diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseGodkendelse/KasseGodkendelseViewComponent.cs b/PlanTempus.Application/Features/CashRegister/Components/CashApproval/CashApprovalViewComponent.cs similarity index 67% rename from PlanTempus.Application/Features/Kasse/Components/KasseGodkendelse/KasseGodkendelseViewComponent.cs rename to PlanTempus.Application/Features/CashRegister/Components/CashApproval/CashApprovalViewComponent.cs index 1341a6a..c9ae962 100644 --- a/PlanTempus.Application/Features/Kasse/Components/KasseGodkendelse/KasseGodkendelseViewComponent.cs +++ b/PlanTempus.Application/Features/CashRegister/Components/CashApproval/CashApprovalViewComponent.cs @@ -1,12 +1,12 @@ using Microsoft.AspNetCore.Mvc; -namespace PlanTempus.Application.Features.Kasse.Components; +namespace PlanTempus.Application.Features.CashRegister.Components; /// /// ViewComponent for the approval section. /// Handles status, approver selection, and confirmation checkbox. /// -public class KasseGodkendelseViewComponent : ViewComponent +public class CashApprovalViewComponent : ViewComponent { public IViewComponentResult Invoke() { diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseGodkendelse/Default.cshtml b/PlanTempus.Application/Features/CashRegister/Components/CashApproval/Default.cshtml similarity index 100% rename from PlanTempus.Application/Features/Kasse/Components/KasseGodkendelse/Default.cshtml rename to PlanTempus.Application/Features/CashRegister/Components/CashApproval/Default.cshtml diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseKontanter/KasseKontanterViewComponent.cs b/PlanTempus.Application/Features/CashRegister/Components/CashBalance/CashBalanceViewComponent.cs similarity index 68% rename from PlanTempus.Application/Features/Kasse/Components/KasseKontanter/KasseKontanterViewComponent.cs rename to PlanTempus.Application/Features/CashRegister/Components/CashBalance/CashBalanceViewComponent.cs index 5c45a98..dc30f17 100644 --- a/PlanTempus.Application/Features/Kasse/Components/KasseKontanter/KasseKontanterViewComponent.cs +++ b/PlanTempus.Application/Features/CashRegister/Components/CashBalance/CashBalanceViewComponent.cs @@ -1,12 +1,12 @@ using Microsoft.AspNetCore.Mvc; -namespace PlanTempus.Application.Features.Kasse.Components; +namespace PlanTempus.Application.Features.CashRegister.Components; /// /// ViewComponent for cash calculation section. /// Handles starting balance, payouts, bank deposits, and actual cash count. /// -public class KasseKontanterViewComponent : ViewComponent +public class CashBalanceViewComponent : ViewComponent { public IViewComponentResult Invoke() { diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseKontanter/Default.cshtml b/PlanTempus.Application/Features/CashRegister/Components/CashBalance/Default.cshtml similarity index 100% rename from PlanTempus.Application/Features/Kasse/Components/KasseKontanter/Default.cshtml rename to PlanTempus.Application/Features/CashRegister/Components/CashBalance/Default.cshtml diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseDifference/KasseDifferenceViewComponent.cs b/PlanTempus.Application/Features/CashRegister/Components/CashDifference/CashDifferenceViewComponent.cs similarity index 67% rename from PlanTempus.Application/Features/Kasse/Components/KasseDifference/KasseDifferenceViewComponent.cs rename to PlanTempus.Application/Features/CashRegister/Components/CashDifference/CashDifferenceViewComponent.cs index 0a3c436..c02c063 100644 --- a/PlanTempus.Application/Features/Kasse/Components/KasseDifference/KasseDifferenceViewComponent.cs +++ b/PlanTempus.Application/Features/CashRegister/Components/CashDifference/CashDifferenceViewComponent.cs @@ -1,12 +1,12 @@ using Microsoft.AspNetCore.Mvc; -namespace PlanTempus.Application.Features.Kasse.Components; +namespace PlanTempus.Application.Features.CashRegister.Components; /// /// ViewComponent for displaying the cash difference. /// Shows positive/negative/neutral states with color coding. /// -public class KasseDifferenceViewComponent : ViewComponent +public class CashDifferenceViewComponent : ViewComponent { public IViewComponentResult Invoke() { diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseDifference/Default.cshtml b/PlanTempus.Application/Features/CashRegister/Components/CashDifference/Default.cshtml similarity index 100% rename from PlanTempus.Application/Features/Kasse/Components/KasseDifference/Default.cshtml rename to PlanTempus.Application/Features/CashRegister/Components/CashDifference/Default.cshtml diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseDagsoplysninger/Default.cshtml b/PlanTempus.Application/Features/CashRegister/Components/PeriodInfo/Default.cshtml similarity index 100% rename from PlanTempus.Application/Features/Kasse/Components/KasseDagsoplysninger/Default.cshtml rename to PlanTempus.Application/Features/CashRegister/Components/PeriodInfo/Default.cshtml diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseDagsoplysninger/KasseDagsoplysningerViewComponent.cs b/PlanTempus.Application/Features/CashRegister/Components/PeriodInfo/PeriodInfoViewComponent.cs similarity index 53% rename from PlanTempus.Application/Features/Kasse/Components/KasseDagsoplysninger/KasseDagsoplysningerViewComponent.cs rename to PlanTempus.Application/Features/CashRegister/Components/PeriodInfo/PeriodInfoViewComponent.cs index 3113322..16b9f56 100644 --- a/PlanTempus.Application/Features/Kasse/Components/KasseDagsoplysninger/KasseDagsoplysningerViewComponent.cs +++ b/PlanTempus.Application/Features/CashRegister/Components/PeriodInfo/PeriodInfoViewComponent.cs @@ -1,12 +1,12 @@ using Microsoft.AspNetCore.Mvc; -namespace PlanTempus.Application.Features.Kasse.Components; +namespace PlanTempus.Application.Features.CashRegister.Components; /// -/// ViewComponent for daily reconciliation info. +/// ViewComponent for period reconciliation info. /// Shows period, register, and employee information. /// -public class KasseDagsoplysningerViewComponent : ViewComponent +public class PeriodInfoViewComponent : ViewComponent { public IViewComponentResult Invoke() { diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseDagensTal/Default.cshtml b/PlanTempus.Application/Features/CashRegister/Components/PeriodRevenue/Default.cshtml similarity index 100% rename from PlanTempus.Application/Features/Kasse/Components/KasseDagensTal/Default.cshtml rename to PlanTempus.Application/Features/CashRegister/Components/PeriodRevenue/Default.cshtml diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseDagensTal/KasseDagensTalViewComponent.cs b/PlanTempus.Application/Features/CashRegister/Components/PeriodRevenue/PeriodRevenueViewComponent.cs similarity index 55% rename from PlanTempus.Application/Features/Kasse/Components/KasseDagensTal/KasseDagensTalViewComponent.cs rename to PlanTempus.Application/Features/CashRegister/Components/PeriodRevenue/PeriodRevenueViewComponent.cs index 7cf2b4b..aab3e16 100644 --- a/PlanTempus.Application/Features/Kasse/Components/KasseDagensTal/KasseDagensTalViewComponent.cs +++ b/PlanTempus.Application/Features/CashRegister/Components/PeriodRevenue/PeriodRevenueViewComponent.cs @@ -1,12 +1,12 @@ using Microsoft.AspNetCore.Mvc; -namespace PlanTempus.Application.Features.Kasse.Components; +namespace PlanTempus.Application.Features.CashRegister.Components; /// -/// ViewComponent for displaying today's payment figures. +/// ViewComponent for displaying period payment figures. /// Shows system values vs. optional control values for different payment types. /// -public class KasseDagensTalViewComponent : ViewComponent +public class PeriodRevenueViewComponent : ViewComponent { public IViewComponentResult Invoke() { diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseNote/Default.cshtml b/PlanTempus.Application/Features/CashRegister/Components/ReconciliationNote/Default.cshtml similarity index 100% rename from PlanTempus.Application/Features/Kasse/Components/KasseNote/Default.cshtml rename to PlanTempus.Application/Features/CashRegister/Components/ReconciliationNote/Default.cshtml diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseNote/KasseNoteViewComponent.cs b/PlanTempus.Application/Features/CashRegister/Components/ReconciliationNote/ReconciliationNoteViewComponent.cs similarity index 64% rename from PlanTempus.Application/Features/Kasse/Components/KasseNote/KasseNoteViewComponent.cs rename to PlanTempus.Application/Features/CashRegister/Components/ReconciliationNote/ReconciliationNoteViewComponent.cs index 3c8f70d..60a9f7f 100644 --- a/PlanTempus.Application/Features/Kasse/Components/KasseNote/KasseNoteViewComponent.cs +++ b/PlanTempus.Application/Features/CashRegister/Components/ReconciliationNote/ReconciliationNoteViewComponent.cs @@ -1,12 +1,12 @@ using Microsoft.AspNetCore.Mvc; -namespace PlanTempus.Application.Features.Kasse.Components; +namespace PlanTempus.Application.Features.CashRegister.Components; /// /// ViewComponent for the note field. /// Optional field for explaining cash differences. /// -public class KasseNoteViewComponent : ViewComponent +public class ReconciliationNoteViewComponent : ViewComponent { public IViewComponentResult Invoke() { diff --git a/PlanTempus.Application/Features/CashRegister/Components/ReconciliationTable/Default.cshtml b/PlanTempus.Application/Features/CashRegister/Components/ReconciliationTable/Default.cshtml new file mode 100644 index 0000000..2675ca8 --- /dev/null +++ b/PlanTempus.Application/Features/CashRegister/Components/ReconciliationTable/Default.cshtml @@ -0,0 +1,191 @@ + + + + 0 valgt + + + + Eksporter SAF-T + + + + + + + + Dato + ID + Periode + Kassepunkt + Afsluttet af + Omsætning + Difference + Status + + + + + + + + I dag + + + + 29. dec 17:45 → ... + + + Kasse 1 + + 4.250 kr + + Kladde + + + + + + 29. dec + Z-043 + + + 28. dec 18:00 → 29. dec 17:45 + + + Kasse 1 + Anna Jensen + 18.865 kr + 0 kr + Godkendt + + + + + + + + Download CSV + + + + Download PDF + + + + Se transaktioner + + + + + + + + 28. dec + Z-042 + + + 27. dec 18:30 → 28. dec 18:00 + + + Kasse 1 + Karina Knudsen + 12.450 kr + -25 kr + Godkendt + + + + + + + + Download CSV + + + + Download PDF + + + + Se transaktioner + + + + + + + + 27. dec + Z-041 + + + 26. dec 18:00 → 27. dec 18:30 + + + Kasse 1 + Martin Nielsen + 21.340 kr + 0 kr + Godkendt + + + + + + + + Download CSV + + + + Download PDF + + + + Se transaktioner + + + + + + + + 23. dec + Z-040 + + + 22. dec 18:00 → 23. dec 17:30 + + + Kasse 1 + Anna Jensen + 28.750 kr + -50 kr + Godkendt + + + + + + + + Download CSV + + + + Download PDF + + + + Se transaktioner + + + + + + + + Viser 5 afstemninger + Z-040 → Z-043 + + diff --git a/PlanTempus.Application/Features/CashRegister/Components/ReconciliationTable/ReconciliationTableViewComponent.cs b/PlanTempus.Application/Features/CashRegister/Components/ReconciliationTable/ReconciliationTableViewComponent.cs new file mode 100644 index 0000000..1b81d0e --- /dev/null +++ b/PlanTempus.Application/Features/CashRegister/Components/ReconciliationTable/ReconciliationTableViewComponent.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; + +namespace PlanTempus.Application.Features.CashRegister.Components; + +/// +/// ViewComponent for the reconciliation table on the Cash Register list page. +/// Shows all reconciliations with action bar and SAF-T export. +/// +public class ReconciliationTableViewComponent : ViewComponent +{ + public IViewComponentResult Invoke() + { + return View(); + } +} diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseFilterBar/Default.cshtml b/PlanTempus.Application/Features/CashRegister/Components/RegisterFilterBar/Default.cshtml similarity index 100% rename from PlanTempus.Application/Features/Kasse/Components/KasseFilterBar/Default.cshtml rename to PlanTempus.Application/Features/CashRegister/Components/RegisterFilterBar/Default.cshtml diff --git a/PlanTempus.Application/Features/CashRegister/Components/RegisterFilterBar/RegisterFilterBarViewComponent.cs b/PlanTempus.Application/Features/CashRegister/Components/RegisterFilterBar/RegisterFilterBarViewComponent.cs new file mode 100644 index 0000000..b73094f --- /dev/null +++ b/PlanTempus.Application/Features/CashRegister/Components/RegisterFilterBar/RegisterFilterBarViewComponent.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; + +namespace PlanTempus.Application.Features.CashRegister.Components; + +/// +/// ViewComponent for the filter bar on the Cash Register list page. +/// Contains date range, register point, and status filters. +/// +public class RegisterFilterBarViewComponent : ViewComponent +{ + public IViewComponentResult Invoke() + { + return View(); + } +} diff --git a/PlanTempus.Application/Features/CashRegister/Pages/Index.cshtml b/PlanTempus.Application/Features/CashRegister/Pages/Index.cshtml new file mode 100644 index 0000000..cec4339 --- /dev/null +++ b/PlanTempus.Application/Features/CashRegister/Pages/Index.cshtml @@ -0,0 +1,93 @@ +@page "/kasse" +@using PlanTempus.Application.Features.CashRegister.Pages +@model PlanTempus.Application.Features.CashRegister.Pages.IndexModel +@{ + ViewData["Title"] = "Kasse"; +} + + + + + + + + + 12 + Afstemninger i periode + + + 186.450 kr + Total omsætning + + + 42.340 kr + Kontantsalg + + + -75 kr + Samlet difference + + + + + + + 47 + Transaktioner i dag + + + 18.865 kr + Omsætning i dag + + + 29. dec 17:45 + Sidste afstemning + + + Anna J. + Åbnede kassen 29. dec 09:05 + + + + + + + + + Oversigt + + + + Kasseafstemning + + + + + + + + @await Component.InvokeAsync("RegisterFilterBar") + @await Component.InvokeAsync("ReconciliationTable") + + + + + + + + + @await Component.InvokeAsync("PeriodRevenue") + @await Component.InvokeAsync("CashBalance") + @await Component.InvokeAsync("CashDifference") + + + + @await Component.InvokeAsync("PeriodInfo") + @await Component.InvokeAsync("ReconciliationNote") + @await Component.InvokeAsync("CashApproval") + + + + Systemet gemmer hvornår og af hvem der er godkendt – enkelt kontrolspor. + + diff --git a/PlanTempus.Application/Features/Kasse/Pages/Index.cshtml.cs b/PlanTempus.Application/Features/CashRegister/Pages/Index.cshtml.cs similarity index 66% rename from PlanTempus.Application/Features/Kasse/Pages/Index.cshtml.cs rename to PlanTempus.Application/Features/CashRegister/Pages/Index.cshtml.cs index c2d9e68..bd06223 100644 --- a/PlanTempus.Application/Features/Kasse/Pages/Index.cshtml.cs +++ b/PlanTempus.Application/Features/CashRegister/Pages/Index.cshtml.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc.RazorPages; -namespace PlanTempus.Application.Features.Kasse.Pages; +namespace PlanTempus.Application.Features.CashRegister.Pages; public class IndexModel : PageModel { diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseFilterBar/KasseFilterBarViewComponent.cs b/PlanTempus.Application/Features/Kasse/Components/KasseFilterBar/KasseFilterBarViewComponent.cs deleted file mode 100644 index 75ace8e..0000000 --- a/PlanTempus.Application/Features/Kasse/Components/KasseFilterBar/KasseFilterBarViewComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace PlanTempus.Application.Features.Kasse.Components; - -/// -/// ViewComponent for the filter bar on the Kasse list page. -/// Contains date range, kassepunkt, and status filters. -/// -public class KasseFilterBarViewComponent : ViewComponent -{ - public IViewComponentResult Invoke() - { - return View(); - } -} diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseStatsBar/Default.cshtml b/PlanTempus.Application/Features/Kasse/Components/KasseStatsBar/Default.cshtml deleted file mode 100644 index baef2a1..0000000 --- a/PlanTempus.Application/Features/Kasse/Components/KasseStatsBar/Default.cshtml +++ /dev/null @@ -1,18 +0,0 @@ - - - 12 - Afstemninger i periode - - - 186.450 kr - Total omsætning - - - 42.340 kr - Kontantsalg - - - -75 kr - Samlet difference - - diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseStatsBar/KasseStatsBarViewComponent.cs b/PlanTempus.Application/Features/Kasse/Components/KasseStatsBar/KasseStatsBarViewComponent.cs deleted file mode 100644 index c46a90f..0000000 --- a/PlanTempus.Application/Features/Kasse/Components/KasseStatsBar/KasseStatsBarViewComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace PlanTempus.Application.Features.Kasse.Components; - -/// -/// ViewComponent for the stats bar on the Kasse list page. -/// Shows summary statistics for reconciliations. -/// -public class KasseStatsBarViewComponent : ViewComponent -{ - public IViewComponentResult Invoke() - { - return View(); - } -} diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseTable/Default.cshtml b/PlanTempus.Application/Features/Kasse/Components/KasseTable/Default.cshtml deleted file mode 100644 index 6490cd5..0000000 --- a/PlanTempus.Application/Features/Kasse/Components/KasseTable/Default.cshtml +++ /dev/null @@ -1,191 +0,0 @@ - - - - 0 valgt - - - - Eksporter SAF-T - - - - - - - - Dato - ID - Periode - Kassepunkt - Afsluttet af - Omsætning - Difference - Status - - - - - - - - I dag - - - - 29. dec 17:45 → ... - - - Kasse 1 - - 4.250 kr - - Kladde - - - - - - 29. dec - Z-043 - - - 28. dec 18:00 → 29. dec 17:45 - - - Kasse 1 - Anna Jensen - 18.865 kr - 0 kr - Godkendt - - - - - - - - Download CSV - - - - Download PDF - - - - Se transaktioner - - - - - - - - 28. dec - Z-042 - - - 27. dec 18:30 → 28. dec 18:00 - - - Kasse 1 - Karina Knudsen - 12.450 kr - -25 kr - Godkendt - - - - - - - - Download CSV - - - - Download PDF - - - - Se transaktioner - - - - - - - - 27. dec - Z-041 - - - 26. dec 18:00 → 27. dec 18:30 - - - Kasse 1 - Martin Nielsen - 21.340 kr - 0 kr - Godkendt - - - - - - - - Download CSV - - - - Download PDF - - - - Se transaktioner - - - - - - - - 23. dec - Z-040 - - - 22. dec 18:00 → 23. dec 17:30 - - - Kasse 1 - Anna Jensen - 28.750 kr - -50 kr - Godkendt - - - - - - - - Download CSV - - - - Download PDF - - - - Se transaktioner - - - - - - - - Viser 5 afstemninger - Z-040 → Z-043 - - diff --git a/PlanTempus.Application/Features/Kasse/Components/KasseTable/KasseTableViewComponent.cs b/PlanTempus.Application/Features/Kasse/Components/KasseTable/KasseTableViewComponent.cs deleted file mode 100644 index 777c357..0000000 --- a/PlanTempus.Application/Features/Kasse/Components/KasseTable/KasseTableViewComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace PlanTempus.Application.Features.Kasse.Components; - -/// -/// ViewComponent for the reconciliation table on the Kasse list page. -/// Shows all reconciliations with action bar and SAF-T export. -/// -public class KasseTableViewComponent : ViewComponent -{ - public IViewComponentResult Invoke() - { - return View(); - } -} diff --git a/PlanTempus.Application/Features/Kasse/Pages/Index.cshtml b/PlanTempus.Application/Features/Kasse/Pages/Index.cshtml deleted file mode 100644 index 33f987c..0000000 --- a/PlanTempus.Application/Features/Kasse/Pages/Index.cshtml +++ /dev/null @@ -1,93 +0,0 @@ -@page "/kasse" -@using PlanTempus.Application.Features.Kasse.Pages -@model PlanTempus.Application.Features.Kasse.Pages.IndexModel -@{ - ViewData["Title"] = "Kasse"; -} - - - - - - - - - 12 - Afstemninger i periode - - - 186.450 kr - Total omsætning - - - 42.340 kr - Kontantsalg - - - -75 kr - Samlet difference - - - - - - - 47 - Transaktioner i dag - - - 18.865 kr - Omsætning i dag - - - 29. dec 17:45 - Sidste afstemning - - - Anna J. - Åbnede kassen 29. dec 09:05 - - - - - - - - - Oversigt - - - - Kasseafstemning - - - - - - - - @await Component.InvokeAsync("KasseFilterBar") - @await Component.InvokeAsync("KasseTable") - - - - - - - - - @await Component.InvokeAsync("KasseDagensTal") - @await Component.InvokeAsync("KasseKontanter") - @await Component.InvokeAsync("KasseDifference") - - - - @await Component.InvokeAsync("KasseDagsoplysninger") - @await Component.InvokeAsync("KasseNote") - @await Component.InvokeAsync("KasseGodkendelse") - - - - Systemet gemmer hvornår og af hvem der er godkendt – enkelt kontrolspor. - - diff --git a/PlanTempus.Application/Features/_Shared/Pages/_Layout.cshtml b/PlanTempus.Application/Features/_Shared/Pages/_Layout.cshtml index 1102fa3..9b72be5 100644 --- a/PlanTempus.Application/Features/_Shared/Pages/_Layout.cshtml +++ b/PlanTempus.Application/Features/_Shared/Pages/_Layout.cshtml @@ -24,7 +24,7 @@ - + @await RenderSectionAsync("Styles", required: false) diff --git a/PlanTempus.Application/wwwroot/css/kasse.css b/PlanTempus.Application/wwwroot/css/cash.css similarity index 93% rename from PlanTempus.Application/wwwroot/css/kasse.css rename to PlanTempus.Application/wwwroot/css/cash.css index 379dc1c..8506141 100644 --- a/PlanTempus.Application/wwwroot/css/kasse.css +++ b/PlanTempus.Application/wwwroot/css/cash.css @@ -1,5 +1,5 @@ /** - * Kasse (Cash Register) - Page Styling + * Cash Register - Page Styling * * Filter bar, stats, table, forms, and difference box */ @@ -7,7 +7,7 @@ /* =========================================== STICKY HEADER CONTAINER =========================================== */ -swp-kasse-sticky-header { +swp-cash-sticky-header { display: block; position: sticky; top: 0; @@ -17,7 +17,7 @@ swp-kasse-sticky-header { } /* Override tab-bar sticky when inside sticky header */ -swp-kasse-sticky-header swp-tab-bar { +swp-cash-sticky-header swp-tab-bar { position: static; top: auto; } @@ -25,7 +25,7 @@ swp-kasse-sticky-header swp-tab-bar { /* =========================================== KASSE HEADER (Stats above tabs) =========================================== */ -swp-kasse-header { +swp-cash-header { display: block; background: var(--color-surface); border-bottom: 1px solid var(--color-border); @@ -82,7 +82,7 @@ swp-filter-spacer { /* =========================================== KASSE STATS BAR =========================================== */ -swp-kasse-stats { +swp-cash-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--spacing-8); @@ -90,17 +90,17 @@ swp-kasse-stats { margin: 0 auto; } -swp-kasse-stats:not(.active) { +swp-cash-stats:not(.active) { display: none; } -swp-kasse-stat { +swp-cash-stat { background: var(--color-background-alt); border-radius: var(--radius-lg); padding: var(--spacing-6) var(--spacing-8); } -swp-kasse-stat-value { +swp-cash-stat-value { display: block; font-size: var(--font-size-2xl); font-weight: var(--font-weight-semibold); @@ -108,26 +108,26 @@ swp-kasse-stat-value { color: var(--color-text); } -swp-kasse-stat-label { +swp-cash-stat-label { display: block; font-size: var(--font-size-sm); color: var(--color-text-secondary); margin-top: var(--spacing-2); } -swp-kasse-stat.highlight swp-kasse-stat-value { +swp-cash-stat.highlight swp-cash-stat-value { color: var(--color-teal); } -swp-kasse-stat.warning swp-kasse-stat-value { +swp-cash-stat.warning swp-cash-stat-value { color: var(--color-amber); } -swp-kasse-stat.negative swp-kasse-stat-value { +swp-cash-stat.negative swp-cash-stat-value { color: var(--color-red); } -swp-kasse-stat.user swp-kasse-stat-value { +swp-cash-stat.user swp-cash-stat-value { color: var(--color-blue); } @@ -153,7 +153,7 @@ swp-selection-info { /* =========================================== KASSE TABLE (Grid + Subgrid pattern) =========================================== */ -swp-kasse-table { +swp-cash-table { display: grid; grid-template-columns: 50px 70px 60px minmax(140px, 1fr) 90px 100px 100px 110px 120px 40px; background: var(--color-surface); @@ -162,28 +162,28 @@ swp-kasse-table { overflow: hidden; } -swp-kasse-table-header, -swp-kasse-table-body { +swp-cash-table-header, +swp-cash-table-body { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; } -swp-kasse-table-header { +swp-cash-table-header { background: var(--color-background-alt); border-bottom: 1px solid var(--color-border); padding: var(--spacing-6) var(--spacing-10); align-items: center; } -swp-kasse-table-row { +swp-cash-table-row { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; } -swp-kasse-th { +swp-cash-th { font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); text-transform: uppercase; @@ -191,76 +191,76 @@ swp-kasse-th { color: var(--color-text-secondary); } -swp-kasse-th.right { +swp-cash-th.right { text-align: right; } -swp-kasse-th.checkbox, -swp-kasse-td.checkbox { +swp-cash-th.checkbox, +swp-cash-td.checkbox { display: flex; align-items: center; justify-content: center; } -swp-kasse-table input[type="checkbox"] { +swp-cash-table input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--color-teal); cursor: pointer; } -swp-kasse-table-row { +swp-cash-table-row { padding: var(--spacing-7) var(--spacing-10); border-bottom: 1px solid var(--color-border); cursor: pointer; transition: background var(--transition-fast); } -swp-kasse-table-row:last-child { +swp-cash-table-row:last-child { border-bottom: none; } -swp-kasse-table-row:hover { +swp-cash-table-row:hover { background: var(--color-background-hover); } /* Draft row - clickable to go to Kasseafstemning */ -swp-kasse-table-row.draft-row { +swp-cash-table-row.draft-row { background: color-mix(in srgb, var(--color-amber) 5%, transparent); cursor: pointer; } -swp-kasse-table-row.draft-row:hover { +swp-cash-table-row.draft-row:hover { background: color-mix(in srgb, var(--color-amber) 12%, transparent); } -swp-kasse-td { +swp-cash-td { font-size: var(--font-size-base); color: var(--color-text); } -swp-kasse-td.right { +swp-cash-td.right { text-align: right; } -swp-kasse-td.mono { +swp-cash-td.mono { font-family: var(--font-mono); } -swp-kasse-td.muted { +swp-cash-td.muted { color: var(--color-text-secondary); font-size: var(--font-size-sm); } -swp-kasse-td.negative { +swp-cash-td.negative { color: var(--color-red); } -swp-kasse-td.positive { +swp-cash-td.positive { color: var(--color-green); } -swp-kasse-td.id { +swp-cash-td.id { font-size: var(--font-size-sm); color: var(--color-text-secondary); font-family: var(--font-mono); @@ -301,7 +301,7 @@ swp-row-toggle i { } /* Row detail - hidden by default */ -swp-kasse-row-detail { +swp-cash-row-detail { grid-column: 1 / -1; display: none; overflow: hidden; @@ -309,7 +309,7 @@ swp-kasse-row-detail { border-bottom: 1px solid var(--color-border); } -swp-kasse-row-detail.expanded { +swp-cash-row-detail.expanded { display: block; } @@ -336,7 +336,7 @@ swp-row-arrow i { font-size: var(--font-size-lg); } -swp-kasse-table-footer { +swp-cash-table-footer { grid-column: 1 / -1; display: flex; align-items: center; @@ -352,8 +352,8 @@ swp-kasse-table-footer { STATUS BADGE =========================================== */ /* Center status column */ -swp-kasse-th:nth-child(9), -swp-kasse-td:nth-child(9) { +swp-cash-th:nth-child(9), +swp-cash-td:nth-child(9) { text-align: center; } @@ -388,19 +388,19 @@ swp-status-badge.draft { /* =========================================== TWO-COLUMN GRID (Detail View) =========================================== */ -swp-kasse-grid { +swp-cash-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-12); } @media (max-width: 900px) { - swp-kasse-grid { + swp-cash-grid { grid-template-columns: 1fr; } } -swp-kasse-column { +swp-cash-column { display: grid; gap: var(--spacing-10); align-content: start; @@ -866,20 +866,20 @@ swp-system-note { RESPONSIVE =========================================== */ @media (max-width: 1000px) { - swp-kasse-stats { + swp-cash-stats { grid-template-columns: repeat(2, 1fr); } /* Table columns defined on parent - subgrid inherits */ - swp-kasse-table { + swp-cash-table { grid-template-columns: 50px 80px 1fr 100px 110px 120px 40px; } /* Hide some columns on smaller screens */ - swp-kasse-th:nth-child(3), - swp-kasse-td:nth-child(3), - swp-kasse-th:nth-child(6), - swp-kasse-td:nth-child(6) { + swp-cash-th:nth-child(3), + swp-cash-td:nth-child(3), + swp-cash-th:nth-child(6), + swp-cash-td:nth-child(6) { display: none; } } diff --git a/PlanTempus.Application/wwwroot/js/app.js b/PlanTempus.Application/wwwroot/js/app.js index e1af9ff..75e7310 100644 --- a/PlanTempus.Application/wwwroot/js/app.js +++ b/PlanTempus.Application/wwwroot/js/app.js @@ -603,8 +603,8 @@ __name(_LockScreenController, "LockScreenController"); _LockScreenController.CORRECT_PIN = "1234"; var LockScreenController = _LockScreenController; -// wwwroot/ts/modules/kasse.ts -var _KasseController = class _KasseController { +// wwwroot/ts/modules/cash.ts +var _CashController = class _CashController { constructor() { // Base values (from system - would come from server in real app) this.startBalance = 2e3; @@ -637,7 +637,7 @@ var _KasseController = class _KasseController { switchToTab(targetTab) { const tabs = document.querySelectorAll("swp-tab[data-tab]"); const contents = document.querySelectorAll("swp-tab-content[data-tab]"); - const statsBars = document.querySelectorAll("swp-kasse-stats[data-for-tab]"); + const statsBars = document.querySelectorAll("swp-cash-stats[data-for-tab]"); tabs.forEach((t) => { if (t.dataset.tab === targetTab) { t.classList.add("active"); @@ -787,21 +787,21 @@ var _KasseController = class _KasseController { * Setup row toggle for expandable details */ setupRowToggle() { - const rows = document.querySelectorAll("swp-kasse-table-row[data-id]:not(.draft-row)"); + const rows = document.querySelectorAll("swp-cash-table-row[data-id]:not(.draft-row)"); rows.forEach((row) => { const rowId = row.getAttribute("data-id"); if (!rowId) return; - const detail = document.querySelector(`swp-kasse-row-detail[data-for="${rowId}"]`); + const detail = document.querySelector(`swp-cash-row-detail[data-for="${rowId}"]`); if (!detail) return; row.addEventListener("click", (e) => { if (e.target.closest('input[type="checkbox"]')) return; const icon = row.querySelector("swp-row-toggle i"); const isExpanded = row.classList.contains("expanded"); - document.querySelectorAll("swp-kasse-table-row.expanded").forEach((r) => { + document.querySelectorAll("swp-cash-table-row.expanded").forEach((r) => { if (r !== row) { const otherId = r.getAttribute("data-id"); if (otherId) { - const otherDetail = document.querySelector(`swp-kasse-row-detail[data-for="${otherId}"]`); + const otherDetail = document.querySelector(`swp-cash-row-detail[data-for="${otherId}"]`); const otherIcon = r.querySelector("swp-row-toggle i"); if (otherDetail && otherIcon) { this.collapseRow(r, otherDetail, otherIcon); @@ -877,10 +877,10 @@ var _KasseController = class _KasseController { } } /** - * Setup draft row click to navigate to Kasseafstemning tab + * Setup draft row click to navigate to reconciliation tab */ setupDraftRowClick() { - const draftRow = document.querySelector("swp-kasse-table-row.draft-row"); + const draftRow = document.querySelector("swp-cash-table-row.draft-row"); if (!draftRow) return; draftRow.style.cursor = "pointer"; draftRow.addEventListener("click", (e) => { @@ -889,8 +889,8 @@ var _KasseController = class _KasseController { }); } }; -__name(_KasseController, "KasseController"); -var KasseController = _KasseController; +__name(_CashController, "CashController"); +var CashController = _CashController; // wwwroot/ts/app.ts var _App = class _App { @@ -900,7 +900,7 @@ var _App = class _App { this.theme = new ThemeController(); this.search = new SearchController(); this.lockScreen = new LockScreenController(this.drawers); - this.kasse = new KasseController(); + this.cash = new CashController(); } }; __name(_App, "App"); @@ -924,4 +924,4 @@ export { app, app_default as default }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdHMvbW9kdWxlcy9zaWRlYmFyLnRzIiwgIi4uL3RzL21vZHVsZXMvZHJhd2Vycy50cyIsICIuLi90cy9tb2R1bGVzL3RoZW1lLnRzIiwgIi4uL3RzL21vZHVsZXMvc2VhcmNoLnRzIiwgIi4uL3RzL21vZHVsZXMvbG9ja3NjcmVlbi50cyIsICIuLi90cy9tb2R1bGVzL2thc3NlLnRzIiwgIi4uL3RzL2FwcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBTaWRlYmFyIENvbnRyb2xsZXJcbiAqXG4gKiBIYW5kbGVzIHNpZGViYXIgY29sbGFwc2UvZXhwYW5kIGFuZCB0b29sdGlwIGZ1bmN0aW9uYWxpdHlcbiAqL1xuXG5leHBvcnQgY2xhc3MgU2lkZWJhckNvbnRyb2xsZXIge1xuICBwcml2YXRlIG1lbnVUb2dnbGU6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYXBwTGF5b3V0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lbnVUb29sdGlwOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubWVudVRvZ2dsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZW51VG9nZ2xlJyk7XG4gICAgdGhpcy5hcHBMYXlvdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzd3AtYXBwLWxheW91dCcpO1xuICAgIHRoaXMubWVudVRvb2x0aXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVudVRvb2x0aXAnKTtcblxuICAgIHRoaXMuc2V0dXBMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNldHVwVG9vbHRpcHMoKTtcbiAgICB0aGlzLnJlc3RvcmVTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHNpZGViYXIgaXMgY29sbGFwc2VkXG4gICAqL1xuICBnZXQgaXNDb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXBwTGF5b3V0Py5jbGFzc0xpc3QuY29udGFpbnMoJ21lbnUtY29sbGFwc2VkJykgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHNpZGViYXIgY29sbGFwc2VkIHN0YXRlXG4gICAqL1xuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFwcExheW91dCkgcmV0dXJuO1xuXG4gICAgdGhpcy5hcHBMYXlvdXQuY2xhc3NMaXN0LnRvZ2dsZSgnbWVudS1jb2xsYXBzZWQnKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2lkZWJhci1jb2xsYXBzZWQnLCBTdHJpbmcodGhpcy5pc0NvbGxhcHNlZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxhcHNlIHRoZSBzaWRlYmFyXG4gICAqL1xuICBjb2xsYXBzZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcExheW91dD8uY2xhc3NMaXN0LmFkZCgnbWVudS1jb2xsYXBzZWQnKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2lkZWJhci1jb2xsYXBzZWQnLCAndHJ1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZCB0aGUgc2lkZWJhclxuICAgKi9cbiAgZXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMuYXBwTGF5b3V0Py5jbGFzc0xpc3QucmVtb3ZlKCdtZW51LWNvbGxhcHNlZCcpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzaWRlYmFyLWNvbGxhcHNlZCcsICdmYWxzZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVUb2dnbGU/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy50b2dnbGUoKSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwVG9vbHRpcHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lbnVUb29sdGlwKSByZXR1cm47XG5cbiAgICBjb25zdCBtZW51SXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3dwLXNpZGUtbWVudS1pdGVtW2RhdGEtdG9vbHRpcF0nKTtcblxuICAgIG1lbnVJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy5zaG93VG9vbHRpcChpdGVtKSk7XG4gICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLmhpZGVUb29sdGlwKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93VG9vbHRpcChpdGVtOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0NvbGxhcHNlZCB8fCAhdGhpcy5tZW51VG9vbHRpcCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdG9vbHRpcFRleHQgPSBpdGVtLmRhdGFzZXQudG9vbHRpcDtcblxuICAgIGlmICghdG9vbHRpcFRleHQpIHJldHVybjtcblxuICAgIHRoaXMubWVudVRvb2x0aXAudGV4dENvbnRlbnQgPSB0b29sdGlwVGV4dDtcbiAgICB0aGlzLm1lbnVUb29sdGlwLnN0eWxlLmxlZnQgPSBgJHtyZWN0LnJpZ2h0ICsgOH1weGA7XG4gICAgdGhpcy5tZW51VG9vbHRpcC5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMn1weGA7XG4gICAgdGhpcy5tZW51VG9vbHRpcC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgtNTAlKSc7XG4gICAgdGhpcy5tZW51VG9vbHRpcC5zaG93UG9wb3ZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlVG9vbHRpcCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVUb29sdGlwPy5oaWRlUG9wb3ZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFwcExheW91dCkgcmV0dXJuO1xuXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaWRlYmFyLWNvbGxhcHNlZCcpID09PSAndHJ1ZScpIHtcbiAgICAgIHRoaXMuYXBwTGF5b3V0LmNsYXNzTGlzdC5hZGQoJ21lbnUtY29sbGFwc2VkJyk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBEcmF3ZXIgQ29udHJvbGxlclxuICpcbiAqIEhhbmRsZXMgYWxsIGRyYXdlciBmdW5jdGlvbmFsaXR5IGluY2x1ZGluZyBwcm9maWxlLCBub3RpZmljYXRpb25zLCBhbmQgdG9kbyBkcmF3ZXJzXG4gKi9cblxuZXhwb3J0IHR5cGUgRHJhd2VyTmFtZSA9ICdwcm9maWxlJyB8ICdub3RpZmljYXRpb24nIHwgJ3RvZG8nIHwgJ25ld1RvZG8nO1xuXG5leHBvcnQgY2xhc3MgRHJhd2VyQ29udHJvbGxlciB7XG4gIHByaXZhdGUgcHJvZmlsZURyYXdlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25EcmF3ZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdG9kb0RyYXdlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBuZXdUb2RvRHJhd2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG92ZXJsYXk6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aXZlRHJhd2VyOiBEcmF3ZXJOYW1lIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aXZlR2VuZXJpY0RyYXdlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnByb2ZpbGVEcmF3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvZmlsZURyYXdlcicpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uRHJhd2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbkRyYXdlcicpO1xuICAgIHRoaXMudG9kb0RyYXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2RvRHJhd2VyJyk7XG4gICAgdGhpcy5uZXdUb2RvRHJhd2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ld1RvZG9EcmF3ZXInKTtcbiAgICB0aGlzLm92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2VyT3ZlcmxheScpO1xuXG4gICAgdGhpcy5zZXR1cExpc3RlbmVycygpO1xuICAgIHRoaXMuc2V0dXBHZW5lcmljRHJhd2VycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgYWN0aXZlIGRyYXdlciBuYW1lXG4gICAqL1xuICBnZXQgYWN0aXZlKCk6IERyYXdlck5hbWUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVEcmF3ZXI7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBhIGRyYXdlciBieSBuYW1lXG4gICAqL1xuICBvcGVuKG5hbWU6IERyYXdlck5hbWUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWxsKCk7XG5cbiAgICBjb25zdCBkcmF3ZXIgPSB0aGlzLmdldERyYXdlcihuYW1lKTtcbiAgICBpZiAoZHJhd2VyICYmIHRoaXMub3ZlcmxheSkge1xuICAgICAgZHJhd2VyLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgdGhpcy5vdmVybGF5LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgdGhpcy5hY3RpdmVEcmF3ZXIgPSBuYW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhIHNwZWNpZmljIGRyYXdlclxuICAgKi9cbiAgY2xvc2UobmFtZTogRHJhd2VyTmFtZSk6IHZvaWQge1xuICAgIGNvbnN0IGRyYXdlciA9IHRoaXMuZ2V0RHJhd2VyKG5hbWUpO1xuICAgIGRyYXdlcj8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG5cbiAgICAvLyBPbmx5IGhpZGUgb3ZlcmxheSBpZiBubyBkcmF3ZXJzIGFyZSBhY3RpdmVcbiAgICBpZiAodGhpcy5vdmVybGF5ICYmICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWN0aXZlW2NsYXNzKj1cImRyYXdlclwiXScpKSB7XG4gICAgICB0aGlzLm92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlRHJhd2VyID09PSBuYW1lKSB7XG4gICAgICB0aGlzLmFjdGl2ZURyYXdlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGFsbCBkcmF3ZXJzXG4gICAqL1xuICBjbG9zZUFsbCgpOiB2b2lkIHtcbiAgICBbdGhpcy5wcm9maWxlRHJhd2VyLCB0aGlzLm5vdGlmaWNhdGlvbkRyYXdlciwgdGhpcy50b2RvRHJhd2VyLCB0aGlzLm5ld1RvZG9EcmF3ZXJdXG4gICAgICAuZm9yRWFjaChkcmF3ZXIgPT4gZHJhd2VyPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG5cbiAgICAvLyBDbG9zZSBhbnkgZ2VuZXJpYyBkcmF3ZXJzXG4gICAgdGhpcy5jbG9zZUdlbmVyaWNEcmF3ZXIoKTtcblxuICAgIHRoaXMub3ZlcmxheT8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgIHRoaXMuYWN0aXZlRHJhd2VyID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZ2VuZXJpYyBkcmF3ZXIgYnkgSURcbiAgICovXG4gIG9wZW5HZW5lcmljRHJhd2VyKGRyYXdlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWxsKCk7XG5cbiAgICBjb25zdCBkcmF3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcmF3ZXJJZCk7XG4gICAgaWYgKGRyYXdlciAmJiB0aGlzLm92ZXJsYXkpIHtcbiAgICAgIGRyYXdlci5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7XG4gICAgICB0aGlzLm92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICB0aGlzLmFjdGl2ZUdlbmVyaWNEcmF3ZXIgPSBkcmF3ZXI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjdXJyZW50bHkgb3BlbiBnZW5lcmljIGRyYXdlclxuICAgKi9cbiAgY2xvc2VHZW5lcmljRHJhd2VyKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlR2VuZXJpY0RyYXdlcj8uY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpO1xuICAgIHRoaXMuYWN0aXZlR2VuZXJpY0RyYXdlciA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBwcm9maWxlIGRyYXdlclxuICAgKi9cbiAgb3BlblByb2ZpbGUoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuKCdwcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBub3RpZmljYXRpb24gZHJhd2VyXG4gICAqL1xuICBvcGVuTm90aWZpY2F0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMub3Blbignbm90aWZpY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0b2RvIGRyYXdlciAoc2xpZGVzIG9uIHRvcCBvZiBwcm9maWxlKVxuICAgKi9cbiAgb3BlblRvZG8oKTogdm9pZCB7XG4gICAgdGhpcy50b2RvRHJhd2VyPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0b2RvIGRyYXdlclxuICAgKi9cbiAgY2xvc2VUb2RvKCk6IHZvaWQge1xuICAgIHRoaXMudG9kb0RyYXdlcj8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgdGhpcy5jbG9zZU5ld1RvZG8oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIG5ldyB0b2RvIGRyYXdlclxuICAgKi9cbiAgb3Blbk5ld1RvZG8oKTogdm9pZCB7XG4gICAgdGhpcy5uZXdUb2RvRHJhd2VyPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBuZXcgdG9kbyBkcmF3ZXJcbiAgICovXG4gIGNsb3NlTmV3VG9kbygpOiB2b2lkIHtcbiAgICB0aGlzLm5ld1RvZG9EcmF3ZXI/LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgYWxsIG5vdGlmaWNhdGlvbnMgYXMgcmVhZFxuICAgKi9cbiAgbWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ub3RpZmljYXRpb25EcmF3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHVucmVhZEl0ZW1zID0gdGhpcy5ub3RpZmljYXRpb25EcmF3ZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgICAnc3dwLW5vdGlmaWNhdGlvbi1pdGVtW2RhdGEtdW5yZWFkPVwidHJ1ZVwiXSdcbiAgICApO1xuICAgIHVucmVhZEl0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS11bnJlYWQnKSk7XG5cbiAgICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdzd3Atbm90aWZpY2F0aW9uLWJhZGdlJyk7XG4gICAgaWYgKGJhZGdlKSB7XG4gICAgICBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RHJhd2VyKG5hbWU6IERyYXdlck5hbWUpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAncHJvZmlsZSc6IHJldHVybiB0aGlzLnByb2ZpbGVEcmF3ZXI7XG4gICAgICBjYXNlICdub3RpZmljYXRpb24nOiByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25EcmF3ZXI7XG4gICAgICBjYXNlICd0b2RvJzogcmV0dXJuIHRoaXMudG9kb0RyYXdlcjtcbiAgICAgIGNhc2UgJ25ld1RvZG8nOiByZXR1cm4gdGhpcy5uZXdUb2RvRHJhd2VyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gUHJvZmlsZSBkcmF3ZXIgdHJpZ2dlcnNcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvZmlsZVRyaWdnZXInKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3BlblByb2ZpbGUoKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyYXdlckNsb3NlJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCdwcm9maWxlJykpO1xuXG4gICAgLy8gTm90aWZpY2F0aW9uIGRyYXdlciB0cmlnZ2Vyc1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zQnRuJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLm9wZW5Ob3RpZmljYXRpb24oKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbkRyYXdlckNsb3NlJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCdub3RpZmljYXRpb24nKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hcmtBbGxSZWFkJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLm1hcmtBbGxOb3RpZmljYXRpb25zUmVhZCgpKTtcblxuICAgIC8vIFRvZG8gZHJhd2VyIHRyaWdnZXJzXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wZW5Ub2RvRHJhd2VyJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLm9wZW5Ub2RvKCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2RvRHJhd2VyQmFjaycpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZVRvZG8oKSk7XG5cbiAgICAvLyBOZXcgdG9kbyBkcmF3ZXIgdHJpZ2dlcnNcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkVG9kb0J0bicpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5vcGVuTmV3VG9kbygpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3VG9kb0RyYXdlckJhY2snKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2VOZXdUb2RvKCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5jZWxOZXdUb2RvJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlTmV3VG9kbygpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZU5ld1RvZG8nKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2VOZXdUb2RvKCkpO1xuXG4gICAgLy8gT3ZlcmxheSBjbGljayBjbG9zZXMgYWxsXG4gICAgdGhpcy5vdmVybGF5Py5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2VBbGwoKSk7XG5cbiAgICAvLyBFc2NhcGUga2V5IGNsb3NlcyBhbGxcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHRoaXMuY2xvc2VBbGwoKTtcbiAgICB9KTtcblxuICAgIC8vIFRvZG8gaW50ZXJhY3Rpb25zXG4gICAgdGhpcy50b2RvRHJhd2VyPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB0aGlzLmhhbmRsZVRvZG9DbGljayhlKSk7XG5cbiAgICAvLyBWaXNpYmlsaXR5IG9wdGlvbnNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB0aGlzLmhhbmRsZVZpc2liaWxpdHlDbGljayhlKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvZG9DbGljayhlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHRvZG9JdGVtID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdzd3AtdG9kby1pdGVtJyk7XG4gICAgY29uc3QgY2hlY2tib3ggPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10b2RvLWNoZWNrYm94Jyk7XG5cbiAgICBpZiAoY2hlY2tib3ggJiYgdG9kb0l0ZW0pIHtcbiAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gdG9kb0l0ZW0uZGF0YXNldC5jb21wbGV0ZWQgPT09ICd0cnVlJztcbiAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICB0b2RvSXRlbS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY29tcGxldGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b2RvSXRlbS5kYXRhc2V0LmNvbXBsZXRlZCA9ICd0cnVlJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUb2dnbGUgc2VjdGlvbiBjb2xsYXBzZVxuICAgIGNvbnN0IHNlY3Rpb25IZWFkZXIgPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10b2RvLXNlY3Rpb24taGVhZGVyJyk7XG4gICAgaWYgKHNlY3Rpb25IZWFkZXIpIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uSGVhZGVyLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdzd3AtdG9kby1zZWN0aW9uJyk7XG4gICAgICBzZWN0aW9uPy5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVZpc2liaWxpdHlDbGljayhlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IG9wdGlvbiA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXZpc2liaWxpdHktb3B0aW9uJyk7XG5cbiAgICBpZiAob3B0aW9uKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3dwLXZpc2liaWxpdHktb3B0aW9uJylcbiAgICAgICAgLmZvckVhY2gobyA9PiBvLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICAgIG9wdGlvbi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgZ2VuZXJpYyBkcmF3ZXIgdHJpZ2dlcnMgYW5kIGNsb3NlIGJ1dHRvbnNcbiAgICogVXNlcyBkYXRhLWRyYXdlci10cmlnZ2VyPVwiZHJhd2VyLWlkXCIgYW5kIGRhdGEtZHJhd2VyLWNsb3NlIGF0dHJpYnV0ZXNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBHZW5lcmljRHJhd2VycygpOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgZHJhd2VyIHRyaWdnZXJzXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgdHJpZ2dlciA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50PignW2RhdGEtZHJhd2VyLXRyaWdnZXJdJyk7XG5cbiAgICAgIGlmICh0cmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IGRyYXdlcklkID0gdHJpZ2dlci5kYXRhc2V0LmRyYXdlclRyaWdnZXI7XG4gICAgICAgIGlmIChkcmF3ZXJJZCkge1xuICAgICAgICAgIHRoaXMub3BlbkdlbmVyaWNEcmF3ZXIoZHJhd2VySWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgZHJhd2VyIGNsb3NlIGJ1dHRvbnNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBjbG9zZUJ0biA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50PignW2RhdGEtZHJhd2VyLWNsb3NlXScpO1xuXG4gICAgICBpZiAoY2xvc2VCdG4pIHtcbiAgICAgICAgdGhpcy5jbG9zZUdlbmVyaWNEcmF3ZXIoKTtcbiAgICAgICAgdGhpcy5vdmVybGF5Py5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCAiLyoqXG4gKiBUaGVtZSBDb250cm9sbGVyXG4gKlxuICogSGFuZGxlcyBkYXJrL2xpZ2h0IG1vZGUgc3dpdGNoaW5nIGFuZCBzeXN0ZW0gcHJlZmVyZW5jZSBkZXRlY3Rpb25cbiAqL1xuXG5leHBvcnQgdHlwZSBUaGVtZSA9ICdsaWdodCcgfCAnZGFyaycgfCAnc3lzdGVtJztcblxuZXhwb3J0IGNsYXNzIFRoZW1lQ29udHJvbGxlciB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfS0VZID0gJ3RoZW1lLXByZWZlcmVuY2UnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEQVJLX0NMQVNTID0gJ2RhcmstbW9kZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IExJR0hUX0NMQVNTID0gJ2xpZ2h0LW1vZGUnO1xuXG4gIHByaXZhdGUgcm9vdDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgdGhlbWVPcHRpb25zOiBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdGhpcy50aGVtZU9wdGlvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3dwLXRoZW1lLW9wdGlvbicpO1xuXG4gICAgdGhpcy5hcHBseVRoZW1lKHRoaXMuY3VycmVudCk7XG4gICAgdGhpcy51cGRhdGVVSSgpO1xuICAgIHRoaXMuc2V0dXBMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdGhlbWUgc2V0dGluZ1xuICAgKi9cbiAgZ2V0IGN1cnJlbnQoKTogVGhlbWUge1xuICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFRoZW1lQ29udHJvbGxlci5TVE9SQUdFX0tFWSkgYXMgVGhlbWUgfCBudWxsO1xuICAgIGlmIChzdG9yZWQgPT09ICdkYXJrJyB8fCBzdG9yZWQgPT09ICdsaWdodCcgfHwgc3RvcmVkID09PSAnc3lzdGVtJykge1xuICAgICAgcmV0dXJuIHN0b3JlZDtcbiAgICB9XG4gICAgcmV0dXJuICdzeXN0ZW0nO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGRhcmsgbW9kZSBpcyBjdXJyZW50bHkgYWN0aXZlXG4gICAqL1xuICBnZXQgaXNEYXJrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvb3QuY2xhc3NMaXN0LmNvbnRhaW5zKFRoZW1lQ29udHJvbGxlci5EQVJLX0NMQVNTKSB8fFxuICAgICAgKHRoaXMuc3lzdGVtUHJlZmVyc0RhcmsgJiYgIXRoaXMucm9vdC5jbGFzc0xpc3QuY29udGFpbnMoVGhlbWVDb250cm9sbGVyLkxJR0hUX0NMQVNTKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc3lzdGVtIHByZWZlcnMgZGFyayBtb2RlXG4gICAqL1xuICBnZXQgc3lzdGVtUHJlZmVyc0RhcmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlbWUgYW5kIHBlcnNpc3QgcHJlZmVyZW5jZVxuICAgKi9cbiAgc2V0KHRoZW1lOiBUaGVtZSk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFRoZW1lQ29udHJvbGxlci5TVE9SQUdFX0tFWSwgdGhlbWUpO1xuICAgIHRoaXMuYXBwbHlUaGVtZSh0aGVtZSk7XG4gICAgdGhpcy51cGRhdGVVSSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBiZXR3ZWVuIGxpZ2h0IGFuZCBkYXJrIHRoZW1lc1xuICAgKi9cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0KHRoaXMuaXNEYXJrID8gJ2xpZ2h0JyA6ICdkYXJrJyk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VGhlbWUodGhlbWU6IFRoZW1lKTogdm9pZCB7XG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoVGhlbWVDb250cm9sbGVyLkRBUktfQ0xBU1MsIFRoZW1lQ29udHJvbGxlci5MSUdIVF9DTEFTUyk7XG5cbiAgICBpZiAodGhlbWUgPT09ICdkYXJrJykge1xuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoVGhlbWVDb250cm9sbGVyLkRBUktfQ0xBU1MpO1xuICAgIH0gZWxzZSBpZiAodGhlbWUgPT09ICdsaWdodCcpIHtcbiAgICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKFRoZW1lQ29udHJvbGxlci5MSUdIVF9DTEFTUyk7XG4gICAgfVxuICAgIC8vICdzeXN0ZW0nIGxlYXZlcyBib3RoIGNsYXNzZXMgb2ZmLCBsZXR0aW5nIENTUyBtZWRpYSBxdWVyeSBoYW5kbGUgaXRcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVUkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRoZW1lT3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgZGFya0FjdGl2ZSA9IHRoaXMuaXNEYXJrO1xuXG4gICAgdGhpcy50aGVtZU9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgY29uc3QgdGhlbWUgPSBvcHRpb24uZGF0YXNldC50aGVtZSBhcyBUaGVtZTtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gKHRoZW1lID09PSAnZGFyaycgJiYgZGFya0FjdGl2ZSkgfHwgKHRoZW1lID09PSAnbGlnaHQnICYmICFkYXJrQWN0aXZlKTtcbiAgICAgIG9wdGlvbi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBpc0FjdGl2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIC8vIFRoZW1lIG9wdGlvbiBjbGlja3NcbiAgICB0aGlzLnRoZW1lT3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICBvcHRpb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5oYW5kbGVPcHRpb25DbGljayhlKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTeXN0ZW0gdGhlbWUgY2hhbmdlc1xuICAgIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB0aGlzLmhhbmRsZVN5c3RlbUNoYW5nZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT3B0aW9uQ2xpY2soZTogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBvcHRpb24gPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10aGVtZS1vcHRpb24nKTtcblxuICAgIGlmIChvcHRpb24pIHtcbiAgICAgIGNvbnN0IHRoZW1lID0gb3B0aW9uLmRhdGFzZXQudGhlbWUgYXMgVGhlbWU7XG4gICAgICBpZiAodGhlbWUpIHtcbiAgICAgICAgdGhpcy5zZXQodGhlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3lzdGVtQ2hhbmdlKCk6IHZvaWQge1xuICAgIC8vIE9ubHkgcmVhY3QgdG8gc3lzdGVtIGNoYW5nZXMgaWYgd2UncmUgdXNpbmcgc3lzdGVtIHByZWZlcmVuY2VcbiAgICBpZiAodGhpcy5jdXJyZW50ID09PSAnc3lzdGVtJykge1xuICAgICAgdGhpcy51cGRhdGVVSSgpO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogU2VhcmNoIENvbnRyb2xsZXJcbiAqXG4gKiBIYW5kbGVzIGdsb2JhbCBzZWFyY2ggZnVuY3Rpb25hbGl0eSBhbmQga2V5Ym9hcmQgc2hvcnRjdXRzXG4gKi9cblxuZXhwb3J0IGNsYXNzIFNlYXJjaENvbnRyb2xsZXIge1xuICBwcml2YXRlIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2xvYmFsU2VhcmNoJykgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50Pignc3dwLXRvcGJhci1zZWFyY2gnKTtcblxuICAgIHRoaXMuc2V0dXBMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBzZWFyY2ggdmFsdWVcbiAgICovXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlucHV0Py52YWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VhcmNoIHZhbHVlXG4gICAqL1xuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgdGhpcy5pbnB1dC52YWx1ZSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdGhlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dD8uZm9jdXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCbHVyIHRoZSBzZWFyY2ggaW5wdXRcbiAgICovXG4gIGJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dD8uYmx1cigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBzZWFyY2ggaW5wdXRcbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gS2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB0aGlzLmhhbmRsZUtleWJvYXJkKGUpKTtcblxuICAgIC8vIElucHV0IGhhbmRsZXJzXG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gdGhpcy5oYW5kbGVJbnB1dChlKSk7XG5cbiAgICAgIC8vIFByZXZlbnQgZm9ybSBzdWJtaXNzaW9uIGlmIHdyYXBwZWQgaW4gZm9ybVxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuaW5wdXQuY2xvc2VzdCgnZm9ybScpO1xuICAgICAgZm9ybT8uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGUpID0+IHRoaXMuaGFuZGxlU3VibWl0KGUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleWJvYXJkKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBDbWQvQ3RybCArIEsgdG8gZm9jdXMgc2VhcmNoXG4gICAgaWYgKChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSAmJiBlLmtleSA9PT0gJ2snKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXNjYXBlIHRvIGJsdXIgc2VhcmNoIHdoZW4gZm9jdXNlZFxuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5pbnB1dCkge1xuICAgICAgdGhpcy5ibHVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbnB1dChlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgcXVlcnkgPSB0YXJnZXQudmFsdWUudHJpbSgpO1xuXG4gICAgLy8gRW1pdCBjdXN0b20gZXZlbnQgZm9yIHNlYXJjaFxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdhcHA6c2VhcmNoJywge1xuICAgICAgZGV0YWlsOiB7IHF1ZXJ5IH0sXG4gICAgICBidWJibGVzOiB0cnVlXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWJtaXQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMudmFsdWUudHJpbSgpO1xuICAgIGlmICghcXVlcnkpIHJldHVybjtcblxuICAgIC8vIEVtaXQgY3VzdG9tIGV2ZW50IGZvciBzZWFyY2ggc3VibWl0XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2FwcDpzZWFyY2gtc3VibWl0Jywge1xuICAgICAgZGV0YWlsOiB7IHF1ZXJ5IH0sXG4gICAgICBidWJibGVzOiB0cnVlXG4gICAgfSkpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBMb2NrIFNjcmVlbiBDb250cm9sbGVyXG4gKlxuICogSGFuZGxlcyBQSU4tYmFzZWQgbG9jayBzY3JlZW4gZnVuY3Rpb25hbGl0eVxuICovXG5cbmltcG9ydCB7IERyYXdlckNvbnRyb2xsZXIgfSBmcm9tICcuL2RyYXdlcnMnO1xuXG5leHBvcnQgY2xhc3MgTG9ja1NjcmVlbkNvbnRyb2xsZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDT1JSRUNUX1BJTiA9ICcxMjM0JzsgLy8gRGVtbyBQSU5cblxuICBwcml2YXRlIGxvY2tTY3JlZW46IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGluSW5wdXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGluS2V5cGFkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvY2tUaW1lRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGluRGlnaXRzOiBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRQaW4gPSAnJztcbiAgcHJpdmF0ZSBkcmF3ZXJzOiBEcmF3ZXJDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZHJhd2Vycz86IERyYXdlckNvbnRyb2xsZXIpIHtcbiAgICB0aGlzLmRyYXdlcnMgPSBkcmF3ZXJzID8/IG51bGw7XG4gICAgdGhpcy5sb2NrU2NyZWVuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2tTY3JlZW4nKTtcbiAgICB0aGlzLnBpbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpbklucHV0Jyk7XG4gICAgdGhpcy5waW5LZXlwYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGluS2V5cGFkJyk7XG4gICAgdGhpcy5sb2NrVGltZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2tUaW1lJyk7XG4gICAgdGhpcy5waW5EaWdpdHMgPSB0aGlzLnBpbklucHV0Py5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3dwLXBpbi1kaWdpdCcpID8/IG51bGw7XG5cbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbG9jayBzY3JlZW4gaXMgYWN0aXZlXG4gICAqL1xuICBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9ja1NjcmVlbj8uY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBsb2NrIHNjcmVlblxuICAgKi9cbiAgc2hvdygpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdlcnM/LmNsb3NlQWxsKCk7XG5cbiAgICBpZiAodGhpcy5sb2NrU2NyZWVuKSB7XG4gICAgICB0aGlzLmxvY2tTY3JlZW4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50UGluID0gJyc7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG5cbiAgICAvLyBVcGRhdGUgbG9jayB0aW1lXG4gICAgaWYgKHRoaXMubG9ja1RpbWVFbCkge1xuICAgICAgdGhpcy5sb2NrVGltZUVsLnRleHRDb250ZW50ID0gYExcdTAwRTVzdCBrbC4gJHt0aGlzLmZvcm1hdFRpbWUoKX1gO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBsb2NrIHNjcmVlblxuICAgKi9cbiAgaGlkZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2NrU2NyZWVuKSB7XG4gICAgICB0aGlzLmxvY2tTY3JlZW4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50UGluID0gJyc7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRpbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGhvdXJzID0gbm93LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBub3cuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7aG91cnN9OiR7bWludXRlc31gO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEaXNwbGF5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5waW5EaWdpdHMpIHJldHVybjtcblxuICAgIHRoaXMucGluRGlnaXRzLmZvckVhY2goKGRpZ2l0LCBpbmRleCkgPT4ge1xuICAgICAgZGlnaXQuY2xhc3NMaXN0LnJlbW92ZSgnZmlsbGVkJywgJ2Vycm9yJyk7XG4gICAgICBpZiAoaW5kZXggPCB0aGlzLmN1cnJlbnRQaW4ubGVuZ3RoKSB7XG4gICAgICAgIGRpZ2l0LnRleHRDb250ZW50ID0gJ1x1MjAyMic7XG4gICAgICAgIGRpZ2l0LmNsYXNzTGlzdC5hZGQoJ2ZpbGxlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlnaXQudGV4dENvbnRlbnQgPSAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Vycm9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5waW5EaWdpdHMpIHJldHVybjtcblxuICAgIHRoaXMucGluRGlnaXRzLmZvckVhY2goZGlnaXQgPT4gZGlnaXQuY2xhc3NMaXN0LmFkZCgnZXJyb3InKSk7XG5cbiAgICAvLyBTaGFrZSBhbmltYXRpb25cbiAgICB0aGlzLnBpbklucHV0Py5jbGFzc0xpc3QuYWRkKCdzaGFrZScpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRQaW4gPSAnJztcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICAgICAgdGhpcy5waW5JbnB1dD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hha2UnKTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBpbiA9PT0gTG9ja1NjcmVlbkNvbnRyb2xsZXIuQ09SUkVDVF9QSU4pIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRGlnaXQoZGlnaXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQaW4ubGVuZ3RoID49IDQpIHJldHVybjtcblxuICAgIHRoaXMuY3VycmVudFBpbiArPSBkaWdpdDtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcblxuICAgIC8vIEF1dG8tdmVyaWZ5IHdoZW4gNCBkaWdpdHMgZW50ZXJlZFxuICAgIGlmICh0aGlzLmN1cnJlbnRQaW4ubGVuZ3RoID09PSA0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudmVyaWZ5KCksIDIwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEaWdpdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGluLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudFBpbiA9IHRoaXMuY3VycmVudFBpbi5zbGljZSgwLCAtMSk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUGluKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBpbiA9ICcnO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBLZXlwYWQgY2xpY2sgaGFuZGxlclxuICAgIHRoaXMucGluS2V5cGFkPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB0aGlzLmhhbmRsZUtleXBhZENsaWNrKGUpKTtcblxuICAgIC8vIEtleWJvYXJkIGlucHV0XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB0aGlzLmhhbmRsZUtleWJvYXJkKGUpKTtcblxuICAgIC8vIExvY2sgYnV0dG9uIGluIHNpZGViYXJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50Pignc3dwLXNpZGUtbWVudS1hY3Rpb24ubG9jaycpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zaG93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlwYWRDbGljayhlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGtleSA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXBpbi1rZXknKTtcblxuICAgIGlmICgha2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBkaWdpdCA9IGtleS5kYXRhc2V0LmRpZ2l0O1xuICAgIGNvbnN0IGFjdGlvbiA9IGtleS5kYXRhc2V0LmFjdGlvbjtcblxuICAgIGlmIChkaWdpdCkge1xuICAgICAgdGhpcy5hZGREaWdpdChkaWdpdCk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdiYWNrc3BhY2UnKSB7XG4gICAgICB0aGlzLnJlbW92ZURpZ2l0KCk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdjbGVhcicpIHtcbiAgICAgIHRoaXMuY2xlYXJQaW4oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleWJvYXJkKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUpIHJldHVybjtcblxuICAgIC8vIFByZXZlbnQgZGVmYXVsdCB0byBhdm9pZCBvdGhlciBpbnRlcmFjdGlvbnNcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoZS5rZXkgPj0gJzAnICYmIGUua2V5IDw9ICc5Jykge1xuICAgICAgdGhpcy5hZGREaWdpdChlLmtleSk7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcbiAgICAgIHRoaXMucmVtb3ZlRGlnaXQoKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgdGhpcy5jbGVhclBpbigpO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogS2Fzc2UgQ29udHJvbGxlclxuICpcbiAqIEhhbmRsZXMgdGFiIHN3aXRjaGluZywgY2FzaCBjYWxjdWxhdGlvbnMsIGFuZCBmb3JtIGludGVyYWN0aW9uc1xuICogZm9yIHRoZSBLYXNzZSAoQ2FzaCBSZWdpc3RlcikgcGFnZS5cbiAqL1xuXG5leHBvcnQgY2xhc3MgS2Fzc2VDb250cm9sbGVyIHtcbiAgLy8gQmFzZSB2YWx1ZXMgKGZyb20gc3lzdGVtIC0gd291bGQgY29tZSBmcm9tIHNlcnZlciBpbiByZWFsIGFwcClcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFydEJhbGFuY2UgPSAyMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGNhc2hTYWxlcyA9IDM1NDA7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXR1cFRhYnMoKTtcbiAgICB0aGlzLnNldHVwQ2FzaENhbGN1bGF0aW9uKCk7XG4gICAgdGhpcy5zZXR1cENoZWNrYm94U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5zZXR1cEFwcHJvdmFsQ2hlY2tib3goKTtcbiAgICB0aGlzLnNldHVwRGF0ZUZpbHRlcnMoKTtcbiAgICB0aGlzLnNldHVwUm93VG9nZ2xlKCk7XG4gICAgdGhpcy5zZXR1cERyYWZ0Um93Q2xpY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCB0YWIgc3dpdGNoaW5nIGZ1bmN0aW9uYWxpdHlcbiAgICovXG4gIHByaXZhdGUgc2V0dXBUYWJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3dwLXRhYltkYXRhLXRhYl0nKTtcblxuICAgIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgdGFiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUYWIgPSB0YWIuZGF0YXNldC50YWI7XG4gICAgICAgIGlmICh0YXJnZXRUYWIpIHtcbiAgICAgICAgICB0aGlzLnN3aXRjaFRvVGFiKHRhcmdldFRhYik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0byBhIHNwZWNpZmljIHRhYiBieSBuYW1lXG4gICAqL1xuICBwcml2YXRlIHN3aXRjaFRvVGFiKHRhcmdldFRhYjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdGFicyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzd3AtdGFiW2RhdGEtdGFiXScpO1xuICAgIGNvbnN0IGNvbnRlbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC10YWItY29udGVudFtkYXRhLXRhYl0nKTtcbiAgICBjb25zdCBzdGF0c0JhcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3dwLWthc3NlLXN0YXRzW2RhdGEtZm9yLXRhYl0nKTtcblxuICAgIC8vIFVwZGF0ZSB0YWIgc3RhdGVzXG4gICAgdGFicy5mb3JFYWNoKHQgPT4ge1xuICAgICAgaWYgKHQuZGF0YXNldC50YWIgPT09IHRhcmdldFRhYikge1xuICAgICAgICB0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBjb250ZW50IHZpc2liaWxpdHlcbiAgICBjb250ZW50cy5mb3JFYWNoKGNvbnRlbnQgPT4ge1xuICAgICAgaWYgKGNvbnRlbnQuZGF0YXNldC50YWIgPT09IHRhcmdldFRhYikge1xuICAgICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzdGF0cyBiYXIgdmlzaWJpbGl0eVxuICAgIHN0YXRzQmFycy5mb3JFYWNoKHN0YXRzID0+IHtcbiAgICAgIGlmIChzdGF0cy5kYXRhc2V0LmZvclRhYiA9PT0gdGFyZ2V0VGFiKSB7XG4gICAgICAgIHN0YXRzLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHMuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgY2FzaCBjYWxjdWxhdGlvbiB3aXRoIHJlYWwtdGltZSB1cGRhdGVzXG4gICAqL1xuICBwcml2YXRlIHNldHVwQ2FzaENhbGN1bGF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHBheW91dHNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXlvdXRzJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB0b0JhbmtJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b0JhbmsnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGFjdHVhbENhc2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY3R1YWxDYXNoJykgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgIGlmICghcGF5b3V0c0lucHV0IHx8ICF0b0JhbmtJbnB1dCB8fCAhYWN0dWFsQ2FzaElucHV0KSByZXR1cm47XG5cbiAgICBjb25zdCBjYWxjdWxhdGUgPSAoKSA9PiB0aGlzLmNhbGN1bGF0ZUNhc2gocGF5b3V0c0lucHV0LCB0b0JhbmtJbnB1dCwgYWN0dWFsQ2FzaElucHV0KTtcblxuICAgIHBheW91dHNJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNhbGN1bGF0ZSk7XG4gICAgdG9CYW5rSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBjYWxjdWxhdGUpO1xuICAgIGFjdHVhbENhc2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNhbGN1bGF0ZSk7XG5cbiAgICAvLyBJbml0aWFsIGNhbGN1bGF0aW9uXG4gICAgY2FsY3VsYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGV4cGVjdGVkIGNhc2ggYW5kIGRpZmZlcmVuY2VcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlQ2FzaChcbiAgICBwYXlvdXRzSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgdG9CYW5rSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgYWN0dWFsQ2FzaElucHV0OiBIVE1MSW5wdXRFbGVtZW50XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBheW91dHMgPSB0aGlzLnBhcnNlTnVtYmVyKHBheW91dHNJbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgdG9CYW5rID0gdGhpcy5wYXJzZU51bWJlcih0b0JhbmtJbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgYWN0dWFsID0gdGhpcy5wYXJzZU51bWJlcihhY3R1YWxDYXNoSW5wdXQudmFsdWUpO1xuXG4gICAgLy8gRXhwZWN0ZWQgPSBzdGFydCArIHNhbGVzIC0gcGF5b3V0cyAtIHRvIGJhbmtcbiAgICBjb25zdCBleHBlY3RlZENhc2ggPSB0aGlzLnN0YXJ0QmFsYW5jZSArIHRoaXMuY2FzaFNhbGVzIC0gcGF5b3V0cyAtIHRvQmFuaztcblxuICAgIGNvbnN0IGV4cGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHBlY3RlZENhc2gnKTtcbiAgICBpZiAoZXhwZWN0ZWRFbGVtZW50KSB7XG4gICAgICBleHBlY3RlZEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmZvcm1hdE51bWJlcihleHBlY3RlZENhc2gpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgZGlzcGxheSBkaWZmZXJlbmNlXG4gICAgdGhpcy51cGRhdGVEaWZmZXJlbmNlKGFjdHVhbCwgZXhwZWN0ZWRDYXNoLCBhY3R1YWxDYXNoSW5wdXQudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkaWZmZXJlbmNlIGJveCB3aXRoIGNvbG9yIGNvZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEaWZmZXJlbmNlKGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCByYXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpZmZlcmVuY2VCb3gnKTtcbiAgICBjb25zdCB2YWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWZmZXJlbmNlVmFsdWUnKTtcbiAgICBpZiAoIWJveCB8fCAhdmFsdWUpIHJldHVybjtcblxuICAgIGNvbnN0IGRpZmYgPSBhY3R1YWwgLSBleHBlY3RlZDtcblxuICAgIC8vIFJlbW92ZSBhbGwgc3RhdGUgY2xhc3Nlc1xuICAgIGJveC5jbGFzc0xpc3QucmVtb3ZlKCdwb3NpdGl2ZScsICduZWdhdGl2ZScsICduZXV0cmFsJyk7XG5cbiAgICBpZiAoYWN0dWFsID09PSAwICYmIHJhd1ZhbHVlID09PSAnJykge1xuICAgICAgLy8gTm8gaW5wdXQgeWV0XG4gICAgICB2YWx1ZS50ZXh0Q29udGVudCA9ICdcdTIwMTMga3InO1xuICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ25ldXRyYWwnKTtcbiAgICB9IGVsc2UgaWYgKGRpZmYgPiAwKSB7XG4gICAgICAvLyBNb3JlIGNhc2ggdGhhbiBleHBlY3RlZFxuICAgICAgdmFsdWUudGV4dENvbnRlbnQgPSAnKycgKyB0aGlzLmZvcm1hdE51bWJlcihkaWZmKSArICcga3InO1xuICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ3Bvc2l0aXZlJyk7XG4gICAgfSBlbHNlIGlmIChkaWZmIDwgMCkge1xuICAgICAgLy8gTGVzcyBjYXNoIHRoYW4gZXhwZWN0ZWRcbiAgICAgIHZhbHVlLnRleHRDb250ZW50ID0gdGhpcy5mb3JtYXROdW1iZXIoZGlmZikgKyAnIGtyJztcbiAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCduZWdhdGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFeGFjdCBtYXRjaFxuICAgICAgdmFsdWUudGV4dENvbnRlbnQgPSAnMCwwMCBrcic7XG4gICAgICBib3guY2xhc3NMaXN0LmFkZCgnbmV1dHJhbCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBjaGVja2JveCBzZWxlY3Rpb24gZm9yIHRhYmxlIHJvd3NcbiAgICovXG4gIHByaXZhdGUgc2V0dXBDaGVja2JveFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RBbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0QWxsJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCByb3dDaGVja2JveGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MSW5wdXRFbGVtZW50PignLnJvdy1zZWxlY3QnKTtcbiAgICBjb25zdCBleHBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwb3J0QnRuJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3Qgc2VsZWN0aW9uQ291bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0aW9uQ291bnQnKTtcblxuICAgIGlmICghc2VsZWN0QWxsIHx8ICFleHBvcnRCdG4gfHwgIXNlbGVjdGlvbkNvdW50KSByZXR1cm47XG5cbiAgICBjb25zdCB1cGRhdGVTZWxlY3Rpb24gPSAoKSA9PiB7XG4gICAgICBjb25zdCBjaGVja2VkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MSW5wdXRFbGVtZW50PignLnJvdy1zZWxlY3Q6Y2hlY2tlZCcpO1xuICAgICAgY29uc3QgY291bnQgPSBjaGVja2VkLmxlbmd0aDtcblxuICAgICAgc2VsZWN0aW9uQ291bnQudGV4dENvbnRlbnQgPSBjb3VudCA9PT0gMCA/ICcwIHZhbGd0JyA6IGAke2NvdW50fSB2YWxndGA7XG4gICAgICBleHBvcnRCdG4uZGlzYWJsZWQgPSBjb3VudCA9PT0gMDtcblxuICAgICAgLy8gVXBkYXRlIHNlbGVjdCBhbGwgc3RhdGVcbiAgICAgIHNlbGVjdEFsbC5jaGVja2VkID0gY291bnQgPT09IHJvd0NoZWNrYm94ZXMubGVuZ3RoICYmIGNvdW50ID4gMDtcbiAgICAgIHNlbGVjdEFsbC5pbmRldGVybWluYXRlID0gY291bnQgPiAwICYmIGNvdW50IDwgcm93Q2hlY2tib3hlcy5sZW5ndGg7XG4gICAgfTtcblxuICAgIHNlbGVjdEFsbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICByb3dDaGVja2JveGVzLmZvckVhY2goY2IgPT4gY2IuY2hlY2tlZCA9IHNlbGVjdEFsbC5jaGVja2VkKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGlvbigpO1xuICAgIH0pO1xuXG4gICAgcm93Q2hlY2tib3hlcy5mb3JFYWNoKGNiID0+IHtcbiAgICAgIGNiLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZVNlbGVjdGlvbik7XG4gICAgICAvLyBTdG9wIGNsaWNrIGZyb20gYnViYmxpbmcgdG8gcm93XG4gICAgICBjYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgYXBwcm92YWwgY2hlY2tib3ggdG8gZW5hYmxlL2Rpc2FibGUgYXBwcm92ZSBidXR0b25cbiAgICovXG4gIHByaXZhdGUgc2V0dXBBcHByb3ZhbENoZWNrYm94KCk6IHZvaWQge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1DaGVja2JveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgYXBwcm92ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHByb3ZlQnRuJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cbiAgICBpZiAoIWNoZWNrYm94IHx8ICFhcHByb3ZlQnRuKSByZXR1cm47XG5cbiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBhcHByb3ZlQnRuLmRpc2FibGVkID0gIWNoZWNrYm94LmNoZWNrZWQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgZGF0ZSBmaWx0ZXIgZGVmYXVsdHMgKGxhc3QgMzAgZGF5cylcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEYXRlRmlsdGVycygpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlRnJvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXRlRnJvbScpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZGF0ZVRvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RhdGVUbycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICBpZiAoIWRhdGVGcm9tIHx8ICFkYXRlVG8pIHJldHVybjtcblxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB0aGlydHlEYXlzQWdvID0gbmV3IERhdGUodG9kYXkpO1xuICAgIHRoaXJ0eURheXNBZ28uc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSAzMCk7XG5cbiAgICBkYXRlVG8udmFsdWUgPSB0aGlzLmZvcm1hdERhdGVJU08odG9kYXkpO1xuICAgIGRhdGVGcm9tLnZhbHVlID0gdGhpcy5mb3JtYXREYXRlSVNPKHRoaXJ0eURheXNBZ28pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBudW1iZXIgYXMgRGFuaXNoIGN1cnJlbmN5XG4gICAqL1xuICBwcml2YXRlIGZvcm1hdE51bWJlcihudW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG51bS50b0xvY2FsZVN0cmluZygnZGEtREsnLCB7XG4gICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIsXG4gICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDJcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBEYW5pc2ggbnVtYmVyIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZU51bWJlcihzdHI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCFzdHIpIHJldHVybiAwO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9cXC4vZywgJycpLnJlcGxhY2UoJywnLCAnLicpKSB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRlIGFzIElTTyBzdHJpbmcgKFlZWVktTU0tREQpXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdERhdGVJU08oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHJvdyB0b2dnbGUgZm9yIGV4cGFuZGFibGUgZGV0YWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFJvd1RvZ2dsZSgpOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC1rYXNzZS10YWJsZS1yb3dbZGF0YS1pZF06bm90KC5kcmFmdC1yb3cpJyk7XG5cbiAgICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgIGNvbnN0IHJvd0lkID0gcm93LmdldEF0dHJpYnV0ZSgnZGF0YS1pZCcpO1xuICAgICAgaWYgKCFyb3dJZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZXRhaWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50Pihgc3dwLWthc3NlLXJvdy1kZXRhaWxbZGF0YS1mb3I9XCIke3Jvd0lkfVwiXWApO1xuICAgICAgaWYgKCFkZXRhaWwpIHJldHVybjtcblxuICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgdG9nZ2xlIGlmIGNsaWNraW5nIG9uIGNoZWNrYm94XG4gICAgICAgIGlmICgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaWNvbiA9IHJvdy5xdWVyeVNlbGVjdG9yKCdzd3Atcm93LXRvZ2dsZSBpJyk7XG4gICAgICAgIGNvbnN0IGlzRXhwYW5kZWQgPSByb3cuY2xhc3NMaXN0LmNvbnRhaW5zKCdleHBhbmRlZCcpO1xuXG4gICAgICAgIC8vIENsb3NlIG90aGVyIGV4cGFuZGVkIHJvd3NcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3dwLWthc3NlLXRhYmxlLXJvdy5leHBhbmRlZCcpLmZvckVhY2gociA9PiB7XG4gICAgICAgICAgaWYgKHIgIT09IHJvdykge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJJZCA9IHIuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJyk7XG4gICAgICAgICAgICBpZiAob3RoZXJJZCkge1xuICAgICAgICAgICAgICBjb25zdCBvdGhlckRldGFpbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBzd3Ata2Fzc2Utcm93LWRldGFpbFtkYXRhLWZvcj1cIiR7b3RoZXJJZH1cIl1gKTtcbiAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJY29uID0gci5xdWVyeVNlbGVjdG9yKCdzd3Atcm93LXRvZ2dsZSBpJyk7XG4gICAgICAgICAgICAgIGlmIChvdGhlckRldGFpbCAmJiBvdGhlckljb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlUm93KHIsIG90aGVyRGV0YWlsLCBvdGhlckljb24gYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUb2dnbGUgY3VycmVudCByb3dcbiAgICAgICAgaWYgKGlzRXhwYW5kZWQpIHtcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlUm93KHJvdywgZGV0YWlsLCBpY29uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmV4cGFuZFJvdyhyb3csIGRldGFpbCwgaWNvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZCBhIHJvdyB3aXRoIGFuaW1hdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBleHBhbmRSb3cocm93OiBFbGVtZW50LCBkZXRhaWw6IEhUTUxFbGVtZW50LCBpY29uOiBFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIHJvdy5jbGFzc0xpc3QuYWRkKCdleHBhbmRlZCcpO1xuICAgIGRldGFpbC5jbGFzc0xpc3QuYWRkKCdleHBhbmRlZCcpO1xuXG4gICAgLy8gQW5pbWF0ZSBpY29uIHJvdGF0aW9uXG4gICAgaWNvbj8uYW5pbWF0ZShbXG4gICAgICB7IHRyYW5zZm9ybTogJ3JvdGF0ZSgwZGVnKScgfSxcbiAgICAgIHsgdHJhbnNmb3JtOiAncm90YXRlKDkwZGVnKScgfVxuICAgIF0sIHtcbiAgICAgIGR1cmF0aW9uOiAyMDAsXG4gICAgICBlYXNpbmc6ICdlYXNlLW91dCcsXG4gICAgICBmaWxsOiAnZm9yd2FyZHMnXG4gICAgfSk7XG5cbiAgICAvLyBBbmltYXRlIGRldGFpbCBleHBhbnNpb25cbiAgICBjb25zdCBjb250ZW50ID0gZGV0YWlsLnF1ZXJ5U2VsZWN0b3IoJ3N3cC1yb3ctZGV0YWlsLWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gY29udGVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICBkZXRhaWwuYW5pbWF0ZShbXG4gICAgICAgIHsgaGVpZ2h0OiAnMHB4Jywgb3BhY2l0eTogMCB9LFxuICAgICAgICB7IGhlaWdodDogYCR7aGVpZ2h0fXB4YCwgb3BhY2l0eTogMSB9XG4gICAgICBdLCB7XG4gICAgICAgIGR1cmF0aW9uOiAyNTAsXG4gICAgICAgIGVhc2luZzogJ2Vhc2Utb3V0JyxcbiAgICAgICAgZmlsbDogJ2ZvcndhcmRzJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxhcHNlIGEgcm93IHdpdGggYW5pbWF0aW9uXG4gICAqL1xuICBwcml2YXRlIGNvbGxhcHNlUm93KHJvdzogRWxlbWVudCwgZGV0YWlsOiBIVE1MRWxlbWVudCwgaWNvbjogRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBBbmltYXRlIGljb24gcm90YXRpb25cbiAgICBpY29uPy5hbmltYXRlKFtcbiAgICAgIHsgdHJhbnNmb3JtOiAncm90YXRlKDkwZGVnKScgfSxcbiAgICAgIHsgdHJhbnNmb3JtOiAncm90YXRlKDBkZWcpJyB9XG4gICAgXSwge1xuICAgICAgZHVyYXRpb246IDIwMCxcbiAgICAgIGVhc2luZzogJ2Vhc2Utb3V0JyxcbiAgICAgIGZpbGw6ICdmb3J3YXJkcydcbiAgICB9KTtcblxuICAgIC8vIEFuaW1hdGUgZGV0YWlsIGNvbGxhcHNlXG4gICAgY29uc3QgY29udGVudCA9IGRldGFpbC5xdWVyeVNlbGVjdG9yKCdzd3Atcm93LWRldGFpbC1jb250ZW50JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRlbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgY29uc3QgYW5pbWF0aW9uID0gZGV0YWlsLmFuaW1hdGUoW1xuICAgICAgICB7IGhlaWdodDogYCR7aGVpZ2h0fXB4YCwgb3BhY2l0eTogMSB9LFxuICAgICAgICB7IGhlaWdodDogJzBweCcsIG9wYWNpdHk6IDAgfVxuICAgICAgXSwge1xuICAgICAgICBkdXJhdGlvbjogMjAwLFxuICAgICAgICBlYXNpbmc6ICdlYXNlLW91dCcsXG4gICAgICAgIGZpbGw6ICdmb3J3YXJkcydcbiAgICAgIH0pO1xuXG4gICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoKSA9PiB7XG4gICAgICAgIHJvdy5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmRlZCcpO1xuICAgICAgICBkZXRhaWwuY2xhc3NMaXN0LnJlbW92ZSgnZXhwYW5kZWQnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvdy5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmRlZCcpO1xuICAgICAgZGV0YWlsLmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIGRyYWZ0IHJvdyBjbGljayB0byBuYXZpZ2F0ZSB0byBLYXNzZWFmc3RlbW5pbmcgdGFiXG4gICAqL1xuICBwcml2YXRlIHNldHVwRHJhZnRSb3dDbGljaygpOiB2b2lkIHtcbiAgICBjb25zdCBkcmFmdFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdzd3Ata2Fzc2UtdGFibGUtcm93LmRyYWZ0LXJvdycpO1xuICAgIGlmICghZHJhZnRSb3cpIHJldHVybjtcblxuICAgIGRyYWZ0Um93LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICBkcmFmdFJvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAvLyBEb24ndCBuYXZpZ2F0ZSBpZiBjbGlja2luZyBvbiBjaGVja2JveFxuICAgICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykpIHJldHVybjtcblxuICAgICAgdGhpcy5zd2l0Y2hUb1RhYignYWZzdGVtbmluZycpO1xuICAgIH0pO1xuICB9XG59XG4iLCAiLyoqXG4gKiBTYWxvbiBPUyBBcHBcbiAqXG4gKiBNYWluIGFwcGxpY2F0aW9uIGNsYXNzIHRoYXQgb3JjaGVzdHJhdGVzIGFsbCBVSSBjb250cm9sbGVyc1xuICovXG5cbmltcG9ydCB7IFNpZGViYXJDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL3NpZGViYXInO1xuaW1wb3J0IHsgRHJhd2VyQ29udHJvbGxlciB9IGZyb20gJy4vbW9kdWxlcy9kcmF3ZXJzJztcbmltcG9ydCB7IFRoZW1lQ29udHJvbGxlciB9IGZyb20gJy4vbW9kdWxlcy90aGVtZSc7XG5pbXBvcnQgeyBTZWFyY2hDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL3NlYXJjaCc7XG5pbXBvcnQgeyBMb2NrU2NyZWVuQ29udHJvbGxlciB9IGZyb20gJy4vbW9kdWxlcy9sb2Nrc2NyZWVuJztcbmltcG9ydCB7IEthc3NlQ29udHJvbGxlciB9IGZyb20gJy4vbW9kdWxlcy9rYXNzZSc7XG5cbi8qKlxuICogTWFpbiBhcHBsaWNhdGlvbiBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgcmVhZG9ubHkgc2lkZWJhcjogU2lkZWJhckNvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGRyYXdlcnM6IERyYXdlckNvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IHRoZW1lOiBUaGVtZUNvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IHNlYXJjaDogU2VhcmNoQ29udHJvbGxlcjtcbiAgcmVhZG9ubHkgbG9ja1NjcmVlbjogTG9ja1NjcmVlbkNvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGthc3NlOiBLYXNzZUNvbnRyb2xsZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBjb250cm9sbGVyc1xuICAgIHRoaXMuc2lkZWJhciA9IG5ldyBTaWRlYmFyQ29udHJvbGxlcigpO1xuICAgIHRoaXMuZHJhd2VycyA9IG5ldyBEcmF3ZXJDb250cm9sbGVyKCk7XG4gICAgdGhpcy50aGVtZSA9IG5ldyBUaGVtZUNvbnRyb2xsZXIoKTtcbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2hDb250cm9sbGVyKCk7XG4gICAgdGhpcy5sb2NrU2NyZWVuID0gbmV3IExvY2tTY3JlZW5Db250cm9sbGVyKHRoaXMuZHJhd2Vycyk7XG4gICAgdGhpcy5rYXNzZSA9IG5ldyBLYXNzZUNvbnRyb2xsZXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIEdsb2JhbCBhcHAgaW5zdGFuY2VcbiAqL1xubGV0IGFwcDogQXBwO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIGluaXQoKTogdm9pZCB7XG4gIGFwcCA9IG5ldyBBcHAoKTtcblxuICAvLyBFeHBvc2UgdG8gd2luZG93IGZvciBkZWJ1Z2dpbmdcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgKHdpbmRvdyBhcyB1bmtub3duIGFzIHsgYXBwOiBBcHAgfSkuYXBwID0gYXBwO1xuICB9XG59XG5cbi8vIFdhaXQgZm9yIERPTSByZWFkeVxuaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7XG59IGVsc2Uge1xuICBpbml0KCk7XG59XG5cbmV4cG9ydCB7IGFwcCB9O1xuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7OztBQU1PLElBQU0scUJBQU4sTUFBTSxtQkFBa0I7QUFBQSxFQUs3QixjQUFjO0FBSmQsU0FBUSxhQUFpQztBQUN6QyxTQUFRLFlBQWdDO0FBQ3hDLFNBQVEsY0FBa0M7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 +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdHMvbW9kdWxlcy9zaWRlYmFyLnRzIiwgIi4uL3RzL21vZHVsZXMvZHJhd2Vycy50cyIsICIuLi90cy9tb2R1bGVzL3RoZW1lLnRzIiwgIi4uL3RzL21vZHVsZXMvc2VhcmNoLnRzIiwgIi4uL3RzL21vZHVsZXMvbG9ja3NjcmVlbi50cyIsICIuLi90cy9tb2R1bGVzL2Nhc2gudHMiLCAiLi4vdHMvYXBwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIFNpZGViYXIgQ29udHJvbGxlclxuICpcbiAqIEhhbmRsZXMgc2lkZWJhciBjb2xsYXBzZS9leHBhbmQgYW5kIHRvb2x0aXAgZnVuY3Rpb25hbGl0eVxuICovXG5cbmV4cG9ydCBjbGFzcyBTaWRlYmFyQ29udHJvbGxlciB7XG4gIHByaXZhdGUgbWVudVRvZ2dsZTogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhcHBMYXlvdXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVudVRvb2x0aXA6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tZW51VG9nZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lbnVUb2dnbGUnKTtcbiAgICB0aGlzLmFwcExheW91dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N3cC1hcHAtbGF5b3V0Jyk7XG4gICAgdGhpcy5tZW51VG9vbHRpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZW51VG9vbHRpcCcpO1xuXG4gICAgdGhpcy5zZXR1cExpc3RlbmVycygpO1xuICAgIHRoaXMuc2V0dXBUb29sdGlwcygpO1xuICAgIHRoaXMucmVzdG9yZVN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc2lkZWJhciBpcyBjb2xsYXBzZWRcbiAgICovXG4gIGdldCBpc0NvbGxhcHNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcHBMYXlvdXQ/LmNsYXNzTGlzdC5jb250YWlucygnbWVudS1jb2xsYXBzZWQnKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgc2lkZWJhciBjb2xsYXBzZWQgc3RhdGVcbiAgICovXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXBwTGF5b3V0KSByZXR1cm47XG5cbiAgICB0aGlzLmFwcExheW91dC5jbGFzc0xpc3QudG9nZ2xlKCdtZW51LWNvbGxhcHNlZCcpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzaWRlYmFyLWNvbGxhcHNlZCcsIFN0cmluZyh0aGlzLmlzQ29sbGFwc2VkKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGFwc2UgdGhlIHNpZGViYXJcbiAgICovXG4gIGNvbGxhcHNlKCk6IHZvaWQge1xuICAgIHRoaXMuYXBwTGF5b3V0Py5jbGFzc0xpc3QuYWRkKCdtZW51LWNvbGxhcHNlZCcpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzaWRlYmFyLWNvbGxhcHNlZCcsICd0cnVlJyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kIHRoZSBzaWRlYmFyXG4gICAqL1xuICBleHBhbmQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBMYXlvdXQ/LmNsYXNzTGlzdC5yZW1vdmUoJ21lbnUtY29sbGFwc2VkJyk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3NpZGViYXItY29sbGFwc2VkJywgJ2ZhbHNlJyk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubWVudVRvZ2dsZT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnRvZ2dsZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUb29sdGlwcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWVudVRvb2x0aXApIHJldHVybjtcblxuICAgIGNvbnN0IG1lbnVJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzd3Atc2lkZS1tZW51LWl0ZW1bZGF0YS10b29sdGlwXScpO1xuXG4gICAgbWVudUl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLnNob3dUb29sdGlwKGl0ZW0pKTtcbiAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHRoaXMuaGlkZVRvb2x0aXAoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dUb29sdGlwKGl0ZW06IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQ29sbGFwc2VkIHx8ICF0aGlzLm1lbnVUb29sdGlwKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0b29sdGlwVGV4dCA9IGl0ZW0uZGF0YXNldC50b29sdGlwO1xuXG4gICAgaWYgKCF0b29sdGlwVGV4dCkgcmV0dXJuO1xuXG4gICAgdGhpcy5tZW51VG9vbHRpcC50ZXh0Q29udGVudCA9IHRvb2x0aXBUZXh0O1xuICAgIHRoaXMubWVudVRvb2x0aXAuc3R5bGUubGVmdCA9IGAke3JlY3QucmlnaHQgKyA4fXB4YDtcbiAgICB0aGlzLm1lbnVUb29sdGlwLnN0eWxlLnRvcCA9IGAke3JlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyfXB4YDtcbiAgICB0aGlzLm1lbnVUb29sdGlwLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC01MCUpJztcbiAgICB0aGlzLm1lbnVUb29sdGlwLnNob3dQb3BvdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVUb29sdGlwKCk6IHZvaWQge1xuICAgIHRoaXMubWVudVRvb2x0aXA/LmhpZGVQb3BvdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXBwTGF5b3V0KSByZXR1cm47XG5cbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NpZGViYXItY29sbGFwc2VkJykgPT09ICd0cnVlJykge1xuICAgICAgdGhpcy5hcHBMYXlvdXQuY2xhc3NMaXN0LmFkZCgnbWVudS1jb2xsYXBzZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIERyYXdlciBDb250cm9sbGVyXG4gKlxuICogSGFuZGxlcyBhbGwgZHJhd2VyIGZ1bmN0aW9uYWxpdHkgaW5jbHVkaW5nIHByb2ZpbGUsIG5vdGlmaWNhdGlvbnMsIGFuZCB0b2RvIGRyYXdlcnNcbiAqL1xuXG5leHBvcnQgdHlwZSBEcmF3ZXJOYW1lID0gJ3Byb2ZpbGUnIHwgJ25vdGlmaWNhdGlvbicgfCAndG9kbycgfCAnbmV3VG9kbyc7XG5cbmV4cG9ydCBjbGFzcyBEcmF3ZXJDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBwcm9maWxlRHJhd2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbkRyYXdlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0b2RvRHJhd2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG5ld1RvZG9EcmF3ZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb3ZlcmxheTogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhY3RpdmVEcmF3ZXI6IERyYXdlck5hbWUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhY3RpdmVHZW5lcmljRHJhd2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvZmlsZURyYXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9maWxlRHJhd2VyJyk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25EcmF3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uRHJhd2VyJyk7XG4gICAgdGhpcy50b2RvRHJhd2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZG9EcmF3ZXInKTtcbiAgICB0aGlzLm5ld1RvZG9EcmF3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3VG9kb0RyYXdlcicpO1xuICAgIHRoaXMub3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcmF3ZXJPdmVybGF5Jyk7XG5cbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5zZXR1cEdlbmVyaWNEcmF3ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnRseSBhY3RpdmUgZHJhd2VyIG5hbWVcbiAgICovXG4gIGdldCBhY3RpdmUoKTogRHJhd2VyTmFtZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZURyYXdlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZHJhd2VyIGJ5IG5hbWVcbiAgICovXG4gIG9wZW4obmFtZTogRHJhd2VyTmFtZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBbGwoKTtcblxuICAgIGNvbnN0IGRyYXdlciA9IHRoaXMuZ2V0RHJhd2VyKG5hbWUpO1xuICAgIGlmIChkcmF3ZXIgJiYgdGhpcy5vdmVybGF5KSB7XG4gICAgICBkcmF3ZXIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICB0aGlzLm92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICB0aGlzLmFjdGl2ZURyYXdlciA9IG5hbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGEgc3BlY2lmaWMgZHJhd2VyXG4gICAqL1xuICBjbG9zZShuYW1lOiBEcmF3ZXJOYW1lKTogdm9pZCB7XG4gICAgY29uc3QgZHJhd2VyID0gdGhpcy5nZXREcmF3ZXIobmFtZSk7XG4gICAgZHJhd2VyPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICAgIC8vIE9ubHkgaGlkZSBvdmVybGF5IGlmIG5vIGRyYXdlcnMgYXJlIGFjdGl2ZVxuICAgIGlmICh0aGlzLm92ZXJsYXkgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmVbY2xhc3MqPVwiZHJhd2VyXCJdJykpIHtcbiAgICAgIHRoaXMub3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVEcmF3ZXIgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMuYWN0aXZlRHJhd2VyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYWxsIGRyYXdlcnNcbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIFt0aGlzLnByb2ZpbGVEcmF3ZXIsIHRoaXMubm90aWZpY2F0aW9uRHJhd2VyLCB0aGlzLnRvZG9EcmF3ZXIsIHRoaXMubmV3VG9kb0RyYXdlcl1cbiAgICAgIC5mb3JFYWNoKGRyYXdlciA9PiBkcmF3ZXI/LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcblxuICAgIC8vIENsb3NlIGFueSBnZW5lcmljIGRyYXdlcnNcbiAgICB0aGlzLmNsb3NlR2VuZXJpY0RyYXdlcigpO1xuXG4gICAgdGhpcy5vdmVybGF5Py5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgdGhpcy5hY3RpdmVEcmF3ZXIgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gYSBnZW5lcmljIGRyYXdlciBieSBJRFxuICAgKi9cbiAgb3BlbkdlbmVyaWNEcmF3ZXIoZHJhd2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBbGwoKTtcblxuICAgIGNvbnN0IGRyYXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRyYXdlcklkKTtcbiAgICBpZiAoZHJhd2VyICYmIHRoaXMub3ZlcmxheSkge1xuICAgICAgZHJhd2VyLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTtcbiAgICAgIHRoaXMub3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgIHRoaXMuYWN0aXZlR2VuZXJpY0RyYXdlciA9IGRyYXdlcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGN1cnJlbnRseSBvcGVuIGdlbmVyaWMgZHJhd2VyXG4gICAqL1xuICBjbG9zZUdlbmVyaWNEcmF3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVHZW5lcmljRHJhd2VyPy5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG4gICAgdGhpcy5hY3RpdmVHZW5lcmljRHJhd2VyID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHByb2ZpbGUgZHJhd2VyXG4gICAqL1xuICBvcGVuUHJvZmlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4oJ3Byb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIG5vdGlmaWNhdGlvbiBkcmF3ZXJcbiAgICovXG4gIG9wZW5Ob3RpZmljYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuKCdub3RpZmljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRvZG8gZHJhd2VyIChzbGlkZXMgb24gdG9wIG9mIHByb2ZpbGUpXG4gICAqL1xuICBvcGVuVG9kbygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZG9EcmF3ZXI/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRvZG8gZHJhd2VyXG4gICAqL1xuICBjbG9zZVRvZG8oKTogdm9pZCB7XG4gICAgdGhpcy50b2RvRHJhd2VyPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB0aGlzLmNsb3NlTmV3VG9kbygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gbmV3IHRvZG8gZHJhd2VyXG4gICAqL1xuICBvcGVuTmV3VG9kbygpOiB2b2lkIHtcbiAgICB0aGlzLm5ld1RvZG9EcmF3ZXI/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIG5ldyB0b2RvIGRyYXdlclxuICAgKi9cbiAgY2xvc2VOZXdUb2RvKCk6IHZvaWQge1xuICAgIHRoaXMubmV3VG9kb0RyYXdlcj8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cblxuICAvKipcbiAgICogTWFyayBhbGwgbm90aWZpY2F0aW9ucyBhcyByZWFkXG4gICAqL1xuICBtYXJrQWxsTm90aWZpY2F0aW9uc1JlYWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5vdGlmaWNhdGlvbkRyYXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgdW5yZWFkSXRlbXMgPSB0aGlzLm5vdGlmaWNhdGlvbkRyYXdlci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICAgICdzd3Atbm90aWZpY2F0aW9uLWl0ZW1bZGF0YS11bnJlYWQ9XCJ0cnVlXCJdJ1xuICAgICk7XG4gICAgdW5yZWFkSXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXVucmVhZCcpKTtcblxuICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ3N3cC1ub3RpZmljYXRpb24tYmFkZ2UnKTtcbiAgICBpZiAoYmFkZ2UpIHtcbiAgICAgIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREcmF3ZXIobmFtZTogRHJhd2VyTmFtZSk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdwcm9maWxlJzogcmV0dXJuIHRoaXMucHJvZmlsZURyYXdlcjtcbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbic6IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbkRyYXdlcjtcbiAgICAgIGNhc2UgJ3RvZG8nOiByZXR1cm4gdGhpcy50b2RvRHJhd2VyO1xuICAgICAgY2FzZSAnbmV3VG9kbyc6IHJldHVybiB0aGlzLm5ld1RvZG9EcmF3ZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBQcm9maWxlIGRyYXdlciB0cmlnZ2Vyc1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9maWxlVHJpZ2dlcicpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5vcGVuUHJvZmlsZSgpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2VyQ2xvc2UnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoJ3Byb2ZpbGUnKSk7XG5cbiAgICAvLyBOb3RpZmljYXRpb24gZHJhd2VyIHRyaWdnZXJzXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnNCdG4nKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3Blbk5vdGlmaWNhdGlvbigpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uRHJhd2VyQ2xvc2UnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoJ25vdGlmaWNhdGlvbicpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFya0FsbFJlYWQnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMubWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkKCkpO1xuXG4gICAgLy8gVG9kbyBkcmF3ZXIgdHJpZ2dlcnNcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BlblRvZG9EcmF3ZXInKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3BlblRvZG8oKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZG9EcmF3ZXJCYWNrJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlVG9kbygpKTtcblxuICAgIC8vIE5ldyB0b2RvIGRyYXdlciB0cmlnZ2Vyc1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGRUb2RvQnRuJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLm9wZW5OZXdUb2RvKCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXdUb2RvRHJhd2VyQmFjaycpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZU5ld1RvZG8oKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbE5ld1RvZG8nKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2VOZXdUb2RvKCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlTmV3VG9kbycpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZU5ld1RvZG8oKSk7XG5cbiAgICAvLyBPdmVybGF5IGNsaWNrIGNsb3NlcyBhbGxcbiAgICB0aGlzLm92ZXJsYXk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZUFsbCgpKTtcblxuICAgIC8vIEVzY2FwZSBrZXkgY2xvc2VzIGFsbFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5jbG9zZUFsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVG9kbyBpbnRlcmFjdGlvbnNcbiAgICB0aGlzLnRvZG9EcmF3ZXI/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlVG9kb0NsaWNrKGUpKTtcblxuICAgIC8vIFZpc2liaWxpdHkgb3B0aW9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlVmlzaWJpbGl0eUNsaWNrKGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG9kb0NsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgdG9kb0l0ZW0gPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10b2RvLWl0ZW0nKTtcbiAgICBjb25zdCBjaGVja2JveCA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXRvZG8tY2hlY2tib3gnKTtcblxuICAgIGlmIChjaGVja2JveCAmJiB0b2RvSXRlbSkge1xuICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSB0b2RvSXRlbS5kYXRhc2V0LmNvbXBsZXRlZCA9PT0gJ3RydWUnO1xuICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICAgIHRvZG9JdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jb21wbGV0ZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvZG9JdGVtLmRhdGFzZXQuY29tcGxldGVkID0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvZ2dsZSBzZWN0aW9uIGNvbGxhcHNlXG4gICAgY29uc3Qgc2VjdGlvbkhlYWRlciA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXRvZG8tc2VjdGlvbi1oZWFkZXInKTtcbiAgICBpZiAoc2VjdGlvbkhlYWRlcikge1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25IZWFkZXIuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10b2RvLXNlY3Rpb24nKTtcbiAgICAgIHNlY3Rpb24/LmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVmlzaWJpbGl0eUNsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgb3B0aW9uID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdzd3AtdmlzaWJpbGl0eS1vcHRpb24nKTtcblxuICAgIGlmIChvcHRpb24pIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzd3AtdmlzaWJpbGl0eS1vcHRpb24nKVxuICAgICAgICAuZm9yRWFjaChvID0+IG8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgb3B0aW9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBnZW5lcmljIGRyYXdlciB0cmlnZ2VycyBhbmQgY2xvc2UgYnV0dG9uc1xuICAgKiBVc2VzIGRhdGEtZHJhd2VyLXRyaWdnZXI9XCJkcmF3ZXItaWRcIiBhbmQgZGF0YS1kcmF3ZXItY2xvc2UgYXR0cmlidXRlc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEdlbmVyaWNEcmF3ZXJzKCk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBkcmF3ZXIgdHJpZ2dlcnNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCB0cmlnZ2VyID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdbZGF0YS1kcmF3ZXItdHJpZ2dlcl0nKTtcblxuICAgICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgICAgY29uc3QgZHJhd2VySWQgPSB0cmlnZ2VyLmRhdGFzZXQuZHJhd2VyVHJpZ2dlcjtcbiAgICAgICAgaWYgKGRyYXdlcklkKSB7XG4gICAgICAgICAgdGhpcy5vcGVuR2VuZXJpY0RyYXdlcihkcmF3ZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBkcmF3ZXIgY2xvc2UgYnV0dG9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGNsb3NlQnRuID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdbZGF0YS1kcmF3ZXItY2xvc2VdJyk7XG5cbiAgICAgIGlmIChjbG9zZUJ0bikge1xuICAgICAgICB0aGlzLmNsb3NlR2VuZXJpY0RyYXdlcigpO1xuICAgICAgICB0aGlzLm92ZXJsYXk/LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIFRoZW1lIENvbnRyb2xsZXJcbiAqXG4gKiBIYW5kbGVzIGRhcmsvbGlnaHQgbW9kZSBzd2l0Y2hpbmcgYW5kIHN5c3RlbSBwcmVmZXJlbmNlIGRldGVjdGlvblxuICovXG5cbmV4cG9ydCB0eXBlIFRoZW1lID0gJ2xpZ2h0JyB8ICdkYXJrJyB8ICdzeXN0ZW0nO1xuXG5leHBvcnQgY2xhc3MgVGhlbWVDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9LRVkgPSAndGhlbWUtcHJlZmVyZW5jZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERBUktfQ0xBU1MgPSAnZGFyay1tb2RlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTElHSFRfQ0xBU1MgPSAnbGlnaHQtbW9kZSc7XG5cbiAgcHJpdmF0ZSByb290OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSB0aGVtZU9wdGlvbnM6IE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnRoZW1lT3B0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzd3AtdGhlbWUtb3B0aW9uJyk7XG5cbiAgICB0aGlzLmFwcGx5VGhlbWUodGhpcy5jdXJyZW50KTtcbiAgICB0aGlzLnVwZGF0ZVVJKCk7XG4gICAgdGhpcy5zZXR1cExpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB0aGVtZSBzZXR0aW5nXG4gICAqL1xuICBnZXQgY3VycmVudCgpOiBUaGVtZSB7XG4gICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oVGhlbWVDb250cm9sbGVyLlNUT1JBR0VfS0VZKSBhcyBUaGVtZSB8IG51bGw7XG4gICAgaWYgKHN0b3JlZCA9PT0gJ2RhcmsnIHx8IHN0b3JlZCA9PT0gJ2xpZ2h0JyB8fCBzdG9yZWQgPT09ICdzeXN0ZW0nKSB7XG4gICAgICByZXR1cm4gc3RvcmVkO1xuICAgIH1cbiAgICByZXR1cm4gJ3N5c3RlbSc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGFyayBtb2RlIGlzIGN1cnJlbnRseSBhY3RpdmVcbiAgICovXG4gIGdldCBpc0RhcmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm9vdC5jbGFzc0xpc3QuY29udGFpbnMoVGhlbWVDb250cm9sbGVyLkRBUktfQ0xBU1MpIHx8XG4gICAgICAodGhpcy5zeXN0ZW1QcmVmZXJzRGFyayAmJiAhdGhpcy5yb290LmNsYXNzTGlzdC5jb250YWlucyhUaGVtZUNvbnRyb2xsZXIuTElHSFRfQ0xBU1MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzeXN0ZW0gcHJlZmVycyBkYXJrIG1vZGVcbiAgICovXG4gIGdldCBzeXN0ZW1QcmVmZXJzRGFyaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGVtZSBhbmQgcGVyc2lzdCBwcmVmZXJlbmNlXG4gICAqL1xuICBzZXQodGhlbWU6IFRoZW1lKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oVGhlbWVDb250cm9sbGVyLlNUT1JBR0VfS0VZLCB0aGVtZSk7XG4gICAgdGhpcy5hcHBseVRoZW1lKHRoZW1lKTtcbiAgICB0aGlzLnVwZGF0ZVVJKCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGJldHdlZW4gbGlnaHQgYW5kIGRhcmsgdGhlbWVzXG4gICAqL1xuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXQodGhpcy5pc0RhcmsgPyAnbGlnaHQnIDogJ2RhcmsnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUaGVtZSh0aGVtZTogVGhlbWUpOiB2b2lkIHtcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZShUaGVtZUNvbnRyb2xsZXIuREFSS19DTEFTUywgVGhlbWVDb250cm9sbGVyLkxJR0hUX0NMQVNTKTtcblxuICAgIGlmICh0aGVtZSA9PT0gJ2RhcmsnKSB7XG4gICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChUaGVtZUNvbnRyb2xsZXIuREFSS19DTEFTUyk7XG4gICAgfSBlbHNlIGlmICh0aGVtZSA9PT0gJ2xpZ2h0Jykge1xuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoVGhlbWVDb250cm9sbGVyLkxJR0hUX0NMQVNTKTtcbiAgICB9XG4gICAgLy8gJ3N5c3RlbScgbGVhdmVzIGJvdGggY2xhc3NlcyBvZmYsIGxldHRpbmcgQ1NTIG1lZGlhIHF1ZXJ5IGhhbmRsZSBpdFxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVVSSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGhlbWVPcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBkYXJrQWN0aXZlID0gdGhpcy5pc0Rhcms7XG5cbiAgICB0aGlzLnRoZW1lT3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICBjb25zdCB0aGVtZSA9IG9wdGlvbi5kYXRhc2V0LnRoZW1lIGFzIFRoZW1lO1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSAodGhlbWUgPT09ICdkYXJrJyAmJiBkYXJrQWN0aXZlKSB8fCAodGhlbWUgPT09ICdsaWdodCcgJiYgIWRhcmtBY3RpdmUpO1xuICAgICAgb3B0aW9uLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGlzQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gVGhlbWUgb3B0aW9uIGNsaWNrc1xuICAgIHRoaXMudGhlbWVPcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgIG9wdGlvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB0aGlzLmhhbmRsZU9wdGlvbkNsaWNrKGUpKTtcbiAgICB9KTtcblxuICAgIC8vIFN5c3RlbSB0aGVtZSBjaGFuZ2VzXG4gICAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKVxuICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHRoaXMuaGFuZGxlU3lzdGVtQ2hhbmdlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVPcHRpb25DbGljayhlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IG9wdGlvbiA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXRoZW1lLW9wdGlvbicpO1xuXG4gICAgaWYgKG9wdGlvbikge1xuICAgICAgY29uc3QgdGhlbWUgPSBvcHRpb24uZGF0YXNldC50aGVtZSBhcyBUaGVtZTtcbiAgICAgIGlmICh0aGVtZSkge1xuICAgICAgICB0aGlzLnNldCh0aGVtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTeXN0ZW1DaGFuZ2UoKTogdm9pZCB7XG4gICAgLy8gT25seSByZWFjdCB0byBzeXN0ZW0gY2hhbmdlcyBpZiB3ZSdyZSB1c2luZyBzeXN0ZW0gcHJlZmVyZW5jZVxuICAgIGlmICh0aGlzLmN1cnJlbnQgPT09ICdzeXN0ZW0nKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVJKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBTZWFyY2ggQ29udHJvbGxlclxuICpcbiAqIEhhbmRsZXMgZ2xvYmFsIHNlYXJjaCBmdW5jdGlvbmFsaXR5IGFuZCBrZXlib2FyZCBzaG9ydGN1dHNcbiAqL1xuXG5leHBvcnQgY2xhc3MgU2VhcmNoQ29udHJvbGxlciB7XG4gIHByaXZhdGUgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnbG9iYWxTZWFyY2gnKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdzd3AtdG9wYmFyLXNlYXJjaCcpO1xuXG4gICAgdGhpcy5zZXR1cExpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHNlYXJjaCB2YWx1ZVxuICAgKi9cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQ/LnZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWFyY2ggdmFsdWVcbiAgICovXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlucHV0KSB7XG4gICAgICB0aGlzLmlucHV0LnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1cyB0aGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0Py5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJsdXIgdGhlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgYmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0Py5ibHVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBLZXlib2FyZCBzaG9ydGN1dHNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHRoaXMuaGFuZGxlS2V5Ym9hcmQoZSkpO1xuXG4gICAgLy8gSW5wdXQgaGFuZGxlcnNcbiAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB0aGlzLmhhbmRsZUlucHV0KGUpKTtcblxuICAgICAgLy8gUHJldmVudCBmb3JtIHN1Ym1pc3Npb24gaWYgd3JhcHBlZCBpbiBmb3JtXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5pbnB1dC5jbG9zZXN0KCdmb3JtJyk7XG4gICAgICBmb3JtPy5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZSkgPT4gdGhpcy5oYW5kbGVTdWJtaXQoZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5Ym9hcmQoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8vIENtZC9DdHJsICsgSyB0byBmb2N1cyBzZWFyY2hcbiAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAnaycpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFc2NhcGUgdG8gYmx1ciBzZWFyY2ggd2hlbiBmb2N1c2VkXG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmlucHV0KSB7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUlucHV0KGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBxdWVyeSA9IHRhcmdldC52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBFbWl0IGN1c3RvbSBldmVudCBmb3Igc2VhcmNoXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2FwcDpzZWFyY2gnLCB7XG4gICAgICBkZXRhaWw6IHsgcXVlcnkgfSxcbiAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Ym1pdChlOiBFdmVudCk6IHZvaWQge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFxdWVyeSkgcmV0dXJuO1xuXG4gICAgLy8gRW1pdCBjdXN0b20gZXZlbnQgZm9yIHNlYXJjaCBzdWJtaXRcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnYXBwOnNlYXJjaC1zdWJtaXQnLCB7XG4gICAgICBkZXRhaWw6IHsgcXVlcnkgfSxcbiAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICB9KSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIExvY2sgU2NyZWVuIENvbnRyb2xsZXJcbiAqXG4gKiBIYW5kbGVzIFBJTi1iYXNlZCBsb2NrIHNjcmVlbiBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHsgRHJhd2VyQ29udHJvbGxlciB9IGZyb20gJy4vZHJhd2Vycyc7XG5cbmV4cG9ydCBjbGFzcyBMb2NrU2NyZWVuQ29udHJvbGxlciB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENPUlJFQ1RfUElOID0gJzEyMzQnOyAvLyBEZW1vIFBJTlxuXG4gIHByaXZhdGUgbG9ja1NjcmVlbjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwaW5JbnB1dDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwaW5LZXlwYWQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9ja1RpbWVFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwaW5EaWdpdHM6IE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFBpbiA9ICcnO1xuICBwcml2YXRlIGRyYXdlcnM6IERyYXdlckNvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkcmF3ZXJzPzogRHJhd2VyQ29udHJvbGxlcikge1xuICAgIHRoaXMuZHJhd2VycyA9IGRyYXdlcnMgPz8gbnVsbDtcbiAgICB0aGlzLmxvY2tTY3JlZW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ja1NjcmVlbicpO1xuICAgIHRoaXMucGluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGluSW5wdXQnKTtcbiAgICB0aGlzLnBpbktleXBhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaW5LZXlwYWQnKTtcbiAgICB0aGlzLmxvY2tUaW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ja1RpbWUnKTtcbiAgICB0aGlzLnBpbkRpZ2l0cyA9IHRoaXMucGluSW5wdXQ/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzd3AtcGluLWRpZ2l0JykgPz8gbnVsbDtcblxuICAgIHRoaXMuc2V0dXBMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBsb2NrIHNjcmVlbiBpcyBhY3RpdmVcbiAgICovXG4gIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2NrU2NyZWVuPy5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIGxvY2sgc2NyZWVuXG4gICAqL1xuICBzaG93KCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd2Vycz8uY2xvc2VBbGwoKTtcblxuICAgIGlmICh0aGlzLmxvY2tTY3JlZW4pIHtcbiAgICAgIHRoaXMubG9ja1NjcmVlbi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRQaW4gPSAnJztcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcblxuICAgIC8vIFVwZGF0ZSBsb2NrIHRpbWVcbiAgICBpZiAodGhpcy5sb2NrVGltZUVsKSB7XG4gICAgICB0aGlzLmxvY2tUaW1lRWwudGV4dENvbnRlbnQgPSBgTFx1MDBFNXN0IGtsLiAke3RoaXMuZm9ybWF0VGltZSgpfWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIGxvY2sgc2NyZWVuXG4gICAqL1xuICBoaWRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvY2tTY3JlZW4pIHtcbiAgICAgIHRoaXMubG9ja1NjcmVlbi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRQaW4gPSAnJztcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VGltZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgaG91cnMgPSBub3cuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbWludXRlcyA9IG5vdy5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgJHtob3Vyc306JHttaW51dGVzfWA7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURpc3BsYXkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBpbkRpZ2l0cykgcmV0dXJuO1xuXG4gICAgdGhpcy5waW5EaWdpdHMuZm9yRWFjaCgoZGlnaXQsIGluZGV4KSA9PiB7XG4gICAgICBkaWdpdC5jbGFzc0xpc3QucmVtb3ZlKCdmaWxsZWQnLCAnZXJyb3InKTtcbiAgICAgIGlmIChpbmRleCA8IHRoaXMuY3VycmVudFBpbi5sZW5ndGgpIHtcbiAgICAgICAgZGlnaXQudGV4dENvbnRlbnQgPSAnXHUyMDIyJztcbiAgICAgICAgZGlnaXQuY2xhc3NMaXN0LmFkZCgnZmlsbGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWdpdC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93RXJyb3IoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBpbkRpZ2l0cykgcmV0dXJuO1xuXG4gICAgdGhpcy5waW5EaWdpdHMuZm9yRWFjaChkaWdpdCA9PiBkaWdpdC5jbGFzc0xpc3QuYWRkKCdlcnJvcicpKTtcblxuICAgIC8vIFNoYWtlIGFuaW1hdGlvblxuICAgIHRoaXMucGluSW5wdXQ/LmNsYXNzTGlzdC5hZGQoJ3NoYWtlJyk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFBpbiA9ICcnO1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gICAgICB0aGlzLnBpbklucHV0Py5jbGFzc0xpc3QucmVtb3ZlKCdzaGFrZScpO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGluID09PSBMb2NrU2NyZWVuQ29udHJvbGxlci5DT1JSRUNUX1BJTikge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGREaWdpdChkaWdpdDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBpbi5sZW5ndGggPj0gNCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyZW50UGluICs9IGRpZ2l0O1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuXG4gICAgLy8gQXV0by12ZXJpZnkgd2hlbiA0IGRpZ2l0cyBlbnRlcmVkXG4gICAgaWYgKHRoaXMuY3VycmVudFBpbi5sZW5ndGggPT09IDQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy52ZXJpZnkoKSwgMjAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURpZ2l0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQaW4ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50UGluID0gdGhpcy5jdXJyZW50UGluLnNsaWNlKDAsIC0xKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJQaW4oKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGluID0gJyc7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIC8vIEtleXBhZCBjbGljayBoYW5kbGVyXG4gICAgdGhpcy5waW5LZXlwYWQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlS2V5cGFkQ2xpY2soZSkpO1xuXG4gICAgLy8gS2V5Ym9hcmQgaW5wdXRcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHRoaXMuaGFuZGxlS2V5Ym9hcmQoZSkpO1xuXG4gICAgLy8gTG9jayBidXR0b24gaW4gc2lkZWJhclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdzd3Atc2lkZS1tZW51LWFjdGlvbi5sb2NrJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNob3coKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleXBhZENsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qga2V5ID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdzd3AtcGluLWtleScpO1xuXG4gICAgaWYgKCFrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpZ2l0ID0ga2V5LmRhdGFzZXQuZGlnaXQ7XG4gICAgY29uc3QgYWN0aW9uID0ga2V5LmRhdGFzZXQuYWN0aW9uO1xuXG4gICAgaWYgKGRpZ2l0KSB7XG4gICAgICB0aGlzLmFkZERpZ2l0KGRpZ2l0KTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2JhY2tzcGFjZScpIHtcbiAgICAgIHRoaXMucmVtb3ZlRGlnaXQoKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgdGhpcy5jbGVhclBpbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5Ym9hcmQoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IHRvIGF2b2lkIG90aGVyIGludGVyYWN0aW9uc1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChlLmtleSA+PSAnMCcgJiYgZS5rZXkgPD0gJzknKSB7XG4gICAgICB0aGlzLmFkZERpZ2l0KGUua2V5KTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnQmFja3NwYWNlJykge1xuICAgICAgdGhpcy5yZW1vdmVEaWdpdCgpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLmNsZWFyUGluKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBDYXNoIENvbnRyb2xsZXJcbiAqXG4gKiBIYW5kbGVzIHRhYiBzd2l0Y2hpbmcsIGNhc2ggY2FsY3VsYXRpb25zLCBhbmQgZm9ybSBpbnRlcmFjdGlvbnNcbiAqIGZvciB0aGUgQ2FzaCBSZWdpc3RlciBwYWdlLlxuICovXG5cbmV4cG9ydCBjbGFzcyBDYXNoQ29udHJvbGxlciB7XG4gIC8vIEJhc2UgdmFsdWVzIChmcm9tIHN5c3RlbSAtIHdvdWxkIGNvbWUgZnJvbSBzZXJ2ZXIgaW4gcmVhbCBhcHApXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRCYWxhbmNlID0gMjAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBjYXNoU2FsZXMgPSAzNTQwO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2V0dXBUYWJzKCk7XG4gICAgdGhpcy5zZXR1cENhc2hDYWxjdWxhdGlvbigpO1xuICAgIHRoaXMuc2V0dXBDaGVja2JveFNlbGVjdGlvbigpO1xuICAgIHRoaXMuc2V0dXBBcHByb3ZhbENoZWNrYm94KCk7XG4gICAgdGhpcy5zZXR1cERhdGVGaWx0ZXJzKCk7XG4gICAgdGhpcy5zZXR1cFJvd1RvZ2dsZSgpO1xuICAgIHRoaXMuc2V0dXBEcmFmdFJvd0NsaWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgdGFiIHN3aXRjaGluZyBmdW5jdGlvbmFsaXR5XG4gICAqL1xuICBwcml2YXRlIHNldHVwVGFicygpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC10YWJbZGF0YS10YWJdJyk7XG5cbiAgICB0YWJzLmZvckVhY2godGFiID0+IHtcbiAgICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0VGFiID0gdGFiLmRhdGFzZXQudGFiO1xuICAgICAgICBpZiAodGFyZ2V0VGFiKSB7XG4gICAgICAgICAgdGhpcy5zd2l0Y2hUb1RhYih0YXJnZXRUYWIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdG8gYSBzcGVjaWZpYyB0YWIgYnkgbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBzd2l0Y2hUb1RhYih0YXJnZXRUYWI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3dwLXRhYltkYXRhLXRhYl0nKTtcbiAgICBjb25zdCBjb250ZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzd3AtdGFiLWNvbnRlbnRbZGF0YS10YWJdJyk7XG4gICAgY29uc3Qgc3RhdHNCYXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC1jYXNoLXN0YXRzW2RhdGEtZm9yLXRhYl0nKTtcblxuICAgIC8vIFVwZGF0ZSB0YWIgc3RhdGVzXG4gICAgdGFicy5mb3JFYWNoKHQgPT4ge1xuICAgICAgaWYgKHQuZGF0YXNldC50YWIgPT09IHRhcmdldFRhYikge1xuICAgICAgICB0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBjb250ZW50IHZpc2liaWxpdHlcbiAgICBjb250ZW50cy5mb3JFYWNoKGNvbnRlbnQgPT4ge1xuICAgICAgaWYgKGNvbnRlbnQuZGF0YXNldC50YWIgPT09IHRhcmdldFRhYikge1xuICAgICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzdGF0cyBiYXIgdmlzaWJpbGl0eVxuICAgIHN0YXRzQmFycy5mb3JFYWNoKHN0YXRzID0+IHtcbiAgICAgIGlmIChzdGF0cy5kYXRhc2V0LmZvclRhYiA9PT0gdGFyZ2V0VGFiKSB7XG4gICAgICAgIHN0YXRzLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHMuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgY2FzaCBjYWxjdWxhdGlvbiB3aXRoIHJlYWwtdGltZSB1cGRhdGVzXG4gICAqL1xuICBwcml2YXRlIHNldHVwQ2FzaENhbGN1bGF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHBheW91dHNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXlvdXRzJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB0b0JhbmtJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b0JhbmsnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGFjdHVhbENhc2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY3R1YWxDYXNoJykgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgIGlmICghcGF5b3V0c0lucHV0IHx8ICF0b0JhbmtJbnB1dCB8fCAhYWN0dWFsQ2FzaElucHV0KSByZXR1cm47XG5cbiAgICBjb25zdCBjYWxjdWxhdGUgPSAoKSA9PiB0aGlzLmNhbGN1bGF0ZUNhc2gocGF5b3V0c0lucHV0LCB0b0JhbmtJbnB1dCwgYWN0dWFsQ2FzaElucHV0KTtcblxuICAgIHBheW91dHNJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNhbGN1bGF0ZSk7XG4gICAgdG9CYW5rSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBjYWxjdWxhdGUpO1xuICAgIGFjdHVhbENhc2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNhbGN1bGF0ZSk7XG5cbiAgICAvLyBJbml0aWFsIGNhbGN1bGF0aW9uXG4gICAgY2FsY3VsYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGV4cGVjdGVkIGNhc2ggYW5kIGRpZmZlcmVuY2VcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlQ2FzaChcbiAgICBwYXlvdXRzSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgdG9CYW5rSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgYWN0dWFsQ2FzaElucHV0OiBIVE1MSW5wdXRFbGVtZW50XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBheW91dHMgPSB0aGlzLnBhcnNlTnVtYmVyKHBheW91dHNJbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgdG9CYW5rID0gdGhpcy5wYXJzZU51bWJlcih0b0JhbmtJbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgYWN0dWFsID0gdGhpcy5wYXJzZU51bWJlcihhY3R1YWxDYXNoSW5wdXQudmFsdWUpO1xuXG4gICAgLy8gRXhwZWN0ZWQgPSBzdGFydCArIHNhbGVzIC0gcGF5b3V0cyAtIHRvIGJhbmtcbiAgICBjb25zdCBleHBlY3RlZENhc2ggPSB0aGlzLnN0YXJ0QmFsYW5jZSArIHRoaXMuY2FzaFNhbGVzIC0gcGF5b3V0cyAtIHRvQmFuaztcblxuICAgIGNvbnN0IGV4cGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHBlY3RlZENhc2gnKTtcbiAgICBpZiAoZXhwZWN0ZWRFbGVtZW50KSB7XG4gICAgICBleHBlY3RlZEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmZvcm1hdE51bWJlcihleHBlY3RlZENhc2gpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgZGlzcGxheSBkaWZmZXJlbmNlXG4gICAgdGhpcy51cGRhdGVEaWZmZXJlbmNlKGFjdHVhbCwgZXhwZWN0ZWRDYXNoLCBhY3R1YWxDYXNoSW5wdXQudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkaWZmZXJlbmNlIGJveCB3aXRoIGNvbG9yIGNvZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEaWZmZXJlbmNlKGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCByYXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpZmZlcmVuY2VCb3gnKTtcbiAgICBjb25zdCB2YWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWZmZXJlbmNlVmFsdWUnKTtcbiAgICBpZiAoIWJveCB8fCAhdmFsdWUpIHJldHVybjtcblxuICAgIGNvbnN0IGRpZmYgPSBhY3R1YWwgLSBleHBlY3RlZDtcblxuICAgIC8vIFJlbW92ZSBhbGwgc3RhdGUgY2xhc3Nlc1xuICAgIGJveC5jbGFzc0xpc3QucmVtb3ZlKCdwb3NpdGl2ZScsICduZWdhdGl2ZScsICduZXV0cmFsJyk7XG5cbiAgICBpZiAoYWN0dWFsID09PSAwICYmIHJhd1ZhbHVlID09PSAnJykge1xuICAgICAgLy8gTm8gaW5wdXQgeWV0XG4gICAgICB2YWx1ZS50ZXh0Q29udGVudCA9ICdcdTIwMTMga3InO1xuICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ25ldXRyYWwnKTtcbiAgICB9IGVsc2UgaWYgKGRpZmYgPiAwKSB7XG4gICAgICAvLyBNb3JlIGNhc2ggdGhhbiBleHBlY3RlZFxuICAgICAgdmFsdWUudGV4dENvbnRlbnQgPSAnKycgKyB0aGlzLmZvcm1hdE51bWJlcihkaWZmKSArICcga3InO1xuICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ3Bvc2l0aXZlJyk7XG4gICAgfSBlbHNlIGlmIChkaWZmIDwgMCkge1xuICAgICAgLy8gTGVzcyBjYXNoIHRoYW4gZXhwZWN0ZWRcbiAgICAgIHZhbHVlLnRleHRDb250ZW50ID0gdGhpcy5mb3JtYXROdW1iZXIoZGlmZikgKyAnIGtyJztcbiAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCduZWdhdGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFeGFjdCBtYXRjaFxuICAgICAgdmFsdWUudGV4dENvbnRlbnQgPSAnMCwwMCBrcic7XG4gICAgICBib3guY2xhc3NMaXN0LmFkZCgnbmV1dHJhbCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBjaGVja2JveCBzZWxlY3Rpb24gZm9yIHRhYmxlIHJvd3NcbiAgICovXG4gIHByaXZhdGUgc2V0dXBDaGVja2JveFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RBbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0QWxsJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCByb3dDaGVja2JveGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MSW5wdXRFbGVtZW50PignLnJvdy1zZWxlY3QnKTtcbiAgICBjb25zdCBleHBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhwb3J0QnRuJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgY29uc3Qgc2VsZWN0aW9uQ291bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0aW9uQ291bnQnKTtcblxuICAgIGlmICghc2VsZWN0QWxsIHx8ICFleHBvcnRCdG4gfHwgIXNlbGVjdGlvbkNvdW50KSByZXR1cm47XG5cbiAgICBjb25zdCB1cGRhdGVTZWxlY3Rpb24gPSAoKSA9PiB7XG4gICAgICBjb25zdCBjaGVja2VkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MSW5wdXRFbGVtZW50PignLnJvdy1zZWxlY3Q6Y2hlY2tlZCcpO1xuICAgICAgY29uc3QgY291bnQgPSBjaGVja2VkLmxlbmd0aDtcblxuICAgICAgc2VsZWN0aW9uQ291bnQudGV4dENvbnRlbnQgPSBjb3VudCA9PT0gMCA/ICcwIHZhbGd0JyA6IGAke2NvdW50fSB2YWxndGA7XG4gICAgICBleHBvcnRCdG4uZGlzYWJsZWQgPSBjb3VudCA9PT0gMDtcblxuICAgICAgLy8gVXBkYXRlIHNlbGVjdCBhbGwgc3RhdGVcbiAgICAgIHNlbGVjdEFsbC5jaGVja2VkID0gY291bnQgPT09IHJvd0NoZWNrYm94ZXMubGVuZ3RoICYmIGNvdW50ID4gMDtcbiAgICAgIHNlbGVjdEFsbC5pbmRldGVybWluYXRlID0gY291bnQgPiAwICYmIGNvdW50IDwgcm93Q2hlY2tib3hlcy5sZW5ndGg7XG4gICAgfTtcblxuICAgIHNlbGVjdEFsbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICByb3dDaGVja2JveGVzLmZvckVhY2goY2IgPT4gY2IuY2hlY2tlZCA9IHNlbGVjdEFsbC5jaGVja2VkKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGlvbigpO1xuICAgIH0pO1xuXG4gICAgcm93Q2hlY2tib3hlcy5mb3JFYWNoKGNiID0+IHtcbiAgICAgIGNiLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZVNlbGVjdGlvbik7XG4gICAgICAvLyBTdG9wIGNsaWNrIGZyb20gYnViYmxpbmcgdG8gcm93XG4gICAgICBjYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgYXBwcm92YWwgY2hlY2tib3ggdG8gZW5hYmxlL2Rpc2FibGUgYXBwcm92ZSBidXR0b25cbiAgICovXG4gIHByaXZhdGUgc2V0dXBBcHByb3ZhbENoZWNrYm94KCk6IHZvaWQge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbmZpcm1DaGVja2JveCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgYXBwcm92ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHByb3ZlQnRuJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cbiAgICBpZiAoIWNoZWNrYm94IHx8ICFhcHByb3ZlQnRuKSByZXR1cm47XG5cbiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBhcHByb3ZlQnRuLmRpc2FibGVkID0gIWNoZWNrYm94LmNoZWNrZWQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgZGF0ZSBmaWx0ZXIgZGVmYXVsdHMgKGxhc3QgMzAgZGF5cylcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEYXRlRmlsdGVycygpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlRnJvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXRlRnJvbScpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZGF0ZVRvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RhdGVUbycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICBpZiAoIWRhdGVGcm9tIHx8ICFkYXRlVG8pIHJldHVybjtcblxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB0aGlydHlEYXlzQWdvID0gbmV3IERhdGUodG9kYXkpO1xuICAgIHRoaXJ0eURheXNBZ28uc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSAzMCk7XG5cbiAgICBkYXRlVG8udmFsdWUgPSB0aGlzLmZvcm1hdERhdGVJU08odG9kYXkpO1xuICAgIGRhdGVGcm9tLnZhbHVlID0gdGhpcy5mb3JtYXREYXRlSVNPKHRoaXJ0eURheXNBZ28pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBudW1iZXIgYXMgRGFuaXNoIGN1cnJlbmN5XG4gICAqL1xuICBwcml2YXRlIGZvcm1hdE51bWJlcihudW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG51bS50b0xvY2FsZVN0cmluZygnZGEtREsnLCB7XG4gICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIsXG4gICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDJcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBEYW5pc2ggbnVtYmVyIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZU51bWJlcihzdHI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCFzdHIpIHJldHVybiAwO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9cXC4vZywgJycpLnJlcGxhY2UoJywnLCAnLicpKSB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRlIGFzIElTTyBzdHJpbmcgKFlZWVktTU0tREQpXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdERhdGVJU08oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHJvdyB0b2dnbGUgZm9yIGV4cGFuZGFibGUgZGV0YWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFJvd1RvZ2dsZSgpOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC1jYXNoLXRhYmxlLXJvd1tkYXRhLWlkXTpub3QoLmRyYWZ0LXJvdyknKTtcblxuICAgIHJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJyk7XG4gICAgICBpZiAoIXJvd0lkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRldGFpbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBzd3AtY2FzaC1yb3ctZGV0YWlsW2RhdGEtZm9yPVwiJHtyb3dJZH1cIl1gKTtcbiAgICAgIGlmICghZGV0YWlsKSByZXR1cm47XG5cbiAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIC8vIERvbid0IHRvZ2dsZSBpZiBjbGlja2luZyBvbiBjaGVja2JveFxuICAgICAgICBpZiAoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGljb24gPSByb3cucXVlcnlTZWxlY3Rvcignc3dwLXJvdy10b2dnbGUgaScpO1xuICAgICAgICBjb25zdCBpc0V4cGFuZGVkID0gcm93LmNsYXNzTGlzdC5jb250YWlucygnZXhwYW5kZWQnKTtcblxuICAgICAgICAvLyBDbG9zZSBvdGhlciBleHBhbmRlZCByb3dzXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N3cC1jYXNoLXRhYmxlLXJvdy5leHBhbmRlZCcpLmZvckVhY2gociA9PiB7XG4gICAgICAgICAgaWYgKHIgIT09IHJvdykge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJJZCA9IHIuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJyk7XG4gICAgICAgICAgICBpZiAob3RoZXJJZCkge1xuICAgICAgICAgICAgICBjb25zdCBvdGhlckRldGFpbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBzd3AtY2FzaC1yb3ctZGV0YWlsW2RhdGEtZm9yPVwiJHtvdGhlcklkfVwiXWApO1xuICAgICAgICAgICAgICBjb25zdCBvdGhlckljb24gPSByLnF1ZXJ5U2VsZWN0b3IoJ3N3cC1yb3ctdG9nZ2xlIGknKTtcbiAgICAgICAgICAgICAgaWYgKG90aGVyRGV0YWlsICYmIG90aGVySWNvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sbGFwc2VSb3cociwgb3RoZXJEZXRhaWwsIG90aGVySWNvbiBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRvZ2dsZSBjdXJyZW50IHJvd1xuICAgICAgICBpZiAoaXNFeHBhbmRlZCkge1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VSb3cocm93LCBkZXRhaWwsIGljb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZXhwYW5kUm93KHJvdywgZGV0YWlsLCBpY29uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kIGEgcm93IHdpdGggYW5pbWF0aW9uXG4gICAqL1xuICBwcml2YXRlIGV4cGFuZFJvdyhyb3c6IEVsZW1lbnQsIGRldGFpbDogSFRNTEVsZW1lbnQsIGljb246IEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgcm93LmNsYXNzTGlzdC5hZGQoJ2V4cGFuZGVkJyk7XG4gICAgZGV0YWlsLmNsYXNzTGlzdC5hZGQoJ2V4cGFuZGVkJyk7XG5cbiAgICAvLyBBbmltYXRlIGljb24gcm90YXRpb25cbiAgICBpY29uPy5hbmltYXRlKFtcbiAgICAgIHsgdHJhbnNmb3JtOiAncm90YXRlKDBkZWcpJyB9LFxuICAgICAgeyB0cmFuc2Zvcm06ICdyb3RhdGUoOTBkZWcpJyB9XG4gICAgXSwge1xuICAgICAgZHVyYXRpb246IDIwMCxcbiAgICAgIGVhc2luZzogJ2Vhc2Utb3V0JyxcbiAgICAgIGZpbGw6ICdmb3J3YXJkcydcbiAgICB9KTtcblxuICAgIC8vIEFuaW1hdGUgZGV0YWlsIGV4cGFuc2lvblxuICAgIGNvbnN0IGNvbnRlbnQgPSBkZXRhaWwucXVlcnlTZWxlY3Rvcignc3dwLXJvdy1kZXRhaWwtY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChjb250ZW50KSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSBjb250ZW50Lm9mZnNldEhlaWdodDtcbiAgICAgIGRldGFpbC5hbmltYXRlKFtcbiAgICAgICAgeyBoZWlnaHQ6ICcwcHgnLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgIHsgaGVpZ2h0OiBgJHtoZWlnaHR9cHhgLCBvcGFjaXR5OiAxIH1cbiAgICAgIF0sIHtcbiAgICAgICAgZHVyYXRpb246IDI1MCxcbiAgICAgICAgZWFzaW5nOiAnZWFzZS1vdXQnLFxuICAgICAgICBmaWxsOiAnZm9yd2FyZHMnXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGFwc2UgYSByb3cgd2l0aCBhbmltYXRpb25cbiAgICovXG4gIHByaXZhdGUgY29sbGFwc2VSb3cocm93OiBFbGVtZW50LCBkZXRhaWw6IEhUTUxFbGVtZW50LCBpY29uOiBFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIC8vIEFuaW1hdGUgaWNvbiByb3RhdGlvblxuICAgIGljb24/LmFuaW1hdGUoW1xuICAgICAgeyB0cmFuc2Zvcm06ICdyb3RhdGUoOTBkZWcpJyB9LFxuICAgICAgeyB0cmFuc2Zvcm06ICdyb3RhdGUoMGRlZyknIH1cbiAgICBdLCB7XG4gICAgICBkdXJhdGlvbjogMjAwLFxuICAgICAgZWFzaW5nOiAnZWFzZS1vdXQnLFxuICAgICAgZmlsbDogJ2ZvcndhcmRzJ1xuICAgIH0pO1xuXG4gICAgLy8gQW5pbWF0ZSBkZXRhaWwgY29sbGFwc2VcbiAgICBjb25zdCBjb250ZW50ID0gZGV0YWlsLnF1ZXJ5U2VsZWN0b3IoJ3N3cC1yb3ctZGV0YWlsLWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gY29udGVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICBjb25zdCBhbmltYXRpb24gPSBkZXRhaWwuYW5pbWF0ZShbXG4gICAgICAgIHsgaGVpZ2h0OiBgJHtoZWlnaHR9cHhgLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgIHsgaGVpZ2h0OiAnMHB4Jywgb3BhY2l0eTogMCB9XG4gICAgICBdLCB7XG4gICAgICAgIGR1cmF0aW9uOiAyMDAsXG4gICAgICAgIGVhc2luZzogJ2Vhc2Utb3V0JyxcbiAgICAgICAgZmlsbDogJ2ZvcndhcmRzJ1xuICAgICAgfSk7XG5cbiAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgcm93LmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7XG4gICAgICAgIGRldGFpbC5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmRlZCcpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93LmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7XG4gICAgICBkZXRhaWwuY2xhc3NMaXN0LnJlbW92ZSgnZXhwYW5kZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgZHJhZnQgcm93IGNsaWNrIHRvIG5hdmlnYXRlIHRvIHJlY29uY2lsaWF0aW9uIHRhYlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERyYWZ0Um93Q2xpY2soKTogdm9pZCB7XG4gICAgY29uc3QgZHJhZnRSb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50Pignc3dwLWNhc2gtdGFibGUtcm93LmRyYWZ0LXJvdycpO1xuICAgIGlmICghZHJhZnRSb3cpIHJldHVybjtcblxuICAgIGRyYWZ0Um93LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICBkcmFmdFJvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAvLyBEb24ndCBuYXZpZ2F0ZSBpZiBjbGlja2luZyBvbiBjaGVja2JveFxuICAgICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykpIHJldHVybjtcblxuICAgICAgdGhpcy5zd2l0Y2hUb1RhYignYWZzdGVtbmluZycpO1xuICAgIH0pO1xuICB9XG59XG4iLCAiLyoqXG4gKiBTYWxvbiBPUyBBcHBcbiAqXG4gKiBNYWluIGFwcGxpY2F0aW9uIGNsYXNzIHRoYXQgb3JjaGVzdHJhdGVzIGFsbCBVSSBjb250cm9sbGVyc1xuICovXG5cbmltcG9ydCB7IFNpZGViYXJDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL3NpZGViYXInO1xuaW1wb3J0IHsgRHJhd2VyQ29udHJvbGxlciB9IGZyb20gJy4vbW9kdWxlcy9kcmF3ZXJzJztcbmltcG9ydCB7IFRoZW1lQ29udHJvbGxlciB9IGZyb20gJy4vbW9kdWxlcy90aGVtZSc7XG5pbXBvcnQgeyBTZWFyY2hDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL3NlYXJjaCc7XG5pbXBvcnQgeyBMb2NrU2NyZWVuQ29udHJvbGxlciB9IGZyb20gJy4vbW9kdWxlcy9sb2Nrc2NyZWVuJztcbmltcG9ydCB7IENhc2hDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL2Nhc2gnO1xuXG4vKipcbiAqIE1haW4gYXBwbGljYXRpb24gY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEFwcCB7XG4gIHJlYWRvbmx5IHNpZGViYXI6IFNpZGViYXJDb250cm9sbGVyO1xuICByZWFkb25seSBkcmF3ZXJzOiBEcmF3ZXJDb250cm9sbGVyO1xuICByZWFkb25seSB0aGVtZTogVGhlbWVDb250cm9sbGVyO1xuICByZWFkb25seSBzZWFyY2g6IFNlYXJjaENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGxvY2tTY3JlZW46IExvY2tTY3JlZW5Db250cm9sbGVyO1xuICByZWFkb25seSBjYXNoOiBDYXNoQ29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBJbml0aWFsaXplIGNvbnRyb2xsZXJzXG4gICAgdGhpcy5zaWRlYmFyID0gbmV3IFNpZGViYXJDb250cm9sbGVyKCk7XG4gICAgdGhpcy5kcmF3ZXJzID0gbmV3IERyYXdlckNvbnRyb2xsZXIoKTtcbiAgICB0aGlzLnRoZW1lID0gbmV3IFRoZW1lQ29udHJvbGxlcigpO1xuICAgIHRoaXMuc2VhcmNoID0gbmV3IFNlYXJjaENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmxvY2tTY3JlZW4gPSBuZXcgTG9ja1NjcmVlbkNvbnRyb2xsZXIodGhpcy5kcmF3ZXJzKTtcbiAgICB0aGlzLmNhc2ggPSBuZXcgQ2FzaENvbnRyb2xsZXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIEdsb2JhbCBhcHAgaW5zdGFuY2VcbiAqL1xubGV0IGFwcDogQXBwO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIGluaXQoKTogdm9pZCB7XG4gIGFwcCA9IG5ldyBBcHAoKTtcblxuICAvLyBFeHBvc2UgdG8gd2luZG93IGZvciBkZWJ1Z2dpbmdcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgKHdpbmRvdyBhcyB1bmtub3duIGFzIHsgYXBwOiBBcHAgfSkuYXBwID0gYXBwO1xuICB9XG59XG5cbi8vIFdhaXQgZm9yIERPTSByZWFkeVxuaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7XG59IGVsc2Uge1xuICBpbml0KCk7XG59XG5cbmV4cG9ydCB7IGFwcCB9O1xuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7OztBQU1PLElBQU0scUJBQU4sTUFBTSxtQkFBa0I7QUFBQSxFQUs3QixjQUFjO0FBSmQsU0FBUSxhQUFpQztBQUN6QyxTQUFRLFlBQWdDO0FBQ3hDLFNBQVEsY0FBa0M7QUFHeEMsU0FBSyxhQUFhLFNBQVMsZUFBZSxZQUFZO0FBQ3RELFNBQUssWUFBWSxTQUFTLGNBQWMsZ0JBQWdCO0FBQ3hELFNBQUssY0FBYyxTQUFTLGVBQWUsYUFBYTtBQUV4RCxTQUFLLGVBQWU7QUFDcEIsU0FBSyxjQUFjO0FBQ25CLFNBQUssYUFBYTtBQUFBLEVBQ3BCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFJLGNBQXVCO0FBQ3pCLFdBQU8sS0FBSyxXQUFXLFVBQVUsU0FBUyxnQkFBZ0IsS0FBSztBQUFBLEVBQ2pFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxTQUFlO0FBQ2IsUUFBSSxDQUFDLEtBQUssVUFBVztBQUVyQixTQUFLLFVBQVUsVUFBVSxPQUFPLGdCQUFnQjtBQUNoRCxpQkFBYSxRQUFRLHFCQUFxQixPQUFPLEtBQUssV0FBVyxDQUFDO0FBQUEsRUFDcEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQWlCO0FBQ2YsU0FBSyxXQUFXLFVBQVUsSUFBSSxnQkFBZ0I7QUFDOUMsaUJBQWEsUUFBUSxxQkFBcUIsTUFBTTtBQUFBLEVBQ2xEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxTQUFlO0FBQ2IsU0FBSyxXQUFXLFVBQVUsT0FBTyxnQkFBZ0I7QUFDakQsaUJBQWEsUUFBUSxxQkFBcUIsT0FBTztBQUFBLEVBQ25EO0FBQUEsRUFFUSxpQkFBdUI7QUFDN0IsU0FBSyxZQUFZLGlCQUFpQixTQUFTLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQSxFQUNoRTtBQUFBLEVBRVEsZ0JBQXNCO0FBQzVCLFFBQUksQ0FBQyxLQUFLLFlBQWE7QUFFdkIsVUFBTSxZQUFZLFNBQVMsaUJBQThCLGtDQUFrQztBQUUzRixjQUFVLFFBQVEsVUFBUTtBQUN4QixXQUFLLGlCQUFpQixjQUFjLE1BQU0sS0FBSyxZQUFZLElBQUksQ0FBQztBQUNoRSxXQUFLLGlCQUFpQixjQUFjLE1BQU0sS0FBSyxZQUFZLENBQUM7QUFBQSxJQUM5RCxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRVEsWUFBWSxNQUF5QjtBQUMzQyxRQUFJLENBQUMsS0FBSyxlQUFlLENBQUMsS0FBSyxZQUFhO0FBRTVDLFVBQU0sT0FBTyxLQUFLLHNCQUFzQjtBQUN4QyxVQUFNLGNBQWMsS0FBSyxRQUFRO0FBRWpDLFFBQUksQ0FBQyxZQUFhO0FBRWxCLFNBQUssWUFBWSxjQUFjO0FBQy9CLFNBQUssWUFBWSxNQUFNLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQztBQUMvQyxTQUFLLFlBQVksTUFBTSxNQUFNLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxDQUFDO0FBQzFELFNBQUssWUFBWSxNQUFNLFlBQVk7QUFDbkMsU0FBSyxZQUFZLFlBQVk7QUFBQSxFQUMvQjtBQUFBLEVBRVEsY0FBb0I7QUFDMUIsU0FBSyxhQUFhLFlBQVk7QUFBQSxFQUNoQztBQUFBLEVBRVEsZUFBcUI7QUFDM0IsUUFBSSxDQUFDLEtBQUssVUFBVztBQUVyQixRQUFJLGFBQWEsUUFBUSxtQkFBbUIsTUFBTSxRQUFRO0FBQ3hELFdBQUssVUFBVSxVQUFVLElBQUksZ0JBQWdCO0FBQUEsSUFDL0M7QUFBQSxFQUNGO0FBQ0Y7QUF6RitCO0FBQXhCLElBQU0sb0JBQU47OztBQ0VBLElBQU0sb0JBQU4sTUFBTSxrQkFBaUI7QUFBQSxFQVM1QixjQUFjO0FBUmQsU0FBUSxnQkFBb0M7QUFDNUMsU0FBUSxxQkFBeUM7QUFDakQsU0FBUSxhQUFpQztBQUN6QyxTQUFRLGdCQUFvQztBQUM1QyxTQUFRLFVBQThCO0FBQ3RDLFNBQVEsZUFBa0M7QUFDMUMsU0FBUSxzQkFBMEM7QUFHaEQsU0FBSyxnQkFBZ0IsU0FBUyxlQUFlLGVBQWU7QUFDNUQsU0FBSyxxQkFBcUIsU0FBUyxlQUFlLG9CQUFvQjtBQUN0RSxTQUFLLGFBQWEsU0FBUyxlQUFlLFlBQVk7QUFDdEQsU0FBSyxnQkFBZ0IsU0FBUyxlQUFlLGVBQWU7QUFDNUQsU0FBSyxVQUFVLFNBQVMsZUFBZSxlQUFlO0FBRXRELFNBQUssZUFBZTtBQUNwQixTQUFLLG9CQUFvQjtBQUFBLEVBQzNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFJLFNBQTRCO0FBQzlCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLEtBQUssTUFBd0I7QUFDM0IsU0FBSyxTQUFTO0FBRWQsVUFBTSxTQUFTLEtBQUssVUFBVSxJQUFJO0FBQ2xDLFFBQUksVUFBVSxLQUFLLFNBQVM7QUFDMUIsYUFBTyxVQUFVLElBQUksUUFBUTtBQUM3QixXQUFLLFFBQVEsVUFBVSxJQUFJLFFBQVE7QUFDbkMsZUFBUyxLQUFLLE1BQU0sV0FBVztBQUMvQixXQUFLLGVBQWU7QUFBQSxJQUN0QjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQU0sTUFBd0I7QUFDNUIsVUFBTSxTQUFTLEtBQUssVUFBVSxJQUFJO0FBQ2xDLFlBQVEsVUFBVSxPQUFPLFFBQVE7QUFHakMsUUFBSSxLQUFLLFdBQVcsQ0FBQyxTQUFTLGNBQWMsMEJBQTBCLEdBQUc7QUFDdkUsV0FBSyxRQUFRLFVBQVUsT0FBTyxRQUFRO0FBQ3RDLGVBQVMsS0FBSyxNQUFNLFdBQVc7QUFBQSxJQUNqQztBQUVBLFFBQUksS0FBSyxpQkFBaUIsTUFBTTtBQUM5QixXQUFLLGVBQWU7QUFBQSxJQUN0QjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQWlCO0FBQ2YsS0FBQyxLQUFLLGVBQWUsS0FBSyxvQkFBb0IsS0FBSyxZQUFZLEtBQUssYUFBYSxFQUM5RSxRQUFRLFlBQVUsUUFBUSxVQUFVLE9BQU8sUUFBUSxDQUFDO0FBR3ZELFNBQUssbUJBQW1CO0FBRXhCLFNBQUssU0FBUyxVQUFVLE9BQU8sUUFBUTtBQUN2QyxhQUFTLEtBQUssTUFBTSxXQUFXO0FBQy9CLFNBQUssZUFBZTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxrQkFBa0IsVUFBd0I7QUFDeEMsU0FBSyxTQUFTO0FBRWQsVUFBTSxTQUFTLFNBQVMsZUFBZSxRQUFRO0FBQy9DLFFBQUksVUFBVSxLQUFLLFNBQVM7QUFDMUIsYUFBTyxVQUFVLElBQUksTUFBTTtBQUMzQixXQUFLLFFBQVEsVUFBVSxJQUFJLFFBQVE7QUFDbkMsZUFBUyxLQUFLLE1BQU0sV0FBVztBQUMvQixXQUFLLHNCQUFzQjtBQUFBLElBQzdCO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EscUJBQTJCO0FBQ3pCLFNBQUsscUJBQXFCLFVBQVUsT0FBTyxNQUFNO0FBQ2pELFNBQUssc0JBQXNCO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGNBQW9CO0FBQ2xCLFNBQUssS0FBSyxTQUFTO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLG1CQUF5QjtBQUN2QixTQUFLLEtBQUssY0FBYztBQUFBLEVBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxXQUFpQjtBQUNmLFNBQUssWUFBWSxVQUFVLElBQUksUUFBUTtBQUFBLEVBQ3pDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxZQUFrQjtBQUNoQixTQUFLLFlBQVksVUFBVSxPQUFPLFFBQVE7QUFDMUMsU0FBSyxhQUFhO0FBQUEsRUFDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGNBQW9CO0FBQ2xCLFNBQUssZUFBZSxVQUFVLElBQUksUUFBUTtBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxlQUFxQjtBQUNuQixTQUFLLGVBQWUsVUFBVSxPQUFPLFFBQVE7QUFBQSxFQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsMkJBQWlDO0FBQy9CLFFBQUksQ0FBQyxLQUFLLG1CQUFvQjtBQUU5QixVQUFNLGNBQWMsS0FBSyxtQkFBbUI7QUFBQSxNQUMxQztBQUFBLElBQ0Y7QUFDQSxnQkFBWSxRQUFRLFVBQVEsS0FBSyxnQkFBZ0IsYUFBYSxDQUFDO0FBRS9ELFVBQU0sUUFBUSxTQUFTLGNBQTJCLHdCQUF3QjtBQUMxRSxRQUFJLE9BQU87QUFDVCxZQUFNLE1BQU0sVUFBVTtBQUFBLElBQ3hCO0FBQUEsRUFDRjtBQUFBLEVBRVEsVUFBVSxNQUFzQztBQUN0RCxZQUFRLE1BQU07QUFBQSxNQUNaLEtBQUs7QUFBVyxlQUFPLEtBQUs7QUFBQSxNQUM1QixLQUFLO0FBQWdCLGVBQU8sS0FBSztBQUFBLE1BQ2pDLEtBQUs7QUFBUSxlQUFPLEtBQUs7QUFBQSxNQUN6QixLQUFLO0FBQVcsZUFBTyxLQUFLO0FBQUEsSUFDOUI7QUFBQSxFQUNGO0FBQUEsRUFFUSxpQkFBdUI7QUFFN0IsYUFBUyxlQUFlLGdCQUFnQixHQUNwQyxpQkFBaUIsU0FBUyxNQUFNLEtBQUssWUFBWSxDQUFDO0FBQ3RELGFBQVMsZUFBZSxhQUFhLEdBQ2pDLGlCQUFpQixTQUFTLE1BQU0sS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUd6RCxhQUFTLGVBQWUsa0JBQWtCLEdBQ3RDLGlCQUFpQixTQUFTLE1BQU0sS0FBSyxpQkFBaUIsQ0FBQztBQUMzRCxhQUFTLGVBQWUseUJBQXlCLEdBQzdDLGlCQUFpQixTQUFTLE1BQU0sS0FBSyxNQUFNLGNBQWMsQ0FBQztBQUM5RCxhQUFTLGVBQWUsYUFBYSxHQUNqQyxpQkFBaUIsU0FBUyxNQUFNLEtBQUsseUJBQXlCLENBQUM7QUFHbkUsYUFBUyxlQUFlLGdCQUFnQixHQUNwQyxpQkFBaUIsU0FBUyxNQUFNLEtBQUssU0FBUyxDQUFDO0FBQ25ELGFBQVMsZUFBZSxnQkFBZ0IsR0FDcEMsaUJBQWlCLFNBQVMsTUFBTSxLQUFLLFVBQVUsQ0FBQztBQUdwRCxhQUFTLGVBQWUsWUFBWSxHQUNoQyxpQkFBaUIsU0FBUyxNQUFNLEtBQUssWUFBWSxDQUFDO0FBQ3RELGFBQVMsZUFBZSxtQkFBbUIsR0FDdkMsaUJBQWlCLFNBQVMsTUFBTSxLQUFLLGFBQWEsQ0FBQztBQUN2RCxhQUFTLGVBQWUsZUFBZSxHQUNuQyxpQkFBaUIsU0FBUyxNQUFNLEtBQUssYUFBYSxDQUFDO0FBQ3ZELGFBQVMsZUFBZSxhQUFhLEdBQ2pDLGlCQUFpQixTQUFTLE1BQU0sS0FBSyxhQUFhLENBQUM7QUFHdkQsU0FBSyxTQUFTLGlCQUFpQixTQUFTLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFHN0QsYUFBUyxpQkFBaUIsV0FBVyxDQUFDLE1BQXFCO0FBQ3pELFVBQUksRUFBRSxRQUFRLFNBQVUsTUFBSyxTQUFTO0FBQUEsSUFDeEMsQ0FBQztBQUdELFNBQUssWUFBWSxpQkFBaUIsU0FBUyxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO0FBR3pFLGFBQVMsaUJBQWlCLFNBQVMsQ0FBQyxNQUFNLEtBQUssc0JBQXNCLENBQUMsQ0FBQztBQUFBLEVBQ3pFO0FBQUEsRUFFUSxnQkFBZ0IsR0FBZ0I7QUFDdEMsVUFBTSxTQUFTLEVBQUU7QUFDakIsVUFBTSxXQUFXLE9BQU8sUUFBcUIsZUFBZTtBQUM1RCxVQUFNLFdBQVcsT0FBTyxRQUFxQixtQkFBbUI7QUFFaEUsUUFBSSxZQUFZLFVBQVU7QUFDeEIsWUFBTSxjQUFjLFNBQVMsUUFBUSxjQUFjO0FBQ25ELFVBQUksYUFBYTtBQUNmLGlCQUFTLGdCQUFnQixnQkFBZ0I7QUFBQSxNQUMzQyxPQUFPO0FBQ0wsaUJBQVMsUUFBUSxZQUFZO0FBQUEsTUFDL0I7QUFBQSxJQUNGO0FBR0EsVUFBTSxnQkFBZ0IsT0FBTyxRQUFxQix5QkFBeUI7QUFDM0UsUUFBSSxlQUFlO0FBQ2pCLFlBQU0sVUFBVSxjQUFjLFFBQXFCLGtCQUFrQjtBQUNyRSxlQUFTLFVBQVUsT0FBTyxXQUFXO0FBQUEsSUFDdkM7QUFBQSxFQUNGO0FBQUEsRUFFUSxzQkFBc0IsR0FBZ0I7QUFDNUMsVUFBTSxTQUFTLEVBQUU7QUFDakIsVUFBTSxTQUFTLE9BQU8sUUFBcUIsdUJBQXVCO0FBRWxFLFFBQUksUUFBUTtBQUNWLGVBQVMsaUJBQThCLHVCQUF1QixFQUMzRCxRQUFRLE9BQUssRUFBRSxVQUFVLE9BQU8sUUFBUSxDQUFDO0FBQzVDLGFBQU8sVUFBVSxJQUFJLFFBQVE7QUFBQSxJQUMvQjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVEsc0JBQTRCO0FBRWxDLGFBQVMsaUJBQWlCLFNBQVMsQ0FBQyxNQUFhO0FBQy9DLFlBQU0sU0FBUyxFQUFFO0FBQ2pCLFlBQU0sVUFBVSxPQUFPLFFBQXFCLHVCQUF1QjtBQUVuRSxVQUFJLFNBQVM7QUFDWCxjQUFNLFdBQVcsUUFBUSxRQUFRO0FBQ2pDLFlBQUksVUFBVTtBQUNaLGVBQUssa0JBQWtCLFFBQVE7QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFHRCxhQUFTLGlCQUFpQixTQUFTLENBQUMsTUFBYTtBQUMvQyxZQUFNLFNBQVMsRUFBRTtBQUNqQixZQUFNLFdBQVcsT0FBTyxRQUFxQixxQkFBcUI7QUFFbEUsVUFBSSxVQUFVO0FBQ1osYUFBSyxtQkFBbUI7QUFDeEIsYUFBSyxTQUFTLFVBQVUsT0FBTyxRQUFRO0FBQ3ZDLGlCQUFTLEtBQUssTUFBTSxXQUFXO0FBQUEsTUFDakM7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFwUjhCO0FBQXZCLElBQU0sbUJBQU47OztBQ0FBLElBQU0sbUJBQU4sTUFBTSxpQkFBZ0I7QUFBQSxFQVEzQixjQUFjO0FBQ1osU0FBSyxPQUFPLFNBQVM7QUFDckIsU0FBSyxlQUFlLFNBQVMsaUJBQThCLGtCQUFrQjtBQUU3RSxTQUFLLFdBQVcsS0FBSyxPQUFPO0FBQzVCLFNBQUssU0FBUztBQUNkLFNBQUssZUFBZTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFJLFVBQWlCO0FBQ25CLFVBQU0sU0FBUyxhQUFhLFFBQVEsaUJBQWdCLFdBQVc7QUFDL0QsUUFBSSxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsVUFBVTtBQUNsRSxhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFJLFNBQWtCO0FBQ3BCLFdBQU8sS0FBSyxLQUFLLFVBQVUsU0FBUyxpQkFBZ0IsVUFBVSxLQUMzRCxLQUFLLHFCQUFxQixDQUFDLEtBQUssS0FBSyxVQUFVLFNBQVMsaUJBQWdCLFdBQVc7QUFBQSxFQUN4RjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxvQkFBNkI7QUFDL0IsV0FBTyxPQUFPLFdBQVcsOEJBQThCLEVBQUU7QUFBQSxFQUMzRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxPQUFvQjtBQUN0QixpQkFBYSxRQUFRLGlCQUFnQixhQUFhLEtBQUs7QUFDdkQsU0FBSyxXQUFXLEtBQUs7QUFDckIsU0FBSyxTQUFTO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFNBQWU7QUFDYixTQUFLLElBQUksS0FBSyxTQUFTLFVBQVUsTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFUSxXQUFXLE9BQW9CO0FBQ3JDLFNBQUssS0FBSyxVQUFVLE9BQU8saUJBQWdCLFlBQVksaUJBQWdCLFdBQVc7QUFFbEYsUUFBSSxVQUFVLFFBQVE7QUFDcEIsV0FBSyxLQUFLLFVBQVUsSUFBSSxpQkFBZ0IsVUFBVTtBQUFBLElBQ3BELFdBQVcsVUFBVSxTQUFTO0FBQzVCLFdBQUssS0FBSyxVQUFVLElBQUksaUJBQWdCLFdBQVc7QUFBQSxJQUNyRDtBQUFBLEVBRUY7QUFBQSxFQUVRLFdBQWlCO0FBQ3ZCLFFBQUksQ0FBQyxLQUFLLGFBQWM7QUFFeEIsVUFBTSxhQUFhLEtBQUs7QUFFeEIsU0FBSyxhQUFhLFFBQVEsWUFBVTtBQUNsQyxZQUFNLFFBQVEsT0FBTyxRQUFRO0FBQzdCLFlBQU0sV0FBWSxVQUFVLFVBQVUsY0FBZ0IsVUFBVSxXQUFXLENBQUM7QUFDNUUsYUFBTyxVQUFVLE9BQU8sVUFBVSxRQUFRO0FBQUEsSUFDNUMsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVRLGlCQUF1QjtBQUU3QixTQUFLLGFBQWEsUUFBUSxZQUFVO0FBQ2xDLGFBQU8saUJBQWlCLFNBQVMsQ0FBQyxNQUFNLEtBQUssa0JBQWtCLENBQUMsQ0FBQztBQUFBLElBQ25FLENBQUM7QUFHRCxXQUFPLFdBQVcsOEJBQThCLEVBQzdDLGlCQUFpQixVQUFVLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQztBQUFBLEVBQy9EO0FBQUEsRUFFUSxrQkFBa0IsR0FBZ0I7QUFDeEMsVUFBTSxTQUFTLEVBQUU7QUFDakIsVUFBTSxTQUFTLE9BQU8sUUFBcUIsa0JBQWtCO0FBRTdELFFBQUksUUFBUTtBQUNWLFlBQU0sUUFBUSxPQUFPLFFBQVE7QUFDN0IsVUFBSSxPQUFPO0FBQ1QsYUFBSyxJQUFJLEtBQUs7QUFBQSxNQUNoQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFUSxxQkFBMkI7QUFFakMsUUFBSSxLQUFLLFlBQVksVUFBVTtBQUM3QixXQUFLLFNBQVM7QUFBQSxJQUNoQjtBQUFBLEVBQ0Y7QUFDRjtBQS9HNkI7QUFBaEIsaUJBQ2EsY0FBYztBQUQzQixpQkFFYSxhQUFhO0FBRjFCLGlCQUdhLGNBQWM7QUFIakMsSUFBTSxrQkFBTjs7O0FDRkEsSUFBTSxvQkFBTixNQUFNLGtCQUFpQjtBQUFBLEVBSTVCLGNBQWM7QUFIZCxTQUFRLFFBQWlDO0FBQ3pDLFNBQVEsWUFBZ0M7QUFHdEMsU0FBSyxRQUFRLFNBQVMsZUFBZSxjQUFjO0FBQ25ELFNBQUssWUFBWSxTQUFTLGNBQTJCLG1CQUFtQjtBQUV4RSxTQUFLLGVBQWU7QUFBQSxFQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxRQUFnQjtBQUNsQixXQUFPLEtBQUssT0FBTyxTQUFTO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQUksTUFBTSxLQUFhO0FBQ3JCLFFBQUksS0FBSyxPQUFPO0FBQ2QsV0FBSyxNQUFNLFFBQVE7QUFBQSxJQUNyQjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFFBQWM7QUFDWixTQUFLLE9BQU8sTUFBTTtBQUFBLEVBQ3BCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFhO0FBQ1gsU0FBSyxPQUFPLEtBQUs7QUFBQSxFQUNuQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsUUFBYztBQUNaLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVRLGlCQUF1QjtBQUU3QixhQUFTLGlCQUFpQixXQUFXLENBQUMsTUFBTSxLQUFLLGVBQWUsQ0FBQyxDQUFDO0FBR2xFLFFBQUksS0FBSyxPQUFPO0FBQ2QsV0FBSyxNQUFNLGlCQUFpQixTQUFTLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxDQUFDO0FBRy9ELFlBQU0sT0FBTyxLQUFLLE1BQU0sUUFBUSxNQUFNO0FBQ3RDLFlBQU0saUJBQWlCLFVBQVUsQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLENBQUM7QUFBQSxJQUM5RDtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGVBQWUsR0FBd0I7QUFFN0MsU0FBSyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxLQUFLO0FBQzdDLFFBQUUsZUFBZTtBQUNqQixXQUFLLE1BQU07QUFDWDtBQUFBLElBQ0Y7QUFHQSxRQUFJLEVBQUUsUUFBUSxZQUFZLFNBQVMsa0JBQWtCLEtBQUssT0FBTztBQUMvRCxXQUFLLEtBQUs7QUFBQSxJQUNaO0FBQUEsRUFDRjtBQUFBLEVBRVEsWUFBWSxHQUFnQjtBQUNsQyxVQUFNLFNBQVMsRUFBRTtBQUNqQixVQUFNLFFBQVEsT0FBTyxNQUFNLEtBQUs7QUFHaEMsYUFBUyxjQUFjLElBQUksWUFBWSxjQUFjO0FBQUEsTUFDbkQsUUFBUSxFQUFFLE1BQU07QUFBQSxNQUNoQixTQUFTO0FBQUEsSUFDWCxDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFUSxhQUFhLEdBQWdCO0FBQ25DLE1BQUUsZUFBZTtBQUVqQixVQUFNLFFBQVEsS0FBSyxNQUFNLEtBQUs7QUFDOUIsUUFBSSxDQUFDLE1BQU87QUFHWixhQUFTLGNBQWMsSUFBSSxZQUFZLHFCQUFxQjtBQUFBLE1BQzFELFFBQVEsRUFBRSxNQUFNO0FBQUEsTUFDaEIsU0FBUztBQUFBLElBQ1gsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUNGO0FBbkc4QjtBQUF2QixJQUFNLG1CQUFOOzs7QUNFQSxJQUFNLHdCQUFOLE1BQU0sc0JBQXFCO0FBQUEsRUFXaEMsWUFBWSxTQUE0QjtBQVJ4QztBQUFBLFNBQVEsYUFBaUM7QUFDekMsU0FBUSxXQUErQjtBQUN2QyxTQUFRLFlBQWdDO0FBQ3hDLFNBQVEsYUFBaUM7QUFDekMsU0FBUSxZQUE0QztBQUNwRCxTQUFRLGFBQWE7QUFDckIsU0FBUSxVQUFtQztBQUd6QyxTQUFLLFVBQVUsV0FBVztBQUMxQixTQUFLLGFBQWEsU0FBUyxlQUFlLFlBQVk7QUFDdEQsU0FBSyxXQUFXLFNBQVMsZUFBZSxVQUFVO0FBQ2xELFNBQUssWUFBWSxTQUFTLGVBQWUsV0FBVztBQUNwRCxTQUFLLGFBQWEsU0FBUyxlQUFlLFVBQVU7QUFDcEQsU0FBSyxZQUFZLEtBQUssVUFBVSxpQkFBOEIsZUFBZSxLQUFLO0FBRWxGLFNBQUssZUFBZTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFJLFdBQW9CO0FBQ3RCLFdBQU8sS0FBSyxZQUFZLFVBQVUsU0FBUyxRQUFRLEtBQUs7QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBYTtBQUNYLFNBQUssU0FBUyxTQUFTO0FBRXZCLFFBQUksS0FBSyxZQUFZO0FBQ25CLFdBQUssV0FBVyxVQUFVLElBQUksUUFBUTtBQUN0QyxlQUFTLEtBQUssTUFBTSxXQUFXO0FBQUEsSUFDakM7QUFFQSxTQUFLLGFBQWE7QUFDbEIsU0FBSyxjQUFjO0FBR25CLFFBQUksS0FBSyxZQUFZO0FBQ25CLFdBQUssV0FBVyxjQUFjLGVBQVksS0FBSyxXQUFXLENBQUM7QUFBQSxJQUM3RDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE9BQWE7QUFDWCxRQUFJLEtBQUssWUFBWTtBQUNuQixXQUFLLFdBQVcsVUFBVSxPQUFPLFFBQVE7QUFDekMsZUFBUyxLQUFLLE1BQU0sV0FBVztBQUFBLElBQ2pDO0FBRUEsU0FBSyxhQUFhO0FBQ2xCLFNBQUssY0FBYztBQUFBLEVBQ3JCO0FBQUEsRUFFUSxhQUFxQjtBQUMzQixVQUFNLE1BQU0sb0JBQUksS0FBSztBQUNyQixVQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ3ZELFVBQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDM0QsV0FBTyxHQUFHLEtBQUssSUFBSSxPQUFPO0FBQUEsRUFDNUI7QUFBQSxFQUVRLGdCQUFzQjtBQUM1QixRQUFJLENBQUMsS0FBSyxVQUFXO0FBRXJCLFNBQUssVUFBVSxRQUFRLENBQUMsT0FBTyxVQUFVO0FBQ3ZDLFlBQU0sVUFBVSxPQUFPLFVBQVUsT0FBTztBQUN4QyxVQUFJLFFBQVEsS0FBSyxXQUFXLFFBQVE7QUFDbEMsY0FBTSxjQUFjO0FBQ3BCLGNBQU0sVUFBVSxJQUFJLFFBQVE7QUFBQSxNQUM5QixPQUFPO0FBQ0wsY0FBTSxjQUFjO0FBQUEsTUFDdEI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFUSxZQUFrQjtBQUN4QixRQUFJLENBQUMsS0FBSyxVQUFXO0FBRXJCLFNBQUssVUFBVSxRQUFRLFdBQVMsTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDO0FBRzVELFNBQUssVUFBVSxVQUFVLElBQUksT0FBTztBQUVwQyxlQUFXLE1BQU07QUFDZixXQUFLLGFBQWE7QUFDbEIsV0FBSyxjQUFjO0FBQ25CLFdBQUssVUFBVSxVQUFVLE9BQU8sT0FBTztBQUFBLElBQ3pDLEdBQUcsR0FBRztBQUFBLEVBQ1I7QUFBQSxFQUVRLFNBQWU7QUFDckIsUUFBSSxLQUFLLGVBQWUsc0JBQXFCLGFBQWE7QUFDeEQsV0FBSyxLQUFLO0FBQUEsSUFDWixPQUFPO0FBQ0wsV0FBSyxVQUFVO0FBQUEsSUFDakI7QUFBQSxFQUNGO0FBQUEsRUFFUSxTQUFTLE9BQXFCO0FBQ3BDLFFBQUksS0FBSyxXQUFXLFVBQVUsRUFBRztBQUVqQyxTQUFLLGNBQWM7QUFDbkIsU0FBSyxjQUFjO0FBR25CLFFBQUksS0FBSyxXQUFXLFdBQVcsR0FBRztBQUNoQyxpQkFBVyxNQUFNLEtBQUssT0FBTyxHQUFHLEdBQUc7QUFBQSxJQUNyQztBQUFBLEVBQ0Y7QUFBQSxFQUVRLGNBQW9CO0FBQzFCLFFBQUksS0FBSyxXQUFXLFdBQVcsRUFBRztBQUNsQyxTQUFLLGFBQWEsS0FBSyxXQUFXLE1BQU0sR0FBRyxFQUFFO0FBQzdDLFNBQUssY0FBYztBQUFBLEVBQ3JCO0FBQUEsRUFFUSxXQUFpQjtBQUN2QixTQUFLLGFBQWE7QUFDbEIsU0FBSyxjQUFjO0FBQUEsRUFDckI7QUFBQSxFQUVRLGlCQUF1QjtBQUU3QixTQUFLLFdBQVcsaUJBQWlCLFNBQVMsQ0FBQyxNQUFNLEtBQUssa0JBQWtCLENBQUMsQ0FBQztBQUcxRSxhQUFTLGlCQUFpQixXQUFXLENBQUMsTUFBTSxLQUFLLGVBQWUsQ0FBQyxDQUFDO0FBR2xFLGFBQVMsY0FBMkIsMkJBQTJCLEdBQzNELGlCQUFpQixTQUFTLE1BQU0sS0FBSyxLQUFLLENBQUM7QUFBQSxFQUNqRDtBQUFBLEVBRVEsa0JBQWtCLEdBQWdCO0FBQ3hDLFVBQU0sU0FBUyxFQUFFO0FBQ2pCLFVBQU0sTUFBTSxPQUFPLFFBQXFCLGFBQWE7QUFFckQsUUFBSSxDQUFDLElBQUs7QUFFVixVQUFNLFFBQVEsSUFBSSxRQUFRO0FBQzFCLFVBQU0sU0FBUyxJQUFJLFFBQVE7QUFFM0IsUUFBSSxPQUFPO0FBQ1QsV0FBSyxTQUFTLEtBQUs7QUFBQSxJQUNyQixXQUFXLFdBQVcsYUFBYTtBQUNqQyxXQUFLLFlBQVk7QUFBQSxJQUNuQixXQUFXLFdBQVcsU0FBUztBQUM3QixXQUFLLFNBQVM7QUFBQSxJQUNoQjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGVBQWUsR0FBd0I7QUFDN0MsUUFBSSxDQUFDLEtBQUssU0FBVTtBQUdwQixNQUFFLGVBQWU7QUFFakIsUUFBSSxFQUFFLE9BQU8sT0FBTyxFQUFFLE9BQU8sS0FBSztBQUNoQyxXQUFLLFNBQVMsRUFBRSxHQUFHO0FBQUEsSUFDckIsV0FBVyxFQUFFLFFBQVEsYUFBYTtBQUNoQyxXQUFLLFlBQVk7QUFBQSxJQUNuQixXQUFXLEVBQUUsUUFBUSxVQUFVO0FBQzdCLFdBQUssU0FBUztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUNGO0FBN0trQztBQUFyQixzQkFDYSxjQUFjO0FBRGpDLElBQU0sdUJBQU47OztBQ0RBLElBQU0sa0JBQU4sTUFBTSxnQkFBZTtBQUFBLEVBSzFCLGNBQWM7QUFIZDtBQUFBLFNBQWlCLGVBQWU7QUFDaEMsU0FBaUIsWUFBWTtBQUczQixTQUFLLFVBQVU7QUFDZixTQUFLLHFCQUFxQjtBQUMxQixTQUFLLHVCQUF1QjtBQUM1QixTQUFLLHNCQUFzQjtBQUMzQixTQUFLLGlCQUFpQjtBQUN0QixTQUFLLGVBQWU7QUFDcEIsU0FBSyxtQkFBbUI7QUFBQSxFQUMxQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EsWUFBa0I7QUFDeEIsVUFBTSxPQUFPLFNBQVMsaUJBQThCLG1CQUFtQjtBQUV2RSxTQUFLLFFBQVEsU0FBTztBQUNsQixVQUFJLGlCQUFpQixTQUFTLE1BQU07QUFDbEMsY0FBTSxZQUFZLElBQUksUUFBUTtBQUM5QixZQUFJLFdBQVc7QUFDYixlQUFLLFlBQVksU0FBUztBQUFBLFFBQzVCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSCxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EsWUFBWSxXQUF5QjtBQUMzQyxVQUFNLE9BQU8sU0FBUyxpQkFBOEIsbUJBQW1CO0FBQ3ZFLFVBQU0sV0FBVyxTQUFTLGlCQUE4QiwyQkFBMkI7QUFDbkYsVUFBTSxZQUFZLFNBQVMsaUJBQThCLDhCQUE4QjtBQUd2RixTQUFLLFFBQVEsT0FBSztBQUNoQixVQUFJLEVBQUUsUUFBUSxRQUFRLFdBQVc7QUFDL0IsVUFBRSxVQUFVLElBQUksUUFBUTtBQUFBLE1BQzFCLE9BQU87QUFDTCxVQUFFLFVBQVUsT0FBTyxRQUFRO0FBQUEsTUFDN0I7QUFBQSxJQUNGLENBQUM7QUFHRCxhQUFTLFFBQVEsYUFBVztBQUMxQixVQUFJLFFBQVEsUUFBUSxRQUFRLFdBQVc7QUFDckMsZ0JBQVEsVUFBVSxJQUFJLFFBQVE7QUFBQSxNQUNoQyxPQUFPO0FBQ0wsZ0JBQVEsVUFBVSxPQUFPLFFBQVE7QUFBQSxNQUNuQztBQUFBLElBQ0YsQ0FBQztBQUdELGNBQVUsUUFBUSxXQUFTO0FBQ3pCLFVBQUksTUFBTSxRQUFRLFdBQVcsV0FBVztBQUN0QyxjQUFNLFVBQVUsSUFBSSxRQUFRO0FBQUEsTUFDOUIsT0FBTztBQUNMLGNBQU0sVUFBVSxPQUFPLFFBQVE7QUFBQSxNQUNqQztBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtRLHVCQUE2QjtBQUNuQyxVQUFNLGVBQWUsU0FBUyxlQUFlLFNBQVM7QUFDdEQsVUFBTSxjQUFjLFNBQVMsZUFBZSxRQUFRO0FBQ3BELFVBQU0sa0JBQWtCLFNBQVMsZUFBZSxZQUFZO0FBRTVELFFBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsZ0JBQWlCO0FBRXZELFVBQU0sWUFBWSw2QkFBTSxLQUFLLGNBQWMsY0FBYyxhQUFhLGVBQWUsR0FBbkU7QUFFbEIsaUJBQWEsaUJBQWlCLFNBQVMsU0FBUztBQUNoRCxnQkFBWSxpQkFBaUIsU0FBUyxTQUFTO0FBQy9DLG9CQUFnQixpQkFBaUIsU0FBUyxTQUFTO0FBR25ELGNBQVU7QUFBQSxFQUNaO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUSxjQUNOLGNBQ0EsYUFDQSxpQkFDTTtBQUNOLFVBQU0sVUFBVSxLQUFLLFlBQVksYUFBYSxLQUFLO0FBQ25ELFVBQU0sU0FBUyxLQUFLLFlBQVksWUFBWSxLQUFLO0FBQ2pELFVBQU0sU0FBUyxLQUFLLFlBQVksZ0JBQWdCLEtBQUs7QUFHckQsVUFBTSxlQUFlLEtBQUssZUFBZSxLQUFLLFlBQVksVUFBVTtBQUVwRSxVQUFNLGtCQUFrQixTQUFTLGVBQWUsY0FBYztBQUM5RCxRQUFJLGlCQUFpQjtBQUNuQixzQkFBZ0IsY0FBYyxLQUFLLGFBQWEsWUFBWTtBQUFBLElBQzlEO0FBR0EsU0FBSyxpQkFBaUIsUUFBUSxjQUFjLGdCQUFnQixLQUFLO0FBQUEsRUFDbkU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtRLGlCQUFpQixRQUFnQixVQUFrQixVQUF3QjtBQUNqRixVQUFNLE1BQU0sU0FBUyxlQUFlLGVBQWU7QUFDbkQsVUFBTSxRQUFRLFNBQVMsZUFBZSxpQkFBaUI7QUFDdkQsUUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFPO0FBRXBCLFVBQU0sT0FBTyxTQUFTO0FBR3RCLFFBQUksVUFBVSxPQUFPLFlBQVksWUFBWSxTQUFTO0FBRXRELFFBQUksV0FBVyxLQUFLLGFBQWEsSUFBSTtBQUVuQyxZQUFNLGNBQWM7QUFDcEIsVUFBSSxVQUFVLElBQUksU0FBUztBQUFBLElBQzdCLFdBQVcsT0FBTyxHQUFHO0FBRW5CLFlBQU0sY0FBYyxNQUFNLEtBQUssYUFBYSxJQUFJLElBQUk7QUFDcEQsVUFBSSxVQUFVLElBQUksVUFBVTtBQUFBLElBQzlCLFdBQVcsT0FBTyxHQUFHO0FBRW5CLFlBQU0sY0FBYyxLQUFLLGFBQWEsSUFBSSxJQUFJO0FBQzlDLFVBQUksVUFBVSxJQUFJLFVBQVU7QUFBQSxJQUM5QixPQUFPO0FBRUwsWUFBTSxjQUFjO0FBQ3BCLFVBQUksVUFBVSxJQUFJLFNBQVM7QUFBQSxJQUM3QjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtRLHlCQUErQjtBQUNyQyxVQUFNLFlBQVksU0FBUyxlQUFlLFdBQVc7QUFDckQsVUFBTSxnQkFBZ0IsU0FBUyxpQkFBbUMsYUFBYTtBQUMvRSxVQUFNLFlBQVksU0FBUyxlQUFlLFdBQVc7QUFDckQsVUFBTSxpQkFBaUIsU0FBUyxlQUFlLGdCQUFnQjtBQUUvRCxRQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxlQUFnQjtBQUVqRCxVQUFNLGtCQUFrQiw2QkFBTTtBQUM1QixZQUFNLFVBQVUsU0FBUyxpQkFBbUMscUJBQXFCO0FBQ2pGLFlBQU0sUUFBUSxRQUFRO0FBRXRCLHFCQUFlLGNBQWMsVUFBVSxJQUFJLFlBQVksR0FBRyxLQUFLO0FBQy9ELGdCQUFVLFdBQVcsVUFBVTtBQUcvQixnQkFBVSxVQUFVLFVBQVUsY0FBYyxVQUFVLFFBQVE7QUFDOUQsZ0JBQVUsZ0JBQWdCLFFBQVEsS0FBSyxRQUFRLGNBQWM7QUFBQSxJQUMvRCxHQVZ3QjtBQVl4QixjQUFVLGlCQUFpQixVQUFVLE1BQU07QUFDekMsb0JBQWMsUUFBUSxRQUFNLEdBQUcsVUFBVSxVQUFVLE9BQU87QUFDMUQsc0JBQWdCO0FBQUEsSUFDbEIsQ0FBQztBQUVELGtCQUFjLFFBQVEsUUFBTTtBQUMxQixTQUFHLGlCQUFpQixVQUFVLGVBQWU7QUFFN0MsU0FBRyxpQkFBaUIsU0FBUyxPQUFLLEVBQUUsZ0JBQWdCLENBQUM7QUFBQSxJQUN2RCxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1Esd0JBQThCO0FBQ3BDLFVBQU0sV0FBVyxTQUFTLGVBQWUsaUJBQWlCO0FBQzFELFVBQU0sYUFBYSxTQUFTLGVBQWUsWUFBWTtBQUV2RCxRQUFJLENBQUMsWUFBWSxDQUFDLFdBQVk7QUFFOUIsYUFBUyxpQkFBaUIsVUFBVSxNQUFNO0FBQ3hDLGlCQUFXLFdBQVcsQ0FBQyxTQUFTO0FBQUEsSUFDbEMsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtRLG1CQUF5QjtBQUMvQixVQUFNLFdBQVcsU0FBUyxlQUFlLFVBQVU7QUFDbkQsVUFBTSxTQUFTLFNBQVMsZUFBZSxRQUFRO0FBRS9DLFFBQUksQ0FBQyxZQUFZLENBQUMsT0FBUTtBQUUxQixVQUFNLFFBQVEsb0JBQUksS0FBSztBQUN2QixVQUFNLGdCQUFnQixJQUFJLEtBQUssS0FBSztBQUNwQyxrQkFBYyxRQUFRLE1BQU0sUUFBUSxJQUFJLEVBQUU7QUFFMUMsV0FBTyxRQUFRLEtBQUssY0FBYyxLQUFLO0FBQ3ZDLGFBQVMsUUFBUSxLQUFLLGNBQWMsYUFBYTtBQUFBLEVBQ25EO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUSxhQUFhLEtBQXFCO0FBQ3hDLFdBQU8sSUFBSSxlQUFlLFNBQVM7QUFBQSxNQUNqQyx1QkFBdUI7QUFBQSxNQUN2Qix1QkFBdUI7QUFBQSxJQUN6QixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EsWUFBWSxLQUFxQjtBQUN2QyxRQUFJLENBQUMsSUFBSyxRQUFPO0FBQ2pCLFdBQU8sV0FBVyxJQUFJLFFBQVEsT0FBTyxFQUFFLEVBQUUsUUFBUSxLQUFLLEdBQUcsQ0FBQyxLQUFLO0FBQUEsRUFDakU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtRLGNBQWMsTUFBb0I7QUFDeEMsV0FBTyxLQUFLLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQUEsRUFDeEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtRLGlCQUF1QjtBQUM3QixVQUFNLE9BQU8sU0FBUyxpQkFBOEIsNkNBQTZDO0FBRWpHLFNBQUssUUFBUSxTQUFPO0FBQ2xCLFlBQU0sUUFBUSxJQUFJLGFBQWEsU0FBUztBQUN4QyxVQUFJLENBQUMsTUFBTztBQUVaLFlBQU0sU0FBUyxTQUFTLGNBQTJCLGlDQUFpQyxLQUFLLElBQUk7QUFDN0YsVUFBSSxDQUFDLE9BQVE7QUFFYixVQUFJLGlCQUFpQixTQUFTLENBQUMsTUFBTTtBQUVuQyxZQUFLLEVBQUUsT0FBdUIsUUFBUSx3QkFBd0IsRUFBRztBQUVqRSxjQUFNLE9BQU8sSUFBSSxjQUFjLGtCQUFrQjtBQUNqRCxjQUFNLGFBQWEsSUFBSSxVQUFVLFNBQVMsVUFBVTtBQUdwRCxpQkFBUyxpQkFBaUIsNkJBQTZCLEVBQUUsUUFBUSxPQUFLO0FBQ3BFLGNBQUksTUFBTSxLQUFLO0FBQ2Isa0JBQU0sVUFBVSxFQUFFLGFBQWEsU0FBUztBQUN4QyxnQkFBSSxTQUFTO0FBQ1gsb0JBQU0sY0FBYyxTQUFTLGNBQTJCLGlDQUFpQyxPQUFPLElBQUk7QUFDcEcsb0JBQU0sWUFBWSxFQUFFLGNBQWMsa0JBQWtCO0FBQ3BELGtCQUFJLGVBQWUsV0FBVztBQUM1QixxQkFBSyxZQUFZLEdBQUcsYUFBYSxTQUF3QjtBQUFBLGNBQzNEO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGLENBQUM7QUFHRCxZQUFJLFlBQVk7QUFDZCxlQUFLLFlBQVksS0FBSyxRQUFRLElBQUk7QUFBQSxRQUNwQyxPQUFPO0FBQ0wsZUFBSyxVQUFVLEtBQUssUUFBUSxJQUFJO0FBQUEsUUFDbEM7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUSxVQUFVLEtBQWMsUUFBcUIsTUFBNEI7QUFDL0UsUUFBSSxVQUFVLElBQUksVUFBVTtBQUM1QixXQUFPLFVBQVUsSUFBSSxVQUFVO0FBRy9CLFVBQU0sUUFBUTtBQUFBLE1BQ1osRUFBRSxXQUFXLGVBQWU7QUFBQSxNQUM1QixFQUFFLFdBQVcsZ0JBQWdCO0FBQUEsSUFDL0IsR0FBRztBQUFBLE1BQ0QsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsTUFBTTtBQUFBLElBQ1IsQ0FBQztBQUdELFVBQU0sVUFBVSxPQUFPLGNBQWMsd0JBQXdCO0FBQzdELFFBQUksU0FBUztBQUNYLFlBQU0sU0FBUyxRQUFRO0FBQ3ZCLGFBQU8sUUFBUTtBQUFBLFFBQ2IsRUFBRSxRQUFRLE9BQU8sU0FBUyxFQUFFO0FBQUEsUUFDNUIsRUFBRSxRQUFRLEdBQUcsTUFBTSxNQUFNLFNBQVMsRUFBRTtBQUFBLE1BQ3RDLEdBQUc7QUFBQSxRQUNELFVBQVU7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLE1BQU07QUFBQSxNQUNSLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EsWUFBWSxLQUFjLFFBQXFCLE1BQTRCO0FBRWpGLFVBQU0sUUFBUTtBQUFBLE1BQ1osRUFBRSxXQUFXLGdCQUFnQjtBQUFBLE1BQzdCLEVBQUUsV0FBVyxlQUFlO0FBQUEsSUFDOUIsR0FBRztBQUFBLE1BQ0QsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsTUFBTTtBQUFBLElBQ1IsQ0FBQztBQUdELFVBQU0sVUFBVSxPQUFPLGNBQWMsd0JBQXdCO0FBQzdELFFBQUksU0FBUztBQUNYLFlBQU0sU0FBUyxRQUFRO0FBQ3ZCLFlBQU0sWUFBWSxPQUFPLFFBQVE7QUFBQSxRQUMvQixFQUFFLFFBQVEsR0FBRyxNQUFNLE1BQU0sU0FBUyxFQUFFO0FBQUEsUUFDcEMsRUFBRSxRQUFRLE9BQU8sU0FBUyxFQUFFO0FBQUEsTUFDOUIsR0FBRztBQUFBLFFBQ0QsVUFBVTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsTUFBTTtBQUFBLE1BQ1IsQ0FBQztBQUVELGdCQUFVLFdBQVcsTUFBTTtBQUN6QixZQUFJLFVBQVUsT0FBTyxVQUFVO0FBQy9CLGVBQU8sVUFBVSxPQUFPLFVBQVU7QUFBQSxNQUNwQztBQUFBLElBQ0YsT0FBTztBQUNMLFVBQUksVUFBVSxPQUFPLFVBQVU7QUFDL0IsYUFBTyxVQUFVLE9BQU8sVUFBVTtBQUFBLElBQ3BDO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EscUJBQTJCO0FBQ2pDLFVBQU0sV0FBVyxTQUFTLGNBQTJCLDhCQUE4QjtBQUNuRixRQUFJLENBQUMsU0FBVTtBQUVmLGFBQVMsTUFBTSxTQUFTO0FBQ3hCLGFBQVMsaUJBQWlCLFNBQVMsQ0FBQyxNQUFNO0FBRXhDLFVBQUssRUFBRSxPQUF1QixRQUFRLHdCQUF3QixFQUFHO0FBRWpFLFdBQUssWUFBWSxZQUFZO0FBQUEsSUFDL0IsQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQTFXNEI7QUFBckIsSUFBTSxpQkFBTjs7O0FDU0EsSUFBTSxPQUFOLE1BQU0sS0FBSTtBQUFBLEVBUWYsY0FBYztBQUVaLFNBQUssVUFBVSxJQUFJLGtCQUFrQjtBQUNyQyxTQUFLLFVBQVUsSUFBSSxpQkFBaUI7QUFDcEMsU0FBSyxRQUFRLElBQUksZ0JBQWdCO0FBQ2pDLFNBQUssU0FBUyxJQUFJLGlCQUFpQjtBQUNuQyxTQUFLLGFBQWEsSUFBSSxxQkFBcUIsS0FBSyxPQUFPO0FBQ3ZELFNBQUssT0FBTyxJQUFJLGVBQWU7QUFBQSxFQUNqQztBQUNGO0FBakJpQjtBQUFWLElBQU0sTUFBTjtBQXNCUCxJQUFJO0FBS0osU0FBUyxPQUFhO0FBQ3BCLFFBQU0sSUFBSSxJQUFJO0FBR2QsTUFBSSxPQUFPLFdBQVcsYUFBYTtBQUNqQyxJQUFDLE9BQW1DLE1BQU07QUFBQSxFQUM1QztBQUNGO0FBUFM7QUFVVCxJQUFJLFNBQVMsZUFBZSxXQUFXO0FBQ3JDLFdBQVMsaUJBQWlCLG9CQUFvQixJQUFJO0FBQ3BELE9BQU87QUFDTCxPQUFLO0FBQ1A7QUFHQSxJQUFPLGNBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg== diff --git a/PlanTempus.Application/wwwroot/ts/app.ts b/PlanTempus.Application/wwwroot/ts/app.ts index d9b665c..572c427 100644 --- a/PlanTempus.Application/wwwroot/ts/app.ts +++ b/PlanTempus.Application/wwwroot/ts/app.ts @@ -9,7 +9,7 @@ import { DrawerController } from './modules/drawers'; import { ThemeController } from './modules/theme'; import { SearchController } from './modules/search'; import { LockScreenController } from './modules/lockscreen'; -import { KasseController } from './modules/kasse'; +import { CashController } from './modules/cash'; /** * Main application class @@ -20,7 +20,7 @@ export class App { readonly theme: ThemeController; readonly search: SearchController; readonly lockScreen: LockScreenController; - readonly kasse: KasseController; + readonly cash: CashController; constructor() { // Initialize controllers @@ -29,7 +29,7 @@ export class App { this.theme = new ThemeController(); this.search = new SearchController(); this.lockScreen = new LockScreenController(this.drawers); - this.kasse = new KasseController(); + this.cash = new CashController(); } } diff --git a/PlanTempus.Application/wwwroot/ts/modules/kasse.ts b/PlanTempus.Application/wwwroot/ts/modules/cash.ts similarity index 94% rename from PlanTempus.Application/wwwroot/ts/modules/kasse.ts rename to PlanTempus.Application/wwwroot/ts/modules/cash.ts index 0a6213a..519dde2 100644 --- a/PlanTempus.Application/wwwroot/ts/modules/kasse.ts +++ b/PlanTempus.Application/wwwroot/ts/modules/cash.ts @@ -1,11 +1,11 @@ /** - * Kasse Controller + * Cash Controller * * Handles tab switching, cash calculations, and form interactions - * for the Kasse (Cash Register) page. + * for the Cash Register page. */ -export class KasseController { +export class CashController { // Base values (from system - would come from server in real app) private readonly startBalance = 2000; private readonly cashSales = 3540; @@ -42,7 +42,7 @@ export class KasseController { private switchToTab(targetTab: string): void { const tabs = document.querySelectorAll('swp-tab[data-tab]'); const contents = document.querySelectorAll('swp-tab-content[data-tab]'); - const statsBars = document.querySelectorAll('swp-kasse-stats[data-for-tab]'); + const statsBars = document.querySelectorAll('swp-cash-stats[data-for-tab]'); // Update tab states tabs.forEach(t => { @@ -243,13 +243,13 @@ export class KasseController { * Setup row toggle for expandable details */ private setupRowToggle(): void { - const rows = document.querySelectorAll('swp-kasse-table-row[data-id]:not(.draft-row)'); + const rows = document.querySelectorAll('swp-cash-table-row[data-id]:not(.draft-row)'); rows.forEach(row => { const rowId = row.getAttribute('data-id'); if (!rowId) return; - const detail = document.querySelector(`swp-kasse-row-detail[data-for="${rowId}"]`); + const detail = document.querySelector(`swp-cash-row-detail[data-for="${rowId}"]`); if (!detail) return; row.addEventListener('click', (e) => { @@ -260,11 +260,11 @@ export class KasseController { const isExpanded = row.classList.contains('expanded'); // Close other expanded rows - document.querySelectorAll('swp-kasse-table-row.expanded').forEach(r => { + document.querySelectorAll('swp-cash-table-row.expanded').forEach(r => { if (r !== row) { const otherId = r.getAttribute('data-id'); if (otherId) { - const otherDetail = document.querySelector(`swp-kasse-row-detail[data-for="${otherId}"]`); + const otherDetail = document.querySelector(`swp-cash-row-detail[data-for="${otherId}"]`); const otherIcon = r.querySelector('swp-row-toggle i'); if (otherDetail && otherIcon) { this.collapseRow(r, otherDetail, otherIcon as HTMLElement); @@ -353,10 +353,10 @@ export class KasseController { } /** - * Setup draft row click to navigate to Kasseafstemning tab + * Setup draft row click to navigate to reconciliation tab */ private setupDraftRowClick(): void { - const draftRow = document.querySelector('swp-kasse-table-row.draft-row'); + const draftRow = document.querySelector('swp-cash-table-row.draft-row'); if (!draftRow) return; draftRow.style.cursor = 'pointer';