diff --git a/Dockerfile b/Dockerfile
index a3cc02e0..7411442a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -11,5 +11,5 @@ ADD mix.exs mix.lock ./
RUN mix do deps.get, deps.compile
ADD assets assets/
-RUN npm --prefix assets install
+RUN npm --prefix assets ci
RUN npm --prefix assets run build
diff --git a/README.md b/README.md
index a7538aa8..7bcb540d 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ every aspect of a particular resource view, like the edit form.
* `actions` - functions that operate on a specific record
* `tasks` - functions that operate on a resource as a whole
-* `list_with` - function used to fetch records
+* `query_with` - function used to fetch a batch of records
* `render_with` - function used to encode field values in views
* `create_with` - function used to insert a record
* `update_with` - function used to update a record
diff --git a/README.md.eex b/README.md.eex
index 5c37a223..2af523b6 100644
--- a/README.md.eex
+++ b/README.md.eex
@@ -77,7 +77,7 @@ every aspect of a particular resource view, like the edit form.
* `actions` - functions that operate on a specific record
* `tasks` - functions that operate on a resource as a whole
-* `list_with` - function used to fetch records
+* `query_with` - function used to fetch a batch of records
* `render_with` - function used to encode field values in views
* `create_with` - function used to insert a record
* `update_with` - function used to update a record
diff --git a/assets/css/app.css b/assets/css/app.css
index 3d2ce15f..904eccd9 100644
--- a/assets/css/app.css
+++ b/assets/css/app.css
@@ -1,930 +1,1897 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-@layer base {
- * {
- @apply bg-inherit;
- }
-
- h1 {
- @apply text-3xl;
- @apply md:text-5xl;
- @apply mb-4;
- @apply font-extrabold;
- }
-
- input, textarea {
- @apply relative;
- @apply rounded;
- @apply text-sm;
- @apply border;
- @apply outline-none;
- @apply focus:outline-none;
- @apply focus:ring;
- @apply p-1;
- @apply overflow-hidden;
- }
-
- select {
- @apply appearance-none;
- @apply bg-clip-padding;
- @apply bg-no-repeat;
- @apply border;
- @apply border-solid;
- @apply rounded;
- @apply transition;
- @apply ease-in-out;
- @apply focus:outline-none;
- @apply w-32;
- @apply p-1;
- }
-}
-
-input[type="date"], input[type="number"] {
- @apply w-32;
-}
-
-input[type="submit"] {
- @apply cursor-pointer;
-};
-
-@layer components {
- .view__container {
- @apply overflow-y-auto;
- }
-
- #list .table__wrapper {
- @apply overflow-auto;
- @apply max-h-full;
- }
-
- #prefix-select nav {
- @apply overflow-y-auto;
- }
-
- #jobs {
- @apply absolute;
- @apply bottom-0;
- @apply left-5;
- @apply w-60;
- @apply z-50;
- @apply border-x-2;
- @apply border-t-2;
- @apply p-5;
- @apply rounded-t-md;
- }
-
- #jobs:empty {
- @apply invisible;
- }
-
- .job__container {
- @apply w-full;
- @apply rounded-full;
- @apply mb-2;
- @apply relative;
- @apply bg-transparent;
- @apply h-5;
- }
-
- .job__label {
- @apply inline-block;
- @apply text-xs;
- @apply font-medium;
- @apply pl-1;
- @apply w-full;
- @apply h-full;
- @apply rounded-full;
- @apply border;
- @apply absolute;
- @apply top-0;
- @apply leading-normal;
- }
-
- .job__bar {
- @apply absolute;
- @apply top-0;
- @apply h-full;
- @apply rounded-full;
- @apply -z-10;
- @apply min-w-5;
- }
-
- .topbar {
- @apply bg-transparent;
- }
-
- .disabled {
- @apply opacity-30;
- }
-
- .drop::before {
- content: ' ';
- display: inline-block;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-left: 5px solid currentColor;
- vertical-align: middle;
- margin-right: .7rem;
- transform: translateY(-2px);
- transition: transform .2s ease-out;
- }
-
- .drop-down::before {
- transform: rotate(90deg) translateX(-3px);
- }
-
- .drop-up::before {
- transform: rotate(-90deg) translateX(3px);
- }
-
- .button__add {
- @apply inline-block;
- content: " ";
- width: 24px;
- height: 24px;
- background: url("data:image/svg+xml;utf8, ");
- }
-
- .button__remove {
- @apply inline-block;
- content: " ";
- width: 24px;
- height: 24px;
- background: url("data:image/svg+xml;utf8, ");
- }
-
- .button__up {
- @apply inline-block;
- content: " ";
- width: 24px;
- height: 24px;
- background: url("data:image/svg+xml;utf8, ");
- }
-
- .button__down {
- @apply inline-block;
- content: " ";
- width: 24px;
- height: 24px;
- background: url("data:image/svg+xml;utf8, ");
- }
-
- @keyframes spinner {
- to {transform: rotate(360deg);}
- }
-
- .spinner {
- content: "";
+* {
+ margin: 0;
+ padding: 0;
box-sizing: border-box;
+}
+
+body {
+ font-family: system-ui, sans-serif;
+ background: var(--bg-light);
+ color: var(--text-primary);
+
+ /* Primary Colors */
+ --accent-color: #6B46C1;
+ --accent-hover: #7C3AED;
+
+ /* Background Colors */
+ --bg-light: #f5f5f7;
+ --bg-white: #fff;
+ --bg-medium: #e8e8ed;
+
+ /* Border Colors */
+ --border-light: #d2d2d7;
+ --border-medium: #e8e8ed;
+
+ /* Text Colors */
+ --text-primary: #1d1d1f;
+ --text-secondary: #515154;
+ --text-muted: #86868b;
+
+ /* Status Colors - Error/Warning */
+ --error-bg: #fef2f2;
+ --error-color: #dc2626;
+ --error-hover: #7f1d1d;
+
+ /* Status Colors - Success */
+ --success-bg: #f0fdf4;
+ --success-light: #d1fae5;
+ --success-color: #16a34a;
+ --success-dark: #065f46;
+ --success-hover: #166534;
+
+ /* Status Colors - Info */
+ --info-bg: #eff6ff;
+ --info-light: #dbeafe;
+ --info-color: #2563eb;
+ --info-dark: #1e40af;
+ --info-hover: #1e40af;
+
+ /* Status Colors - Warning/Pending */
+ --warning-bg: #fff1e5;
+ --warning-color: #e53e3e;
+ --warning-hover: #c53030;
+
+ /* Purple Selection States */
+ --purple-50: #f3e8ff;
+ --purple-100: #e9d5ff;
+
+ /* Opacity Values */
+ --opacity-disabled: 0.4;
+ --opacity-muted: 0.7;
+
+ /* Shadow */
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.1);
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.15);
+ --shadow-lg: 0 20px 60px rgba(0, 0, 0, 0.3);
+
+ /* Focus Ring */
+ --focus-ring: 0 0 0 3px rgba(107, 70, 193, 0.1);
+
+ --top-height: 64px;
+}
+
+body {
+ padding-top: var(--top-height);
+}
+
+body:has(.alert-bar) {
+ padding-top: 112px;
+}
+
+p {
+ margin: 1lh 0;
+}
+
+h1[class$='title'], h3[class$='title'], h3[class$='title'] {
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ color:var(--accent-hover);
+ font-size: 16px;
+ opacity:.75;
+}
+
+h1[class$='title'] {
+ font-size: 16px;
+}
+
+h2[class$='title'] {
+ font-size: 14px;
+}
+
+ h3[class$='title'] {
+ font-size: 12px;
+}
+
+h1 span,h2 span,h3 span {
+ display:block;
+ font-size: 2.5em;
+ color:var(--text-primary);
+ text-transform: none;
+ opacity:1;
+}
+
+/* Header */
+.header {
+ background: var(--bg-white);
+ border-bottom: 1px solid var(--border-light);
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 100;
+}
+
+.header-content {
+ margin: 0 32px 0 24px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ height: var(--top-height);
+}
+
+.logo {
+ font-size: 20px;
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+.user-menu {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+
+#alert-bar {
+ position: fixed;
+ left: 0;
+ right: 0;
+}
+
+#alert-bar:hover .alert-bar + .alert-bar {
+ top:64px;
+ opacity:100;
+}
+
+.alert-bar {
+ position:absolute;
+ padding: 14px 24px;
+ align-items: center;
+ justify-content: space-between;
+ border-width: 2px 0;
+ border-style: solid;
+ transition: all 0.2s ease-in-out;
+ width:100%;
+ display:flex;
+ height:64px;
+ z-index:2;
+}
+
+.alert-bar + .alert-bar {
+ border-top-width:0;
+ position:absolute;
+ top:0;
+ opacity:0;
+ z-index:1;
+}
+
+.alert-count {
+ border-width: 2px;
+ border-style: solid;
+ border-radius: 50%;
+ width: 1.25lh;
+ text-align: center;
+ height: 1.25lh;
+ vertical-align: middle;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+}
+
+.alert-bar.error {
+ background: var(--error-bg);
+ border-color: var(--error-color);
+ color: var(--error-color);
+}
+
+.alert-bar.error:hover {
+ color: var(--error-hover);
+}
+
+.alert-bar.success {
+ background: var(--success-bg);
+ border-color: var(--success-color);
+ color: var(--success-color);
+}
+
+.alert-bar.success:hover {
+ color: var(--success-hover);
+}
+
+.alert-bar.info {
+ background: var(--info-bg);
+ border-color: var(--info-color);
+ color: var(--info-color);
+}
+
+.alert-bar.info:hover {
+ color: var(--info-hover);
+}
+
+#alert-bar[class$='loading'] {
+ opacity: var(--opacity-muted);
+ pointer-events: none;
+}
+
+.alert-content {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ flex: 1;
+}
+
+.alert-icon {
width: 20px;
height: 20px;
- border-radius: 50%;
- border: 2px solid #ccc;
- border-top-color: #000;
- animation: spinner 0.6s linear infinite;
- }
-
- input[class$="-loading"] + div nav:before {
- @apply spinner;
- @apply absolute;
- @apply top-1;
- @apply right-1;
- }
-
- .button__remove, .button__add {
- @apply opacity-50;
- }
-
- .button__remove:hover, .button__add:hover {
- @apply opacity-100;
- }
-
- .search_select {
- @apply flex;
- @apply flex-row;
- @apply content-center;
- }
-
- .search_select nav {
- @apply w-full;
- }
-
- .search_select .button__remove {
- @apply mr-1;
- }
-
- .main__content {
- @apply flex;
- @apply flex-col;
- }
-
- .main__wrap {
- @apply flex;
- @apply overflow-hidden;
- @apply h-screen;
- }
-
- .nav {
- @apply overflow-y-auto;
- @apply w-1/5;
- @apply p-4;
- }
-
- .nav__list {
- @apply content-center;
- @apply justify-between;
- }
-
- .nav__list > .nav__item:first-of-type {
- @apply pb-5;
- @apply text-3xl;
- @apply font-bold;
- @apply text-center;
- }
-
- .nav__item {
- @apply truncate;
- }
-
- .nav__item--drop {
- @apply ml-1;
- }
-
- .nav__item--drop > ul {
- @apply ml-4;
- }
-
- .nav__item--group {
- @apply nav__item;
- @apply border-b;
- @apply py-1;
- @apply flex;
- @apply flex-col;
- }
-
- .nav__item--selected {
- @apply nav__item;
- }
-
- .nav__item--selected a {
- @apply underline;
- @apply decoration-dotted;
- }
-
- .nav__item a {
- @apply p-1;
- @apply rounded;
- }
-
- .nav__item--active {
- @apply p-2;
- @apply truncate;
- }
-
- .nav__item--drop {
- @apply whitespace-nowrap;
- }
-
- .nav__item--drop input {
- @apply hidden;
- }
-
- .nav__item--drop label {
- @apply pl-1;
- @apply font-bold;
+ flex-shrink: 0;
+ cursor: pointer;
+}
+
+.alert-message {
+ font-size: 14px;
+ font-weight: 500;
+}
+
+.alert-close {
+ cursor: pointer;
+ padding: 6px 12px;
+ border-radius: 6px;
+ transition: all 0.2s;
+ font-size: 16px;
+ line-height: 1;
+ font-weight: 600;
+ flex-shrink: 0;
+}
+
+/* Breadcrumb Navigation */
+.breadcrumb {
+ display: none;
+}
+
+.breadcrumb-content {
+ display: none;
+}
+
+.breadcrumb a {
+ display: none;
+}
+
+.breadcrumb-separator {
+ display: none;
+}
+
+.breadcrumb-current {
+ display: none;
+}
+
+/* Main Layout */
+.main-layout {
+ display: flex;
+ min-height: calc(100vh - var(--top-height));
+}
+
+/* Sidebar Navigation */
+.sidebar {
+ width: 20vw;
+ min-width: 200px;
+ max-width: 300px;
+ background: var(--bg-white);
+ border-right: 1px solid var(--border-light);
+ padding: 24px 0 180px 0;
+ position: fixed;
+ left: 0;
+ top: var(--top-height);
+ bottom: 0;
+ overflow-y: auto;
+ z-index: 10;
+}
+
+body:has(.alert-bar) .sidebar {
+ top: 112px;
+}
+
+.nav-section {
+ margin-bottom: 32px;
+}
+
+.nav-section-title {
+ padding: 0 24px 12px;
+ font-size: 12px;
+ font-weight: 600;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.nav-item {
+ padding: 10px 24px;
+ color: var(--text-primary);
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ transition: background 0.2s;
cursor: pointer;
- transition: all 0.25s ease-out;
- }
-
- .nav__item--drop label {
- @apply drop;
- }
-
- .nav__item--drop input:checked + label {
- @apply drop-down;
- }
-
- .nav__item--drop ul {
- @apply hidden;
- }
-
- .nav__item--drop input:checked + label + ul {
- @apply list-item;
- }
-
- .content {
- @apply flex;
- @apply flex-col;
- @apply w-4/5;
- @apply p-2;
- }
-
- .home__intro {
- @apply py-2;
- @apply text-xl;
- }
-
- .resource__banner {
- @apply grid;
- @apply grid-cols-1;
- @apply lg:grid-cols-2;
- @apply whitespace-nowrap;
- @apply overflow-x-clip;
- @apply mb-2;
- }
-
- .resource__title {
- @apply grid;
- @apply items-center;
- @apply justify-items-center;
- @apply lg:justify-items-end;
- @apply h-full;
- direction: rtl;
- }
-
- .resource__actions {
- @apply flex-col;
- @apply flex-1;
- @apply items-center;
- @apply grid;
- @apply justify-items-center;
- @apply lg:justify-items-end;
- @apply whitespace-nowrap;
- }
-
- .resource__actions > div > * {
- @apply ml-2;
- }
-
- .resource__action {
- @apply inline-flex;
- @apply h-8;
- }
-
- .resource__action--link:hover {
- @apply underline;
- }
-
- .resource__action--btn, .resource__action--secondary {
- @apply resource__action;
- @apply items-center;
- @apply px-4;
- @apply text-sm;
- @apply transition-colors;
- @apply duration-150;
- @apply relative;
- @apply rounded-lg;
- @apply relative;
- @apply whitespace-nowrap;
- @apply border;
- }
-
- .resource__action--disabled {
- @apply resource__action--btn;
- @apply disabled;
- }
-
- .resource__action--danger {
- @apply resource__action--btn;
- }
-
- .resource__action--drop {
- @apply resource__action;
- }
-
- [class$="--drop"] {
- @apply flex-col;
- }
-
- [class$="--drop"] > div {
- @apply relative;
- }
-
- [class$="--drop"] nav {
- @apply appearance-none;
- @apply hidden;
- @apply absolute;
- @apply left-0;
- @apply border;
- @apply rounded-md;
- @apply pl-2;
- @apply truncate;
- @apply z-50;
- @apply max-h-80;
- @apply p-1;
- }
-
- [class$="--drop"] div:first-child nav {
- @apply bottom-2;
- }
-
- [class$="--drop"] div:last-child nav {
- @apply top-1;
- }
-
- [class$="--drop"]:focus-within nav {
- @apply block;
- }
-
- [class$="--drop"] nav a:hover {
- @apply underline;
- }
-
- .resource__view dd {
- @apply mb-3;
- }
-
- #index-page {
- @apply overflow-x-auto;
- }
-
- .list__search {
- @apply bg-transparent;
- @apply flex;
- @apply m-1;
- }
-
- .list__error {
- @apply w-full;
- @apply text-center;
- }
-
- .list__error * {
- @apply m-2;
- }
-
- .list__search input {
- @apply px-4;
- @apply py-1;
- @apply w-60;
- @apply border-0;
- @apply h-8;
- }
-
- .list__search svg {
- @apply w-5;
- @apply h-5;
- }
-
- .resource__table {
- @apply p-2;
- @apply m-1;
- @apply shadow-md;
- @apply rounded;
- @apply border-collapse;
- @apply border;
- @apply relative;
- }
-
- .resource__table th {
- @apply sticky;
- @apply z-10;
- @apply top-0;
- }
-
- .table__footer > div {
- @apply p-2;
- @apply flex;
- @apply items-center;
- }
-
- #footer-nav div {
- @apply flex;
- @apply flex-row;
- @apply items-center;
- @apply justify-center;
- @apply w-full;
- @apply font-semibold;
- }
-
- #settings-modal label {
- @apply bg-inherit;
- @apply w-1/2;
- }
-
- #list-filters > div:nth-child(1) {
- @apply flex;
- @apply justify-evenly;
- }
-
- #list-filters div > div:nth-child(1) {
- @apply flex;
- }
-
- #list-filters > div > div:nth-child(2) {
- @apply flex;
- @apply justify-evenly;
- }
-
- #list-filters div > div:nth-child(2) > * {
- @apply w-1/4;
- @apply leading-5;
- }
-
- #list-filters > div:last-of-type {
- @apply justify-start;
- }
-
- .resource__table dd {
- @apply mb-5;
- }
-
- .resource__header {
- @apply border;
- @apply px-8;
- @apply py-4;
- @apply whitespace-nowrap;
- }
-
- .header__link--down {
- @apply drop;
- @apply drop-down;
- }
-
- .header__link--up {
- @apply drop;
- @apply drop-up;
- }
-
- [class^="resource__cell"] {
- @apply px-4;
- @apply py-2;
- @apply h-20;
- @apply relative;
- }
-
- .resource__cell:not(:first-child) .cell__contents {
- @apply overflow-y-auto;
- }
-
- .cell__contents {
- @apply flex;
- @apply flex-col;
- @apply h-full;
- @apply w-full;
- @apply justify-center;
- align-items: safe center;
- }
-
- .resource__menu--drop svg {
- @apply w-5;
- @apply h-5;
- }
-
- .cell__copy {
- @apply cursor-pointer;
- }
-
- .resource__form {
- @apply shadow-md;
- @apply rounded;
- @apply border-collapse;
- @apply border;
- @apply w-3/4;
- @apply shadow-md;
- @apply p-2;
- @apply m-1;
- @apply w-full;
- }
-
- .form__actions {
- @apply flex;
- @apply justify-end;
- }
-
- .form__actions > * {
- @apply ml-1;
- }
-
- .table__actions {
- @apply flex;
- }
-
- .table__actions * {
- @apply mr-2;
- }
-
- .embed__sort, .embed__drop {
- @apply hidden;
- }
-
- .embed__title {
- @apply mb-2;
- @apply uppercase;
- @apply font-bold;
- @apply text-lg;
- }
-
- .embed__group {
- @apply border-l;
- @apply border-dashed;
- @apply pb-5;
- @apply relative;
- @apply ml-3;
- }
-
- .embed__group .button__add {
- @apply absolute;
- @apply -bottom-2;
- @apply -left-3;
- }
-
- .embed__item > .button__remove {
- @apply absolute;
- @apply -top-2;
- @apply -left-2;
- }
-
- .embed__item > .button__up {
- @apply absolute;
- @apply -top-2;
- @apply -right-2;
- }
-
- .embed__item > .button__down {
- @apply absolute;
- @apply -bottom-2;
- @apply -right-2;
- }
-
- .embed__item {
- @apply relative;
- @apply border;
- @apply border-dotted;
- @apply ml-5;
- @apply mt-3;
- }
-
- .embed__item > div {
- @apply flex-col;
- @apply p-3;
- @apply grow;
- }
-
- .field__group {
- @apply flex;
- @apply flex-col;
- @apply mb-4;
- }
-
-
- .field__group--disabled {
- @apply field__group;
- @apply disabled;
- }
-
- .field__label {
- @apply mb-2 uppercase;
- @apply font-bold;
- @apply text-lg;
- }
-
- .checkbox__group input {
- @apply scale-150;
- }
-
- .checkbox__group label {
- @apply ml-1;
- }
-
- .checkbox__group {
- @apply grid;
- grid-template-columns: auto minmax(0, 1fr);
- @apply gap-1;
- @apply justify-items-start;
- @apply ml-3;
- }
-
- .field__array--group {
- @apply relative;
- @apply pb-6;
- }
-
- .field__array--row input:not(first-of-type) {
- @apply mr-2;
- }
-
- .field__array--group a.button__add {
- @apply absolute;
- @apply -left-0;
- @apply -bottom-1;
- }
-
- .field__array--group > div {
- @apply flex;
- @apply items-center;
- @apply mb-2;
- }
-
- .field__array--group > div > a {
- @apply shrink-0;
- @apply mr-2;
- }
-
- .field__array--group input {
- @apply mb-0;
- }
-
- .field__map--group > div {
- @apply relative;
- @apply pb-6;
- }
-
- .field__map--group a.button__remove {
- @apply shrink-0;
- @apply mr-2;
- }
-
- .field__map--group a.button__add {
- @apply absolute;
- @apply left-0;
- @apply bottom-0;
- }
-
- .field__map--row {
- @apply flex;
- @apply items-center;
- @apply mb-2;
- }
-
- .field__map--row textarea {
- @apply mb-0;
- @apply mr-2;
- @apply w-1/4;
- }
-
- .toast__container {
- @apply fixed;
- @apply w-48;
- @apply z-40;
- @apply rounded;
- @apply p-1;
- @apply text-center;
- @apply border;
- @apply bottom-5;
- @apply text-clip;
- @apply overflow-hidden;
-
- left: 50%;
- top: auto !important;
- transform: translate(-50%, -50%) !important;
- }
-
- [class^="toast__container"]:empty {
+}
+
+.nav-item:hover {
+ background: var(--bg-light);
+}
+
+.nav-item.active {
+ background: var(--bg-light);
+ font-weight: 500;
+ border-left: 3px solid var(--accent-color);
+ color: var(--accent-color) !important;
+}
+
+.nav-icon {
+ width: 20px;
+ height: 20px;
+ fill: currentColor;
+}
+
+.nav-icon svg {
+ width: 100%;
+ height: 100%;
+ display: block;
+}
+
+.nav-item-expand {
+ margin-left: auto;
+ opacity: var(--opacity-muted);
+ font-size: 12px;
+ transition: transform 0.2s;
+}
+
+.nav-toggle-input {
display: none;
- }
+}
+
+.nav-toggle-label {
+ padding: 10px 24px;
+ color: var(--text-primary);
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ transition: background 0.2s;
+ cursor: pointer;
+ user-select: none;
+}
+
+.nav-toggle-label:hover {
+ background: var(--bg-light);
+}
+
+.nav-toggle-label.active {
+ background: var(--bg-medium);
+ font-weight: 500;
+ border-left: 3px solid var(--accent-color);
+}
+
+.nav-subitems {
+ max-height: 0;
+ overflow: hidden;
+}
+
+.nav-toggle-input:checked + .nav-toggle-label + .nav-subitems {
+ max-height: none;
+}
+
+.nav-toggle-input:checked + .nav-toggle-label .nav-item-expand {
+ transform: rotate(180deg);
+}
+
+/* Nested level styles using child selectors */
+.nav-subitems .nav-toggle-label {
+ padding: 8px 24px;
+ color: var(--text-secondary);
+ font-size: 16px;
+}
+
+.nav-subitems .nav-toggle-label:hover {
+ color: var(--accent-color);
+ background: transparent;
+}
+
+.nav-subitems .nav-subitems {
+ padding-left: 16px;
+ max-height: 0;
+}
+
+/* Third level items (leaf nodes without expand arrows) */
+.nav-subitems .nav-subitems a {
+ padding: 8px 24px;
+ color: var(--text-secondary);
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ font-size: 16px;
+ transition: color 0.2s;
+}
- .toast__container--info {
- @apply toast__container;
- top: auto !important;
- transform: translate(-50%, -50%) !important;
- }
+.nav-subitems .nav-subitems a:hover {
+ color: var(--accent-color);
+}
+
+.nav-subitem {
+ padding: 8px 24px;
+ color: var(--text-secondary);
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 16px;
+ transition: color 0.2s;
+}
+
+.nav-subitem:hover {
+ color: var(--accent-color);
+}
+
+.nav-subitem .nav-item-expand {
+ opacity: var(--opacity-muted);
+ font-size: 12px;
+}
+
+/* Progress Section */
+.nav-progress-section {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 16px 24px 24px;
+ border-top: 1px solid var(--border-light);
+ background: var(--bg-white);
+}
+
+.nav-progress-title {
+ font-size: 12px;
+ font-weight: 600;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ margin-bottom: 16px;
+}
+
+.progress-item {
+ margin-bottom: 16px;
+}
+
+.progress-item:last-child {
+ margin-bottom: 0;
+}
+
+.progress-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 6px;
+}
+
+.progress-label {
+ font-size: 13px;
+ color: var(--text-primary);
+ font-weight: 500;
+}
+
+.progress-percentage {
+ font-size: 12px;
+ color: var(--text-muted);
+ font-weight: 600;
+}
- .toast__container--error {
- @apply toast__container;
- top: auto !important;
- transform: translate(-50%, -50%) !important;
- }
+.progress-bar-container {
+ width: 100%;
+ height: 6px;
+ background: var(--bg-medium);
+ border-radius: 3px;
+ overflow: hidden;
+}
+
+.progress-bar {
+ height: 100%;
+ background: var(--accent-color);
+ border-radius: 3px;
+ transition: width 0.3s ease;
+}
- .toast__container--success {
- @apply toast__container;
- top: auto !important;
- transform: translate(-50%, -50%) !important;
- }
+/* Content Area */
+.content {
+ flex: 1;
+ padding: 32px;
+ margin-left: 20vw;
+ max-width: calc(100vw - 20vw);
+ box-sizing: border-box;
}
-.cell__icons {
- display: none;
- position: absolute;
- bottom: 0px;
- right: 0px;
- margin: 0.25rem;
+@media (min-width: 1500px) {
+ .content {
+ margin-left: 300px;
+ max-width: calc(100vw - 300px);
+ }
}
-.cell__icons div {
- cursor: pointer;
- @apply mx-1;
+@media (max-width: 1000px) {
+ .content {
+ margin-left: 200px;
+ max-width: calc(100vw - 200px);
+ }
}
-[class^="resource__cell"]:hover .cell__icons {
- @apply flex;
+.content-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 32px;
+ flex-wrap: wrap;
+ gap: 16px;
+ max-width: 100%;
+ overflow: visible;
}
-.resource__cell svg {
- @apply w-6;
- @apply h-6;
+.content-title {
+ font-size: 32px;
+ font-weight: 600;
+ flex-shrink: 1;
+ min-width: 0;
+ overflow-wrap: break-word;
}
-.field__assoc--link {
- @apply leading-9;
- @apply underline;
- vertical-align: bottom;
+@media (max-width: 768px) {
+ .content-header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .contextual-actions {
+ width: 100%;
+ }
+}
+
+/* Contextual Buttons */
+.contextual-actions {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+ flex-shrink: 0;
+}
+
+.btn {
+ padding: 10px 20px;
+ border: none;
+ border-radius: 8px;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.btn-primary {
+ background: var(--accent-color);
+ color: var(--bg-white);
+}
+
+.btn-primary:hover {
+ background: var(--accent-hover);
+}
+
+.btn-secondary {
+ background: var(--bg-white);
+ color: var(--text-primary);
+ border: 1px solid var(--border-light);
+}
+
+.btn-secondary:hover {
+ background: var(--bg-light);
+}
+
+.btn-select {
+ padding: 10px 20px;
+ border: 1px solid var(--border-light);
+ border-radius: 8px;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ background: var(--bg-white);
+ color: var(--text-primary);
+ transition: all 0.2s;
+ position: relative;
}
-.field__assoc--link:hover::after {
- @apply leading-9;
- @apply inline-block;
- content: " ";
- background-image: url("data:image/svg+xml, ");
- width: 20px;
- height: 20px;
- @apply ml-2;
- @apply ml-2;
+.btn-select:hover {
+ background: var(--bg-light);
}
+.btn-select[open] {
+ background: var(--bg-light);
+}
+
+.btn-select summary {
+ list-style: none;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ cursor: pointer;
+ user-select: none;
+}
+
+.btn-select summary::-webkit-details-marker {
+ display: none;
+}
+
+.btn-select summary::after {
+ content: '';
+ width: 0;
+ height: 0;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 5px solid var(--text-primary);
+ margin-left: 8px;
+}
+
+.btn-select[open] summary::after {
+ border-top: none;
+ border-bottom: 5px solid var(--text-primary);
+}
+
+.drop-menu {
+ position: absolute;
+ top: calc(100% + 4px);
+ right: 0;
+ background: var(--bg-white);
+ border: 1px solid var(--border-light);
+ border-radius: 8px;
+ box-shadow: var(--shadow-md);
+ min-width: 200px;
+ padding: 8px 0;
+ z-index: 1000;
+ max-height: 30vh;
+ overflow-y: scroll;
+}
+
+.drop-link {
+ display: block;
+ padding: 10px 16px;
+ color: var(--text-primary);
+ text-decoration: none;
+ font-size: 14px;
+ transition: background 0.2s;
+ display:inline-block;
+ width:100%;
+ height:100%;
+}
+
+.drop-link:hover {
+ background: var(--bg-light);
+}
+
+.btn-icon {
+ width: 16px;
+ height: 16px;
+ fill: currentColor;
+}
+
+.btn-icon svg {
+ width: 100%;
+ height: 100%;
+ display: block;
+}
+
+/* Content Card */
+.content-card {
+ background: var(--bg-white);
+ border-radius: 12px;
+ padding: 24px;
+ box-shadow: var(--shadow-sm);
+}
+
+.card-section {
+ margin-bottom: 24px;
+}
+
+.table-container {
+ overflow-x: auto;
+}
+
+.card-section:last-child {
+ margin-bottom: 0;
+}
+
+.card-section-title {
+ font-size: 18px;
+ font-weight: 600;
+ margin-bottom: 16px;
+}
+
+.card-text {
+ color: var(--text-secondary);
+ line-height: 1.6;
+}
+
+.data-table {
+ width: 100%;
+ border-collapse: collapse;
+ margin-top: 16px;
+ min-width: 1600px;
+}
+
+.data-table th {
+ background: var(--bg-light);
+ padding: 12px 16px;
+ text-align: left;
+ font-weight: 600;
+ font-size: 14px;
+ color: var(--text-primary);
+ border-bottom: 2px solid var(--border-light);
+ cursor: pointer;
+ user-select: none;
+ position: relative;
+}
+
+.data-table th a {
+ color: inherit;
+ text-decoration: none;
+}
+
+.data-table th a:hover {
+ color: var(--accent-color);
+}
+
+.data-table th:first-child {
+ cursor: default;
+}
+
+.data-table th.sort-asc:after,
+.data-table th.sort-desc:after {
+ content: '';
+ margin-left: 8px;
+ font-size: 12px;
+}
+
+.data-table th.sort-asc:after {
+ content: '▲';
+ color: var(--accent-color);
+}
+
+.data-table th.sort-desc:after {
+ content: '▼';
+ color: var(--accent-color);
+}
+
+.data-table td {
+ padding: 12px 16px;
+ border-bottom: 1px solid var(--border-medium);
+ color: var(--text-secondary);
+ position: relative;
+ max-width: 250px;
+ vertical-align: middle;
+}
+
+.data-table td:first-child {
+ vertical-align: middle;
+}
+
+.expand-icon {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ transition: opacity 0.2s;
+ cursor: pointer;
+ color: var(--text-muted);
+ background: #eee;
+ z-index: 10;
+ padding: 2px;
+ border-radius: 2px;
+ display: none;
+}
+
+.expand-icon:hover {
+ color: var(--text-secondary);
+}
+
+.table-cell:hover .expand-icon, .detail-field-value:hover .expand-icon {
+ display: flex;
+}
+
+.copy-icon {
+ position: absolute;
+ right: 6px;
+ bottom: 6px;
+ transition: opacity 0.2s;
+ cursor: pointer;
+ color: var(--text-muted);
+ background: #eee;
+ z-index: 100;
+ padding: 2px;
+ border-radius: 2px;
+ display: flex;
+ width: 20px;
+}
+
+.copy-icon:hover {
+ color: var(--text-secondary);
+}
+
+.modal-body:hover .copy-icon {
+ display: flex;
+}
+
+/* Modal */
.modal {
- @apply fixed;
- @apply hidden;
- @apply inset-0;
- @apply bg-gray-600;
- @apply bg-opacity-50;
- @apply overflow-y-auto;
- @apply h-full;
- @apply w-full;
- @apply z-50;
- @apply m-0;
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.5);
+ z-index: 2000;
+ align-items: center;
+ justify-content: center;
}
-.modal > div {
- @apply relative;
- @apply top-20;
- @apply mx-auto;
- @apply p-5;
- @apply border;
- @apply w-1/4;
- @apply shadow-lg;
- @apply rounded-md;
- @apply bg-white;
- @apply whitespace-normal;
+.modal-content {
+ background: var(--bg-white);
+ border-radius: 12px;
+ padding: 32px;
+ max-width: 600px;
+ max-height: 80vh;
+ overflow-y: auto;
+ position: relative;
+ box-shadow: var(--shadow-lg);
}
-.modal form {
- @apply flex;
- @apply flex-col;
- @apply mt-3;
+.modal-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 24px;
+ padding-bottom: 16px;
+ border-bottom: 2px solid var(--border-medium);
}
-.modal label {
- @apply flex;
- @apply h-7;
- @apply w-7;
- @apply rounded-full;
- @apply bg-gray-100;
- @apply items-center;
- @apply justify-center;
- @apply mr-2;
+.modal-title {
+ font-size: 20px;
+ font-weight: 600;
+ color: var(--text-primary);
}
-.modal__title {
- @apply text-lg;
- @apply font-bold;
- @apply border-b-2;
+.modal-close {
+ background: none;
+ border: none;
+ font-size: 28px;
+ color: var(--text-muted);
+ cursor: pointer;
+ padding: 0;
+ width: 32px;
+ height: 32px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 6px;
+ transition: all 0.2s;
+}
+
+.modal-close:hover {
+ background: var(--bg-light);
+ color: var(--text-primary);
+}
+
+.modal-body {
+ color: var(--text-secondary);
+ line-height: 1.6;
+ position: relative;
}
-.modal__tabs {
- @apply border-b-2;
+.cell-content {
+ display: inline-block;
+ max-width: calc(100% - 24px);
+ max-height: 60px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ line-height: 1.4;
}
-.modal__tabs > .modal__title--active {
- @apply text-lg;
- @apply font-bold;
- @apply border-b-2;
- @apply inline-block;
- @apply mr-2;
- @apply border-0;
+.cell-content * {
+ display: inline-block;
}
-.modal__tabs > .modal__title {
- @apply inline-block;
- @apply mr-2;
- @apply border-0;
- @apply cursor-pointer;
+.data-table tr:last-child td {
+ border-bottom: none;
}
-.modal form > div {
- @apply flex;
- @apply my-1;
- @apply items-center;
+.data-table tr:hover {
+ background: var(--bg-light);
}
-.modal form > input[type="submit"] {
- @apply w-24;
- @apply mx-auto;
+.row-checkbox {
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ accent-color: var(--accent-color);
}
+.row-checkbox:checked ~ td {
+ background: var(--purple-50);
+}
-.modal form > div:last-of-type {
- @apply mb-3;
+.data-table input[type="checkbox"]:checked {
+ background: var(--accent-color);
}
-.docs {
- @apply whitespace-pre-wrap;
- @apply block;
- @apply font-mono;
- @apply rounded;
- @apply bg-gray-100;
- @apply p-2;
- @apply my-2;
+.data-table tr:has(input[type="checkbox"]:checked) {
+ background: var(--purple-50);
}
+
+.data-table tr:has(input[type="checkbox"]:checked):hover {
+ background: var(--purple-100);
+}
+
+.data-table th:first-child,
+.data-table td:first-child {
+ width: 40px;
+ text-align: center;
+}
+
+.status-badge {
+ display: inline-block;
+ padding: 4px 12px;
+ border-radius: 12px;
+ font-size: 12px;
+ font-weight: 500;
+}
+
+.status-active {
+ background: var(--success-light);
+ color: var(--success-dark);
+}
+
+.status-pending {
+ background: var(--warning-bg);
+ color: var(--warning-color);
+}
+
+.status-completed {
+ background: var(--info-light);
+ color: var(--info-dark);
+}
+
+.pagination {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-top: 24px;
+ padding-top: 16px;
+ border-top: 1px solid var(--border-medium);
+}
+
+.pagination-info {
+ color: var(--text-secondary);
+ font-size: 14px;
+}
+
+.pagination-controls {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+}
+
+.pagination-btn {
+ padding: 6px 12px;
+ border: 1px solid var(--border-light);
+ border-radius: 6px;
+ background: var(--bg-white);
+ color: var(--text-primary);
+ font-size: 14px;
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+.pagination-btn:hover:not(:disabled) {
+ background: var(--bg-light);
+ border-color: var(--accent-color);
+}
+
+.pagination-btn:disabled {
+ opacity: var(--opacity-disabled);
+ cursor: not-allowed;
+}
+
+.pagination-info-btn {
+ padding: 6px 12px;
+ border: 1px solid var(--border-light);
+ border-radius: 6px;
+ background: var(--bg-white);
+ color: var(--text-secondary);
+ font-size: 14px;
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+.pagination-info-btn:hover {
+ background: var(--bg-light);
+ border-color: var(--accent-color);
+}
+
+.search-container {
+ position: relative;
+ max-width: 400px;
+ margin-bottom: 16px;
+}
+
+.search-input {
+ width: 100%;
+ padding: 10px 16px 10px 40px;
+ border: 1px solid var(--border-light);
+ border-radius: 8px;
+ font-size: 14px;
+ font-family: inherit;
+ transition: all 0.2s;
+}
+
+.search-input:focus {
+ outline: none;
+ border-color: var(--accent-color);
+ box-shadow: var(--focus-ring);
+}
+
+.search-input::placeholder {
+ color: var(--text-muted);
+}
+
+.search-icon {
+ position: absolute;
+ left: 12px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 18px;
+ height: 18px;
+ pointer-events: none;
+ opacity: var(--opacity-muted);
+}
+
+/* Edit Form View */
+.edit-view {
+ display: none;
+}
+
+.edit-view.active {
+ display: block;
+}
+
+.edit-view.hidden {
+ display: none;
+}
+
+.form-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 24px;
+ margin-bottom: 32px;
+}
+
+.form-field {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.form-label {
+ font-size: 12px;
+ font-weight: 600;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.form-input,
+.form-select,
+.form-textarea {
+ width: 100%;
+ padding: 10px 12px;
+ border: 1px solid var(--border-light);
+ border-radius: 6px;
+ font-size: 14px;
+ font-family: inherit;
+ color: var(--text-primary);
+ transition: all 0.2s;
+}
+
+.form-input:focus,
+.form-select:focus,
+.form-textarea:focus {
+ outline: none;
+ border-color: var(--accent-color);
+ box-shadow: var(--focus-ring);
+}
+
+.form-textarea {
+ height: 39px;
+ min-height: 39px;
+ resize: vertical;
+ padding: 10px 12px;
+ max-width: 30vw;
+}
+
+.form-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: flex-end;
+ padding-top: 16px;
+ border-top: 2px solid var(--border-medium);
+ margin-top: 16px;
+}
+
+.form-subsection {
+ grid-column: 1 / -1;
+ background: var(--bg-light);
+ padding: 24px;
+ border-radius: 8px;
+ margin-bottom: 16px;
+}
+
+.form-subsection-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--text-primary);
+ margin-bottom: 16px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.form-subgrid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: 16px;
+}
+
+.detail-grid {
+ display:grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 24px;
+ margin-bottom: 32px;
+}
+
+.detail-field {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.detail-field-label {
+ font-size: 12px;
+ font-weight: 600;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.detail-field-value {
+ font-size: 16px;
+ color: var(--text-primary);
+ max-height: calc(1lh * 3);
+ min-height: 1.5lh;
+ overflow: hidden;
+ display: flex;
+ position: relative;
+}
+
+.detail-field-value > span {
+ display: flex;
+}
+
+.detail-field-value .btn, .cell-content .btn {
+ padding: 4px;
+ margin: 2px;
+ cursor: default;
+}
+
+.expand-content {
+ background: var(--bg-light);
+ padding: 16px;
+ border-radius: 8px;
+ line-height: 1.6;
+ color: var(--text-secondary);
+ overflow: scroll;
+ white-space: pre;
+ font-family: monospace;
+}
+
+.form-line .form-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: var(--text-primary);
+ margin-bottom: 30px;
+ text-align: left;
+ }
+
+ .form-line .docs {
+ background: var(--info-bg);
+ border-left: 4px solid var(--info-color);
+ padding: 16px 20px;
+ margin-bottom: 30px;
+ border-radius: 8px;
+ color: var(--text-secondary);
+ font-size: 14px;
+ line-height: 1.6;
+ }
+
+ .form-line .form-group {
+ width: 100%;
+ margin-bottom: 24px;
+ display: flex;
+ align-items: flex-start;
+ gap: 12px;
+ }
+
+ .form-line label {
+ display: block;
+ font-size: 14px;
+ font-weight: 500;
+ color: var(--text-secondary);
+ padding-top: 2px;
+ flex-shrink: 0;
+ min-width: 20px;
+ }
+
+ .form-line textarea {
+ width: 100%;
+ flex: 1;
+ padding: 8px 16px;
+ font-size: 15px;
+ border: 2px solid var(--border-light);
+ border-radius: 8px;
+ transition: all 0.3s ease;
+ font-family: inherit;
+ resize: vertical;
+ background: var(--bg-white);
+ color: var(--text-primary);
+ }
+
+ .form-line textarea:focus {
+ outline: none;
+ border-color: var(--accent-color);
+ box-shadow: var(--focus-ring);
+ }
+
+ .form-line .button-group {
+ display: flex;
+ gap: 12px;
+ margin-top: 32px;
+ width: 100%;
+ justify-content: flex-end;
+ }
+
+ select {
+ background-color: #fff;
+ }
+
+ .btn {
+ text-decoration: none;
+ }
+
+ .btn-danger {
+ background-color: var(--warning-color);
+ color:var(--warning-bg);
+ border:solid 1px var(--warning-color);
+ }
+
+ .btn-danger:hover {
+ background-color: var(--warning-hover);
+ }
+
+ .nav-subitems .nav-icon {
+ display:none;
+ }
+
+
+ .detail-subtitle + .detail-subtitle::before {
+ content: "|";
+ }
+
+ pre {
+ overflow:scroll;
+ }
+
+ th {
+ white-space: nowrap;
+ }
+
+ .cell-content {
+ max-width: 100%;
+ padding:2px;
+ }
+
+ .cell-content * {
+ display:inline;
+ }
+
+ .modal-content {
+ min-width: 50%;
+ }
+
+ .edit-view {
+ display: block;
+ }
+
+ .nav-progress-section:not(:has(*)) {
+ display:none;
+ }
+
+ .resource-link {
+ color:#444;
+ text-decoration-style: dashed;
+ }
+
+ .resource-link:hover {
+ color:#333;
+ }
+
+
+ .switch-container {
+ display: inline-block;
+ position: relative;
+ }
+
+ /* Hide radio buttons */
+ input[type="radio"] {
+ display: none;
+ }
+
+ .switch {
+ width: 125px;
+ height: 38px;
+ background: #fff;
+ border-radius: 5.5px;
+ position: relative;
+ cursor: pointer;
+ border: 1px solid #d2d2d7;
+ overflow: hidden;
+ }
+
+ /* Background colors for each state */
+ .switch-background {
+ position: absolute;
+ width: 300%;
+ height: 100%;
+ display: flex;
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ left: 0;
+ top: 0;
+ }
+
+ .bg-section {
+ width: 33.333%;
+ height: 100%;
+ }
+
+ /* Handle */
+ .switch-handle {
+ position: absolute;
+ top:1px;
+ width: 34px;
+ height: 34px;
+ background: white;
+ border-radius: 5.5px;
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 12px;
+ z-index: 2;
+ border: 1px solid #d2d2d7;
+ }
+
+ /* State transitions using radio button checked state */
+ .switch-left:checked ~ .switch .switch-background {
+ transform: translateX(1px);
+ }
+
+ .switch-left:checked ~ .switch .switch-handle {
+ transform: translateX(1px);
+ }
+
+ .switch-left:checked ~ .switch .switch-handle::before {
+ content: '';
+ width: 16px;
+ height: 16px;
+ background-image: url('data:image/svg+xml;utf8, ');
+ background-size: contain;
+ background-repeat: no-repeat;
+ flex-shrink: 0;
+ }
+
+ .switch-center:checked ~ .switch .switch-background {
+ transform: translateX(-33.333%);
+ }
+
+ .switch-center:checked ~ .switch .switch-handle {
+ transform: translateX(45px);
+ }
+
+ .switch-center:checked ~ .switch .switch-handle::before {
+ content: '';
+ width: 16px;
+ height: 16px;
+ background-image: url('data:image/svg+xml;utf8, ');
+ background-size: contain;
+ background-repeat: no-repeat;
+ flex-shrink: 0;
+ }
+
+ .switch-right:checked ~ .switch .switch-background {
+ transform: translateX(-66.666%);
+ }
+
+ .switch-right:checked ~ .switch .switch-handle {
+ transform: translateX(88px);
+ }
+
+ .switch-right:checked ~ .switch .switch-handle::before {
+ content: '';
+ width: 16px;
+ height: 16px;
+ background-image: url('data:image/svg+xml;utf8, ');
+ background-size: contain;
+ background-repeat: no-repeat;
+ flex-shrink: 0;
+ }
+
+
+ .switch-left:checked ~ .labels .label-left,
+ .switch-center:checked ~ .labels .label-center,
+ .switch-right:checked ~ .labels .label-right {
+ color: #333;
+ font-weight: 600;
+ transform: scale(1.1);
+ }
+
+ /* Clickable label areas */
+ .label-area {
+ position: absolute;
+ height: 35px;
+ width: 33.333px;
+ top: 0;
+ cursor: pointer;
+ z-index: 3;
+ }
+
+ .label-area.left {
+ left: 0;
+ }
+
+ .label-area.center {
+ left: 33.333px;
+ }
+
+ .label-area.right {
+ right: 0;
+ }
+
+ *:disabled {
+ opacity:.5;
+ }
+
+ select[multiple]{
+ height:39px;
+ }
+
+ select[multiple]:focus-within {
+ height:100px;
+ }
+
+ /*search select*/
+ .search-select-container {
+ position: relative;
+ width:100%;
+ }
+
+ .select-filter {
+ width: 100%;
+ padding: 10px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ box-sizing: border-box;
+ }
+
+ .select-options {
+ display: none;
+ position: absolute;
+ top: 120%;
+ left: 0;
+ right: 0;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ background-color: white;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ max-height: 150px;
+ overflow-y: auto;
+ z-index: 1;
+ }
+
+ .search-select-container:focus-within .select-options {
+ display: block;
+ }
+
+ .search-select-container .select-options:active, .search-select-container .select-options:focus {
+ display: block;
+ }
+
+ .select-options li {
+ padding: 10px;
+ cursor: pointer;
+ }
+
+ .select-options li:hover {
+ background-color: #f0f0f0;
+ }
+
+ .search-select-container[class$='loading'] {
+ opacity:.5;
+ }
+
+ .search-select-container[class$='loading'] input, .search-select-container[class$='loading'] button {
+ opacity:.5;
+ pointer-events: none;
+ }
+
+ input[class$='loading'] {
+ opacity:.5;
+ pointer-events: none;
+ }
+
+ input[class$='loading'] + .select-options {
+ content: '';
+ }
+
+ button[class$='loading'] {
+ opacity:.5;
+ pointer-events: none;
+ }
+
+
+ .array-input-wrapper {
+ border: 1px solid #e2e8f0;
+ border-radius: 8px;
+ padding: 2px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ min-height: 39px;
+ transition: border-color 0.2s;
+ }
+
+ .array-input-wrapper:focus-within {
+ border-color: var(--accent-color);
+ background: white;
+ }
+
+ .array-input-wrapper .btn {
+ height:32px;
+ padding: 0 10px;
+ }
+
+ @keyframes slideIn {
+ from {
+ opacity: 0;
+ transform: scale(0.8);
+ }
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+ }
+
+ @keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 0.5;
+ }
+ }
+
+ .array-input-wrapper input {
+ border: none;
+ outline: none;
+ flex: 1;
+ min-width: 120px;
+ font-size: 14px;
+ padding: 6px;
+ background: transparent;
+ }
+
+ .array-input-wrapper input:not(:placeholder-shown) + .return-icon {
+ display:block;
+ }
+
+ .return-icon {
+ display: none;
+ width: 20px;
+ height: 20px;
+ opacity: 0.5;
+ transition: opacity 0.2s;
+ animation: fadeIn 0.2s ease-out;
+ margin:5px;
+ }
+
+ .form-field.error .error-message {
+ color:#C15846;
+ font-size:10px;
+ font-weight: bold;
+ }
+
+ .form-field.error input {
+ background:#fef2f2;
+ }
+
+ .form-field.error textarea {
+ background:#fef2f2;
+ }
+
+
+
+ .embed-container {
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+ }
+
+ .remove-icon {
+ position: absolute;
+ top: 6px;
+ left: 6px;
+ width: 24px;
+ height: 24px;
+ cursor: pointer;
+ color: #e53e3e;
+ transition: color 0.2s, opacity 0.2s;
+ background: none;
+ border: none;
+ padding: 0;
+ opacity: var(--opacity-muted);
+ }
+
+ .remove-icon:hover {
+ color: #c53030;
+ opacity: 1;
+ }
+
+ .remove-icon svg {
+ width: 100%;
+ height: 100%;
+ }
+
+ .embed-section-wrapper {
+ margin-bottom: 15px;
+ }
+
+ .embed-section-title-wrapper {
+ margin-bottom: 15px;
+ }
+
+
+ .embed-section {
+ background: #f7f7f7;
+ padding: 25px;
+ padding-top: 50px;
+ border-radius: 8px;
+ position: relative;
+ margin-bottom: 15px;
+ }
+
+ .add-section-btn {
+ margin-top: 0;
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ padding: 16px;
+ background: var(--bg-white);
+ color: #2d3748;
+ border: 1px dashed var(--border-medium);
+ border-radius: 8px;
+ font-size: 15px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.2s;
+ }
+
+ .add-section-btn:hover {
+ border-style: solid;
+ }
+
+
+ .embed-section.odd {
+ position: relative;
+ background: #fff;
+ border-radius: 6px;
+ border: 1px solid #cbd5e0;
+ transition: border-color 0.2s;
+ }
+
+ .embed.subsection:hover {
+ border-color: #a0aec0;
+ }
+
+ .embed-section:has(.remove-icon.phx-click-loading) {
+ opacity:var(--opacity-disabled);
+ pointer-events: none;
+ }
+
+ .drag-icon {
+ position: absolute;
+ top: 6px;
+ right: 6px;
+ width: 28px;
+ height: 28px;
+ cursor: grab;
+ color: #718096;
+ transition: color 0.2s;
+ background: none;
+ border: none;
+ padding: 0;
+ }
+
+ .drag-icon:active {
+ cursor: grabbing;
+ }
+
+ .drag-icon:hover {
+ color: #4a5568;
+ }
+
+ .drag-icon svg {
+ width: 100%;
+ height: 100%;
+ }
+
+ .dragging {
+ opacity: 0.5;
+ transform: scale(0.95);
+ transition: transform 0.2s, opacity 0.2s;
+ }
+
+ .drop-zone {
+ height: 60px;
+ margin: 10px 0;
+ border: 2px dashed #4299e1;
+ border-radius: 8px;
+ background: #ebf8ff;
+ align-items: center;
+ justify-content: center;
+ color: #4299e1;
+ font-weight: 500;
+ font-size: 14px;
+ display:none;
+ opacity: var(--opacity-muted);
+ }
+
+ .content-card:has(.tabs) {
+ padding: 0;
+ }
+
+ .content-card:has(.tabs) .card-section {
+ padding: 24px;
+ }
+
+ .tabs {
+ display: flex;
+ border-bottom: 1px solid #e5e7eb;
+ padding: 0px;
+ justify-content: right;
+ }
+
+ .tabs a {
+ padding: 4px 2px;
+ font-size: 11px;
+ font-weight: 700;
+ color: #9ca3af;
+ background: none;
+ border: none;
+ cursor: pointer;
+ font-family: inherit;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ text-decoration: none;
+ flex: 1;
+ max-width: 200px;
+ transition: all 0.2s ease;
+ border-left: dashed 1px var(--border-light);
+ align-content: center;
+ text-align: center;
+ }
+
+ .tabs a:hover {
+ color: #6b7280;
+ background-color: #f9fafb;
+ }
+
+ .tabs a.active {
+ color: #1f2937;
+ font-weight: 700;
+ background-color: #f9fafb;
+ }
+
+ #main-link.active {
+ visibility: hidden;
+ }
+
+ #main-link {
+ margin-right: auto;
+ border: none;
+ border-right: 2px solid #e5e7eb;
+ }
+
+ #main-link:before {
+ content: '←';
+ font-size: 16px;
+ font-weight: 400;
+ }
+
+
+
+ .error-box {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 80px 40px;
+ text-align: center;
+ }
+
+ .error-header {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 12px;
+ }
+
+ .error-icon {
+ width: 32px;
+ height: 32px;
+ flex-shrink: 0;
+ }
+
+
+ .error-icon svg {
+ width: 100%;
+ height: 100%;
+ }
+
+ .error-header h3 {
+ font-size: 24px;
+ font-weight: 600;
+ color: #1a1a1a;
+ }
+
+ .error-message {
+ font-size: 15px;
+ color: #666;
+ line-height: 1.6;
+ max-width: 500px;
+ }
diff --git a/assets/css/default_overrides.css b/assets/css/default_overrides.css
index 6de07612..e69de29b 100644
--- a/assets/css/default_overrides.css
+++ b/assets/css/default_overrides.css
@@ -1,71 +0,0 @@
-body {
- @apply bg-white;
-}
-
-.nav__list > .nav__item--group:first-of-type span {
- @apply mt-3;
- @apply bg-gradient-to-r;
- @apply from-violet-500;
- @apply to-purple-900;
- @apply bg-clip-text;
- @apply text-transparent;
-}
-
-.resource__action--btn {
- @apply bg-violet-600;
- @apply border-violet-600;
- @apply text-violet-50;
-}
-
-.resource__action--btn:hover {
- @apply bg-violet-900;
- @apply border-violet-900;
-}
-
-.resource__action--secondary {
- @apply bg-violet-50;
- @apply border-violet-50;
- @apply text-violet-900;
-}
-
-.resource__action--secondary:hover {
- @apply bg-violet-300;
- @apply border-violet-300;
-}
-
-.resource__action--danger {
- @apply bg-rose-500;
- @apply border-rose-500;
- @apply text-white;
-}
-
-.resource__header {
- @apply bg-violet-100;
-}
-
-.nav a:hover {
- @apply bg-violet-100;
-}
-
-.toast__container--error {
- @apply border-rose-500;
- @apply text-rose-500;
-}
-
-.toast__container--success {
- @apply bg-lime-500;
- @apply border-lime-500;
-}
-
-.toast__container--info {
- @apply bg-violet-300;
- @apply border-violet-300;
-}
-
-.job__container {
- @apply text-violet-50;
-}
-
-.job__bar {
- @apply bg-violet-600;
-}
diff --git a/assets/esbuild.js b/assets/esbuild.js
index bfd261b4..6b4ed893 100644
--- a/assets/esbuild.js
+++ b/assets/esbuild.js
@@ -17,6 +17,9 @@ let opts = {
logLevel: 'info',
target: 'es2016',
outdir: '../dist/js',
+ define: {
+ 'process.env.LATENCY_SIM': process.env.LATENCY_SIM || 0,
+ },
}
if (mode === 'watch') {
opts = {
diff --git a/assets/js/app.js b/assets/js/app.js
index b265b726..36844f2f 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -2,8 +2,8 @@ import "phoenix_html";
import { Socket } from "phoenix";
import { LiveSocket } from "phoenix_live_view";
import ClipboardJS from "clipboard";
-import Toastify from "toastify-js";
import topbar from "topbar";
+import {hooks as colocatedHooks} from "phoenix-colocated/live_admin";
topbar.config({
barColors: { 0: "rgb(67, 56, 202)" },
@@ -12,91 +12,121 @@ topbar.config({
});
window.addEventListener("phx:page-loading-start", (info) => topbar.show());
window.addEventListener("phx:page-loading-stop", () => topbar.hide());
-window.addEventListener("phx:success", (e) => {
- Toastify({
- text: e.detail.msg,
- className: "toast__container--success",
- }).showToast();
-});
-window.addEventListener("phx:error", (e) => {
- Toastify({
- text: e.detail.msg,
- className: "toast__container--error",
- }).showToast();
-});
let Hooks = {};
-Hooks.EmbedComponent = {
+Hooks.ArrayInput = {
mounted() {
- this.el.addEventListener("live_admin:move_embed", (e) => {
- const embedEl = e.target.parentElement;
- const indexEl = embedEl.querySelector(".embed__index");
- const fieldEl = embedEl.parentElement;
-
- const newIndex = +indexEl.value + +e.target.dataset.dir;
- indexEl.value = newIndex;
+ this.el.querySelector("input").addEventListener("input", e => e.stopPropagation());
- const targetEl = fieldEl.querySelectorAll(".embed__index")[newIndex];
- targetEl.value = +targetEl.value + +e.target.dataset.dir * -1;
-
- indexEl.dispatchEvent(
- new Event("input", { bubbles: true, cancelable: true }),
- );
+ this.el.addEventListener("keydown", e => {
+ if (e.key === "Enter") {
+ e.target.blur()
+ e.preventDefault();
+ }
});
+ },
+ updated() {
+ this.el.querySelector("input").addEventListener("input", e => e.stopPropagation());
+ }
+};
- this.el.addEventListener("live_admin:embed_add", (e) => {
- const sortInput = e.target.previousElementSibling;
- sortInput.checked = true;
- sortInput.dispatchEvent(
- new Event("input", { bubbles: true, cancelable: true }),
- );
- });
+Hooks.Show = {
+ setTab(el) {
+ const urlHash = window.location.hash || '#main';
- this.el.addEventListener("live_admin:embed_drop", (e) => {
- e.target.parentElement.classList.add("hidden");
- const deleteInput = e.target.previousElementSibling;
- deleteInput.checked = true;
- deleteInput.dispatchEvent(
- new Event("input", { bubbles: true, cancelable: true }),
- );
- });
+ for (tabLink of el.querySelectorAll('.tabs a')) {
+ const target = tabLink.getAttribute('href');
+ if (target === urlHash) {
+ tabLink.classList.add('active');
+ } else if (tabLink.getAttribute('href') !== "#main" && el.querySelector(target).querySelector(urlHash) || (el.querySelector(target).parentNode === el.querySelector(urlHash).parentElement && !tabLink.parentNode.querySelector(`:scope > a[href="${urlHash}"]`))) {
+ tabLink.classList.add('active');
+ } else {
+ tabLink.classList.remove('active');
+ };
+ };
- this.el.addEventListener("live_admin:embed_delete", (e) => {
- e.target.parentElement.classList.add("hidden");
+ const currentTabContent = el.querySelector(urlHash)
- const deleteInput = e.target
- .closest(".embed__group")
- .querySelector('input[value=""]');
- deleteInput.disabled = false;
- deleteInput.dispatchEvent(
- new Event("input", { bubbles: true, cancelable: true }),
- );
- });
- },
-};
+ for (const fieldSet of el.querySelectorAll('.card-section')) {
+ if (fieldSet.parentNode === currentTabContent) {
+ fieldSet.style.removeProperty('display')
+ } else {
+ fieldSet.style.setProperty('display', 'none');
+ }
+ };
-Hooks.SearchSelect = {
+ for (const tabContent of currentTabContent.parentNode.querySelectorAll('.detail-view')) {
+ if (tabContent === currentTabContent) {
+ tabContent.style.removeProperty('display');
+ } else {
+ tabContent.style.setProperty('display', 'none');
+ }
+ };
+ },
mounted() {
- this.handleEvent("change", () => {
- this.el
- .querySelector("input")
- .dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
- });
+ this.setTab(this.el);
+
+ window.addEventListener('hashchange', () => this.setTab(this.el));
},
-};
+}
-Hooks.ArrayInput = {
+Hooks.Form = {
mounted() {
- this.handleEvent("change", () => {
- this.el
- .querySelector("input")
- .dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
+ this.el.addEventListener('dragstart', (e) => {
+ e.target.classList.add('dragging');
+
+ for (const btn of this.el.querySelectorAll('.add-section-btn')) {
+ btn.style.setProperty('display', 'none');
+ };
+
+ for (const zone of this.el.querySelectorAll(`.drop-zone:not([data-idx="${e.target.dataset.idx}"]):not([data-idx="${(+e.target.dataset.idx)+1}"])`)) {
+ zone.style.setProperty('display', 'flex');
+ };
+
+ e.dataTransfer.setData('text/plain', e.target.dataset.idx);
});
- },
-};
-Hooks.MapInput = {
+
+ this.el.addEventListener('dragend', (e) => {
+ e.target.classList.remove('dragging');
+
+ for (const btn of this.el.querySelectorAll('.add-section-btn')) {
+ btn.style.removeProperty('display');
+ };
+
+ for (const zone of this.el.querySelectorAll('.drop-zone')) {
+ zone.style.removeProperty('display');
+ };
+ });
+
+ this.el.addEventListener("dragover", e => {
+ if (e.target.classList.contains('drop-zone')) {
+ e.target.style.setProperty('opacity', 1);
+ e.preventDefault();
+ }
+ });
+
+ this.el.addEventListener("dragleave", e => {
+ if (e.target.classList.contains('drop-zone')) {
+ e.target.style.removeProperty('opacity');
+ e.preventDefault();
+ }
+ });
+
+ this.el.addEventListener("drop", e => {
+ if (e.target.classList.contains('drop-zone')) {
+ e.preventDefault();
+ const embed = e.target.parentNode.querySelector(`.embed-section[data-idx="${e.dataTransfer.getData("text/plain")}"]`)
+ e.target.after(embed);
+
+ this.el.querySelector("input").dispatchEvent(new Event("change", { bubbles: true, cancelable: true }));
+ };
+ });
+ }
+}
+
+Hooks.SearchSelect = {
mounted() {
this.handleEvent("change", () => {
this.el
@@ -106,95 +136,63 @@ Hooks.MapInput = {
},
};
-Hooks.ViewPage = {
+Hooks.CopyField = {
mounted() {
- this.el.addEventListener("live_admin:action", (e) => {
- if (e.target.tagName === "FORM") {
- const params = [...new FormData(e.target)].reduce(
- (params, [key, val]) => {
- if (key === "args[]") {
- return { ...params, args: [...params.args, val] };
- } else {
- return { ...params, [key]: val };
- }
- },
- { args: [] },
- );
-
- e.target.reset();
-
- this.pushEventTo(this.el, "action", params);
- } else {
- this.pushEventTo(this.el, "action", { name: e.target.dataset.action });
- }
- });
+ new ClipboardJS(this.el.querySelectorAll('[data-clipboard-target]'))
},
-};
+}
Hooks.IndexPage = {
mounted() {
this.selected = [];
- this.el.addEventListener("live_admin:action", (e) => {
- if (e.target.tagName === "FORM") {
- const params = [...new FormData(e.target)].reduce(
- (params, [key, val]) => {
- if (key === "args[]") {
- return { ...params, args: [...params.args, val] };
- } else {
- return { ...params, [key]: val };
- }
- },
- { args: [] },
- );
-
- this.pushEventTo(this.el, "action", { ...params, ids: this.selected });
- } else {
- this.pushEventTo(this.el, "action", {
- name: e.target.dataset.action,
- ids: this.selected,
- });
- }
- });
-
- this.el.addEventListener("live_admin:toggle_select", (e) => {
- if (e.target.id === "select-all") {
- this.el
- .querySelectorAll(".resource__select")
- .forEach((box) => (box.checked = e.target.checked));
- } else {
- this.el.querySelector("#select-all").checked = false;
- }
-
- this.selected = Array.from(
- this.el.querySelectorAll("input[data-record-key]:checked"),
- (e) => e.dataset.recordKey,
- );
-
- if (this.selected.length > 0) {
- document.getElementById("footer-select").style.removeProperty("display");
- document.getElementById("footer-nav").style.display = "none";
- } else {
- document.getElementById("footer-nav").style.removeProperty("display");
- document.getElementById("footer-select").style.display = "none";
- }
- });
+ // this.el.addEventListener("live_admin:action", (e) => {
+ // if (e.target.tagName === "FORM") {
+ // const params = [...new FormData(e.target)].reduce(
+ // (params, [key, val]) => {
+ // if (key === "args[]") {
+ // return { ...params, args: [...params.args, val] };
+ // } else {
+ // return { ...params, [key]: val };
+ // }
+ // },
+ // { args: [] },
+ // );
+
+ // this.pushEventTo(this.el, "action", { ...params, ids: this.selected });
+ // } else {
+ // this.pushEventTo(this.el, "action", {
+ // name: e.target.dataset.action,
+ // ids: this.selected,
+ // });
+ // }
+ // });
+
+ // this.el.addEventListener("live_admin:toggle_select", (e) => {
+ // if (e.target.id === "select-all") {
+ // this.el
+ // .querySelectorAll(".resource__select")
+ // .forEach((box) => (box.checked = e.target.checked));
+ // } else {
+ // this.el.querySelector("#select-all").checked = false;
+ // }
+
+ // this.selected = Array.from(
+ // this.el.querySelectorAll("input[data-record-key]:checked"),
+ // (e) => e.dataset.recordKey,
+ // );
+
+ // if (this.selected.length > 0) {
+ // document.getElementById("footer-select").style.removeProperty("display");
+ // document.getElementById("footer-nav").style.display = "none";
+ // } else {
+ // document.getElementById("footer-nav").style.removeProperty("display");
+ // document.getElementById("footer-select").style.display = "none";
+ // }
+ // });
},
updated() {
this.selected = [];
-
- var clipboard = new ClipboardJS(this.el.querySelectorAll(".cell__copy"), {
- target: function (trigger) {
- return trigger.closest(".resource__cell").firstElementChild;
- },
- });
-
- clipboard.on("success", function (e) {
- Toastify({
- text: e.trigger.dataset.message,
- className: "toast__container",
- }).showToast();
- });
},
};
@@ -202,7 +200,7 @@ let csrfToken = document
.querySelector("meta[name='csrf-token']")
.getAttribute("content");
let liveSocket = new LiveSocket("/live", Socket, {
- hooks: Hooks,
+ hooks: {...Hooks, ...colocatedHooks},
params: { _csrf_token: csrfToken },
});
@@ -211,7 +209,7 @@ liveSocket.connect();
if (ENV == "dev") {
liveSocket.enableDebug();
- liveSocket.enableLatencySim(200 + Math.floor(Math.random() * 1500));
+ liveSocket.enableLatencySim(process.env.LATENCY_SIM);
}
window.liveSocket = liveSocket;
diff --git a/assets/package-lock.json b/assets/package-lock.json
index cf488e60..0921e4c5 100644
--- a/assets/package-lock.json
+++ b/assets/package-lock.json
@@ -12,193 +12,75 @@
"phoenix": "file:../deps/phoenix",
"phoenix_html": "file:../deps/phoenix_html",
"phoenix_live_view": "file:../deps/phoenix_live_view",
- "toastify-js": "^1.11.2",
"topbar": "^1.0.1"
},
"devDependencies": {
"autoprefixer": "^10.4.1",
+ "cssnano": "^7.1.1",
"esbuild": "^0.14.0",
"postcss": "^8.4.31",
- "tailwindcss": "^3.0.11"
+ "postcss-cli": "^11.0.1"
}
},
"../deps/phoenix": {
- "version": "0.0.1"
+ "version": "1.8.1",
+ "license": "MIT",
+ "devDependencies": {
+ "@babel/cli": "7.28.3",
+ "@babel/core": "7.28.3",
+ "@babel/preset-env": "7.28.3",
+ "@eslint/js": "^9.28.0",
+ "@stylistic/eslint-plugin": "^5.0.0",
+ "documentation": "^14.0.3",
+ "eslint": "9.34.0",
+ "eslint-plugin-jest": "29.0.1",
+ "jest": "^30.0.0",
+ "jest-environment-jsdom": "^30.0.0",
+ "jsdom": "^26.1.0",
+ "mock-socket": "^9.3.1"
+ }
},
"../deps/phoenix_html": {
- "version": "0.0.1"
+ "version": "4.3.0"
},
"../deps/phoenix_live_view": {
- "version": "0.0.1"
- },
- "node_modules/@babel/code-frame": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
- "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
- "dev": true,
- "dependencies": {
- "@babel/highlight": "^7.16.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
- "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz",
- "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.16.7",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
+ "version": "1.1.14",
+ "license": "MIT",
"dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
- },
- "node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
+ "morphdom": "2.7.7"
},
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-node": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
- "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
- "dev": true,
- "dependencies": {
- "acorn": "^7.0.0",
- "acorn-walk": "^7.0.0",
- "xtend": "^4.0.2"
- }
- },
- "node_modules/acorn-walk": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "devDependencies": {
+ "@babel/cli": "7.27.2",
+ "@babel/core": "7.27.4",
+ "@babel/preset-env": "7.27.2",
+ "@babel/preset-typescript": "^7.27.1",
+ "@eslint/js": "^9.29.0",
+ "@playwright/test": "^1.53.0",
+ "@types/jest": "^30.0.0",
+ "@types/phoenix": "^1.6.6",
+ "css.escape": "^1.5.1",
+ "eslint": "9.29.0",
+ "eslint-plugin-jest": "28.14.0",
+ "eslint-plugin-playwright": "^2.2.0",
+ "globals": "^16.2.0",
+ "jest": "^30.0.0",
+ "jest-environment-jsdom": "^30.0.0",
+ "jest-monocart-coverage": "^1.1.1",
+ "monocart-reporter": "^2.9.21",
+ "phoenix": "1.7.21",
+ "prettier": "3.5.3",
+ "ts-jest": "^29.4.0",
+ "typescript": "^5.8.3",
+ "typescript-eslint": "^8.34.0"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
- "node": ">=0.4.0"
+ "node": ">=8"
}
},
"node_modules/ansi-styles": {
@@ -217,9 +99,9 @@
}
},
"node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
@@ -229,12 +111,6 @@
"node": ">= 8"
}
},
- "node_modules/arg": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
- "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
- "dev": true
- },
"node_modules/autoprefixer": {
"version": "10.4.1",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.1.tgz",
@@ -262,15 +138,33 @@
"postcss": "^8.1.0"
}
},
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.16",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz",
+ "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==",
+ "dev": true,
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
"node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
@@ -284,76 +178,74 @@
}
},
"node_modules/browserslist": {
- "version": "4.19.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
- "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+ "version": "4.26.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"dependencies": {
- "caniuse-lite": "^1.0.30001286",
- "electron-to-chromium": "^1.4.17",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.1",
- "picocolors": "^1.0.0"
+ "baseline-browser-mapping": "^2.8.9",
+ "caniuse-lite": "^1.0.30001746",
+ "electron-to-chromium": "^1.5.227",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
}
},
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
"dev": true,
- "engines": {
- "node": ">= 6"
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001296",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001296.tgz",
- "integrity": "sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "version": "1.0.30001750",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz",
+ "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
},
"node_modules/chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"dependencies": {
"anymatch": "~3.1.2",
@@ -367,22 +259,13 @@
"engines": {
"node": ">= 8.10.0"
},
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/clipboard": {
"version": "2.0.10",
"resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.10.tgz",
@@ -393,6 +276,20 @@
"tiny-emitter": "^2.0.0"
}
},
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -411,20 +308,72 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "node_modules/cosmiconfig": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
- "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz",
+ "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
+ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
"dev": true,
"dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
+ "mdn-data": "2.12.2",
+ "source-map-js": "^1.0.1"
},
"engines": {
- "node": ">=10"
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
"node_modules/cssesc": {
@@ -439,65 +388,212 @@
"node": ">=4"
}
},
- "node_modules/defined": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
- "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
- "dev": true
+ "node_modules/cssnano": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.1.tgz",
+ "integrity": "sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-preset-default": "^7.0.9",
+ "lilconfig": "^3.1.3"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
},
- "node_modules/delegate": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
- "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+ "node_modules/cssnano-preset-default": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.9.tgz",
+ "integrity": "sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.25.1",
+ "css-declaration-sorter": "^7.2.0",
+ "cssnano-utils": "^5.0.1",
+ "postcss-calc": "^10.1.1",
+ "postcss-colormin": "^7.0.4",
+ "postcss-convert-values": "^7.0.7",
+ "postcss-discard-comments": "^7.0.4",
+ "postcss-discard-duplicates": "^7.0.2",
+ "postcss-discard-empty": "^7.0.1",
+ "postcss-discard-overridden": "^7.0.1",
+ "postcss-merge-longhand": "^7.0.5",
+ "postcss-merge-rules": "^7.0.6",
+ "postcss-minify-font-values": "^7.0.1",
+ "postcss-minify-gradients": "^7.0.1",
+ "postcss-minify-params": "^7.0.4",
+ "postcss-minify-selectors": "^7.0.5",
+ "postcss-normalize-charset": "^7.0.1",
+ "postcss-normalize-display-values": "^7.0.1",
+ "postcss-normalize-positions": "^7.0.1",
+ "postcss-normalize-repeat-style": "^7.0.1",
+ "postcss-normalize-string": "^7.0.1",
+ "postcss-normalize-timing-functions": "^7.0.1",
+ "postcss-normalize-unicode": "^7.0.4",
+ "postcss-normalize-url": "^7.0.1",
+ "postcss-normalize-whitespace": "^7.0.1",
+ "postcss-ordered-values": "^7.0.2",
+ "postcss-reduce-initial": "^7.0.4",
+ "postcss-reduce-transforms": "^7.0.1",
+ "postcss-svgo": "^7.1.0",
+ "postcss-unique-selectors": "^7.0.4"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz",
+ "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==",
+ "dev": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
},
- "node_modules/detective": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
- "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
"dev": true,
"dependencies": {
- "acorn-node": "^1.6.1",
- "defined": "^1.0.0",
- "minimist": "^1.1.1"
+ "css-tree": "~2.2.0"
},
- "bin": {
- "detective": "bin/detective.js"
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
},
"engines": {
- "node": ">=0.8.0"
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
}
},
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
"dev": true
},
- "node_modules/dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "dev": true
+ "node_modules/delegate": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
},
- "node_modules/electron-to-chromium": {
- "version": "1.4.37",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.37.tgz",
- "integrity": "sha512-XIvFB1omSAxYgHYX48sC+HR8i/p7lx7R+0cX9faElg1g++h9IilCrJ12+bQuY+d96Wp7zkBiJwMOv+AhLtLrTg==",
- "dev": true
+ "node_modules/dependency-graph": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz",
+ "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
"dev": true,
"dependencies": {
- "is-arrayish": "^0.2.1"
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
- "node_modules/esbuild": {
- "version": "0.14.10",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.10.tgz",
- "integrity": "sha512-ibZb+NwFqBwHHJlpnFMtg4aNmVK+LUtYMFC9CuKs6lDCBEvCHpqCFZFEirpqt1jOugwKGx8gALNGvX56lQyfew==",
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.234",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz",
+ "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.10.tgz",
+ "integrity": "sha512-ibZb+NwFqBwHHJlpnFMtg4aNmVK+LUtYMFC9CuKs6lDCBEvCHpqCFZFEirpqt1jOugwKGx8gALNGvX56lQyfew==",
"dev": true,
"hasInstallScript": true,
"bin": {
@@ -759,60 +855,14 @@
]
},
"node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
"engines": {
"node": ">=6"
}
},
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/fast-glob": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
- "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -838,10 +888,24 @@
"url": "https://www.patreon.com/infusion"
}
},
+ "node_modules/fs-extra": {
+ "version": "11.3.2",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
+ "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
"node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
"optional": true,
@@ -852,22 +916,25 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
},
"node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
- "is-glob": "^4.0.3"
+ "is-glob": "^4.0.1"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">= 6"
}
},
"node_modules/good-listener": {
@@ -878,47 +945,10 @@
"delegate": "^3.1.2"
}
},
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true
},
"node_modules/is-binary-path": {
@@ -933,27 +963,24 @@
"node": ">=8"
}
},
- "node_modules/is-core-module": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
- "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -975,65 +1002,52 @@
"node": ">=0.12.0"
}
},
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
},
"node_modules/lilconfig": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
- "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"dev": true,
"engines": {
- "node": ">=10"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
}
},
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
"dev": true
},
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": ">=8.6"
- }
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
},
- "node_modules/minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "node_modules/mdn-data": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
"dev": true
},
"node_modules/nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true,
"funding": [
{
@@ -1049,9 +1063,9 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
- "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+ "version": "2.0.23",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz",
+ "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==",
"dev": true
},
"node_modules/normalize-path": {
@@ -1072,58 +1086,16 @@
"node": ">=0.10.0"
}
},
- "node_modules/object-hash": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
- "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
+ "boolbase": "^1.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
"node_modules/phoenix": {
@@ -1139,9 +1111,9 @@
"link": true
},
"node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true
},
"node_modules/picomatch": {
@@ -1156,10 +1128,19 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/postcss": {
- "version": "8.4.31",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"dev": true,
"funding": [
{
@@ -1176,281 +1157,731 @@
}
],
"dependencies": {
- "nanoid": "^3.3.6",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
- "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+ "node_modules/postcss-calc": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz",
+ "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==",
"dev": true,
"dependencies": {
- "camelcase-css": "^2.0.1"
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.2.0"
},
"engines": {
- "node": "^12 || ^14 || >= 16"
+ "node": "^18.12 || ^20.9 || >=22.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
+ "peerDependencies": {
+ "postcss": "^8.4.38"
+ }
+ },
+ "node_modules/postcss-cli": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz",
+ "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^3.3.0",
+ "dependency-graph": "^1.0.0",
+ "fs-extra": "^11.0.0",
+ "picocolors": "^1.0.0",
+ "postcss-load-config": "^5.0.0",
+ "postcss-reporter": "^7.0.0",
+ "pretty-hrtime": "^1.0.3",
+ "read-cache": "^1.0.0",
+ "slash": "^5.0.0",
+ "tinyglobby": "^0.2.12",
+ "yargs": "^17.0.0"
+ },
+ "bin": {
+ "postcss": "index.js"
+ },
+ "engines": {
+ "node": ">=18"
},
"peerDependencies": {
- "postcss": "^8.3.3"
+ "postcss": "^8.0.0"
}
},
- "node_modules/postcss-load-config": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz",
- "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==",
+ "node_modules/postcss-colormin": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.4.tgz",
+ "integrity": "sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==",
"dev": true,
"dependencies": {
- "lilconfig": "^2.0.4",
- "yaml": "^1.10.2"
+ "browserslist": "^4.25.1",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.3",
+ "postcss-value-parser": "^4.2.0"
},
"engines": {
- "node": ">= 10"
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.7.tgz",
+ "integrity": "sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.25.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz",
+ "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^7.1.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
},
"peerDependencies": {
- "ts-node": ">=9.0.0"
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz",
+ "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==",
+ "dev": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz",
+ "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==",
+ "dev": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz",
+ "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==",
+ "dev": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz",
+ "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.1.1",
+ "yaml": "^2.4.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "jiti": ">=1.21.0",
+ "postcss": ">=8.0.9",
+ "tsx": "^4.8.1"
},
"peerDependenciesMeta": {
- "ts-node": {
+ "jiti": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tsx": {
"optional": true
}
}
},
- "node_modules/postcss-nested": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
- "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
+ "node_modules/postcss-merge-longhand": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz",
+ "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==",
"dev": true,
"dependencies": {
- "postcss-selector-parser": "^6.0.6"
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^7.0.5"
},
"engines": {
- "node": ">=12.0"
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.6.tgz",
+ "integrity": "sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.25.1",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^5.0.1",
+ "postcss-selector-parser": "^7.1.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
},
"peerDependencies": {
- "postcss": "^8.2.14"
+ "postcss": "^8.4.32"
}
},
- "node_modules/postcss-selector-parser": {
- "version": "6.0.8",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz",
- "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==",
+ "node_modules/postcss-minify-font-values": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz",
+ "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz",
+ "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==",
+ "dev": true,
+ "dependencies": {
+ "colord": "^2.9.3",
+ "cssnano-utils": "^5.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.4.tgz",
+ "integrity": "sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.25.1",
+ "cssnano-utils": "^5.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz",
+ "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
+ "postcss-selector-parser": "^7.1.0"
},
"engines": {
- "node": ">=4"
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
}
},
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
+ "node_modules/postcss-normalize-charset": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz",
+ "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==",
+ "dev": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
},
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "node_modules/postcss-normalize-display-values": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz",
+ "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
},
- "node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "node_modules/postcss-normalize-positions": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz",
+ "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==",
"dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
"engines": {
- "node": ">=10"
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "postcss": "^8.4.32"
}
},
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz",
+ "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==",
"dev": true,
"dependencies": {
- "picomatch": "^2.2.1"
+ "postcss-value-parser": "^4.2.0"
},
"engines": {
- "node": ">=8.10.0"
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
}
},
- "node_modules/resolve": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
- "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
+ "node_modules/postcss-normalize-string": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz",
+ "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==",
"dev": true,
"dependencies": {
- "is-core-module": "^2.8.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
+ "postcss-value-parser": "^4.2.0"
},
- "bin": {
- "resolve": "bin/resolve"
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "postcss": "^8.4.32"
}
},
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz",
+ "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==",
"dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
"engines": {
- "node": ">=4"
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
}
},
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "node_modules/postcss-normalize-unicode": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.4.tgz",
+ "integrity": "sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==",
"dev": true,
+ "dependencies": {
+ "browserslist": "^4.25.1",
+ "postcss-value-parser": "^4.2.0"
+ },
"engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
}
},
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "node_modules/postcss-normalize-url": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz",
+ "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz",
+ "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz",
+ "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-utils": "^5.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.4.tgz",
+ "integrity": "sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.25.1",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz",
+ "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-reporter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz",
+ "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==",
"dev": true,
"funding": [
{
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
},
{
- "type": "consulting",
- "url": "https://feross.org/support"
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
- "queue-microtask": "^1.2.2"
+ "picocolors": "^1.0.0",
+ "thenby": "^1.3.4"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz",
+ "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >= 18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz",
+ "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^7.1.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
}
},
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "dev": true
+ },
"node_modules/select": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
"integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
},
+ "node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
- "has-flag": "^4.0.0"
+ "ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "node_modules/stylehacks": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.6.tgz",
+ "integrity": "sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==",
"dev": true,
+ "dependencies": {
+ "browserslist": "^4.25.1",
+ "postcss-selector-parser": "^7.1.0"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tailwindcss": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.11.tgz",
- "integrity": "sha512-JyMsQ2kPqpOvG8ow535XpauXj3wz3nQqcy2tVlXj4FQ0eNlsdzvlAqpRA3q5rPLboWirNG6r2DqKczwjW2uc8Q==",
- "dev": true,
- "dependencies": {
- "arg": "^5.0.1",
- "chalk": "^4.1.2",
- "chokidar": "^3.5.2",
- "color-name": "^1.1.4",
- "cosmiconfig": "^7.0.1",
- "detective": "^5.2.0",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.2.7",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "normalize-path": "^3.0.0",
- "object-hash": "^2.2.0",
- "postcss-js": "^4.0.0",
- "postcss-load-config": "^3.1.0",
- "postcss-nested": "5.0.6",
- "postcss-selector-parser": "^6.0.7",
- "postcss-value-parser": "^4.2.0",
- "quick-lru": "^5.1.1",
- "resolve": "^1.20.0"
+ "peerDependencies": {
+ "postcss": "^8.4.32"
+ }
+ },
+ "node_modules/svgo": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz",
+ "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^11.1.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^3.0.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.1.1",
+ "sax": "^1.4.1"
},
"bin": {
- "tailwind": "lib/cli.js",
- "tailwindcss": "lib/cli.js"
+ "svgo": "bin/svgo.js"
},
"engines": {
- "node": ">=12.13.0"
+ "node": ">=16"
},
- "peerDependencies": {
- "autoprefixer": "^10.0.2",
- "postcss": "^8.0.9"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
}
},
+ "node_modules/thenby": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz",
+ "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==",
+ "dev": true
+ },
"node_modules/tiny-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
},
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -1463,173 +1894,127 @@
"node": ">=8.0"
}
},
- "node_modules/toastify-js": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.11.2.tgz",
- "integrity": "sha512-bMBNKhZLPX/sDhpwM7KHIRUTtqCylQeoZDiEWy5zE7iDUJ92XmP8AKgDAp9rXx6pR5GXGFtQHHoH62toahbHgQ=="
- },
"node_modules/topbar": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/topbar/-/topbar-1.0.1.tgz",
"integrity": "sha512-HZqQSMBiG29vcjOrqKCM9iGY/h69G5gQH7ae83ZCPz5uPmbQKwK0sMEqzVDBiu64tWHJ+kk9NApECrF+FAAvRA=="
},
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"engines": {
- "node": ">=0.4"
+ "node": ">= 10.0.0"
}
},
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- }
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
- "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
"dev": true,
- "requires": {
- "@babel/highlight": "^7.16.7"
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
}
},
- "@babel/helper-validator-identifier": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
- "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
- "@babel/highlight": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz",
- "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==",
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.16.7",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
"dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "engines": {
+ "node": ">=10"
}
},
- "@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "node_modules/yaml": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
"dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
}
},
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
- },
- "acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true
- },
- "acorn-node": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
- "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
- "requires": {
- "acorn": "^7.0.0",
- "acorn-walk": "^7.0.0",
- "xtend": "^4.0.2"
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
}
},
- "acorn-walk": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ }
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {
@@ -1642,21 +2027,15 @@
}
},
"anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
- "arg": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
- "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
- "dev": true
- },
"autoprefixer": {
"version": "10.4.1",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.1.tgz",
@@ -1671,10 +2050,22 @@
"postcss-value-parser": "^4.2.0"
}
},
+ "baseline-browser-mapping": {
+ "version": "2.8.16",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz",
+ "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==",
+ "dev": true
+ },
"binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"dev": true
},
"braces": {
@@ -1687,50 +2078,40 @@
}
},
"browserslist": {
- "version": "4.19.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
- "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+ "version": "4.26.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001286",
- "electron-to-chromium": "^1.4.17",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.1",
- "picocolors": "^1.0.0"
+ "baseline-browser-mapping": "^2.8.9",
+ "caniuse-lite": "^1.0.30001746",
+ "electron-to-chromium": "^1.5.227",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
}
},
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
- "dev": true
- },
- "caniuse-lite": {
- "version": "1.0.30001296",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001296.tgz",
- "integrity": "sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q==",
- "dev": true
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
"dev": true,
"requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
}
},
+ "caniuse-lite": {
+ "version": "1.0.30001750",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz",
+ "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==",
+ "dev": true
+ },
"chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"requires": {
"anymatch": "~3.1.2",
@@ -1741,17 +2122,6 @@
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
}
},
"clipboard": {
@@ -1764,6 +2134,17 @@
"tiny-emitter": "^2.0.0"
}
},
+ "cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1779,74 +2160,208 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "cosmiconfig": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
- "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+ "colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true
+ },
+ "commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "dev": true
+ },
+ "css-declaration-sorter": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz",
+ "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ }
+ },
+ "css-tree": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
+ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
"dev": true,
"requires": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
+ "mdn-data": "2.12.2",
+ "source-map-js": "^1.0.1"
}
},
+ "css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "dev": true
+ },
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true
},
- "defined": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
- "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
- "dev": true
+ "cssnano": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.1.tgz",
+ "integrity": "sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==",
+ "dev": true,
+ "requires": {
+ "cssnano-preset-default": "^7.0.9",
+ "lilconfig": "^3.1.3"
+ }
+ },
+ "cssnano-preset-default": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.9.tgz",
+ "integrity": "sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.25.1",
+ "css-declaration-sorter": "^7.2.0",
+ "cssnano-utils": "^5.0.1",
+ "postcss-calc": "^10.1.1",
+ "postcss-colormin": "^7.0.4",
+ "postcss-convert-values": "^7.0.7",
+ "postcss-discard-comments": "^7.0.4",
+ "postcss-discard-duplicates": "^7.0.2",
+ "postcss-discard-empty": "^7.0.1",
+ "postcss-discard-overridden": "^7.0.1",
+ "postcss-merge-longhand": "^7.0.5",
+ "postcss-merge-rules": "^7.0.6",
+ "postcss-minify-font-values": "^7.0.1",
+ "postcss-minify-gradients": "^7.0.1",
+ "postcss-minify-params": "^7.0.4",
+ "postcss-minify-selectors": "^7.0.5",
+ "postcss-normalize-charset": "^7.0.1",
+ "postcss-normalize-display-values": "^7.0.1",
+ "postcss-normalize-positions": "^7.0.1",
+ "postcss-normalize-repeat-style": "^7.0.1",
+ "postcss-normalize-string": "^7.0.1",
+ "postcss-normalize-timing-functions": "^7.0.1",
+ "postcss-normalize-unicode": "^7.0.4",
+ "postcss-normalize-url": "^7.0.1",
+ "postcss-normalize-whitespace": "^7.0.1",
+ "postcss-ordered-values": "^7.0.2",
+ "postcss-reduce-initial": "^7.0.4",
+ "postcss-reduce-transforms": "^7.0.1",
+ "postcss-svgo": "^7.1.0",
+ "postcss-unique-selectors": "^7.0.4"
+ }
+ },
+ "cssnano-utils": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz",
+ "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==",
+ "dev": true,
+ "requires": {}
+ },
+ "csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dev": true,
+ "requires": {
+ "css-tree": "~2.2.0"
+ },
+ "dependencies": {
+ "css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dev": true,
+ "requires": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "dev": true
+ }
+ }
},
"delegate": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
"integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
},
- "detective": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
- "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+ "dependency-graph": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz",
+ "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==",
+ "dev": true
+ },
+ "dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
"dev": true,
"requires": {
- "acorn-node": "^1.6.1",
- "defined": "^1.0.0",
- "minimist": "^1.1.1"
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
}
},
- "didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "dev": true
- },
- "dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
"dev": true
},
- "electron-to-chromium": {
- "version": "1.4.37",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.37.tgz",
- "integrity": "sha512-XIvFB1omSAxYgHYX48sC+HR8i/p7lx7R+0cX9faElg1g++h9IilCrJ12+bQuY+d96Wp7zkBiJwMOv+AhLtLrTg==",
- "dev": true
+ "domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.3.0"
+ }
},
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"dev": true,
"requires": {
- "is-arrayish": "^0.2.1"
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
}
},
+ "electron-to-chromium": {
+ "version": "1.5.234",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz",
+ "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true
+ },
"esbuild": {
"version": "0.14.10",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.10.tgz",
@@ -2000,50 +2515,11 @@
"optional": true
},
"escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true
},
- "fast-glob": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
- "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
"fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -2059,26 +2535,37 @@
"integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==",
"dev": true
},
+ "fs-extra": {
+ "version": "11.3.2",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
+ "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
"fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"optional": true
},
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
"glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
- "is-glob": "^4.0.3"
+ "is-glob": "^4.0.1"
}
},
"good-listener": {
@@ -2089,35 +2576,10 @@
"delegate": "^3.1.2"
}
},
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true
},
"is-binary-path": {
@@ -2129,19 +2591,16 @@
"binary-extensions": "^2.0.0"
}
},
- "is-core-module": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
- "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"is-glob": {
@@ -2159,62 +2618,50 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
+ "jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
},
"lilconfig": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
- "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"dev": true
},
- "lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
"dev": true
},
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
"dev": true
},
- "micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- }
- },
- "minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "mdn-data": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
"dev": true
},
"nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true
},
"node-releases": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
- "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+ "version": "2.0.23",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz",
+ "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==",
"dev": true
},
"normalize-path": {
@@ -2229,58 +2676,67 @@
"integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
"dev": true
},
- "object-hash": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
- "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
- "dev": true
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"dev": true,
"requires": {
- "callsites": "^3.0.0"
+ "boolbase": "^1.0.0"
}
},
- "parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
+ "phoenix": {
+ "version": "file:../deps/phoenix",
"requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
+ "@babel/cli": "7.28.3",
+ "@babel/core": "7.28.3",
+ "@babel/preset-env": "7.28.3",
+ "@eslint/js": "^9.28.0",
+ "@stylistic/eslint-plugin": "^5.0.0",
+ "documentation": "^14.0.3",
+ "eslint": "9.34.0",
+ "eslint-plugin-jest": "29.0.1",
+ "jest": "^30.0.0",
+ "jest-environment-jsdom": "^30.0.0",
+ "jsdom": "^26.1.0",
+ "mock-socket": "^9.3.1"
}
},
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "phoenix": {
- "version": "file:../deps/phoenix"
- },
"phoenix_html": {
"version": "file:../deps/phoenix_html"
},
"phoenix_live_view": {
- "version": "file:../deps/phoenix_live_view"
+ "version": "file:../deps/phoenix_live_view",
+ "requires": {
+ "@babel/cli": "7.27.2",
+ "@babel/core": "7.27.4",
+ "@babel/preset-env": "7.27.2",
+ "@babel/preset-typescript": "^7.27.1",
+ "@eslint/js": "^9.29.0",
+ "@playwright/test": "^1.53.0",
+ "@types/jest": "^30.0.0",
+ "@types/phoenix": "^1.6.6",
+ "css.escape": "^1.5.1",
+ "eslint": "9.29.0",
+ "eslint-plugin-jest": "28.14.0",
+ "eslint-plugin-playwright": "^2.2.0",
+ "globals": "^16.2.0",
+ "jest": "^30.0.0",
+ "jest-environment-jsdom": "^30.0.0",
+ "jest-monocart-coverage": "^1.1.1",
+ "monocart-reporter": "^2.9.21",
+ "morphdom": "2.7.7",
+ "phoenix": "1.7.21",
+ "prettier": "3.5.3",
+ "ts-jest": "^29.4.0",
+ "typescript": "^5.8.3",
+ "typescript-eslint": "^8.34.0"
+ }
},
"picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true
},
"picomatch": {
@@ -2289,72 +2745,345 @@
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true
+ },
"postcss": {
- "version": "8.4.31",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "postcss-calc": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz",
+ "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-cli": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz",
+ "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==",
"dev": true,
"requires": {
- "nanoid": "^3.3.6",
+ "chokidar": "^3.3.0",
+ "dependency-graph": "^1.0.0",
+ "fs-extra": "^11.0.0",
"picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
+ "postcss-load-config": "^5.0.0",
+ "postcss-reporter": "^7.0.0",
+ "pretty-hrtime": "^1.0.3",
+ "read-cache": "^1.0.0",
+ "slash": "^5.0.0",
+ "tinyglobby": "^0.2.12",
+ "yargs": "^17.0.0"
}
},
- "postcss-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
- "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+ "postcss-colormin": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.4.tgz",
+ "integrity": "sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==",
"dev": true,
"requires": {
- "camelcase-css": "^2.0.1"
+ "browserslist": "^4.25.1",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.3",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-convert-values": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.7.tgz",
+ "integrity": "sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.25.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-discard-comments": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz",
+ "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^7.1.0"
}
},
+ "postcss-discard-duplicates": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz",
+ "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-discard-empty": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz",
+ "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-discard-overridden": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz",
+ "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==",
+ "dev": true,
+ "requires": {}
+ },
"postcss-load-config": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz",
- "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz",
+ "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==",
+ "dev": true,
+ "requires": {
+ "lilconfig": "^3.1.1",
+ "yaml": "^2.4.2"
+ }
+ },
+ "postcss-merge-longhand": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz",
+ "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^7.0.5"
+ }
+ },
+ "postcss-merge-rules": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.6.tgz",
+ "integrity": "sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.25.1",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^5.0.1",
+ "postcss-selector-parser": "^7.1.0"
+ }
+ },
+ "postcss-minify-font-values": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz",
+ "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-gradients": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz",
+ "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==",
+ "dev": true,
+ "requires": {
+ "colord": "^2.9.3",
+ "cssnano-utils": "^5.0.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-params": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.4.tgz",
+ "integrity": "sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.25.1",
+ "cssnano-utils": "^5.0.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-minify-selectors": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz",
+ "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "postcss-selector-parser": "^7.1.0"
+ }
+ },
+ "postcss-normalize-charset": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz",
+ "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-normalize-display-values": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz",
+ "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-positions": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz",
+ "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-repeat-style": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz",
+ "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-string": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz",
+ "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-timing-functions": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz",
+ "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-unicode": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.4.tgz",
+ "integrity": "sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.25.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-url": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz",
+ "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-normalize-whitespace": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz",
+ "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-ordered-values": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz",
+ "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==",
+ "dev": true,
+ "requires": {
+ "cssnano-utils": "^5.0.1",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "postcss-reduce-initial": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.4.tgz",
+ "integrity": "sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.25.1",
+ "caniuse-api": "^3.0.0"
+ }
+ },
+ "postcss-reduce-transforms": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz",
+ "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==",
"dev": true,
"requires": {
- "lilconfig": "^2.0.4",
- "yaml": "^1.10.2"
+ "postcss-value-parser": "^4.2.0"
}
},
- "postcss-nested": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
- "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
+ "postcss-reporter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz",
+ "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==",
"dev": true,
"requires": {
- "postcss-selector-parser": "^6.0.6"
+ "picocolors": "^1.0.0",
+ "thenby": "^1.3.4"
}
},
"postcss-selector-parser": {
- "version": "6.0.8",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz",
- "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
}
},
+ "postcss-svgo": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz",
+ "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^4.0.0"
+ }
+ },
+ "postcss-unique-selectors": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz",
+ "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^7.1.0"
+ }
+ },
"postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
- "queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
"dev": true
},
- "quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "dev": true
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^2.3.0"
+ }
},
"readdirp": {
"version": "3.6.0",
@@ -2365,97 +3094,116 @@
"picomatch": "^2.2.1"
}
},
- "resolve": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
- "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.8.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true
},
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "sax": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
"dev": true
},
- "run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
"select": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
"integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
},
+ "slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "dev": true
+ },
"source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true
},
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
}
},
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
},
- "tailwindcss": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.11.tgz",
- "integrity": "sha512-JyMsQ2kPqpOvG8ow535XpauXj3wz3nQqcy2tVlXj4FQ0eNlsdzvlAqpRA3q5rPLboWirNG6r2DqKczwjW2uc8Q==",
- "dev": true,
- "requires": {
- "arg": "^5.0.1",
- "chalk": "^4.1.2",
- "chokidar": "^3.5.2",
- "color-name": "^1.1.4",
- "cosmiconfig": "^7.0.1",
- "detective": "^5.2.0",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.2.7",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "normalize-path": "^3.0.0",
- "object-hash": "^2.2.0",
- "postcss-js": "^4.0.0",
- "postcss-load-config": "^3.1.0",
- "postcss-nested": "5.0.6",
- "postcss-selector-parser": "^6.0.7",
- "postcss-value-parser": "^4.2.0",
- "quick-lru": "^5.1.1",
- "resolve": "^1.20.0"
+ "stylehacks": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.6.tgz",
+ "integrity": "sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.25.1",
+ "postcss-selector-parser": "^7.1.0"
+ }
+ },
+ "svgo": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz",
+ "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==",
+ "dev": true,
+ "requires": {
+ "commander": "^11.1.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^3.0.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.1.1",
+ "sax": "^1.4.1"
}
},
+ "thenby": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz",
+ "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==",
+ "dev": true
+ },
"tiny-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
},
+ "tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "requires": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "dependencies": {
+ "fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "requires": {}
+ },
+ "picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true
+ }
+ }
+ },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2465,32 +3213,75 @@
"is-number": "^7.0.0"
}
},
- "toastify-js": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.11.2.tgz",
- "integrity": "sha512-bMBNKhZLPX/sDhpwM7KHIRUTtqCylQeoZDiEWy5zE7iDUJ92XmP8AKgDAp9rXx6pR5GXGFtQHHoH62toahbHgQ=="
- },
"topbar": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/topbar/-/topbar-1.0.1.tgz",
"integrity": "sha512-HZqQSMBiG29vcjOrqKCM9iGY/h69G5gQH7ae83ZCPz5uPmbQKwK0sMEqzVDBiu64tWHJ+kk9NApECrF+FAAvRA=="
},
+ "universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true
+ },
+ "update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ }
+ },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true
},
"yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "requires": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true
}
}
diff --git a/assets/package.json b/assets/package.json
index 646a953e..13543a3e 100644
--- a/assets/package.json
+++ b/assets/package.json
@@ -12,13 +12,13 @@
"phoenix": "file:../deps/phoenix",
"phoenix_html": "file:../deps/phoenix_html",
"phoenix_live_view": "file:../deps/phoenix_live_view",
- "toastify-js": "^1.11.2",
"topbar": "^1.0.1"
},
"devDependencies": {
"autoprefixer": "^10.4.1",
+ "cssnano": "^7.1.1",
"esbuild": "^0.14.0",
"postcss": "^8.4.31",
- "tailwindcss": "^3.0.11"
+ "postcss-cli": "^11.0.1"
}
}
diff --git a/assets/postcss.config.js b/assets/postcss.config.js
index f1c8dac8..276347c6 100644
--- a/assets/postcss.config.js
+++ b/assets/postcss.config.js
@@ -1,6 +1,6 @@
module.exports = {
plugins: {
- tailwindcss: {},
autoprefixer: {},
+ cssnano: { preset: 'default' }
}
}
diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js
deleted file mode 100644
index 95ff634a..00000000
--- a/assets/tailwind.config.js
+++ /dev/null
@@ -1,9 +0,0 @@
-module.exports = {
- content: [
- './css/**/*.css',
- '../lib/live_admin/**/*.*ex',
- ],
- theme: {},
- variants: {},
- plugins: []
-};
diff --git a/config/config.exs b/config/config.exs
index 7e3505f7..1d6c5441 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -6,11 +6,9 @@ config :phoenix, :stacktrace_depth, 20
config :logger, level: :warning
config :logger, :console, format: "[$level] $message\n"
-config :phoenix, LiveAdmin.Endpoint,
- watchers: [
- node: ["esbuild.js", "--watch", cd: Path.expand("../assets", __DIR__)]
- ]
-
config :docout,
app_name: :live_admin,
formatters: [LiveAdmin.READMECompiler]
+
+config :phoenix_live_view, :colocated_js,
+ target_directory: Path.expand("../assets/node_modules/phoenix-colocated", __DIR__)
diff --git a/dev.exs b/dev.exs
index 2fde226d..5677d9bb 100644
--- a/dev.exs
+++ b/dev.exs
@@ -18,20 +18,21 @@ Application.put_env(:live_admin, DemoWeb.Endpoint,
watchers: [
npm: ["run", "watch", cd: "assets"],
npx: [
- "tailwindcss",
- "--input=css/app.css",
+ "postcss",
+ "css/app.css",
"--output=../dist/css/app.css",
- "--postcss",
"--watch",
cd: "assets"
],
npx: [
- "tailwindcss",
- "--input=css/default_overrides.css",
+ "postcss",
+ "css/default_overrides.css",
"--output=../dist/css/default_overrides.css",
- "--postcss",
"--watch",
cd: "assets"
+ ],
+ watchers: [
+ node: ["esbuild.js", "--watch", cd: Path.expand("../assets", __DIR__)]
]
],
live_reload: [
@@ -206,9 +207,9 @@ defmodule DemoWeb.PostsAdmin.Home do
@impl true
def render(assigns) do
~H"""
-
-
- This is only for managing posts
+
+
"""
@@ -221,9 +222,9 @@ defmodule DemoWeb.Extra do
@impl true
def render(assigns) do
~H"""
-
-
- This is an extra page
+
+
"""
diff --git a/dev/repo.ex b/dev/repo.ex
index 96aae347..54467ab7 100644
--- a/dev/repo.ex
+++ b/dev/repo.ex
@@ -1,5 +1,5 @@
defmodule Demo.Repo do
use Ecto.Repo, otp_app: :live_admin, adapter: Ecto.Adapters.Postgres
- def prefixes, do: ["public", "alt"]
+ def prefixes, do: ["public", "alt"] ++ Enum.map(0..100, & "fake #{&1}")
end
diff --git a/dev/user_admin.ex b/dev/user_admin.ex
index 2d5cc669..8e48fccf 100644
--- a/dev/user_admin.ex
+++ b/dev/user_admin.ex
@@ -3,11 +3,10 @@ defmodule DemoWeb.UserAdmin do
schema: Demo.Accounts.User,
hidden_fields: [:private_data],
immutable_fields: [:encrypted_password, :inserted_at],
- components: [new: DemoWeb.CreateUserForm],
+ components: [create: DemoWeb.CreateUserForm],
label_with: :name,
actions: [:deactivate, :activate, set_password: {__MODULE__, :set_password, 3}],
- tasks: [:regenerate_passwords, {__MODULE__, :aggregate, 4}],
- render_with: :render_field
+ tasks: [:regenerate_passwords, {__MODULE__, :aggregate, 4}]
use PhoenixHTMLHelpers
diff --git a/dist/css/app.css b/dist/css/app.css
index 87ce6b61..626a2b01 100644
--- a/dist/css/app.css
+++ b/dist/css/app.css
@@ -1,1941 +1 @@
-/*
-! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com
-*/
-
-/*
-1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
-2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
-*/
-
-*,
-::before,
-::after {
- box-sizing: border-box;
- /* 1 */
- border-width: 0;
- /* 2 */
- border-style: solid;
- /* 2 */
- border-color: #e5e7eb;
- /* 2 */
-}
-
-::before,
-::after {
- --tw-content: '';
-}
-
-/*
-1. Use a consistent sensible line-height in all browsers.
-2. Prevent adjustments of font size after orientation changes in iOS.
-3. Use a more readable tab size.
-4. Use the user's configured `sans` font-family by default.
-5. Use the user's configured `sans` font-feature-settings by default.
-6. Use the user's configured `sans` font-variation-settings by default.
-7. Disable tap highlights on iOS
-*/
-
-html,
-:host {
- line-height: 1.5;
- /* 1 */
- -webkit-text-size-adjust: 100%;
- /* 2 */
- -moz-tab-size: 4;
- /* 3 */
- -o-tab-size: 4;
- tab-size: 4;
- /* 3 */
- font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- /* 4 */
- font-feature-settings: normal;
- /* 5 */
- font-variation-settings: normal;
- /* 6 */
- -webkit-tap-highlight-color: transparent;
- /* 7 */
-}
-
-/*
-1. Remove the margin in all browsers.
-2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
-*/
-
-body {
- margin: 0;
- /* 1 */
- line-height: inherit;
- /* 2 */
-}
-
-/*
-1. Add the correct height in Firefox.
-2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
-3. Ensure horizontal rules are visible by default.
-*/
-
-hr {
- height: 0;
- /* 1 */
- color: inherit;
- /* 2 */
- border-top-width: 1px;
- /* 3 */
-}
-
-/*
-Add the correct text decoration in Chrome, Edge, and Safari.
-*/
-
-abbr:where([title]) {
- -webkit-text-decoration: underline dotted;
- text-decoration: underline dotted;
-}
-
-/*
-Remove the default font size and weight for headings.
-*/
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-size: inherit;
- font-weight: inherit;
-}
-
-/*
-Reset links to optimize for opt-in styling instead of opt-out.
-*/
-
-a {
- color: inherit;
- text-decoration: inherit;
-}
-
-/*
-Add the correct font weight in Edge and Safari.
-*/
-
-b,
-strong {
- font-weight: bolder;
-}
-
-/*
-1. Use the user's configured `mono` font-family by default.
-2. Use the user's configured `mono` font-feature-settings by default.
-3. Use the user's configured `mono` font-variation-settings by default.
-4. Correct the odd `em` font sizing in all browsers.
-*/
-
-code,
-kbd,
-samp,
-pre {
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
- /* 1 */
- font-feature-settings: normal;
- /* 2 */
- font-variation-settings: normal;
- /* 3 */
- font-size: 1em;
- /* 4 */
-}
-
-/*
-Add the correct font size in all browsers.
-*/
-
-small {
- font-size: 80%;
-}
-
-/*
-Prevent `sub` and `sup` elements from affecting the line height in all browsers.
-*/
-
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-sup {
- top: -0.5em;
-}
-
-/*
-1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
-2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
-3. Remove gaps between table borders by default.
-*/
-
-table {
- text-indent: 0;
- /* 1 */
- border-color: inherit;
- /* 2 */
- border-collapse: collapse;
- /* 3 */
-}
-
-/*
-1. Change the font styles in all browsers.
-2. Remove the margin in Firefox and Safari.
-3. Remove default padding in all browsers.
-*/
-
-button,
-input,
-optgroup,
-select,
-textarea {
- font-family: inherit;
- /* 1 */
- font-feature-settings: inherit;
- /* 1 */
- font-variation-settings: inherit;
- /* 1 */
- font-size: 100%;
- /* 1 */
- font-weight: inherit;
- /* 1 */
- line-height: inherit;
- /* 1 */
- color: inherit;
- /* 1 */
- margin: 0;
- /* 2 */
- padding: 0;
- /* 3 */
-}
-
-/*
-Remove the inheritance of text transform in Edge and Firefox.
-*/
-
-button,
-select {
- text-transform: none;
-}
-
-/*
-1. Correct the inability to style clickable types in iOS and Safari.
-2. Remove default button styles.
-*/
-
-button,
-[type='button'],
-[type='reset'],
-[type='submit'] {
- -webkit-appearance: button;
- /* 1 */
- background-color: transparent;
- /* 2 */
- background-image: none;
- /* 2 */
-}
-
-/*
-Use the modern Firefox focus style for all focusable elements.
-*/
-
-:-moz-focusring {
- outline: auto;
-}
-
-/*
-Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
-*/
-
-:-moz-ui-invalid {
- box-shadow: none;
-}
-
-/*
-Add the correct vertical alignment in Chrome and Firefox.
-*/
-
-progress {
- vertical-align: baseline;
-}
-
-/*
-Correct the cursor style of increment and decrement buttons in Safari.
-*/
-
-::-webkit-inner-spin-button,
-::-webkit-outer-spin-button {
- height: auto;
-}
-
-/*
-1. Correct the odd appearance in Chrome and Safari.
-2. Correct the outline style in Safari.
-*/
-
-[type='search'] {
- -webkit-appearance: textfield;
- /* 1 */
- outline-offset: -2px;
- /* 2 */
-}
-
-/*
-Remove the inner padding in Chrome and Safari on macOS.
-*/
-
-::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-/*
-1. Correct the inability to style clickable types in iOS and Safari.
-2. Change font properties to `inherit` in Safari.
-*/
-
-::-webkit-file-upload-button {
- -webkit-appearance: button;
- /* 1 */
- font: inherit;
- /* 2 */
-}
-
-/*
-Add the correct display in Chrome and Safari.
-*/
-
-summary {
- display: list-item;
-}
-
-/*
-Removes the default spacing and border for appropriate elements.
-*/
-
-blockquote,
-dl,
-dd,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-hr,
-figure,
-p,
-pre {
- margin: 0;
-}
-
-fieldset {
- margin: 0;
- padding: 0;
-}
-
-legend {
- padding: 0;
-}
-
-ol,
-ul,
-menu {
- list-style: none;
- margin: 0;
- padding: 0;
-}
-
-/*
-Reset default styling for dialogs.
-*/
-
-dialog {
- padding: 0;
-}
-
-/*
-Prevent resizing textareas horizontally by default.
-*/
-
-textarea {
- resize: vertical;
-}
-
-/*
-1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
-2. Set the default placeholder color to the user's configured gray 400 color.
-*/
-
-input::-moz-placeholder, textarea::-moz-placeholder {
- opacity: 1;
- /* 1 */
- color: #9ca3af;
- /* 2 */
-}
-
-input:-ms-input-placeholder, textarea:-ms-input-placeholder {
- opacity: 1;
- /* 1 */
- color: #9ca3af;
- /* 2 */
-}
-
-input::placeholder,
-textarea::placeholder {
- opacity: 1;
- /* 1 */
- color: #9ca3af;
- /* 2 */
-}
-
-/*
-Set the default cursor for buttons.
-*/
-
-button,
-[role="button"] {
- cursor: pointer;
-}
-
-/*
-Make sure disabled buttons don't get the pointer cursor.
-*/
-
-:disabled {
- cursor: default;
-}
-
-/*
-1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
-2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
- This can trigger a poorly considered lint error in some tools but is included by design.
-*/
-
-img,
-svg,
-video,
-canvas,
-audio,
-iframe,
-embed,
-object {
- display: block;
- /* 1 */
- vertical-align: middle;
- /* 2 */
-}
-
-/*
-Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
-*/
-
-img,
-video {
- max-width: 100%;
- height: auto;
-}
-
-/* Make elements with the HTML hidden attribute stay hidden by default */
-
-[hidden] {
- display: none;
-}
-
-* {
- background-color: inherit;
-}
-
-h1 {
- font-size: 1.875rem;
- line-height: 2.25rem;
-}
-
-@media (min-width: 768px) {
- h1 {
- font-size: 3rem;
- line-height: 1;
- }
-}
-
-h1 {
- margin-bottom: 1rem;
- font-weight: 800;
-}
-
-input, textarea {
- position: relative;
- border-radius: 0.25rem;
- font-size: 0.875rem;
- line-height: 1.25rem;
- border-width: 1px;
- outline: 2px solid transparent;
- outline-offset: 2px;
-}
-
-input:focus, textarea:focus {
- outline: 2px solid transparent;
- outline-offset: 2px;
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
-}
-
-input, textarea {
- padding: 0.25rem;
- overflow: hidden;
-}
-
-select {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- background-clip: padding-box;
- background-repeat: no-repeat;
- border-width: 1px;
- border-style: solid;
- border-radius: 0.25rem;
- transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
- transition-duration: 150ms;
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-}
-
-select:focus {
- outline: 2px solid transparent;
- outline-offset: 2px;
-}
-
-select {
- width: 8rem;
- padding: 0.25rem;
-}
-
-*, ::before, ::after {
- --tw-border-spacing-x: 0;
- --tw-border-spacing-y: 0;
- --tw-translate-x: 0;
- --tw-translate-y: 0;
- --tw-rotate: 0;
- --tw-skew-x: 0;
- --tw-skew-y: 0;
- --tw-scale-x: 1;
- --tw-scale-y: 1;
- --tw-pan-x: ;
- --tw-pan-y: ;
- --tw-pinch-zoom: ;
- --tw-scroll-snap-strictness: proximity;
- --tw-gradient-from-position: ;
- --tw-gradient-via-position: ;
- --tw-gradient-to-position: ;
- --tw-ordinal: ;
- --tw-slashed-zero: ;
- --tw-numeric-figure: ;
- --tw-numeric-spacing: ;
- --tw-numeric-fraction: ;
- --tw-ring-inset: ;
- --tw-ring-offset-width: 0px;
- --tw-ring-offset-color: #fff;
- --tw-ring-color: rgb(59 130 246 / 0.5);
- --tw-ring-offset-shadow: 0 0 #0000;
- --tw-ring-shadow: 0 0 #0000;
- --tw-shadow: 0 0 #0000;
- --tw-shadow-colored: 0 0 #0000;
- --tw-blur: ;
- --tw-brightness: ;
- --tw-contrast: ;
- --tw-grayscale: ;
- --tw-hue-rotate: ;
- --tw-invert: ;
- --tw-saturate: ;
- --tw-sepia: ;
- --tw-drop-shadow: ;
- --tw-backdrop-blur: ;
- --tw-backdrop-brightness: ;
- --tw-backdrop-contrast: ;
- --tw-backdrop-grayscale: ;
- --tw-backdrop-hue-rotate: ;
- --tw-backdrop-invert: ;
- --tw-backdrop-opacity: ;
- --tw-backdrop-saturate: ;
- --tw-backdrop-sepia: ;
-}
-
-::-webkit-backdrop {
- --tw-border-spacing-x: 0;
- --tw-border-spacing-y: 0;
- --tw-translate-x: 0;
- --tw-translate-y: 0;
- --tw-rotate: 0;
- --tw-skew-x: 0;
- --tw-skew-y: 0;
- --tw-scale-x: 1;
- --tw-scale-y: 1;
- --tw-pan-x: ;
- --tw-pan-y: ;
- --tw-pinch-zoom: ;
- --tw-scroll-snap-strictness: proximity;
- --tw-gradient-from-position: ;
- --tw-gradient-via-position: ;
- --tw-gradient-to-position: ;
- --tw-ordinal: ;
- --tw-slashed-zero: ;
- --tw-numeric-figure: ;
- --tw-numeric-spacing: ;
- --tw-numeric-fraction: ;
- --tw-ring-inset: ;
- --tw-ring-offset-width: 0px;
- --tw-ring-offset-color: #fff;
- --tw-ring-color: rgb(59 130 246 / 0.5);
- --tw-ring-offset-shadow: 0 0 #0000;
- --tw-ring-shadow: 0 0 #0000;
- --tw-shadow: 0 0 #0000;
- --tw-shadow-colored: 0 0 #0000;
- --tw-blur: ;
- --tw-brightness: ;
- --tw-contrast: ;
- --tw-grayscale: ;
- --tw-hue-rotate: ;
- --tw-invert: ;
- --tw-saturate: ;
- --tw-sepia: ;
- --tw-drop-shadow: ;
- --tw-backdrop-blur: ;
- --tw-backdrop-brightness: ;
- --tw-backdrop-contrast: ;
- --tw-backdrop-grayscale: ;
- --tw-backdrop-hue-rotate: ;
- --tw-backdrop-invert: ;
- --tw-backdrop-opacity: ;
- --tw-backdrop-saturate: ;
- --tw-backdrop-sepia: ;
-}
-
-::backdrop {
- --tw-border-spacing-x: 0;
- --tw-border-spacing-y: 0;
- --tw-translate-x: 0;
- --tw-translate-y: 0;
- --tw-rotate: 0;
- --tw-skew-x: 0;
- --tw-skew-y: 0;
- --tw-scale-x: 1;
- --tw-scale-y: 1;
- --tw-pan-x: ;
- --tw-pan-y: ;
- --tw-pinch-zoom: ;
- --tw-scroll-snap-strictness: proximity;
- --tw-gradient-from-position: ;
- --tw-gradient-via-position: ;
- --tw-gradient-to-position: ;
- --tw-ordinal: ;
- --tw-slashed-zero: ;
- --tw-numeric-figure: ;
- --tw-numeric-spacing: ;
- --tw-numeric-fraction: ;
- --tw-ring-inset: ;
- --tw-ring-offset-width: 0px;
- --tw-ring-offset-color: #fff;
- --tw-ring-color: rgb(59 130 246 / 0.5);
- --tw-ring-offset-shadow: 0 0 #0000;
- --tw-ring-shadow: 0 0 #0000;
- --tw-shadow: 0 0 #0000;
- --tw-shadow-colored: 0 0 #0000;
- --tw-blur: ;
- --tw-brightness: ;
- --tw-contrast: ;
- --tw-grayscale: ;
- --tw-hue-rotate: ;
- --tw-invert: ;
- --tw-saturate: ;
- --tw-sepia: ;
- --tw-drop-shadow: ;
- --tw-backdrop-blur: ;
- --tw-backdrop-brightness: ;
- --tw-backdrop-contrast: ;
- --tw-backdrop-grayscale: ;
- --tw-backdrop-hue-rotate: ;
- --tw-backdrop-invert: ;
- --tw-backdrop-opacity: ;
- --tw-backdrop-saturate: ;
- --tw-backdrop-sepia: ;
-}
-
-.view__container {
- overflow-y: auto;
-}
-
-#list .table__wrapper {
- overflow: auto;
- max-height: 100%;
-}
-
-#prefix-select nav {
- overflow-y: auto;
-}
-
-#jobs {
- position: absolute;
- bottom: 0px;
- left: 1.25rem;
- width: 15rem;
- z-index: 50;
- border-left-width: 2px;
- border-right-width: 2px;
- border-top-width: 2px;
- padding: 1.25rem;
- border-top-left-radius: 0.375rem;
- border-top-right-radius: 0.375rem;
-}
-
-#jobs:empty {
- visibility: hidden;
-}
-
-.job__container {
- width: 100%;
- border-radius: 9999px;
- margin-bottom: 0.5rem;
- position: relative;
- background-color: transparent;
- height: 1.25rem;
-}
-
-.job__label {
- display: inline-block;
- font-size: 0.75rem;
- line-height: 1rem;
- font-weight: 500;
- padding-left: 0.25rem;
- width: 100%;
- height: 100%;
- border-radius: 9999px;
- border-width: 1px;
- position: absolute;
- top: 0px;
- line-height: 1.5;
-}
-
-.job__bar {
- position: absolute;
- top: 0px;
- height: 100%;
- border-radius: 9999px;
- z-index: -10;
- min-width: 1.25rem;
-}
-
-.topbar {
- background-color: transparent;
-}
-
-.disabled {
- opacity: 0.3;
-}
-
-.drop::before {
- content: ' ';
- display: inline-block;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-left: 5px solid currentColor;
- vertical-align: middle;
- margin-right: .7rem;
- transform: translateY(-2px);
- transition: transform .2s ease-out;
-}
-
-.button__add {
- display: inline-block;
- content: " ";
- width: 24px;
- height: 24px;
- background: url("data:image/svg+xml;utf8,
");
-}
-
-.button__remove {
- display: inline-block;
- content: " ";
- width: 24px;
- height: 24px;
- background: url("data:image/svg+xml;utf8,
");
-}
-
-.button__up {
- display: inline-block;
- content: " ";
- width: 24px;
- height: 24px;
- background: url("data:image/svg+xml;utf8,
");
-}
-
-.button__down {
- display: inline-block;
- content: " ";
- width: 24px;
- height: 24px;
- background: url("data:image/svg+xml;utf8,
");
-}
-
-@-webkit-keyframes spinner {
- to {
- transform: rotate(360deg);
- }
-}
-
-@keyframes spinner {
- to {
- transform: rotate(360deg);
- }
-}
-
-.spinner {
- content: "";
- box-sizing: border-box;
- width: 20px;
- height: 20px;
- border-radius: 50%;
- border: 2px solid #ccc;
- border-top-color: #000;
- -webkit-animation: spinner 0.6s linear infinite;
- animation: spinner 0.6s linear infinite;
-}
-
-input[class$="-loading"] + div nav:before {
- content: "";
- box-sizing: border-box;
- width: 20px;
- height: 20px;
- border-radius: 50%;
- border: 2px solid #ccc;
- border-top-color: #000;
- -webkit-animation: spinner 0.6s linear infinite;
- animation: spinner 0.6s linear infinite;
- position: absolute;
- top: 0.25rem;
- right: 0.25rem;
-}
-
-.button__remove, .button__add {
- opacity: 0.5;
-}
-
-.button__remove:hover, .button__add:hover {
- opacity: 1;
-}
-
-.search_select {
- display: flex;
- flex-direction: row;
- align-content: center;
-}
-
-.search_select nav {
- width: 100%;
-}
-
-.search_select .button__remove {
- margin-right: 0.25rem;
-}
-
-.main__content {
- display: flex;
- flex-direction: column;
-}
-
-.main__wrap {
- display: flex;
- overflow: hidden;
- height: 100vh;
-}
-
-.nav {
- overflow-y: auto;
- width: 20%;
- padding: 1rem;
-}
-
-.nav__list {
- align-content: center;
- justify-content: space-between;
-}
-
-.nav__list > .nav__item:first-of-type {
- padding-bottom: 1.25rem;
- font-size: 1.875rem;
- line-height: 2.25rem;
- font-weight: 700;
- text-align: center;
-}
-
-.nav__item {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.nav__item--drop {
- margin-left: 0.25rem;
-}
-
-.nav__item--drop > ul {
- margin-left: 1rem;
-}
-
-.nav__list > .nav__item--group:first-of-type {
- padding-bottom: 1.25rem;
- font-size: 1.875rem;
- line-height: 2.25rem;
- font-weight: 700;
- text-align: center;
-}
-
-.nav__item--group {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.nav__item--group a {
- padding: 0.25rem;
- border-radius: 0.25rem;
-}
-
-.nav__item--group {
- border-bottom-width: 1px;
- padding-top: 0.25rem;
- padding-bottom: 0.25rem;
- display: flex;
- flex-direction: column;
-}
-
-.nav__list > .nav__item--selected:first-of-type {
- padding-bottom: 1.25rem;
- font-size: 1.875rem;
- line-height: 2.25rem;
- font-weight: 700;
- text-align: center;
-}
-
-.nav__item--selected {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.nav__item--selected a {
- padding: 0.25rem;
- border-radius: 0.25rem;
- -webkit-text-decoration-line: underline;
- text-decoration-line: underline;
- -webkit-text-decoration-style: dotted;
- text-decoration-style: dotted;
-}
-
-.nav__item a {
- padding: 0.25rem;
- border-radius: 0.25rem;
-}
-
-.nav__item--active {
- padding: 0.5rem;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.nav__item--drop {
- white-space: nowrap;
-}
-
-.nav__item--drop input {
- display: none;
-}
-
-.nav__item--drop label {
- padding-left: 0.25rem;
- font-weight: 700;
- cursor: pointer;
- transition: all 0.25s ease-out;
-}
-
-.nav__item--drop label::before {
- content: ' ';
- display: inline-block;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-left: 5px solid currentColor;
- vertical-align: middle;
- margin-right: .7rem;
- transform: translateY(-2px);
- transition: transform .2s ease-out;
-}
-
-.nav__item--drop input:checked + label::before {
- transform: rotate(90deg) translateX(-3px);
-}
-
-.nav__item--drop ul {
- display: none;
-}
-
-.nav__item--drop input:checked + label + ul {
- display: list-item;
-}
-
-.content {
- display: flex;
- flex-direction: column;
- width: 80%;
- padding: 0.5rem;
-}
-
-.home__intro {
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- font-size: 1.25rem;
- line-height: 1.75rem;
-}
-
-.resource__banner {
- display: grid;
- grid-template-columns: repeat(1, minmax(0, 1fr));
-}
-
-@media (min-width: 1024px) {
- .resource__banner {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
-}
-
-.resource__banner {
- white-space: nowrap;
- overflow-x: clip;
- margin-bottom: 0.5rem;
-}
-
-.resource__title {
- display: grid;
- align-items: center;
- justify-items: center;
-}
-
-@media (min-width: 1024px) {
- .resource__title {
- justify-items: end;
- }
-}
-
-.resource__title {
- height: 100%;
- direction: rtl;
-}
-
-.resource__actions {
- flex-direction: column;
- flex: 1 1 0%;
- align-items: center;
- display: grid;
- justify-items: center;
-}
-
-@media (min-width: 1024px) {
- .resource__actions {
- justify-items: end;
- }
-}
-
-.resource__actions {
- white-space: nowrap;
-}
-
-.resource__actions > div > * {
- margin-left: 0.5rem;
-}
-
-.resource__action {
- display: inline-flex;
- height: 2rem;
-}
-
-.resource__action--link:hover {
- -webkit-text-decoration-line: underline;
- text-decoration-line: underline;
-}
-
-.resource__action--btn, .resource__action--secondary {
- display: inline-flex;
- height: 2rem;
- align-items: center;
- padding-left: 1rem;
- padding-right: 1rem;
- font-size: 0.875rem;
- line-height: 1.25rem;
- transition-property: color, background-color, border-color, fill, stroke, -webkit-text-decoration-color;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, -webkit-text-decoration-color;
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-duration: 150ms;
- border-radius: 0.5rem;
- position: relative;
- white-space: nowrap;
- border-width: 1px;
-}
-
-.resource__action--disabled {
- display: inline-flex;
- height: 2rem;
- align-items: center;
- padding-left: 1rem;
- padding-right: 1rem;
- font-size: 0.875rem;
- line-height: 1.25rem;
- transition-property: color, background-color, border-color, fill, stroke, -webkit-text-decoration-color;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, -webkit-text-decoration-color;
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-duration: 150ms;
- border-radius: 0.5rem;
- position: relative;
- white-space: nowrap;
- border-width: 1px;
- opacity: 0.3;
-}
-
-.resource__action--danger {
- display: inline-flex;
- height: 2rem;
- align-items: center;
- padding-left: 1rem;
- padding-right: 1rem;
- font-size: 0.875rem;
- line-height: 1.25rem;
- transition-property: color, background-color, border-color, fill, stroke, -webkit-text-decoration-color;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, -webkit-text-decoration-color;
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-duration: 150ms;
- border-radius: 0.5rem;
- position: relative;
- white-space: nowrap;
- border-width: 1px;
-}
-
-.resource__action--drop {
- display: inline-flex;
- height: 2rem;
-}
-
-[class$="--drop"] {
- flex-direction: column;
-}
-
-[class$="--drop"] > div {
- position: relative;
-}
-
-[class$="--drop"] nav {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- display: none;
- position: absolute;
- left: 0px;
- border-width: 1px;
- border-radius: 0.375rem;
- padding-left: 0.5rem;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- z-index: 50;
- max-height: 20rem;
- padding: 0.25rem;
-}
-
-[class$="--drop"] div:first-child nav {
- bottom: 0.5rem;
-}
-
-[class$="--drop"] div:last-child nav {
- top: 0.25rem;
-}
-
-[class$="--drop"]:focus-within nav {
- display: block;
-}
-
-[class$="--drop"] nav a:hover {
- -webkit-text-decoration-line: underline;
- text-decoration-line: underline;
-}
-
-.resource__view dd {
- margin-bottom: 0.75rem;
-}
-
-#index-page {
- overflow-x: auto;
-}
-
-.list__search {
- background-color: transparent;
- display: flex;
- margin: 0.25rem;
-}
-
-.list__error {
- width: 100%;
- text-align: center;
-}
-
-.list__error * {
- margin: 0.5rem;
-}
-
-.list__search input {
- padding-left: 1rem;
- padding-right: 1rem;
- padding-top: 0.25rem;
- padding-bottom: 0.25rem;
- width: 15rem;
- border-width: 0px;
- height: 2rem;
-}
-
-.list__search svg {
- width: 1.25rem;
- height: 1.25rem;
-}
-
-.resource__table {
- padding: 0.5rem;
- margin: 0.25rem;
- --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
- border-radius: 0.25rem;
- border-collapse: collapse;
- border-width: 1px;
- position: relative;
-}
-
-.resource__table th {
- position: -webkit-sticky;
- position: sticky;
- z-index: 10;
- top: 0px;
-}
-
-.table__footer > div {
- padding: 0.5rem;
- display: flex;
- align-items: center;
-}
-
-#footer-nav div {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- width: 100%;
- font-weight: 600;
-}
-
-#settings-modal label {
- background-color: inherit;
- width: 50%;
-}
-
-#list-filters > div:nth-child(1) {
- display: flex;
- justify-content: space-evenly;
-}
-
-#list-filters div > div:nth-child(1) {
- display: flex;
-}
-
-#list-filters > div > div:nth-child(2) {
- display: flex;
- justify-content: space-evenly;
-}
-
-#list-filters div > div:nth-child(2) > * {
- width: 25%;
- line-height: 1.25rem;
-}
-
-#list-filters > div:last-of-type {
- justify-content: flex-start;
-}
-
-.resource__table dd {
- margin-bottom: 1.25rem;
-}
-
-.resource__header {
- border-width: 1px;
- padding-left: 2rem;
- padding-right: 2rem;
- padding-top: 1rem;
- padding-bottom: 1rem;
- white-space: nowrap;
-}
-
-.header__link--down::before {
- content: ' ';
- display: inline-block;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-left: 5px solid currentColor;
- vertical-align: middle;
- margin-right: .7rem;
- transform: translateY(-2px);
- transition: transform .2s ease-out;
- transform: rotate(90deg) translateX(-3px);
-}
-
-.header__link--up::before {
- content: ' ';
- display: inline-block;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-left: 5px solid currentColor;
- vertical-align: middle;
- margin-right: .7rem;
- transform: translateY(-2px);
- transition: transform .2s ease-out;
- transform: rotate(-90deg) translateX(3px);
-}
-
-[class^="resource__cell"] {
- padding-left: 1rem;
- padding-right: 1rem;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- height: 5rem;
- position: relative;
-}
-
-.resource__cell:not(:first-child) .cell__contents {
- overflow-y: auto;
-}
-
-.cell__contents {
- display: flex;
- flex-direction: column;
- height: 100%;
- width: 100%;
- justify-content: center;
- align-items: safe center;
-}
-
-.resource__menu--drop svg {
- width: 1.25rem;
- height: 1.25rem;
-}
-
-.cell__copy {
- cursor: pointer;
-}
-
-.resource__form {
- border-radius: 0.25rem;
- border-collapse: collapse;
- border-width: 1px;
- --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
- padding: 0.5rem;
- margin: 0.25rem;
- width: 100%;
-}
-
-.form__actions {
- display: flex;
- justify-content: flex-end;
-}
-
-.form__actions > * {
- margin-left: 0.25rem;
-}
-
-.table__actions {
- display: flex;
-}
-
-.table__actions * {
- margin-right: 0.5rem;
-}
-
-.embed__sort, .embed__drop {
- display: none;
-}
-
-.embed__title {
- margin-bottom: 0.5rem;
- text-transform: uppercase;
- font-weight: 700;
- font-size: 1.125rem;
- line-height: 1.75rem;
-}
-
-.embed__group {
- border-left-width: 1px;
- border-style: dashed;
- padding-bottom: 1.25rem;
- position: relative;
- margin-left: 0.75rem;
-}
-
-.embed__group .button__add {
- position: absolute;
- bottom: -0.5rem;
- left: -0.75rem;
-}
-
-.embed__item > .button__remove {
- position: absolute;
- top: -0.5rem;
- left: -0.5rem;
-}
-
-.embed__item > .button__up {
- position: absolute;
- top: -0.5rem;
- right: -0.5rem;
-}
-
-.embed__item > .button__down {
- position: absolute;
- bottom: -0.5rem;
- right: -0.5rem;
-}
-
-.embed__item {
- position: relative;
- border-width: 1px;
- border-style: dotted;
- margin-left: 1.25rem;
- margin-top: 0.75rem;
-}
-
-.embed__item > div {
- flex-direction: column;
- padding: 0.75rem;
- flex-grow: 1;
-}
-
-.field__group {
- display: flex;
- flex-direction: column;
- margin-bottom: 1rem;
-}
-
-.field__group--disabled {
- display: flex;
- flex-direction: column;
- margin-bottom: 1rem;
- opacity: 0.3;
-}
-
-.field__label {
- margin-bottom: 0.5rem;
- text-transform: uppercase;
- font-weight: 700;
- font-size: 1.125rem;
- line-height: 1.75rem;
-}
-
-.checkbox__group input {
- --tw-scale-x: 1.5;
- --tw-scale-y: 1.5;
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
-}
-
-.checkbox__group label {
- margin-left: 0.25rem;
-}
-
-.checkbox__group {
- display: grid;
- grid-template-columns: auto minmax(0, 1fr);
- gap: 0.25rem;
- justify-items: start;
- margin-left: 0.75rem;
-}
-
-.field__array--group {
- position: relative;
- padding-bottom: 1.5rem;
-}
-
-.field__array--row input:not(first-of-type) {
- margin-right: 0.5rem;
-}
-
-.field__array--group a.button__add {
- position: absolute;
- left: -0px;
- bottom: -0.25rem;
-}
-
-.field__array--group > div {
- display: flex;
- align-items: center;
- margin-bottom: 0.5rem;
-}
-
-.field__array--group > div > a {
- flex-shrink: 0;
- margin-right: 0.5rem;
-}
-
-.field__array--group input {
- margin-bottom: 0px;
-}
-
-.field__map--group > div {
- position: relative;
- padding-bottom: 1.5rem;
-}
-
-.field__map--group a.button__remove {
- flex-shrink: 0;
- margin-right: 0.5rem;
-}
-
-.field__map--group a.button__add {
- position: absolute;
- left: 0px;
- bottom: 0px;
-}
-
-.field__map--row {
- display: flex;
- align-items: center;
- margin-bottom: 0.5rem;
-}
-
-.field__map--row textarea {
- margin-bottom: 0px;
- margin-right: 0.5rem;
- width: 25%;
-}
-
-.toast__container {
- position: fixed;
- width: 12rem;
- z-index: 40;
- border-radius: 0.25rem;
- padding: 0.25rem;
- text-align: center;
- border-width: 1px;
- bottom: 1.25rem;
- text-overflow: clip;
- overflow: hidden;
- left: 50%;
- top: auto !important;
- transform: translate(-50%, -50%) !important;
-}
-
-[class^="toast__container"]:empty {
- display: none;
-}
-
-.toast__container--info {
- position: fixed;
- width: 12rem;
- z-index: 40;
- border-radius: 0.25rem;
- padding: 0.25rem;
- text-align: center;
- border-width: 1px;
- bottom: 1.25rem;
- text-overflow: clip;
- overflow: hidden;
- left: 50%;
- top: auto !important;
- transform: translate(-50%, -50%) !important;
-}
-
-.toast__container--error {
- position: fixed;
- width: 12rem;
- z-index: 40;
- border-radius: 0.25rem;
- padding: 0.25rem;
- text-align: center;
- border-width: 1px;
- bottom: 1.25rem;
- text-overflow: clip;
- overflow: hidden;
- left: 50%;
- top: auto !important;
- transform: translate(-50%, -50%) !important;
-}
-
-.toast__container--success {
- position: fixed;
- width: 12rem;
- z-index: 40;
- border-radius: 0.25rem;
- padding: 0.25rem;
- text-align: center;
- border-width: 1px;
- bottom: 1.25rem;
- text-overflow: clip;
- overflow: hidden;
- left: 50%;
- top: auto !important;
- transform: translate(-50%, -50%) !important;
-}
-
-.invisible {
- visibility: hidden;
-}
-
-.fixed {
- position: fixed;
-}
-
-.absolute {
- position: absolute;
-}
-
-.relative {
- position: relative;
-}
-
-.sticky {
- position: -webkit-sticky;
- position: sticky;
-}
-
-.mb-2 {
- margin-bottom: 0.5rem;
-}
-
-.block {
- display: block;
-}
-
-.flex {
- display: flex;
-}
-
-.table {
- display: table;
-}
-
-.grid {
- display: grid;
-}
-
-.contents {
- display: contents;
-}
-
-.hidden {
- display: none;
-}
-
-.size-6 {
- width: 1.5rem;
- height: 1.5rem;
-}
-
-.h-5 {
- height: 1.25rem;
-}
-
-.h-6 {
- height: 1.5rem;
-}
-
-.h-full {
- height: 100%;
-}
-
-.w-1\/2 {
- width: 50%;
-}
-
-.w-5 {
- width: 1.25rem;
-}
-
-.w-6 {
- width: 1.5rem;
-}
-
-.grow {
- flex-grow: 1;
-}
-
-.transform {
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
-}
-
-.select-all {
- -webkit-user-select: all;
- -moz-user-select: all;
- user-select: all;
-}
-
-.items-center {
- align-items: center;
-}
-
-.justify-center {
- justify-content: center;
-}
-
-.truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.rounded {
- border-radius: 0.25rem;
-}
-
-.rounded-lg {
- border-radius: 0.5rem;
-}
-
-.border {
- border-width: 1px;
-}
-
-.border-2 {
- border-width: 2px;
-}
-
-.border-l {
- border-left-width: 1px;
-}
-
-.p-10 {
- padding: 2.5rem;
-}
-
-.px-2 {
- padding-left: 0.5rem;
- padding-right: 0.5rem;
-}
-
-.uppercase {
- text-transform: uppercase;
-}
-
-.underline {
- -webkit-text-decoration-line: underline;
- text-decoration-line: underline;
-}
-
-.opacity-0 {
- opacity: 0;
-}
-
-.opacity-100 {
- opacity: 1;
-}
-
-.opacity-30 {
- opacity: 0.3;
-}
-
-.filter {
- filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
-}
-
-.transition {
- transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-duration: 150ms;
-}
-
-.duration-300 {
- transition-duration: 300ms;
-}
-
-.ease-in {
- transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
-}
-
-.ease-out {
- transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
-}
-
-input[type="date"], input[type="number"] {
- width: 8rem;
-}
-
-input[type="submit"] {
- cursor: pointer;
-}
-
-.cell__icons {
- display: none;
- position: absolute;
- bottom: 0px;
- right: 0px;
- margin: 0.25rem;
-}
-
-.cell__icons div {
- cursor: pointer;
- margin-left: 0.25rem;
- margin-right: 0.25rem;
-}
-
-[class^="resource__cell"]:hover .cell__icons {
- display: flex;
-}
-
-.resource__cell svg {
- width: 1.5rem;
- height: 1.5rem;
-}
-
-.field__assoc--link {
- line-height: 2.25rem;
- -webkit-text-decoration-line: underline;
- text-decoration-line: underline;
- vertical-align: bottom;
-}
-
-.field__assoc--link:hover::after {
- line-height: 2.25rem;
- display: inline-block;
- content: " ";
- background-image: url("data:image/svg+xml,
");
- width: 20px;
- height: 20px;
- margin-left: 0.5rem;
-}
-
-.modal {
- position: fixed;
- display: none;
- inset: 0px;
- background-color: rgb(75 85 99 / var(--tw-bg-opacity));
- --tw-bg-opacity: 0.5;
- overflow-y: auto;
- height: 100%;
- width: 100%;
- z-index: 50;
- margin: 0px;
-}
-
-.modal > div {
- position: relative;
- top: 5rem;
- margin-left: auto;
- margin-right: auto;
- padding: 1.25rem;
- border-width: 1px;
- width: 25%;
- --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
- border-radius: 0.375rem;
- --tw-bg-opacity: 1;
- background-color: rgb(255 255 255 / var(--tw-bg-opacity));
- white-space: normal;
-}
-
-.modal form {
- display: flex;
- flex-direction: column;
- margin-top: 0.75rem;
-}
-
-.modal label {
- display: flex;
- height: 1.75rem;
- width: 1.75rem;
- border-radius: 9999px;
- --tw-bg-opacity: 1;
- background-color: rgb(243 244 246 / var(--tw-bg-opacity));
- align-items: center;
- justify-content: center;
- margin-right: 0.5rem;
-}
-
-.modal__title {
- font-size: 1.125rem;
- line-height: 1.75rem;
- font-weight: 700;
- border-bottom-width: 2px;
-}
-
-.modal__tabs {
- border-bottom-width: 2px;
-}
-
-.modal__tabs > .modal__title--active {
- font-size: 1.125rem;
- line-height: 1.75rem;
- font-weight: 700;
- border-bottom-width: 2px;
- display: inline-block;
- margin-right: 0.5rem;
- border-width: 0px;
-}
-
-.modal__tabs > .modal__title {
- display: inline-block;
- margin-right: 0.5rem;
- border-width: 0px;
- cursor: pointer;
-}
-
-.modal form > div {
- display: flex;
- margin-top: 0.25rem;
- margin-bottom: 0.25rem;
- align-items: center;
-}
-
-.modal form > input[type="submit"] {
- width: 6rem;
- margin-left: auto;
- margin-right: auto;
-}
-
-.modal form > div:last-of-type {
- margin-bottom: 0.75rem;
-}
-
-.docs {
- white-space: pre-wrap;
- display: block;
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
- border-radius: 0.25rem;
- --tw-bg-opacity: 1;
- background-color: rgb(243 244 246 / var(--tw-bg-opacity));
- padding: 0.5rem;
- margin-top: 0.5rem;
- margin-bottom: 0.5rem;
-}
-
-.focus\:ring:focus {
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
-}
+*{box-sizing:border-box;margin:0;padding:0}body{background:var(--bg-light);color:var(--text-primary);font-family:system-ui,sans-serif;--accent-color:#6b46c1;--accent-hover:#7c3aed;--bg-light:#f5f5f7;--bg-white:#fff;--bg-medium:#e8e8ed;--border-light:#d2d2d7;--border-medium:#e8e8ed;--text-primary:#1d1d1f;--text-secondary:#515154;--text-muted:#86868b;--error-bg:#fef2f2;--error-color:#dc2626;--error-hover:#7f1d1d;--success-bg:#f0fdf4;--success-light:#d1fae5;--success-color:#16a34a;--success-dark:#065f46;--success-hover:#166534;--info-bg:#eff6ff;--info-light:#dbeafe;--info-color:#2563eb;--info-dark:#1e40af;--info-hover:#1e40af;--warning-bg:#fff1e5;--warning-color:#e53e3e;--warning-hover:#c53030;--purple-50:#f3e8ff;--purple-100:#e9d5ff;--opacity-disabled:0.4;--opacity-muted:0.7;--shadow-sm:0 1px 3px rgba(0,0,0,.1);--shadow-md:0 4px 12px rgba(0,0,0,.15);--shadow-lg:0 20px 60px rgba(0,0,0,.3);--focus-ring:0 0 0 3px rgba(107,70,193,.1);--top-height:64px;padding-top:var(--top-height)}body:has(.alert-bar){padding-top:112px}p{margin:1lh 0}h1[class$=title],h3[class$=title]{color:var(--accent-hover);font-size:16px;font-weight:600;letter-spacing:.1em;opacity:.75;text-transform:uppercase}h1[class$=title]{font-size:16px}h2[class$=title]{font-size:14px}h3[class$=title]{font-size:12px}h1 span,h2 span,h3 span{color:var(--text-primary);display:block;font-size:2.5em;opacity:1;text-transform:none}.header{background:var(--bg-white);border-bottom:1px solid var(--border-light);left:0;position:fixed;right:0;top:0;z-index:100}.header-content{align-items:center;display:flex;height:var(--top-height);justify-content:space-between;margin:0 32px 0 24px}.logo{color:var(--text-primary);font-size:20px;font-weight:600}.user-menu{align-items:center;display:flex;gap:16px}#alert-bar{left:0;position:fixed;right:0}#alert-bar:hover .alert-bar+.alert-bar{opacity:1;top:64px}.alert-bar{align-items:center;border-style:solid;border-width:2px 0;display:flex;height:64px;justify-content:space-between;padding:14px 24px;position:absolute;transition:all .2s ease-in-out;width:100%;z-index:2}.alert-bar+.alert-bar{border-top-width:0;opacity:0;position:absolute;top:0;z-index:1}.alert-count{align-items:center;border-radius:50%;border-style:solid;border-width:2px;cursor:pointer;display:flex;height:1.25lh;justify-content:center;text-align:center;vertical-align:middle;width:1.25lh}.alert-bar.error{background:var(--error-bg);border-color:var(--error-color);color:var(--error-color)}.alert-bar.error:hover{color:var(--error-hover)}.alert-bar.success{background:var(--success-bg);border-color:var(--success-color);color:var(--success-color)}.alert-bar.success:hover{color:var(--success-hover)}.alert-bar.info{background:var(--info-bg);border-color:var(--info-color);color:var(--info-color)}.alert-bar.info:hover{color:var(--info-hover)}#alert-bar[class$=loading]{opacity:var(--opacity-muted);pointer-events:none}.alert-content{align-items:center;display:flex;flex:1;gap:12px}.alert-icon{cursor:pointer;flex-shrink:0;height:20px;width:20px}.alert-message{font-size:14px;font-weight:500}.alert-close{border-radius:6px;cursor:pointer;flex-shrink:0;font-size:16px;font-weight:600;line-height:1;padding:6px 12px;transition:all .2s}.breadcrumb,.breadcrumb a,.breadcrumb-content,.breadcrumb-current,.breadcrumb-separator{display:none}.main-layout{display:flex;min-height:calc(100vh - var(--top-height))}.sidebar{background:var(--bg-white);border-right:1px solid var(--border-light);bottom:0;left:0;max-width:300px;min-width:200px;overflow-y:auto;padding:24px 0 180px;position:fixed;top:var(--top-height);width:20vw;z-index:10}body:has(.alert-bar) .sidebar{top:112px}.nav-section{margin-bottom:32px}.nav-section-title{color:var(--text-muted);font-size:12px;font-weight:600;letter-spacing:.5px;padding:0 24px 12px;text-transform:uppercase}.nav-item{align-items:center;color:var(--text-primary);cursor:pointer;display:flex;gap:12px;padding:10px 24px;text-decoration:none;transition:background .2s}.nav-item.active,.nav-item:hover{background:var(--bg-light)}.nav-item.active{border-left:3px solid var(--accent-color);color:var(--accent-color)!important;font-weight:500}.nav-icon{fill:currentColor;height:20px;width:20px}.nav-icon svg{display:block;height:100%;width:100%}.nav-item-expand{font-size:12px;margin-left:auto;opacity:var(--opacity-muted);transition:transform .2s}.nav-toggle-input{display:none}.nav-toggle-label{align-items:center;color:var(--text-primary);cursor:pointer;display:flex;gap:12px;padding:10px 24px;text-decoration:none;transition:background .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none}.nav-toggle-label:hover{background:var(--bg-light)}.nav-toggle-label.active{background:var(--bg-medium);border-left:3px solid var(--accent-color);font-weight:500}.nav-subitems{max-height:0;overflow:hidden}.nav-toggle-input:checked+.nav-toggle-label+.nav-subitems{max-height:none}.nav-toggle-input:checked+.nav-toggle-label .nav-item-expand{transform:rotate(180deg)}.nav-subitems .nav-toggle-label{color:var(--text-secondary);font-size:16px;padding:8px 24px}.nav-subitems .nav-toggle-label:hover{background:transparent;color:var(--accent-color)}.nav-subitems .nav-subitems{max-height:0;padding-left:16px}.nav-subitems .nav-subitems a{align-items:center;color:var(--text-secondary);display:flex;font-size:16px;gap:12px;padding:8px 24px;text-decoration:none;transition:color .2s}.nav-subitems .nav-subitems a:hover{color:var(--accent-color)}.nav-subitem{align-items:center;color:var(--text-secondary);display:flex;font-size:16px;justify-content:space-between;padding:8px 24px;text-decoration:none;transition:color .2s}.nav-subitem:hover{color:var(--accent-color)}.nav-subitem .nav-item-expand{font-size:12px;opacity:var(--opacity-muted)}.nav-progress-section{background:var(--bg-white);border-top:1px solid var(--border-light);bottom:0;left:0;padding:16px 24px 24px;position:absolute;right:0}.nav-progress-title{color:var(--text-muted);font-size:12px;font-weight:600;letter-spacing:.5px;margin-bottom:16px;text-transform:uppercase}.progress-item{margin-bottom:16px}.progress-item:last-child{margin-bottom:0}.progress-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:6px}.progress-label{color:var(--text-primary);font-size:13px;font-weight:500}.progress-percentage{color:var(--text-muted);font-size:12px;font-weight:600}.progress-bar-container{background:var(--bg-medium);border-radius:3px;height:6px;overflow:hidden;width:100%}.progress-bar{background:var(--accent-color);border-radius:3px;height:100%;transition:width .3s ease}.content{box-sizing:border-box;flex:1;margin-left:20vw;max-width:80vw;padding:32px}@media (min-width:1500px){.content{margin-left:300px;max-width:calc(100vw - 300px)}}@media (max-width:1000px){.content{margin-left:200px;max-width:calc(100vw - 200px)}}.content-header{align-items:center;display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between;margin-bottom:32px;max-width:100%;overflow:visible}.content-title{flex-shrink:1;font-size:32px;font-weight:600;min-width:0;overflow-wrap:break-word}@media (max-width:768px){.content-header{align-items:flex-start;flex-direction:column}.contextual-actions{width:100%}}.contextual-actions{display:flex;flex-shrink:0;flex-wrap:wrap;gap:12px}.btn{align-items:center;border:none;border-radius:8px;cursor:pointer;display:flex;font-size:14px;font-weight:500;gap:8px;padding:10px 20px;transition:all .2s}.btn-primary{background:var(--accent-color);color:var(--bg-white)}.btn-primary:hover{background:var(--accent-hover)}.btn-secondary{background:var(--bg-white);border:1px solid var(--border-light);color:var(--text-primary)}.btn-secondary:hover{background:var(--bg-light)}.btn-select{background:var(--bg-white);border:1px solid var(--border-light);border-radius:8px;color:var(--text-primary);cursor:pointer;font-size:14px;font-weight:500;padding:10px 20px;position:relative;transition:all .2s}.btn-select:hover,.btn-select[open]{background:var(--bg-light)}.btn-select summary{align-items:center;cursor:pointer;display:flex;gap:8px;list-style:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-select summary::-webkit-details-marker{display:none}.btn-select summary:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--text-primary);content:"";height:0;margin-left:8px;width:0}.btn-select[open] summary:after{border-bottom:5px solid var(--text-primary);border-top:none}.drop-menu{background:var(--bg-white);border:1px solid var(--border-light);border-radius:8px;box-shadow:var(--shadow-md);max-height:30vh;min-width:200px;overflow-y:scroll;padding:8px 0;position:absolute;right:0;top:calc(100% + 4px);z-index:1000}.drop-link{color:var(--text-primary);display:block;display:inline-block;font-size:14px;height:100%;padding:10px 16px;text-decoration:none;transition:background .2s;width:100%}.drop-link:hover{background:var(--bg-light)}.btn-icon{fill:currentColor;height:16px;width:16px}.btn-icon svg{display:block;height:100%;width:100%}.content-card{background:var(--bg-white);border-radius:12px;box-shadow:var(--shadow-sm);padding:24px}.card-section{margin-bottom:24px}.table-container{overflow-x:auto}.card-section:last-child{margin-bottom:0}.card-section-title{font-size:18px;font-weight:600;margin-bottom:16px}.card-text{color:var(--text-secondary);line-height:1.6}.data-table{border-collapse:collapse;margin-top:16px;min-width:1600px;width:100%}.data-table th{background:var(--bg-light);border-bottom:2px solid var(--border-light);color:var(--text-primary);cursor:pointer;font-size:14px;font-weight:600;padding:12px 16px;position:relative;text-align:left;-webkit-user-select:none;-moz-user-select:none;user-select:none}.data-table th a{color:inherit;text-decoration:none}.data-table th a:hover{color:var(--accent-color)}.data-table th:first-child{cursor:default}.data-table th.sort-asc:after,.data-table th.sort-desc:after{content:"";font-size:12px;margin-left:8px}.data-table th.sort-asc:after{color:var(--accent-color);content:"▲"}.data-table th.sort-desc:after{color:var(--accent-color);content:"▼"}.data-table td{border-bottom:1px solid var(--border-medium);color:var(--text-secondary);max-width:250px;padding:12px 16px;position:relative}.data-table td,.data-table td:first-child{vertical-align:middle}.expand-icon{background:#eee;border-radius:2px;bottom:2px;color:var(--text-muted);cursor:pointer;display:none;padding:2px;position:absolute;right:2px;transition:opacity .2s;z-index:10}.expand-icon:hover{color:var(--text-secondary)}.copy-icon,.detail-field-value:hover .expand-icon,.table-cell:hover .expand-icon{display:flex}.copy-icon{background:#eee;border-radius:2px;bottom:6px;color:var(--text-muted);cursor:pointer;padding:2px;position:absolute;right:6px;transition:opacity .2s;width:20px;z-index:100}.copy-icon:hover{color:var(--text-secondary)}.modal-body:hover .copy-icon{display:flex}.modal{align-items:center;background:rgba(0,0,0,.5);bottom:0;display:none;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:2000}.modal-content{background:var(--bg-white);border-radius:12px;box-shadow:var(--shadow-lg);max-height:80vh;max-width:600px;overflow-y:auto;padding:32px;position:relative}.modal-header{align-items:center;border-bottom:2px solid var(--border-medium);display:flex;justify-content:space-between;margin-bottom:24px;padding-bottom:16px}.modal-title{color:var(--text-primary);font-size:20px;font-weight:600}.modal-close{align-items:center;background:none;border:none;border-radius:6px;color:var(--text-muted);cursor:pointer;display:flex;font-size:28px;height:32px;justify-content:center;padding:0;transition:all .2s;width:32px}.modal-close:hover{background:var(--bg-light);color:var(--text-primary)}.modal-body{color:var(--text-secondary);line-height:1.6;position:relative}.cell-content{display:inline-block;display:-webkit-box;-webkit-line-clamp:3;max-height:60px;max-width:calc(100% - 24px);overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;line-height:1.4}.cell-content *{display:inline-block}.data-table tr:last-child td{border-bottom:none}.data-table tr:hover{background:var(--bg-light)}.row-checkbox{accent-color:var(--accent-color);cursor:pointer;height:18px;width:18px}.row-checkbox:checked~td{background:var(--purple-50)}.data-table input[type=checkbox]:checked{background:var(--accent-color)}.data-table tr:has(input[type=checkbox]:checked){background:var(--purple-50)}.data-table tr:has(input[type=checkbox]:checked):hover{background:var(--purple-100)}.data-table td:first-child,.data-table th:first-child{text-align:center;width:40px}.status-badge{border-radius:12px;display:inline-block;font-size:12px;font-weight:500;padding:4px 12px}.status-active{background:var(--success-light);color:var(--success-dark)}.status-pending{background:var(--warning-bg);color:var(--warning-color)}.status-completed{background:var(--info-light);color:var(--info-dark)}.pagination{align-items:center;border-top:1px solid var(--border-medium);display:flex;justify-content:center;margin-top:24px;padding-top:16px}.pagination-info{color:var(--text-secondary);font-size:14px}.pagination-controls{align-items:center;display:flex;gap:8px}.pagination-btn{background:var(--bg-white);border:1px solid var(--border-light);border-radius:6px;color:var(--text-primary);cursor:pointer;font-size:14px;padding:6px 12px;transition:all .2s}.pagination-btn:hover:not(:disabled){background:var(--bg-light);border-color:var(--accent-color)}.pagination-btn:disabled{cursor:not-allowed;opacity:var(--opacity-disabled)}.pagination-info-btn{background:var(--bg-white);border:1px solid var(--border-light);border-radius:6px;color:var(--text-secondary);cursor:pointer;font-size:14px;padding:6px 12px;transition:all .2s}.pagination-info-btn:hover{background:var(--bg-light);border-color:var(--accent-color)}.search-container{margin-bottom:16px;max-width:400px;position:relative}.search-input{border:1px solid var(--border-light);border-radius:8px;font-family:inherit;font-size:14px;padding:10px 16px 10px 40px;transition:all .2s;width:100%}.search-input:focus{border-color:var(--accent-color);box-shadow:var(--focus-ring);outline:none}.search-input::-moz-placeholder{color:var(--text-muted)}.search-input::placeholder{color:var(--text-muted)}.search-icon{height:18px;left:12px;opacity:var(--opacity-muted);pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);width:18px}.edit-view{display:none}.edit-view.active{display:block}.edit-view.hidden{display:none}.form-grid{display:grid;gap:24px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-bottom:32px}.form-field{display:flex;flex-direction:column;gap:8px}.form-label{color:var(--text-muted);font-size:12px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}.form-input,.form-select,.form-textarea{border:1px solid var(--border-light);border-radius:6px;color:var(--text-primary);font-family:inherit;font-size:14px;padding:10px 12px;transition:all .2s;width:100%}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--accent-color);box-shadow:var(--focus-ring);outline:none}.form-textarea{height:39px;max-width:30vw;min-height:39px;padding:10px 12px;resize:vertical}.form-actions{border-top:2px solid var(--border-medium);display:flex;gap:12px;justify-content:flex-end;margin-top:16px;padding-top:16px}.form-subsection{background:var(--bg-light);border-radius:8px;grid-column:1/-1;margin-bottom:16px;padding:24px}.form-subsection-title{color:var(--text-primary);font-size:14px;font-weight:600;letter-spacing:.5px;margin-bottom:16px;text-transform:uppercase}.form-subgrid{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.detail-grid{display:grid;gap:24px;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));margin-bottom:32px}.detail-field{display:flex;flex-direction:column;gap:8px}.detail-field-label{color:var(--text-muted);font-size:12px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}.detail-field-value{color:var(--text-primary);display:flex;font-size:16px;max-height:3lh;min-height:1.5lh;overflow:hidden;position:relative}.detail-field-value>span{display:flex}.cell-content .btn,.detail-field-value .btn{cursor:default;margin:2px;padding:4px}.expand-content{background:var(--bg-light);border-radius:8px;color:var(--text-secondary);font-family:monospace;line-height:1.6;overflow:scroll;padding:16px;white-space:pre}.form-line .form-title{color:var(--text-primary);font-size:16px;font-weight:600;margin-bottom:30px;text-align:left}.form-line .docs{background:var(--info-bg);border-left:4px solid var(--info-color);border-radius:8px;color:var(--text-secondary);font-size:14px;line-height:1.6;margin-bottom:30px;padding:16px 20px}.form-line .form-group{align-items:flex-start;display:flex;gap:12px;margin-bottom:24px;width:100%}.form-line label{color:var(--text-secondary);display:block;flex-shrink:0;font-size:14px;font-weight:500;min-width:20px;padding-top:2px}.form-line textarea{background:var(--bg-white);border:2px solid var(--border-light);border-radius:8px;color:var(--text-primary);flex:1;font-family:inherit;font-size:15px;padding:8px 16px;resize:vertical;transition:all .3s ease;width:100%}.form-line textarea:focus{border-color:var(--accent-color);box-shadow:var(--focus-ring);outline:none}.form-line .button-group{display:flex;gap:12px;justify-content:flex-end;margin-top:32px;width:100%}select{background-color:#fff}.btn{text-decoration:none}.btn-danger{background-color:var(--warning-color);border:1px solid var(--warning-color);color:var(--warning-bg)}.btn-danger:hover{background-color:var(--warning-hover)}.nav-subitems .nav-icon{display:none}.detail-subtitle+.detail-subtitle:before{content:"|"}pre{overflow:scroll}th{white-space:nowrap}.cell-content{max-width:100%;padding:2px}.cell-content *{display:inline}.modal-content{min-width:50%}.edit-view{display:block}.nav-progress-section:not(:has(*)){display:none}.resource-link{color:#444;-webkit-text-decoration-style:dashed;text-decoration-style:dashed}.resource-link:hover{color:#333}.switch-container{display:inline-block;position:relative}input[type=radio]{display:none}.switch{background:#fff;border:1px solid #d2d2d7;border-radius:5.5px;cursor:pointer;height:38px;overflow:hidden;position:relative;width:125px}.switch-background{display:flex;height:100%;left:0;position:absolute;top:0;transition:transform .3s cubic-bezier(.4,0,.2,1);width:300%}.bg-section{height:100%;width:33.333%}.switch-handle{align-items:center;background:#fff;border:1px solid #d2d2d7;border-radius:5.5px;display:flex;font-size:12px;height:34px;justify-content:center;position:absolute;top:1px;transition:transform .3s cubic-bezier(.4,0,.2,1);width:34px;z-index:2}.switch-left:checked~.switch .switch-background,.switch-left:checked~.switch .switch-handle{transform:translateX(1px)}.switch-left:checked~.switch .switch-handle:before{background-image:url('data:image/svg+xml;utf8,
');background-repeat:no-repeat;background-size:contain;content:"";flex-shrink:0;height:16px;width:16px}.switch-center:checked~.switch .switch-background{transform:translateX(-33.333%)}.switch-center:checked~.switch .switch-handle{transform:translateX(45px)}.switch-center:checked~.switch .switch-handle:before{background-image:url('data:image/svg+xml;utf8,
');background-repeat:no-repeat;background-size:contain;content:"";flex-shrink:0;height:16px;width:16px}.switch-right:checked~.switch .switch-background{transform:translateX(-66.666%)}.switch-right:checked~.switch .switch-handle{transform:translateX(88px)}.switch-right:checked~.switch .switch-handle:before{background-image:url('data:image/svg+xml;utf8,
');background-repeat:no-repeat;background-size:contain;content:"";flex-shrink:0;height:16px;width:16px}.switch-center:checked~.labels .label-center,.switch-left:checked~.labels .label-left,.switch-right:checked~.labels .label-right{color:#333;font-weight:600;transform:scale(1.1)}.label-area{cursor:pointer;height:35px;position:absolute;top:0;width:33.333px;z-index:3}.label-area.left{left:0}.label-area.center{left:33.333px}.label-area.right{right:0}:disabled{opacity:.5}select[multiple]{height:39px}select[multiple]:focus-within{height:100px}.search-select-container{position:relative;width:100%}.select-filter{box-sizing:border-box;padding:10px;width:100%}.select-filter,.select-options{border:1px solid #ccc;border-radius:4px}.select-options{background-color:#fff;display:none;left:0;list-style:none;margin:0;max-height:150px;overflow-y:auto;padding:0;position:absolute;right:0;top:120%;z-index:1}.search-select-container:focus-within .select-options{display:block}.search-select-container .select-options:active,.search-select-container .select-options:focus{display:block}.select-options li{cursor:pointer;padding:10px}.select-options li:hover{background-color:#f0f0f0}.search-select-container[class$=loading]{opacity:.5}.search-select-container[class$=loading] button,.search-select-container[class$=loading] input,input[class$=loading]{opacity:.5;pointer-events:none}input[class$=loading]+.select-options{content:""}button[class$=loading]{opacity:.5;pointer-events:none}.array-input-wrapper{border:1px solid #e2e8f0;border-radius:8px;display:flex;flex-wrap:wrap;gap:8px;min-height:39px;padding:2px;transition:border-color .2s}.array-input-wrapper:focus-within{background:#fff;border-color:var(--accent-color)}.array-input-wrapper .btn{height:32px;padding:0 10px}@keyframes slideIn{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes fadeIn{0%{opacity:0}to{opacity:.5}}.array-input-wrapper input{background:transparent;border:none;flex:1;font-size:14px;min-width:120px;outline:none;padding:6px}.array-input-wrapper input:not(:-moz-placeholder-shown)+.return-icon{display:block}.array-input-wrapper input:not(:placeholder-shown)+.return-icon{display:block}.return-icon{animation:fadeIn .2s ease-out;display:none;height:20px;margin:5px;opacity:.5;transition:opacity .2s;width:20px}.form-field.error .error-message{color:#c15846;font-size:10px;font-weight:700}.form-field.error input,.form-field.error textarea{background:#fef2f2}.embed-container{display:flex;flex-direction:column;gap:30px}.remove-icon{background:none;border:none;color:#e53e3e;cursor:pointer;height:24px;left:6px;opacity:var(--opacity-muted);padding:0;position:absolute;top:6px;transition:color .2s,opacity .2s;width:24px}.remove-icon:hover{color:#c53030;opacity:1}.remove-icon svg{height:100%;width:100%}.embed-section,.embed-section-title-wrapper,.embed-section-wrapper{margin-bottom:15px}.embed-section{background:#f7f7f7;border-radius:8px;padding:50px 25px 25px;position:relative}.add-section-btn{align-items:center;background:var(--bg-white);border:1px dashed var(--border-medium);border-radius:8px;color:#2d3748;cursor:pointer;display:flex;font-size:15px;font-weight:600;gap:8px;justify-content:center;margin-top:0;padding:16px;transition:all .2s;width:100%}.add-section-btn:hover{border-style:solid}.embed-section.odd{background:#fff;border:1px solid #cbd5e0;border-radius:6px;position:relative;transition:border-color .2s}.embed.subsection:hover{border-color:#a0aec0}.embed-section:has(.remove-icon.phx-click-loading){opacity:var(--opacity-disabled);pointer-events:none}.drag-icon{background:none;border:none;color:#718096;cursor:grab;height:28px;padding:0;position:absolute;right:6px;top:6px;transition:color .2s;width:28px}.drag-icon:active{cursor:grabbing}.drag-icon:hover{color:#4a5568}.drag-icon svg{height:100%;width:100%}.dragging{opacity:.5;transform:scale(.95);transition:transform .2s,opacity .2s}.drop-zone{align-items:center;background:#ebf8ff;border:2px dashed #4299e1;border-radius:8px;color:#4299e1;display:none;font-size:14px;font-weight:500;height:60px;justify-content:center;margin:10px 0;opacity:var(--opacity-muted)}.content-card:has(.tabs){padding:0}.content-card:has(.tabs) .card-section{padding:24px}.tabs{border-bottom:1px solid #e5e7eb;display:flex;justify-content:right;padding:0}.tabs a{align-content:center;background:none;border:none;border-left:1px dashed var(--border-light);color:#9ca3af;cursor:pointer;flex:1;font-family:inherit;font-size:11px;font-weight:700;letter-spacing:.08em;max-width:200px;padding:4px 2px;text-align:center;text-decoration:none;text-transform:uppercase;transition:all .2s ease}.tabs a:hover{background-color:#f9fafb;color:#6b7280}.tabs a.active{background-color:#f9fafb;color:#1f2937;font-weight:700}#main-link.active{visibility:hidden}#main-link{border:none;border-right:2px solid #e5e7eb;margin-right:auto}#main-link:before{content:"←";font-size:16px;font-weight:400}.error-box{flex-direction:column;justify-content:center;padding:80px 40px;text-align:center}.error-box,.error-header{align-items:center;display:flex}.error-header{gap:12px;margin-bottom:12px}.error-icon{flex-shrink:0;height:32px;width:32px}.error-icon svg{height:100%;width:100%}.error-header h3{color:#1a1a1a;font-size:24px;font-weight:600}.error-message{color:#666;font-size:15px;line-height:1.6;max-width:500px}
\ No newline at end of file
diff --git a/dist/css/default_overrides.css b/dist/css/default_overrides.css
index bca456a2..e69de29b 100644
--- a/dist/css/default_overrides.css
+++ b/dist/css/default_overrides.css
@@ -1,97 +0,0 @@
-body {
- --tw-bg-opacity: 1;
- background-color: rgb(255 255 255 / var(--tw-bg-opacity))
-}
-
-.nav__list > .nav__item--group:first-of-type span {
- margin-top: 0.75rem;
- background-image: linear-gradient(to right, var(--tw-gradient-stops));
- --tw-gradient-from: #8b5cf6;
- --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgb(139 92 246 / 0));
- --tw-gradient-to: #581c87;
- -webkit-background-clip: text;
- background-clip: text;
- color: transparent
-}
-
-.resource__action--btn {
- --tw-bg-opacity: 1;
- background-color: rgb(124 58 237 / var(--tw-bg-opacity));
- --tw-border-opacity: 1;
- border-color: rgb(124 58 237 / var(--tw-border-opacity));
- --tw-text-opacity: 1;
- color: rgb(245 243 255 / var(--tw-text-opacity))
-}
-
-.resource__action--btn:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(76 29 149 / var(--tw-bg-opacity));
- --tw-border-opacity: 1;
- border-color: rgb(76 29 149 / var(--tw-border-opacity))
-}
-
-.resource__action--secondary {
- --tw-bg-opacity: 1;
- background-color: rgb(245 243 255 / var(--tw-bg-opacity));
- --tw-border-opacity: 1;
- border-color: rgb(245 243 255 / var(--tw-border-opacity));
- --tw-text-opacity: 1;
- color: rgb(76 29 149 / var(--tw-text-opacity))
-}
-
-.resource__action--secondary:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(196 181 253 / var(--tw-bg-opacity));
- --tw-border-opacity: 1;
- border-color: rgb(196 181 253 / var(--tw-border-opacity))
-}
-
-.resource__action--danger {
- --tw-bg-opacity: 1;
- background-color: rgb(244 63 94 / var(--tw-bg-opacity));
- --tw-border-opacity: 1;
- border-color: rgb(244 63 94 / var(--tw-border-opacity));
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity))
-}
-
-.resource__header {
- --tw-bg-opacity: 1;
- background-color: rgb(237 233 254 / var(--tw-bg-opacity))
-}
-
-.nav a:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(237 233 254 / var(--tw-bg-opacity))
-}
-
-.toast__container--error {
- --tw-border-opacity: 1;
- border-color: rgb(244 63 94 / var(--tw-border-opacity));
- --tw-text-opacity: 1;
- color: rgb(244 63 94 / var(--tw-text-opacity))
-}
-
-.toast__container--success {
- --tw-bg-opacity: 1;
- background-color: rgb(132 204 22 / var(--tw-bg-opacity));
- --tw-border-opacity: 1;
- border-color: rgb(132 204 22 / var(--tw-border-opacity))
-}
-
-.toast__container--info {
- --tw-bg-opacity: 1;
- background-color: rgb(196 181 253 / var(--tw-bg-opacity));
- --tw-border-opacity: 1;
- border-color: rgb(196 181 253 / var(--tw-border-opacity))
-}
-
-.job__container {
- --tw-text-opacity: 1;
- color: rgb(245 243 255 / var(--tw-text-opacity))
-}
-
-.job__bar {
- --tw-bg-opacity: 1;
- background-color: rgb(124 58 237 / var(--tw-bg-opacity))
-}
diff --git a/dist/js/app.js b/dist/js/app.js
index ec06f26a..4a40fb5e 100644
--- a/dist/js/app.js
+++ b/dist/js/app.js
@@ -607,278 +607,6 @@
}
});
- // node_modules/toastify-js/src/toastify.js
- var require_toastify = __commonJS({
- "node_modules/toastify-js/src/toastify.js"(exports, module) {
- (function(root, factory) {
- if (typeof module === "object" && module.exports) {
- module.exports = factory();
- } else {
- root.Toastify = factory();
- }
- })(exports, function(global2) {
- var Toastify2 = function(options) {
- return new Toastify2.lib.init(options);
- }, version = "1.11.2";
- Toastify2.defaults = {
- oldestFirst: true,
- text: "Toastify is awesome!",
- node: void 0,
- duration: 3e3,
- selector: void 0,
- callback: function() {
- },
- destination: void 0,
- newWindow: false,
- close: false,
- gravity: "toastify-top",
- positionLeft: false,
- position: "",
- backgroundColor: "",
- avatar: "",
- className: "",
- stopOnFocus: true,
- onClick: function() {
- },
- offset: { x: 0, y: 0 },
- escapeMarkup: true,
- style: { background: "" }
- };
- Toastify2.lib = Toastify2.prototype = {
- toastify: version,
- constructor: Toastify2,
- init: function(options) {
- if (!options) {
- options = {};
- }
- this.options = {};
- this.toastElement = null;
- this.options.text = options.text || Toastify2.defaults.text;
- this.options.node = options.node || Toastify2.defaults.node;
- this.options.duration = options.duration === 0 ? 0 : options.duration || Toastify2.defaults.duration;
- this.options.selector = options.selector || Toastify2.defaults.selector;
- this.options.callback = options.callback || Toastify2.defaults.callback;
- this.options.destination = options.destination || Toastify2.defaults.destination;
- this.options.newWindow = options.newWindow || Toastify2.defaults.newWindow;
- this.options.close = options.close || Toastify2.defaults.close;
- this.options.gravity = options.gravity === "bottom" ? "toastify-bottom" : Toastify2.defaults.gravity;
- this.options.positionLeft = options.positionLeft || Toastify2.defaults.positionLeft;
- this.options.position = options.position || Toastify2.defaults.position;
- this.options.backgroundColor = options.backgroundColor || Toastify2.defaults.backgroundColor;
- this.options.avatar = options.avatar || Toastify2.defaults.avatar;
- this.options.className = options.className || Toastify2.defaults.className;
- this.options.stopOnFocus = options.stopOnFocus === void 0 ? Toastify2.defaults.stopOnFocus : options.stopOnFocus;
- this.options.onClick = options.onClick || Toastify2.defaults.onClick;
- this.options.offset = options.offset || Toastify2.defaults.offset;
- this.options.escapeMarkup = options.escapeMarkup !== void 0 ? options.escapeMarkup : Toastify2.defaults.escapeMarkup;
- this.options.style = options.style || Toastify2.defaults.style;
- if (options.backgroundColor) {
- this.options.style.background = options.backgroundColor;
- }
- return this;
- },
- buildToast: function() {
- if (!this.options) {
- throw "Toastify is not initialized";
- }
- var divElement = document.createElement("div");
- divElement.className = "toastify on " + this.options.className;
- if (!!this.options.position) {
- divElement.className += " toastify-" + this.options.position;
- } else {
- if (this.options.positionLeft === true) {
- divElement.className += " toastify-left";
- console.warn("Property `positionLeft` will be depreciated in further versions. Please use `position` instead.");
- } else {
- divElement.className += " toastify-right";
- }
- }
- divElement.className += " " + this.options.gravity;
- if (this.options.backgroundColor) {
- console.warn('DEPRECATION NOTICE: "backgroundColor" is being deprecated. Please use the "style.background" property.');
- }
- for (var property in this.options.style) {
- divElement.style[property] = this.options.style[property];
- }
- if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) {
- divElement.appendChild(this.options.node);
- } else {
- if (this.options.escapeMarkup) {
- divElement.innerText = this.options.text;
- } else {
- divElement.innerHTML = this.options.text;
- }
- if (this.options.avatar !== "") {
- var avatarElement = document.createElement("img");
- avatarElement.src = this.options.avatar;
- avatarElement.className = "toastify-avatar";
- if (this.options.position == "left" || this.options.positionLeft === true) {
- divElement.appendChild(avatarElement);
- } else {
- divElement.insertAdjacentElement("afterbegin", avatarElement);
- }
- }
- }
- if (this.options.close === true) {
- var closeElement = document.createElement("span");
- closeElement.innerHTML = "✖";
- closeElement.className = "toast-close";
- closeElement.addEventListener("click", function(event) {
- event.stopPropagation();
- this.removeElement(this.toastElement);
- window.clearTimeout(this.toastElement.timeOutValue);
- }.bind(this));
- var width = window.innerWidth > 0 ? window.innerWidth : screen.width;
- if ((this.options.position == "left" || this.options.positionLeft === true) && width > 360) {
- divElement.insertAdjacentElement("afterbegin", closeElement);
- } else {
- divElement.appendChild(closeElement);
- }
- }
- if (this.options.stopOnFocus && this.options.duration > 0) {
- var self2 = this;
- divElement.addEventListener("mouseover", function(event) {
- window.clearTimeout(divElement.timeOutValue);
- });
- divElement.addEventListener("mouseleave", function() {
- divElement.timeOutValue = window.setTimeout(function() {
- self2.removeElement(divElement);
- }, self2.options.duration);
- });
- }
- if (typeof this.options.destination !== "undefined") {
- divElement.addEventListener("click", function(event) {
- event.stopPropagation();
- if (this.options.newWindow === true) {
- window.open(this.options.destination, "_blank");
- } else {
- window.location = this.options.destination;
- }
- }.bind(this));
- }
- if (typeof this.options.onClick === "function" && typeof this.options.destination === "undefined") {
- divElement.addEventListener("click", function(event) {
- event.stopPropagation();
- this.options.onClick();
- }.bind(this));
- }
- if (typeof this.options.offset === "object") {
- var x = getAxisOffsetAValue("x", this.options);
- var y = getAxisOffsetAValue("y", this.options);
- var xOffset = this.options.position == "left" ? x : "-" + x;
- var yOffset = this.options.gravity == "toastify-top" ? y : "-" + y;
- divElement.style.transform = "translate(" + xOffset + "," + yOffset + ")";
- }
- return divElement;
- },
- showToast: function() {
- this.toastElement = this.buildToast();
- var rootElement;
- if (typeof this.options.selector === "string") {
- rootElement = document.getElementById(this.options.selector);
- } else if (this.options.selector instanceof HTMLElement || typeof ShadowRoot !== "undefined" && this.options.selector instanceof ShadowRoot) {
- rootElement = this.options.selector;
- } else {
- rootElement = document.body;
- }
- if (!rootElement) {
- throw "Root element is not defined";
- }
- var elementToInsert = Toastify2.defaults.oldestFirst ? rootElement.firstChild : rootElement.lastChild;
- rootElement.insertBefore(this.toastElement, elementToInsert);
- Toastify2.reposition();
- if (this.options.duration > 0) {
- this.toastElement.timeOutValue = window.setTimeout(function() {
- this.removeElement(this.toastElement);
- }.bind(this), this.options.duration);
- }
- return this;
- },
- hideToast: function() {
- if (this.toastElement.timeOutValue) {
- clearTimeout(this.toastElement.timeOutValue);
- }
- this.removeElement(this.toastElement);
- },
- removeElement: function(toastElement) {
- toastElement.className = toastElement.className.replace(" on", "");
- window.setTimeout(function() {
- if (this.options.node && this.options.node.parentNode) {
- this.options.node.parentNode.removeChild(this.options.node);
- }
- if (toastElement.parentNode) {
- toastElement.parentNode.removeChild(toastElement);
- }
- this.options.callback.call(toastElement);
- Toastify2.reposition();
- }.bind(this), 400);
- }
- };
- Toastify2.reposition = function() {
- var topLeftOffsetSize = {
- top: 15,
- bottom: 15
- };
- var topRightOffsetSize = {
- top: 15,
- bottom: 15
- };
- var offsetSize = {
- top: 15,
- bottom: 15
- };
- var allToasts = document.getElementsByClassName("toastify");
- var classUsed;
- for (var i = 0; i < allToasts.length; i++) {
- if (containsClass(allToasts[i], "toastify-top") === true) {
- classUsed = "toastify-top";
- } else {
- classUsed = "toastify-bottom";
- }
- var height = allToasts[i].offsetHeight;
- classUsed = classUsed.substr(9, classUsed.length - 1);
- var offset = 15;
- var width = window.innerWidth > 0 ? window.innerWidth : screen.width;
- if (width <= 360) {
- allToasts[i].style[classUsed] = offsetSize[classUsed] + "px";
- offsetSize[classUsed] += height + offset;
- } else {
- if (containsClass(allToasts[i], "toastify-left") === true) {
- allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + "px";
- topLeftOffsetSize[classUsed] += height + offset;
- } else {
- allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + "px";
- topRightOffsetSize[classUsed] += height + offset;
- }
- }
- }
- return this;
- };
- function getAxisOffsetAValue(axis, options) {
- if (options.offset[axis]) {
- if (isNaN(options.offset[axis])) {
- return options.offset[axis];
- } else {
- return options.offset[axis] + "px";
- }
- }
- return "0px";
- }
- function containsClass(elem, yourClass) {
- if (!elem || typeof yourClass !== "string") {
- return false;
- } else if (elem.className && elem.className.trim().split(/\s+/gi).indexOf(yourClass) > -1) {
- return true;
- } else {
- return false;
- }
- }
- Toastify2.lib.init.prototype = Toastify2.lib;
- return Toastify2;
- });
- }
- });
-
// node_modules/topbar/topbar.min.js
var require_topbar_min = __commonJS({
"node_modules/topbar/topbar.min.js"(exports, module) {
@@ -8057,8 +7785,24 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}"
// js/app.js
var import_clipboard = __toESM(require_clipboard());
- var import_toastify_js = __toESM(require_toastify());
var import_topbar = __toESM(require_topbar_min());
+
+ // node_modules/phoenix-colocated/live_admin/LiveAdmin.Components.AlertBar/20_6fjnua5crhwniinis3b4qltd44.js
+ var fjnua5crhwniinis3b4qltd44_default = {
+ mounted() {
+ setTimeout(() => {
+ if (this.el.dataset["type"] !== "error") {
+ this.pushEvent("dismiss", { index: parseInt(this.el.dataset["index"]) });
+ }
+ }, 3e3);
+ }
+ };
+
+ // node_modules/phoenix-colocated/live_admin/index.js
+ var imp_nbxw623t = {};
+ imp_nbxw623t["LiveAdmin.Components.AlertBar.AlertItem"] = fjnua5crhwniinis3b4qltd44_default;
+
+ // js/app.js
import_topbar.default.config({
barColors: { 0: "rgb(67, 56, 202)" },
shadowColor: "rgba(0, 0, 0, .3)",
@@ -8066,160 +7810,139 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}"
});
window.addEventListener("phx:page-loading-start", (info) => import_topbar.default.show());
window.addEventListener("phx:page-loading-stop", () => import_topbar.default.hide());
- window.addEventListener("phx:success", (e) => {
- (0, import_toastify_js.default)({
- text: e.detail.msg,
- className: "toast__container--success"
- }).showToast();
- });
- window.addEventListener("phx:error", (e) => {
- (0, import_toastify_js.default)({
- text: e.detail.msg,
- className: "toast__container--error"
- }).showToast();
- });
var Hooks2 = {};
- Hooks2.EmbedComponent = {
+ Hooks2.ArrayInput = {
mounted() {
- this.el.addEventListener("live_admin:move_embed", (e) => {
- const embedEl = e.target.parentElement;
- const indexEl = embedEl.querySelector(".embed__index");
- const fieldEl = embedEl.parentElement;
- const newIndex = +indexEl.value + +e.target.dataset.dir;
- indexEl.value = newIndex;
- const targetEl = fieldEl.querySelectorAll(".embed__index")[newIndex];
- targetEl.value = +targetEl.value + +e.target.dataset.dir * -1;
- indexEl.dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
- });
- this.el.addEventListener("live_admin:embed_add", (e) => {
- const sortInput = e.target.previousElementSibling;
- sortInput.checked = true;
- sortInput.dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
- });
- this.el.addEventListener("live_admin:embed_drop", (e) => {
- e.target.parentElement.classList.add("hidden");
- const deleteInput = e.target.previousElementSibling;
- deleteInput.checked = true;
- deleteInput.dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
- });
- this.el.addEventListener("live_admin:embed_delete", (e) => {
- e.target.parentElement.classList.add("hidden");
- const deleteInput = e.target.closest(".embed__group").querySelector('input[value=""]');
- deleteInput.disabled = false;
- deleteInput.dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
+ this.el.querySelector("input").addEventListener("input", (e) => e.stopPropagation());
+ this.el.addEventListener("keydown", (e) => {
+ if (e.key === "Enter") {
+ e.target.blur();
+ e.preventDefault();
+ }
});
+ },
+ updated() {
+ this.el.querySelector("input").addEventListener("input", (e) => e.stopPropagation());
}
};
- Hooks2.SearchSelect = {
+ Hooks2.Show = {
+ setTab(el) {
+ const urlHash = window.location.hash || "#main";
+ for (tabLink of el.querySelectorAll(".tabs a")) {
+ const target = tabLink.getAttribute("href");
+ if (target === urlHash) {
+ tabLink.classList.add("active");
+ } else if (tabLink.getAttribute("href") !== "#main" && el.querySelector(target).querySelector(urlHash) || el.querySelector(target).parentNode === el.querySelector(urlHash).parentElement && !tabLink.parentNode.querySelector(`:scope > a[href="${urlHash}"]`)) {
+ tabLink.classList.add("active");
+ } else {
+ tabLink.classList.remove("active");
+ }
+ ;
+ }
+ ;
+ const currentTabContent = el.querySelector(urlHash);
+ for (const fieldSet of el.querySelectorAll(".card-section")) {
+ if (fieldSet.parentNode === currentTabContent) {
+ fieldSet.style.removeProperty("display");
+ } else {
+ fieldSet.style.setProperty("display", "none");
+ }
+ }
+ ;
+ for (const tabContent of currentTabContent.parentNode.querySelectorAll(".detail-view")) {
+ if (tabContent === currentTabContent) {
+ tabContent.style.removeProperty("display");
+ } else {
+ tabContent.style.setProperty("display", "none");
+ }
+ }
+ ;
+ },
mounted() {
- this.handleEvent("change", () => {
- this.el.querySelector("input").dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
- });
+ this.setTab(this.el);
+ window.addEventListener("hashchange", () => this.setTab(this.el));
}
};
- Hooks2.ArrayInput = {
+ Hooks2.Form = {
mounted() {
- this.handleEvent("change", () => {
- this.el.querySelector("input").dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
+ this.el.addEventListener("dragstart", (e) => {
+ e.target.classList.add("dragging");
+ for (const btn of this.el.querySelectorAll(".add-section-btn")) {
+ btn.style.setProperty("display", "none");
+ }
+ ;
+ for (const zone of this.el.querySelectorAll(`.drop-zone:not([data-idx="${e.target.dataset.idx}"]):not([data-idx="${+e.target.dataset.idx + 1}"])`)) {
+ zone.style.setProperty("display", "flex");
+ }
+ ;
+ e.dataTransfer.setData("text/plain", e.target.dataset.idx);
+ });
+ this.el.addEventListener("dragend", (e) => {
+ e.target.classList.remove("dragging");
+ for (const btn of this.el.querySelectorAll(".add-section-btn")) {
+ btn.style.removeProperty("display");
+ }
+ ;
+ for (const zone of this.el.querySelectorAll(".drop-zone")) {
+ zone.style.removeProperty("display");
+ }
+ ;
+ });
+ this.el.addEventListener("dragover", (e) => {
+ if (e.target.classList.contains("drop-zone")) {
+ e.target.style.setProperty("opacity", 1);
+ e.preventDefault();
+ }
+ });
+ this.el.addEventListener("dragleave", (e) => {
+ if (e.target.classList.contains("drop-zone")) {
+ e.target.style.removeProperty("opacity");
+ e.preventDefault();
+ }
+ });
+ this.el.addEventListener("drop", (e) => {
+ if (e.target.classList.contains("drop-zone")) {
+ e.preventDefault();
+ const embed = e.target.parentNode.querySelector(`.embed-section[data-idx="${e.dataTransfer.getData("text/plain")}"]`);
+ e.target.after(embed);
+ this.el.querySelector("input").dispatchEvent(new Event("change", { bubbles: true, cancelable: true }));
+ }
+ ;
});
}
};
- Hooks2.MapInput = {
+ Hooks2.SearchSelect = {
mounted() {
this.handleEvent("change", () => {
this.el.querySelector("input").dispatchEvent(new Event("input", { bubbles: true, cancelable: true }));
});
}
};
- Hooks2.ViewPage = {
+ Hooks2.CopyField = {
mounted() {
- this.el.addEventListener("live_admin:action", (e) => {
- if (e.target.tagName === "FORM") {
- const params = [...new FormData(e.target)].reduce((params2, [key, val]) => {
- if (key === "args[]") {
- return __spreadProps(__spreadValues({}, params2), { args: [...params2.args, val] });
- } else {
- return __spreadProps(__spreadValues({}, params2), { [key]: val });
- }
- }, { args: [] });
- e.target.reset();
- this.pushEventTo(this.el, "action", params);
- } else {
- this.pushEventTo(this.el, "action", { name: e.target.dataset.action });
- }
- });
+ new import_clipboard.default(this.el.querySelectorAll("[data-clipboard-target]"));
}
};
Hooks2.IndexPage = {
mounted() {
this.selected = [];
- this.el.addEventListener("live_admin:action", (e) => {
- if (e.target.tagName === "FORM") {
- const params = [...new FormData(e.target)].reduce((params2, [key, val]) => {
- if (key === "args[]") {
- return __spreadProps(__spreadValues({}, params2), { args: [...params2.args, val] });
- } else {
- return __spreadProps(__spreadValues({}, params2), { [key]: val });
- }
- }, { args: [] });
- this.pushEventTo(this.el, "action", __spreadProps(__spreadValues({}, params), { ids: this.selected }));
- } else {
- this.pushEventTo(this.el, "action", {
- name: e.target.dataset.action,
- ids: this.selected
- });
- }
- });
- this.el.addEventListener("live_admin:toggle_select", (e) => {
- if (e.target.id === "select-all") {
- this.el.querySelectorAll(".resource__select").forEach((box) => box.checked = e.target.checked);
- } else {
- this.el.querySelector("#select-all").checked = false;
- }
- this.selected = Array.from(this.el.querySelectorAll("input[data-record-key]:checked"), (e2) => e2.dataset.recordKey);
- if (this.selected.length > 0) {
- document.getElementById("footer-select").style.removeProperty("display");
- document.getElementById("footer-nav").style.display = "none";
- } else {
- document.getElementById("footer-nav").style.removeProperty("display");
- document.getElementById("footer-select").style.display = "none";
- }
- });
},
updated() {
this.selected = [];
- var clipboard = new import_clipboard.default(this.el.querySelectorAll(".cell__copy"), {
- target: function(trigger) {
- return trigger.closest(".resource__cell").firstElementChild;
- }
- });
- clipboard.on("success", function(e) {
- (0, import_toastify_js.default)({
- text: e.trigger.dataset.message,
- className: "toast__container"
- }).showToast();
- });
}
};
var csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content");
var liveSocket = new LiveSocket2("/live", Socket, {
- hooks: Hooks2,
+ hooks: __spreadValues(__spreadValues({}, Hooks2), imp_nbxw623t),
params: { _csrf_token: csrfToken }
});
liveSocket.connect();
if (ENV == "dev") {
liveSocket.enableDebug();
- liveSocket.enableLatencySim(200 + Math.floor(Math.random() * 1500));
+ liveSocket.enableLatencySim(0);
}
window.liveSocket = liveSocket;
})();
-/*!
- * Toastify js 1.11.2
- * https://github.com/apvarun/toastify-js
- * @license MIT licensed
- *
- * Copyright (C) 2018 Varun A P
- */
/*!
* clipboard.js v2.0.10
* https://clipboardjs.com/
@@ -8232,4 +7955,4 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}"
* http://buunguyen.github.io/topbar
* Copyright (c) 2021 Buu Nguyen
*/
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQvZGlzdC9jbGlwYm9hcmQuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b2FzdGlmeS1qcy9zcmMvdG9hc3RpZnkuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b3BiYXIvdG9wYmFyLm1pbi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfaHRtbC9wcml2L3N0YXRpYy9waG9lbml4X2h0bWwuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYXJpYS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9lbGVtZW50X3JlZi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcG9zdF9tb3JwaF9yZXN0b3Jlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L25vZGVfbW9kdWxlcy9tb3JwaGRvbS9kaXN0L21vcnBoZG9tLWVzbS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcGF0Y2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvcmVuZGVyZWQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanNfY29tbWFuZHMudHMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlld19ob29rLnRzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3ZpZXcuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvbGl2ZV9zb2NrZXQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaW5kZXgudHMiLCAiLi4vLi4vYXNzZXRzL2pzL2FwcC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBjbGlwYm9hcmQuanMgdjIuMC4xMFxuICogaHR0cHM6Ly9jbGlwYm9hcmRqcy5jb20vXG4gKlxuICogTGljZW5zZWQgTUlUIFx1MDBBOSBaZW5vIFJvY2hhXG4gKi9cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkNsaXBib2FyZEpTXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkNsaXBib2FyZEpTXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjg2OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBFWFBPUlRTXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuICBcImRlZmF1bHRcIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGNsaXBib2FyZDsgfVxufSk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdGlueS1lbWl0dGVyL2luZGV4LmpzXG52YXIgdGlueV9lbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNzkpO1xudmFyIHRpbnlfZW1pdHRlcl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih0aW55X2VtaXR0ZXIpO1xuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9nb29kLWxpc3RlbmVyL3NyYy9saXN0ZW4uanNcbnZhciBsaXN0ZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MCk7XG52YXIgbGlzdGVuX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGxpc3Rlbik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3NlbGVjdC9zcmMvc2VsZWN0LmpzXG52YXIgc3JjX3NlbGVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODE3KTtcbnZhciBzZWxlY3RfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc3JjX3NlbGVjdCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NvbW1hbmQuanNcbi8qKlxuICogRXhlY3V0ZXMgYSBnaXZlbiBvcGVyYXRpb24gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBjb21tYW5kKHR5cGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQodHlwZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvY3V0LmpzXG5cblxuLyoqXG4gKiBDdXQgYWN0aW9uIHdyYXBwZXIuXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkN1dCA9IGZ1bmN0aW9uIENsaXBib2FyZEFjdGlvbkN1dCh0YXJnZXQpIHtcbiAgdmFyIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkodGFyZ2V0KTtcbiAgY29tbWFuZCgnY3V0Jyk7XG4gIHJldHVybiBzZWxlY3RlZFRleHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2N1dCA9IChDbGlwYm9hcmRBY3Rpb25DdXQpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9jcmVhdGUtZmFrZS1lbGVtZW50LmpzXG4vKipcbiAqIENyZWF0ZXMgYSBmYWtlIHRleHRhcmVhIGVsZW1lbnQgd2l0aCBhIHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFrZUVsZW1lbnQodmFsdWUpIHtcbiAgdmFyIGlzUlRMID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlyJykgPT09ICdydGwnO1xuICB2YXIgZmFrZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOyAvLyBQcmV2ZW50IHpvb21pbmcgb24gaU9TXG5cbiAgZmFrZUVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7IC8vIFJlc2V0IGJveCBtb2RlbFxuXG4gIGZha2VFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcwJztcbiAgZmFrZUVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcbiAgZmFrZUVsZW1lbnQuc3R5bGUubWFyZ2luID0gJzAnOyAvLyBNb3ZlIGVsZW1lbnQgb3V0IG9mIHNjcmVlbiBob3Jpem9udGFsbHlcblxuICBmYWtlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIGZha2VFbGVtZW50LnN0eWxlW2lzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnLTk5OTlweCc7IC8vIE1vdmUgZWxlbWVudCB0byB0aGUgc2FtZSBwb3NpdGlvbiB2ZXJ0aWNhbGx5XG5cbiAgdmFyIHlQb3NpdGlvbiA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICBmYWtlRWxlbWVudC5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdCh5UG9zaXRpb24sIFwicHhcIik7XG4gIGZha2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7XG4gIGZha2VFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gIHJldHVybiBmYWtlRWxlbWVudDtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9hY3Rpb25zL2NvcHkuanNcblxuXG5cbi8qKlxuICogQ29weSBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkNvcHkgPSBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb25Db3B5KHRhcmdldCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keVxuICB9O1xuICB2YXIgc2VsZWN0ZWRUZXh0ID0gJyc7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGZha2VFbGVtZW50ID0gY3JlYXRlRmFrZUVsZW1lbnQodGFyZ2V0KTtcbiAgICBvcHRpb25zLmNvbnRhaW5lci5hcHBlbmRDaGlsZChmYWtlRWxlbWVudCk7XG4gICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKShmYWtlRWxlbWVudCk7XG4gICAgY29tbWFuZCgnY29weScpO1xuICAgIGZha2VFbGVtZW50LnJlbW92ZSgpO1xuICB9IGVsc2Uge1xuICAgIHNlbGVjdGVkVGV4dCA9IHNlbGVjdF9kZWZhdWx0KCkodGFyZ2V0KTtcbiAgICBjb21tYW5kKCdjb3B5Jyk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWN0aW9uc19jb3B5ID0gKENsaXBib2FyZEFjdGlvbkNvcHkpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvZGVmYXVsdC5qc1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuLyoqXG4gKiBJbm5lciBmdW5jdGlvbiB3aGljaCBwZXJmb3JtcyBzZWxlY3Rpb24gZnJvbSBlaXRoZXIgYHRleHRgIG9yIGB0YXJnZXRgXG4gKiBwcm9wZXJ0aWVzIGFuZCB0aGVuIGV4ZWN1dGVzIGNvcHkgb3IgY3V0IG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5cbnZhciBDbGlwYm9hcmRBY3Rpb25EZWZhdWx0ID0gZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uRGVmYXVsdCgpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAvLyBEZWZpbmVzIGJhc2UgcHJvcGVydGllcyBwYXNzZWQgZnJvbSBjb25zdHJ1Y3Rvci5cbiAgdmFyIF9vcHRpb25zJGFjdGlvbiA9IG9wdGlvbnMuYWN0aW9uLFxuICAgICAgYWN0aW9uID0gX29wdGlvbnMkYWN0aW9uID09PSB2b2lkIDAgPyAnY29weScgOiBfb3B0aW9ucyRhY3Rpb24sXG4gICAgICBjb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcixcbiAgICAgIHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgdGV4dCA9IG9wdGlvbnMudGV4dDsgLy8gU2V0cyB0aGUgYGFjdGlvbmAgdG8gYmUgcGVyZm9ybWVkIHdoaWNoIGNhbiBiZSBlaXRoZXIgJ2NvcHknIG9yICdjdXQnLlxuXG4gIGlmIChhY3Rpb24gIT09ICdjb3B5JyAmJiBhY3Rpb24gIT09ICdjdXQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwiYWN0aW9uXCIgdmFsdWUsIHVzZSBlaXRoZXIgXCJjb3B5XCIgb3IgXCJjdXRcIicpO1xuICB9IC8vIFNldHMgdGhlIGB0YXJnZXRgIHByb3BlcnR5IHVzaW5nIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGhhdmUgaXRzIGNvbnRlbnQgY29waWVkLlxuXG5cbiAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRhcmdldCAmJiBfdHlwZW9mKHRhcmdldCkgPT09ICdvYmplY3QnICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NvcHknICYmIHRhcmdldC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBQbGVhc2UgdXNlIFwicmVhZG9ubHlcIiBpbnN0ZWFkIG9mIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvbiA9PT0gJ2N1dCcgJiYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykgfHwgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgYXR0cmlidXRlLiBZb3UgY2FuXFwndCBjdXQgdGV4dCBmcm9tIGVsZW1lbnRzIHdpdGggXCJyZWFkb25seVwiIG9yIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGVzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBcInRhcmdldFwiIHZhbHVlLCB1c2UgYSB2YWxpZCBFbGVtZW50Jyk7XG4gICAgfVxuICB9IC8vIERlZmluZSBzZWxlY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24gYHRleHRgIHByb3BlcnR5LlxuXG5cbiAgaWYgKHRleHQpIHtcbiAgICByZXR1cm4gYWN0aW9uc19jb3B5KHRleHQsIHtcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyXG4gICAgfSk7XG4gIH0gLy8gRGVmaW5lcyB3aGljaCBzZWxlY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24gYHRhcmdldGAgcHJvcGVydHkuXG5cblxuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGFjdGlvbiA9PT0gJ2N1dCcgPyBhY3Rpb25zX2N1dCh0YXJnZXQpIDogYWN0aW9uc19jb3B5KHRhcmdldCwge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9KTtcbiAgfVxufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgYWN0aW9uc19kZWZhdWx0ID0gKENsaXBib2FyZEFjdGlvbkRlZmF1bHQpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NsaXBib2FyZC5qc1xuZnVuY3Rpb24gY2xpcGJvYXJkX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgY2xpcGJvYXJkX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBjbGlwYm9hcmRfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIGNsaXBib2FyZF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKGNsaXBib2FyZF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5cblxuXG5cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmV0cmlldmUgYXR0cmlidXRlIHZhbHVlLlxuICogQHBhcmFtIHtTdHJpbmd9IHN1ZmZpeFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoc3VmZml4LCBlbGVtZW50KSB7XG4gIHZhciBhdHRyaWJ1dGUgPSBcImRhdGEtY2xpcGJvYXJkLVwiLmNvbmNhdChzdWZmaXgpO1xuXG4gIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIHdoaWNoIHRha2VzIG9uZSBvciBtb3JlIGVsZW1lbnRzLCBhZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGVtLFxuICogYW5kIGluc3RhbnRpYXRlcyBhIG5ldyBgQ2xpcGJvYXJkQWN0aW9uYCBvbiBlYWNoIGNsaWNrLlxuICovXG5cblxudmFyIENsaXBib2FyZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0VtaXR0ZXIpIHtcbiAgX2luaGVyaXRzKENsaXBib2FyZCwgX0VtaXR0ZXIpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ2xpcGJvYXJkKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIENsaXBib2FyZCh0cmlnZ2VyLCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBib2FyZCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuXG4gICAgX3RoaXMucmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBfdGhpcy5saXN0ZW5DbGljayh0cmlnZ2VyKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogRGVmaW5lcyBpZiBhdHRyaWJ1dGVzIHdvdWxkIGJlIHJlc29sdmVkIHVzaW5nIGludGVybmFsIHNldHRlciBmdW5jdGlvbnNcbiAgICogb3IgY3VzdG9tIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoQ2xpcGJvYXJkLCBbe1xuICAgIGtleTogXCJyZXNvbHZlT3B0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHRoaXMuYWN0aW9uID0gdHlwZW9mIG9wdGlvbnMuYWN0aW9uID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5hY3Rpb24gOiB0aGlzLmRlZmF1bHRBY3Rpb247XG4gICAgICB0aGlzLnRhcmdldCA9IHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGFyZ2V0IDogdGhpcy5kZWZhdWx0VGFyZ2V0O1xuICAgICAgdGhpcy50ZXh0ID0gdHlwZW9mIG9wdGlvbnMudGV4dCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGV4dCA6IHRoaXMuZGVmYXVsdFRleHQ7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNsaXBib2FyZF90eXBlb2Yob3B0aW9ucy5jb250YWluZXIpID09PSAnb2JqZWN0JyA/IG9wdGlvbnMuY29udGFpbmVyIDogZG9jdW1lbnQuYm9keTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNsaWNrIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBwYXNzZWQgdHJpZ2dlci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdGVuQ2xpY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuQ2xpY2sodHJpZ2dlcikge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5fZGVmYXVsdCgpKHRyaWdnZXIsICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIub25DbGljayhlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgbmV3IGBDbGlwYm9hcmRBY3Rpb25gIG9uIGVhY2ggY2xpY2sgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib25DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gZS5kZWxlZ2F0ZVRhcmdldCB8fCBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICB2YXIgYWN0aW9uID0gdGhpcy5hY3Rpb24odHJpZ2dlcikgfHwgJ2NvcHknO1xuICAgICAgdmFyIHRleHQgPSBhY3Rpb25zX2RlZmF1bHQoe1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCh0cmlnZ2VyKSxcbiAgICAgICAgdGV4dDogdGhpcy50ZXh0KHRyaWdnZXIpXG4gICAgICB9KTsgLy8gRmlyZXMgYW4gZXZlbnQgYmFzZWQgb24gdGhlIGNvcHkgb3BlcmF0aW9uIHJlc3VsdC5cblxuICAgICAgdGhpcy5lbWl0KHRleHQgPyAnc3VjY2VzcycgOiAnZXJyb3InLCB7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgICBjbGVhclNlbGVjdGlvbjogZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXIuZm9jdXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGBhY3Rpb25gIGxvb2t1cCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRyaWdnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRBY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdEFjdGlvbih0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ2FjdGlvbicsIHRyaWdnZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGB0YXJnZXRgIGxvb2t1cCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRyaWdnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUYXJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmYXVsdFRhcmdldCh0cmlnZ2VyKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgndGFyZ2V0JywgdHJpZ2dlcik7XG5cbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93IGZpcmUgcHJvZ3JhbW1hdGljYWxseSBhIGNvcHkgYWN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IHRhcmdldFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMgVGV4dCBjb3BpZWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0VGV4dFwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBgdGV4dGAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGV4dCh0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ3RleHQnLCB0cmlnZ2VyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzdHJveSBsaWZlY3ljbGUuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmxpc3RlbmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkodGFyZ2V0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgICBjb250YWluZXI6IGRvY3VtZW50LmJvZHlcbiAgICAgIH07XG4gICAgICByZXR1cm4gYWN0aW9uc19jb3B5KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93IGZpcmUgcHJvZ3JhbW1hdGljYWxseSBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHJldHVybnMgVGV4dCBjdXR0ZWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3V0KHRhcmdldCkge1xuICAgICAgcmV0dXJuIGFjdGlvbnNfY3V0KHRhcmdldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnQgb2YgdGhlIGdpdmVuIGFjdGlvbiwgb3IgYWxsIGFjdGlvbnMgaWYgbm8gYWN0aW9uIGlzXG4gICAgICogZ2l2ZW4uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFthY3Rpb25dXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc1N1cHBvcnRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1N1cHBvcnRlZCgpIHtcbiAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFsnY29weScsICdjdXQnXTtcbiAgICAgIHZhciBhY3Rpb25zID0gdHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycgPyBbYWN0aW9uXSA6IGFjdGlvbjtcbiAgICAgIHZhciBzdXBwb3J0ID0gISFkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQ7XG4gICAgICBhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBzdXBwb3J0ID0gc3VwcG9ydCAmJiAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChhY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3VwcG9ydDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2xpcGJvYXJkO1xufSgodGlueV9lbWl0dGVyX2RlZmF1bHQoKSkpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDgyODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxudmFyIERPQ1VNRU5UX05PREVfVFlQRSA9IDk7XG5cbi8qKlxuICogQSBwb2x5ZmlsbCBmb3IgRWxlbWVudC5tYXRjaGVzKClcbiAqL1xuaWYgKHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuICAgIHZhciBwcm90byA9IEVsZW1lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8ubWF0Y2hlcyA9IHByb3RvLm1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgbWF0Y2hlcyBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY2xvc2VzdCAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSBET0NVTUVOVF9OT0RFX1RZUEUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9zZXN0O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA0Mzg6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGNsb3Nlc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyOCk7XG5cbi8qKlxuICogRGVsZWdhdGVzIGV2ZW50IHRvIGEgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtCb29sZWFufSB1c2VDYXB0dXJlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIF9kZWxlZ2F0ZShlbGVtZW50LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgbGlzdGVuZXJGbiA9IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfEFycmF5fSBbZWxlbWVudHNdXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtCb29sZWFufSB1c2VDYXB0dXJlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlbGVnYXRlKGVsZW1lbnRzLCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpIHtcbiAgICAvLyBIYW5kbGUgdGhlIHJlZ3VsYXIgRWxlbWVudCB1c2FnZVxuICAgIGlmICh0eXBlb2YgZWxlbWVudHMuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEVsZW1lbnQtbGVzcyB1c2FnZSwgaXQgZGVmYXVsdHMgdG8gZ2xvYmFsIGRlbGVnYXRpb25cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVXNlIGBkb2N1bWVudGAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciwgdGhlbiBhcHBseSBhcmd1bWVudHNcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNob3J0IHdheSB0byAudW5zaGlmdCBgYXJndW1lbnRzYCB3aXRob3V0IHJ1bm5pbmcgaW50byBkZW9wdGltaXphdGlvbnNcbiAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5iaW5kKG51bGwsIGRvY3VtZW50KS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBTZWxlY3Rvci1iYXNlZCB1c2FnZVxuICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbGVtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEFycmF5LWxpa2UgYmFzZWQgdXNhZ2VcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGVsZW1lbnRzLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlKGVsZW1lbnQsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgY2xvc2VzdCBtYXRjaCBhbmQgaW52b2tlcyBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuZXIoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5kZWxlZ2F0ZVRhcmdldCA9IGNsb3Nlc3QoZS50YXJnZXQsIHNlbGVjdG9yKTtcblxuICAgICAgICBpZiAoZS5kZWxlZ2F0ZVRhcmdldCkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChlbGVtZW50LCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWxlZ2F0ZTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODc5OlxuLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBIVE1MIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgJiYgdmFsdWUubm9kZVR5cGUgPT09IDE7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgbGlzdCBvZiBIVE1MIGVsZW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5ub2RlTGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgKHR5cGUgPT09ICdbb2JqZWN0IE5vZGVMaXN0XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJylcbiAgICAgICAgJiYgKCdsZW5ndGgnIGluIHZhbHVlKVxuICAgICAgICAmJiAodmFsdWUubGVuZ3RoID09PSAwIHx8IGV4cG9ydHMubm9kZSh2YWx1ZVswXSkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuc3RyaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuZm4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblxuICAgIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMzcwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpcyA9IF9fd2VicGFja19yZXF1aXJlX18oODc5KTtcbnZhciBkZWxlZ2F0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDM4KTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYWxsIHBhcmFtcyBhbmQgY2FsbHMgdGhlIHJpZ2h0XG4gKiBsaXN0ZW5lciBmdW5jdGlvbiBiYXNlZCBvbiBpdHMgdGFyZ2V0IHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0YXJnZXQgJiYgIXR5cGUgJiYgIWNhbGxiYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIFN0cmluZycpO1xuICAgIH1cblxuICAgIGlmICghaXMuZm4oY2FsbGJhY2spKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSBGdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChpcy5ub2RlKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rlbk5vZGUodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLm5vZGVMaXN0KHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rlbk5vZGVMaXN0KHRhcmdldCwgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIGlmIChpcy5zdHJpbmcodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuU2VsZWN0b3IodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nLCBIVE1MRWxlbWVudCwgSFRNTENvbGxlY3Rpb24sIG9yIE5vZGVMaXN0Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBIVE1MIGVsZW1lbnRcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5Ob2RlKG5vZGUsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBsaXN0IG9mIEhUTUwgZWxlbWVudHNcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Tm9kZUxpc3R8SFRNTENvbGxlY3Rpb259IG5vZGVMaXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuTm9kZUxpc3Qobm9kZUxpc3QsIHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChub2RlTGlzdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIHNlbGVjdG9yXG4gKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5TZWxlY3RvcihzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZGVsZWdhdGUoZG9jdW1lbnQuYm9keSwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0ZW47XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDgxNzpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxuZnVuY3Rpb24gc2VsZWN0KGVsZW1lbnQpIHtcbiAgICB2YXIgc2VsZWN0ZWRUZXh0O1xuXG4gICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQubm9kZU5hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgdmFyIGlzUmVhZE9ubHkgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKTtcblxuICAgICAgICBpZiAoIWlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgZWxlbWVudC52YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSkge1xuICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgICAgICBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRUZXh0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbGVjdDtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMjc5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBFICgpIHtcbiAgLy8gS2VlcCB0aGlzIGVtcHR5IHNvIGl0J3MgZWFzaWVyIHRvIGluaGVyaXQgZnJvbVxuICAvLyAodmlhIGh0dHBzOi8vZ2l0aHViLmNvbS9saXBzbWFjayBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGNvcmdhbi90aW55LWVtaXR0ZXIvaXNzdWVzLzMpXG59XG5cbkUucHJvdG90eXBlID0ge1xuICBvbjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgZSA9IHRoaXMuZSB8fCAodGhpcy5lID0ge30pO1xuXG4gICAgKGVbbmFtZV0gfHwgKGVbbmFtZV0gPSBbXSkpLnB1c2goe1xuICAgICAgZm46IGNhbGxiYWNrLFxuICAgICAgY3R4OiBjdHhcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9uY2U6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY3R4KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIGxpc3RlbmVyICgpIHtcbiAgICAgIHNlbGYub2ZmKG5hbWUsIGxpc3RlbmVyKTtcbiAgICAgIGNhbGxiYWNrLmFwcGx5KGN0eCwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIuXyA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHRoaXMub24obmFtZSwgbGlzdGVuZXIsIGN0eCk7XG4gIH0sXG5cbiAgZW1pdDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgZGF0YSA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgZXZ0QXJyID0gKCh0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KSlbbmFtZV0gfHwgW10pLnNsaWNlKCk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBsZW4gPSBldnRBcnIubGVuZ3RoO1xuXG4gICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGV2dEFycltpXS5mbi5hcHBseShldnRBcnJbaV0uY3R4LCBkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBvZmY6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG4gICAgdmFyIGV2dHMgPSBlW25hbWVdO1xuICAgIHZhciBsaXZlRXZlbnRzID0gW107XG5cbiAgICBpZiAoZXZ0cyAmJiBjYWxsYmFjaykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGV2dHNbaV0uZm4gIT09IGNhbGxiYWNrICYmIGV2dHNbaV0uZm4uXyAhPT0gY2FsbGJhY2spXG4gICAgICAgICAgbGl2ZUV2ZW50cy5wdXNoKGV2dHNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBldmVudCBmcm9tIHF1ZXVlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtcbiAgICAvLyBTdWdnZXN0ZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2xhemRcbiAgICAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dGNvcmdhbi90aW55LWVtaXR0ZXIvY29tbWl0L2M2ZWJmYWE5YmM5NzNiMzNkMTEwYTg0YTMwNzc0MmI3Y2Y5NGM5NTMjY29tbWl0Y29tbWVudC01MDI0OTEwXG5cbiAgICAobGl2ZUV2ZW50cy5sZW5ndGgpXG4gICAgICA/IGVbbmFtZV0gPSBsaXZlRXZlbnRzXG4gICAgICA6IGRlbGV0ZSBlW25hbWVdO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRTtcbm1vZHVsZS5leHBvcnRzLlRpbnlFbWl0dGVyID0gRTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0ICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBtb2R1bGUgZXhwb3J0cyBtdXN0IGJlIHJldHVybmVkIGZyb20gcnVudGltZSBzbyBlbnRyeSBpbmxpbmluZyBpcyBkaXNhYmxlZFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2ODYpO1xuLyoqKioqKi8gfSkoKVxuLmRlZmF1bHQ7XG59KTsiLCAiLyohXG4gKiBUb2FzdGlmeSBqcyAxLjExLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHZhcnVuL3RvYXN0aWZ5LWpzXG4gKiBAbGljZW5zZSBNSVQgbGljZW5zZWRcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggVmFydW4gQSBQXG4gKi9cbihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5Ub2FzdGlmeSA9IGZhY3RvcnkoKTtcbiAgfVxufSkodGhpcywgZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIC8vIE9iamVjdCBpbml0aWFsaXphdGlvblxuICB2YXIgVG9hc3RpZnkgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAvLyBSZXR1cm5pbmcgYSBuZXcgaW5pdCBvYmplY3RcbiAgICAgIHJldHVybiBuZXcgVG9hc3RpZnkubGliLmluaXQob3B0aW9ucyk7XG4gICAgfSxcbiAgICAvLyBMaWJyYXJ5IHZlcnNpb25cbiAgICB2ZXJzaW9uID0gXCIxLjExLjJcIjtcblxuICAvLyBTZXQgdGhlIGRlZmF1bHQgZ2xvYmFsIG9wdGlvbnNcbiAgVG9hc3RpZnkuZGVmYXVsdHMgPSB7XG4gICAgb2xkZXN0Rmlyc3Q6IHRydWUsXG4gICAgdGV4dDogXCJUb2FzdGlmeSBpcyBhd2Vzb21lIVwiLFxuICAgIG5vZGU6IHVuZGVmaW5lZCxcbiAgICBkdXJhdGlvbjogMzAwMCxcbiAgICBzZWxlY3RvcjogdW5kZWZpbmVkLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbjogdW5kZWZpbmVkLFxuICAgIG5ld1dpbmRvdzogZmFsc2UsXG4gICAgY2xvc2U6IGZhbHNlLFxuICAgIGdyYXZpdHk6IFwidG9hc3RpZnktdG9wXCIsXG4gICAgcG9zaXRpb25MZWZ0OiBmYWxzZSxcbiAgICBwb3NpdGlvbjogJycsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnJyxcbiAgICBhdmF0YXI6IFwiXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLFxuICAgIHN0b3BPbkZvY3VzOiB0cnVlLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuICAgIG9mZnNldDoge3g6IDAsIHk6IDB9LFxuICAgIGVzY2FwZU1hcmt1cDogdHJ1ZSxcbiAgICBzdHlsZToge2JhY2tncm91bmQ6ICcnfVxuICB9O1xuXG4gIC8vIERlZmluaW5nIHRoZSBwcm90b3R5cGUgb2YgdGhlIG9iamVjdFxuICBUb2FzdGlmeS5saWIgPSBUb2FzdGlmeS5wcm90b3R5cGUgPSB7XG4gICAgdG9hc3RpZnk6IHZlcnNpb24sXG5cbiAgICBjb25zdHJ1Y3RvcjogVG9hc3RpZnksXG5cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIG9iamVjdCB3aXRoIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBpbml0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAvLyBWZXJpZnlpbmcgYW5kIHZhbGlkYXRpbmcgdGhlIGlucHV0IG9iamVjdFxuICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRpbmcgdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcblxuICAgICAgdGhpcy50b2FzdEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAvLyBWYWxpZGF0aW5nIHRoZSBvcHRpb25zXG4gICAgICB0aGlzLm9wdGlvbnMudGV4dCA9IG9wdGlvbnMudGV4dCB8fCBUb2FzdGlmeS5kZWZhdWx0cy50ZXh0OyAvLyBEaXNwbGF5IG1lc3NhZ2VcbiAgICAgIHRoaXMub3B0aW9ucy5ub2RlID0gb3B0aW9ucy5ub2RlIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLm5vZGU7ICAvLyBEaXNwbGF5IGNvbnRlbnQgYXMgbm9kZVxuICAgICAgdGhpcy5vcHRpb25zLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiA9PT0gMCA/IDAgOiBvcHRpb25zLmR1cmF0aW9uIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmR1cmF0aW9uOyAvLyBEaXNwbGF5IGR1cmF0aW9uXG4gICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPSBvcHRpb25zLnNlbGVjdG9yIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLnNlbGVjdG9yOyAvLyBQYXJlbnQgc2VsZWN0b3JcbiAgICAgIHRoaXMub3B0aW9ucy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2FsbGJhY2s7IC8vIENhbGxiYWNrIGFmdGVyIGRpc3BsYXlcbiAgICAgIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9IG9wdGlvbnMuZGVzdGluYXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMuZGVzdGluYXRpb247IC8vIE9uLWNsaWNrIGRlc3RpbmF0aW9uXG4gICAgICB0aGlzLm9wdGlvbnMubmV3V2luZG93ID0gb3B0aW9ucy5uZXdXaW5kb3cgfHwgVG9hc3RpZnkuZGVmYXVsdHMubmV3V2luZG93OyAvLyBPcGVuIGRlc3RpbmF0aW9uIGluIG5ldyB3aW5kb3dcbiAgICAgIHRoaXMub3B0aW9ucy5jbG9zZSA9IG9wdGlvbnMuY2xvc2UgfHwgVG9hc3RpZnkuZGVmYXVsdHMuY2xvc2U7IC8vIFNob3cgdG9hc3QgY2xvc2UgaWNvblxuICAgICAgdGhpcy5vcHRpb25zLmdyYXZpdHkgPSBvcHRpb25zLmdyYXZpdHkgPT09IFwiYm90dG9tXCIgPyBcInRvYXN0aWZ5LWJvdHRvbVwiIDogVG9hc3RpZnkuZGVmYXVsdHMuZ3Jhdml0eTsgLy8gdG9hc3QgcG9zaXRpb24gLSB0b3Agb3IgYm90dG9tXG4gICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25MZWZ0ID0gb3B0aW9ucy5wb3NpdGlvbkxlZnQgfHwgVG9hc3RpZnkuZGVmYXVsdHMucG9zaXRpb25MZWZ0OyAvLyB0b2FzdCBwb3NpdGlvbiAtIGxlZnQgb3IgcmlnaHRcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24gfHwgVG9hc3RpZnkuZGVmYXVsdHMucG9zaXRpb247IC8vIHRvYXN0IHBvc2l0aW9uIC0gbGVmdCBvciByaWdodFxuICAgICAgdGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmJhY2tncm91bmRDb2xvcjsgLy8gdG9hc3QgYmFja2dyb3VuZCBjb2xvclxuICAgICAgdGhpcy5vcHRpb25zLmF2YXRhciA9IG9wdGlvbnMuYXZhdGFyIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmF2YXRhcjsgLy8gaW1nIGVsZW1lbnQgc3JjIC0gdXJsIG9yIGEgcGF0aFxuICAgICAgdGhpcy5vcHRpb25zLmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3NOYW1lIHx8IFRvYXN0aWZ5LmRlZmF1bHRzLmNsYXNzTmFtZTsgLy8gYWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3IgdGhlIHRvYXN0XG4gICAgICB0aGlzLm9wdGlvbnMuc3RvcE9uRm9jdXMgPSBvcHRpb25zLnN0b3BPbkZvY3VzID09PSB1bmRlZmluZWQgPyBUb2FzdGlmeS5kZWZhdWx0cy5zdG9wT25Gb2N1cyA6IG9wdGlvbnMuc3RvcE9uRm9jdXM7IC8vIHN0b3AgdGltZW91dCBvbiBmb2N1c1xuICAgICAgdGhpcy5vcHRpb25zLm9uQ2xpY2sgPSBvcHRpb25zLm9uQ2xpY2sgfHwgVG9hc3RpZnkuZGVmYXVsdHMub25DbGljazsgLy8gQ2FsbGJhY2sgYWZ0ZXIgY2xpY2tcbiAgICAgIHRoaXMub3B0aW9ucy5vZmZzZXQgPSBvcHRpb25zLm9mZnNldCB8fCBUb2FzdGlmeS5kZWZhdWx0cy5vZmZzZXQ7IC8vIHRvYXN0IG9mZnNldFxuICAgICAgdGhpcy5vcHRpb25zLmVzY2FwZU1hcmt1cCA9IG9wdGlvbnMuZXNjYXBlTWFya3VwICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmVzY2FwZU1hcmt1cCA6IFRvYXN0aWZ5LmRlZmF1bHRzLmVzY2FwZU1hcmt1cDtcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUgfHwgVG9hc3RpZnkuZGVmYXVsdHMuc3R5bGU7XG4gICAgICBpZihvcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3R5bGUuYmFja2dyb3VuZCA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm5pbmcgdGhlIGN1cnJlbnQgb2JqZWN0IGZvciBjaGFpbmluZyBmdW5jdGlvbnNcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZGluZyB0aGUgRE9NIGVsZW1lbnRcbiAgICBidWlsZFRvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFZhbGlkYXRpbmcgaWYgdGhlIG9wdGlvbnMgYXJlIGRlZmluZWRcbiAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRocm93IFwiVG9hc3RpZnkgaXMgbm90IGluaXRpYWxpemVkXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0XG4gICAgICB2YXIgZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSA9IFwidG9hc3RpZnkgb24gXCIgKyB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gICAgICAvLyBQb3NpdGlvbmluZyB0b2FzdCB0byBsZWZ0IG9yIHJpZ2h0IG9yIGNlbnRlclxuICAgICAgaWYgKCEhdGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LVwiICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG8gYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9uc1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGRpdkVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIHRvYXN0aWZ5LWxlZnRcIjtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Byb3BlcnR5IGBwb3NpdGlvbkxlZnRgIHdpbGwgYmUgZGVwcmVjaWF0ZWQgaW4gZnVydGhlciB2ZXJzaW9ucy4gUGxlYXNlIHVzZSBgcG9zaXRpb25gIGluc3RlYWQuJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uXG4gICAgICAgICAgZGl2RWxlbWVudC5jbGFzc05hbWUgKz0gXCIgdG9hc3RpZnktcmlnaHRcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ25pbmcgZ3Jhdml0eSBvZiBlbGVtZW50XG4gICAgICBkaXZFbGVtZW50LmNsYXNzTmFtZSArPSBcIiBcIiArIHRoaXMub3B0aW9ucy5ncmF2aXR5O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAvLyBUaGlzIGlzIGJlaW5nIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIHN0eWxlIEhUTUwgRE9NIHByb3BlcnR5XG4gICAgICAgIGNvbnNvbGUud2FybignREVQUkVDQVRJT04gTk9USUNFOiBcImJhY2tncm91bmRDb2xvclwiIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFwic3R5bGUuYmFja2dyb3VuZFwiIHByb3BlcnR5LicpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggb3VyIHN0eWxlIG9iamVjdCBhbmQgYXBwbHkgc3R5bGVzIHRvIGRpdkVsZW1lbnRcbiAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMub3B0aW9ucy5zdHlsZSkge1xuICAgICAgICBkaXZFbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IHRoaXMub3B0aW9ucy5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyB0aGUgdG9hc3QgbWVzc2FnZS9ub2RlXG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vZGUgJiYgdGhpcy5vcHRpb25zLm5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCBub2RlLCB3ZSBpbnNlcnQgaXRcbiAgICAgICAgZGl2RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm9wdGlvbnMubm9kZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXNjYXBlTWFya3VwKSB7XG4gICAgICAgICAgZGl2RWxlbWVudC5pbm5lclRleHQgPSB0aGlzLm9wdGlvbnMudGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXZFbGVtZW50LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy50ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdmF0YXIgIT09IFwiXCIpIHtcbiAgICAgICAgICB2YXIgYXZhdGFyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgYXZhdGFyRWxlbWVudC5zcmMgPSB0aGlzLm9wdGlvbnMuYXZhdGFyO1xuXG4gICAgICAgICAgYXZhdGFyRWxlbWVudC5jbGFzc05hbWUgPSBcInRvYXN0aWZ5LWF2YXRhclwiO1xuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PSBcImxlZnRcIiB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb25MZWZ0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGF2YXRhckVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgcmlnaHQgb2YgY29udGVudFxuICAgICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGF2YXRhckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdFxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBzcGFuIGZvciBjbG9zZSBlbGVtZW50XG4gICAgICAgIHZhciBjbG9zZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgY2xvc2VFbGVtZW50LmlubmVySFRNTCA9IFwiJiMxMDAwNjtcIjtcblxuICAgICAgICBjbG9zZUVsZW1lbnQuY2xhc3NOYW1lID0gXCJ0b2FzdC1jbG9zZVwiO1xuXG4gICAgICAgIC8vIFRyaWdnZXJpbmcgdGhlIHJlbW92YWwgb2YgdG9hc3QgZnJvbSBET00gb24gY2xvc2UgY2xpY2tcbiAgICAgICAgY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh0aGlzLnRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9DYWxjdWxhdGluZyBzY3JlZW4gd2lkdGhcbiAgICAgICAgdmFyIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggPiAwID8gd2luZG93LmlubmVyV2lkdGggOiBzY3JlZW4ud2lkdGg7XG5cbiAgICAgICAgLy8gQWRkaW5nIHRoZSBjbG9zZSBpY29uIHRvIHRoZSB0b2FzdCBlbGVtZW50XG4gICAgICAgIC8vIERpc3BsYXkgb24gdGhlIHJpZ2h0IGlmIHNjcmVlbiB3aWR0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzYwcHhcbiAgICAgICAgaWYgKCh0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uTGVmdCA9PT0gdHJ1ZSkgJiYgd2lkdGggPiAzNjApIHtcbiAgICAgICAgICAvLyBBZGRpbmcgY2xvc2UgaWNvbiBvbiB0aGUgbGVmdCBvZiBjb250ZW50XG4gICAgICAgICAgZGl2RWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkaW5nIGNsb3NlIGljb24gb24gdGhlIHJpZ2h0IG9mIGNvbnRlbnRcbiAgICAgICAgICBkaXZFbGVtZW50LmFwcGVuZENoaWxkKGNsb3NlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGltZW91dCB3aGlsZSB0b2FzdCBpcyBmb2N1c2VkXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN0b3BPbkZvY3VzICYmIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAvLyBzdG9wIGNvdW50ZG93blxuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJtb3VzZW92ZXJcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChkaXZFbGVtZW50LnRpbWVPdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC8vIGFkZCBiYWNrIHRoZSB0aW1lb3V0XG4gICAgICAgIGRpdkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlbGVhdmVcIixcbiAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRpdkVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdG9hc3QgZnJvbSBET01cbiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUVsZW1lbnQoZGl2RWxlbWVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5kdXJhdGlvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgYW4gb24tY2xpY2sgZGVzdGluYXRpb24gcGF0aFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZGl2RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5ld1dpbmRvdyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24sIFwiX2JsYW5rXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gdGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5vbkNsaWNrID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBkaXZFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNsaWNrKCk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGluZyBvZmZzZXRcbiAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMub2Zmc2V0ID09PSBcIm9iamVjdFwiKSB7XG5cbiAgICAgICAgdmFyIHggPSBnZXRBeGlzT2Zmc2V0QVZhbHVlKFwieFwiLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB2YXIgeSA9IGdldEF4aXNPZmZzZXRBVmFsdWUoXCJ5XCIsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHhPZmZzZXQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT0gXCJsZWZ0XCIgPyB4IDogXCItXCIgKyB4O1xuICAgICAgICB2YXIgeU9mZnNldCA9IHRoaXMub3B0aW9ucy5ncmF2aXR5ID09IFwidG9hc3RpZnktdG9wXCIgPyB5IDogXCItXCIgKyB5O1xuXG4gICAgICAgIGRpdkVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUoXCIgKyB4T2Zmc2V0ICsgXCIsXCIgKyB5T2Zmc2V0ICsgXCIpXCI7XG5cbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudFxuICAgICAgcmV0dXJuIGRpdkVsZW1lbnQ7XG4gICAgfSxcblxuICAgIC8vIERpc3BsYXlpbmcgdGhlIHRvYXN0XG4gICAgc2hvd1RvYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIENyZWF0aW5nIHRoZSBET00gb2JqZWN0IGZvciB0aGUgdG9hc3RcbiAgICAgIHRoaXMudG9hc3RFbGVtZW50ID0gdGhpcy5idWlsZFRvYXN0KCk7XG5cbiAgICAgIC8vIEdldHRpbmcgdGhlIHJvb3QgZWxlbWVudCB0byB3aXRoIHRoZSB0b2FzdCBuZWVkcyB0byBiZSBhZGRlZFxuICAgICAgdmFyIHJvb3RFbGVtZW50O1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3B0aW9ucy5zZWxlY3RvciBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgIHJvb3RFbGVtZW50ID0gdGhpcy5vcHRpb25zLnNlbGVjdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0aW5nIGlmIHJvb3QgZWxlbWVudCBpcyBwcmVzZW50IGluIERPTVxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICB0aHJvdyBcIlJvb3QgZWxlbWVudCBpcyBub3QgZGVmaW5lZFwiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGRpbmcgdGhlIERPTSBlbGVtZW50XG4gICAgICB2YXIgZWxlbWVudFRvSW5zZXJ0ID0gVG9hc3RpZnkuZGVmYXVsdHMub2xkZXN0Rmlyc3QgPyByb290RWxlbWVudC5maXJzdENoaWxkIDogcm9vdEVsZW1lbnQubGFzdENoaWxkO1xuICAgICAgcm9vdEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMudG9hc3RFbGVtZW50LCBlbGVtZW50VG9JbnNlcnQpO1xuXG4gICAgICAvLyBSZXBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgaW4gY2FzZSBtdWx0aXBsZSB0b2FzdHMgYXJlIHByZXNlbnRcbiAgICAgIFRvYXN0aWZ5LnJlcG9zaXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvYXN0IGZyb20gRE9NXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodGhpcy50b2FzdEVsZW1lbnQpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZHVyYXRpb25cbiAgICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICAgIH1cblxuICAgICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGhpZGVUb2FzdDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy50b2FzdEVsZW1lbnQudGltZU91dFZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0RWxlbWVudC50aW1lT3V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHRoaXMudG9hc3RFbGVtZW50KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZpbmcgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAgcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24odG9hc3RFbGVtZW50KSB7XG4gICAgICAvLyBIaWRpbmcgdGhlIGVsZW1lbnRcbiAgICAgIC8vIHRvYXN0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwib25cIik7XG4gICAgICB0b2FzdEVsZW1lbnQuY2xhc3NOYW1lID0gdG9hc3RFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFwiIG9uXCIsIFwiXCIpO1xuXG4gICAgICAvLyBSZW1vdmluZyB0aGUgZWxlbWVudCBmcm9tIERPTSBhZnRlciB0cmFuc2l0aW9uIGVuZFxuICAgICAgd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBvcHRpb25zIG5vZGUgaWYgYW55XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub2RlICYmIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5vcHRpb25zLm5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBET00sIG9ubHkgd2hlbiB0aGUgcGFyZW50IG5vZGUgd2FzIG5vdCByZW1vdmVkIGJlZm9yZS5cbiAgICAgICAgICBpZiAodG9hc3RFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRvYXN0RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgICAgICB0aGlzLm9wdGlvbnMuY2FsbGJhY2suY2FsbCh0b2FzdEVsZW1lbnQpO1xuXG4gICAgICAgICAgLy8gUmVwb3NpdGlvbmluZyB0aGUgdG9hc3RzIGFnYWluXG4gICAgICAgICAgVG9hc3RpZnkucmVwb3NpdGlvbigpO1xuICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgIDQwMFxuICAgICAgKTsgLy8gQmluZGluZyBgdGhpc2AgZm9yIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICB9LFxuICB9O1xuXG4gIC8vIFBvc2l0aW9uaW5nIHRoZSB0b2FzdHMgb24gdGhlIERPTVxuICBUb2FzdGlmeS5yZXBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBUb3AgbWFyZ2lucyB3aXRoIGdyYXZpdHlcbiAgICB2YXIgdG9wTGVmdE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciB0b3BSaWdodE9mZnNldFNpemUgPSB7XG4gICAgICB0b3A6IDE1LFxuICAgICAgYm90dG9tOiAxNSxcbiAgICB9O1xuICAgIHZhciBvZmZzZXRTaXplID0ge1xuICAgICAgdG9wOiAxNSxcbiAgICAgIGJvdHRvbTogMTUsXG4gICAgfTtcblxuICAgIC8vIEdldCBhbGwgdG9hc3QgbWVzc2FnZXMgb24gdGhlIERPTVxuICAgIHZhciBhbGxUb2FzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwidG9hc3RpZnlcIik7XG5cbiAgICB2YXIgY2xhc3NVc2VkO1xuXG4gICAgLy8gTW9kaWZ5aW5nIHRoZSBwb3NpdGlvbiBvZiBlYWNoIHRvYXN0IGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFRvYXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0dGluZyB0aGUgYXBwbGllZCBncmF2aXR5XG4gICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktdG9wXCIpID09PSB0cnVlKSB7XG4gICAgICAgIGNsYXNzVXNlZCA9IFwidG9hc3RpZnktdG9wXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc1VzZWQgPSBcInRvYXN0aWZ5LWJvdHRvbVwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVpZ2h0ID0gYWxsVG9hc3RzW2ldLm9mZnNldEhlaWdodDtcbiAgICAgIGNsYXNzVXNlZCA9IGNsYXNzVXNlZC5zdWJzdHIoOSwgY2xhc3NVc2VkLmxlbmd0aC0xKVxuICAgICAgLy8gU3BhY2luZyBiZXR3ZWVuIHRvYXN0c1xuICAgICAgdmFyIG9mZnNldCA9IDE1O1xuXG4gICAgICB2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCA+IDAgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHNjcmVlbi53aWR0aDtcblxuICAgICAgLy8gU2hvdyB0b2FzdCBpbiBjZW50ZXIgaWYgc2NyZWVuIHdpdGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM2MHB4XG4gICAgICBpZiAod2lkdGggPD0gMzYwKSB7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgIGFsbFRvYXN0c1tpXS5zdHlsZVtjbGFzc1VzZWRdID0gb2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgIG9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGFpbnNDbGFzcyhhbGxUb2FzdHNbaV0sIFwidG9hc3RpZnktbGVmdFwiKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgdGhlIHBvc2l0aW9uXG4gICAgICAgICAgYWxsVG9hc3RzW2ldLnN0eWxlW2NsYXNzVXNlZF0gPSB0b3BMZWZ0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wTGVmdE9mZnNldFNpemVbY2xhc3NVc2VkXSArPSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgcG9zaXRpb25cbiAgICAgICAgICBhbGxUb2FzdHNbaV0uc3R5bGVbY2xhc3NVc2VkXSA9IHRvcFJpZ2h0T2Zmc2V0U2l6ZVtjbGFzc1VzZWRdICsgXCJweFwiO1xuXG4gICAgICAgICAgdG9wUmlnaHRPZmZzZXRTaXplW2NsYXNzVXNlZF0gKz0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcG9ydGluZyBmdW5jdGlvbiBjaGFpbmluZ1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgb2Zmc2V0LlxuICBmdW5jdGlvbiBnZXRBeGlzT2Zmc2V0QVZhbHVlKGF4aXMsIG9wdGlvbnMpIHtcblxuICAgIGlmKG9wdGlvbnMub2Zmc2V0W2F4aXNdKSB7XG4gICAgICBpZihpc05hTihvcHRpb25zLm9mZnNldFtheGlzXSkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMub2Zmc2V0W2F4aXNdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9mZnNldFtheGlzXSArICdweCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcwcHgnO1xuXG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluc0NsYXNzKGVsZW0sIHlvdXJDbGFzcykge1xuICAgIGlmICghZWxlbSB8fCB0eXBlb2YgeW91ckNsYXNzICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGVsZW0uY2xhc3NOYW1lICYmXG4gICAgICBlbGVtLmNsYXNzTmFtZVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5zcGxpdCgvXFxzKy9naSlcbiAgICAgICAgLmluZGV4T2YoeW91ckNsYXNzKSA+IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHRpbmcgdXAgdGhlIHByb3RvdHlwZSBmb3IgdGhlIGluaXQgb2JqZWN0XG4gIFRvYXN0aWZ5LmxpYi5pbml0LnByb3RvdHlwZSA9IFRvYXN0aWZ5LmxpYjtcblxuICAvLyBSZXR1cm5pbmcgdGhlIFRvYXN0aWZ5IGZ1bmN0aW9uIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB3aW5kb3cgb2JqZWN0L21vZHVsZVxuICByZXR1cm4gVG9hc3RpZnk7XG59KTtcbiIsICIvKipcbiAqIEBsaWNlbnNlIE1JVFxuICogdG9wYmFyIDEuMC4wLCAyMDIxLTAxLTA2XG4gKiBodHRwOi8vYnV1bmd1eWVuLmdpdGh1Yi5pby90b3BiYXJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBCdXUgTmd1eWVuXG4gKi9cbihmdW5jdGlvbih3aW5kb3csZG9jdW1lbnQpe1widXNlIHN0cmljdFwiOyFmdW5jdGlvbigpe2Zvcih2YXIgbGFzdFRpbWU9MCx2ZW5kb3JzPVtcIm1zXCIsXCJtb3pcIixcIndlYmtpdFwiLFwib1wiXSx4PTA7eDx2ZW5kb3JzLmxlbmd0aCYmIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7Kyt4KXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9d2luZG93W3ZlbmRvcnNbeF0rXCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl0sd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPXdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl18fHdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGNhbGxiYWNrLGVsZW1lbnQpe3ZhciBjdXJyVGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aW1lVG9DYWxsPU1hdGgubWF4KDAsMTYtKGN1cnJUaW1lLWxhc3RUaW1lKSksaWQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYWxsYmFjayhjdXJyVGltZSt0aW1lVG9DYWxsKX0sdGltZVRvQ2FsbCk7cmV0dXJuIGxhc3RUaW1lPWN1cnJUaW1lK3RpbWVUb0NhbGwsaWR9KSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oaWQpe2NsZWFyVGltZW91dChpZCl9KX0oKTtmdW5jdGlvbiByZXBhaW50KCl7Y2FudmFzLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoLGNhbnZhcy5oZWlnaHQ9NSpvcHRpb25zLmJhclRoaWNrbmVzczt2YXIgY3R4PWNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7Y3R4LnNoYWRvd0JsdXI9b3B0aW9ucy5zaGFkb3dCbHVyLGN0eC5zaGFkb3dDb2xvcj1vcHRpb25zLnNoYWRvd0NvbG9yO3ZhciBzdG9wLGxpbmVHcmFkaWVudD1jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwwLGNhbnZhcy53aWR0aCwwKTtmb3Ioc3RvcCBpbiBvcHRpb25zLmJhckNvbG9ycylsaW5lR3JhZGllbnQuYWRkQ29sb3JTdG9wKHN0b3Asb3B0aW9ucy5iYXJDb2xvcnNbc3RvcF0pO2N0eC5saW5lV2lkdGg9b3B0aW9ucy5iYXJUaGlja25lc3MsY3R4LmJlZ2luUGF0aCgpLGN0eC5tb3ZlVG8oMCxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHgubGluZVRvKE1hdGguY2VpbChjdXJyZW50UHJvZ3Jlc3MqY2FudmFzLndpZHRoKSxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHguc3Ryb2tlU3R5bGU9bGluZUdyYWRpZW50LGN0eC5zdHJva2UoKX12YXIgY2FudmFzLHByb2dyZXNzVGltZXJJZCxmYWRlVGltZXJJZCxjdXJyZW50UHJvZ3Jlc3Msc2hvd2luZyxvcHRpb25zPXthdXRvUnVuOiEwLGJhclRoaWNrbmVzczozLGJhckNvbG9yczp7MDpcInJnYmEoMjYsICAxODgsIDE1NiwgLjkpXCIsXCIuMjVcIjpcInJnYmEoNTIsICAxNTIsIDIxOSwgLjkpXCIsXCIuNTBcIjpcInJnYmEoMjQxLCAxOTYsIDE1LCAgLjkpXCIsXCIuNzVcIjpcInJnYmEoMjMwLCAxMjYsIDM0LCAgLjkpXCIsXCIxLjBcIjpcInJnYmEoMjExLCA4NCwgIDAsICAgLjkpXCJ9LHNoYWRvd0JsdXI6MTAsc2hhZG93Q29sb3I6XCJyZ2JhKDAsICAgMCwgICAwLCAgIC42KVwiLGNsYXNzTmFtZTpudWxsfSx0b3BiYXI9e2NvbmZpZzpmdW5jdGlvbihvcHRzKXtmb3IodmFyIGtleSBpbiBvcHRzKW9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSYmKG9wdGlvbnNba2V5XT1vcHRzW2tleV0pfSxzaG93OmZ1bmN0aW9uKCl7dmFyIHR5cGUsaGFuZGxlcixlbGVtO3Nob3dpbmd8fChzaG93aW5nPSEwLG51bGwhPT1mYWRlVGltZXJJZCYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZhZGVUaW1lcklkKSxjYW52YXN8fCgoZWxlbT0oY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLnN0eWxlKS5wb3NpdGlvbj1cImZpeGVkXCIsZWxlbS50b3A9ZWxlbS5sZWZ0PWVsZW0ucmlnaHQ9ZWxlbS5tYXJnaW49ZWxlbS5wYWRkaW5nPTAsZWxlbS56SW5kZXg9MTAwMDAxLGVsZW0uZGlzcGxheT1cIm5vbmVcIixvcHRpb25zLmNsYXNzTmFtZSYmY2FudmFzLmNsYXNzTGlzdC5hZGQob3B0aW9ucy5jbGFzc05hbWUpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKSx0eXBlPVwicmVzaXplXCIsaGFuZGxlcj1yZXBhaW50LChlbGVtPXdpbmRvdykuYWRkRXZlbnRMaXN0ZW5lcj9lbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxoYW5kbGVyLCExKTplbGVtLmF0dGFjaEV2ZW50P2VsZW0uYXR0YWNoRXZlbnQoXCJvblwiK3R5cGUsaGFuZGxlcik6ZWxlbVtcIm9uXCIrdHlwZV09aGFuZGxlciksY2FudmFzLnN0eWxlLm9wYWNpdHk9MSxjYW52YXMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdG9wYmFyLnByb2dyZXNzKDApLG9wdGlvbnMuYXV0b1J1biYmZnVuY3Rpb24gbG9vcCgpe3Byb2dyZXNzVGltZXJJZD13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApLHRvcGJhci5wcm9ncmVzcyhcIitcIisuMDUqTWF0aC5wb3coMS1NYXRoLnNxcnQoY3VycmVudFByb2dyZXNzKSwyKSl9KCkpfSxwcm9ncmVzczpmdW5jdGlvbih0byl7cmV0dXJuIHZvaWQgMD09PXRvfHwoXCJzdHJpbmdcIj09dHlwZW9mIHRvJiYodG89KDA8PXRvLmluZGV4T2YoXCIrXCIpfHwwPD10by5pbmRleE9mKFwiLVwiKT9jdXJyZW50UHJvZ3Jlc3M6MCkrcGFyc2VGbG9hdCh0bykpLGN1cnJlbnRQcm9ncmVzcz0xPHRvPzE6dG8scmVwYWludCgpKSxjdXJyZW50UHJvZ3Jlc3N9LGhpZGU6ZnVuY3Rpb24oKXtzaG93aW5nJiYoc2hvd2luZz0hMSxudWxsIT1wcm9ncmVzc1RpbWVySWQmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NUaW1lcklkKSxwcm9ncmVzc1RpbWVySWQ9bnVsbCksZnVuY3Rpb24gbG9vcCgpe3JldHVybiAxPD10b3BiYXIucHJvZ3Jlc3MoXCIrLjFcIikmJihjYW52YXMuc3R5bGUub3BhY2l0eS09LjA1LGNhbnZhcy5zdHlsZS5vcGFjaXR5PD0uMDUpPyhjYW52YXMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix2b2lkKGZhZGVUaW1lcklkPW51bGwpKTp2b2lkKGZhZGVUaW1lcklkPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCkpfSgpKX19O1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10b3BiYXI6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiB0b3BiYXJ9KTp0aGlzLnRvcGJhcj10b3BiYXJ9KS5jYWxsKHRoaXMsd2luZG93LGRvY3VtZW50KTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbigpIHtcbiAgdmFyIFBvbHlmaWxsRXZlbnQgPSBldmVudENvbnN0cnVjdG9yKCk7XG5cbiAgZnVuY3Rpb24gZXZlbnRDb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gd2luZG93LkN1c3RvbUV2ZW50O1xuICAgIC8vIElFPD05IFN1cHBvcnRcbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2J1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWR9O1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBldnQ7XG4gICAgfVxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRIaWRkZW5JbnB1dChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICBpbnB1dC5uYW1lID0gbmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGVsZW1lbnQsIHRhcmdldE1vZGlmaWVyS2V5KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgc3VibWl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLFxuICAgICAgICB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcblxuICAgIGZvcm0ubWV0aG9kID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgPT09IFwiZ2V0XCIpID8gXCJnZXRcIiA6IFwicG9zdFwiO1xuICAgIGZvcm0uYWN0aW9uID0gdG87XG4gICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcbiAgICBlbHNlIGlmICh0YXJnZXRNb2RpZmllcktleSkgZm9ybS50YXJnZXQgPSBcIl9ibGFua1wiO1xuXG4gICAgZm9ybS5hcHBlbmRDaGlsZChjc3JmKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKG1ldGhvZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIC8vIEluc2VydCBhIGJ1dHRvbiBhbmQgY2xpY2sgaXQgaW5zdGVhZCBvZiB1c2luZyBgZm9ybS5zdWJtaXRgXG4gICAgLy8gYmVjYXVzZSB0aGUgYHN1Ym1pdGAgZnVuY3Rpb24gZG9lcyBub3QgZW1pdCBhIGBzdWJtaXRgIGV2ZW50LlxuICAgIHN1Ym1pdC50eXBlID0gXCJzdWJtaXRcIjtcbiAgICBmb3JtLmFwcGVuZENoaWxkKHN1Ym1pdCk7XG4gICAgc3VibWl0LmNsaWNrKCk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICB2YXIgcGhvZW5peExpbmtFdmVudCA9IG5ldyBQb2x5ZmlsbEV2ZW50KCdwaG9lbml4LmxpbmsuY2xpY2snLCB7XG4gICAgICAgIFwiYnViYmxlc1wiOiB0cnVlLCBcImNhbmNlbGFibGVcIjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghZWxlbWVudC5kaXNwYXRjaEV2ZW50KHBob2VuaXhMaW5rRXZlbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdG9cIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCwgZS5tZXRhS2V5IHx8IGUuc2hpZnRLZXkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9LCBmYWxzZSk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bob2VuaXgubGluay5jbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbmZpcm1cIik7XG4gICAgaWYobWVzc2FnZSAmJiAhd2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbn0pKCk7XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCBnbG9iYWxUaGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cblxuZXhwb3J0IGNvbnN0IFRSQU5TUE9SVFMgPSB7XG4gIGxvbmdwb2xsOiBcImxvbmdwb2xsXCIsXG4gIHdlYnNvY2tldDogXCJ3ZWJzb2NrZXRcIlxufVxuZXhwb3J0IGNvbnN0IFhIUl9TVEFURVMgPSB7XG4gIGNvbXBsZXRlOiA0XG59XG5leHBvcnQgY29uc3QgQVVUSF9UT0tFTl9QUkVGSVggPSBcImJhc2U2NHVybC5iZWFyZXIucGh4LlwiXG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfU1RBVEVTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgUHVzaCBmcm9tIFwiLi9wdXNoXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gcGFyYW1zXG4gKiBAcGFyYW0ge1NvY2tldH0gc29ja2V0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5uZWwge1xuICBjb25zdHJ1Y3Rvcih0b3BpYywgcGFyYW1zLCBzb2NrZXQpe1xuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLnRvcGljID0gdG9waWNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5iaW5kaW5ncyA9IFtdXG4gICAgdGhpcy5iaW5kaW5nUmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXRcbiAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZVxuICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KVxuICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMgPSBbXVxuXG4gICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSwgdGhpcy5zb2NrZXQucmVqb2luQWZ0ZXJNcylcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uRXJyb3IoKCkgPT4gdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpKSlcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuaXNFcnJvcmVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9KVxuICAgIClcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkXG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKHB1c2hFdmVudCA9PiBwdXNoRXZlbnQuc2VuZCgpKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuam9pblJlZigpfWApXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgICB0aGlzLnNvY2tldC5yZW1vdmUodGhpcylcbiAgICB9KVxuICAgIHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pXG4gICAgICBpZih0aGlzLmlzSm9pbmluZygpKXsgdGhpcy5qb2luUHVzaC5yZXNldCgpIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGB0aW1lb3V0ICR7dGhpcy50b3BpY30gKCR7dGhpcy5qb2luUmVmKCl9KWAsIHRoaXMuam9pblB1c2gudGltZW91dClcbiAgICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRoaXMudGltZW91dClcbiAgICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICB0aGlzLmpvaW5QdXNoLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLnJlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlXG4gICAgICB0aGlzLnJlam9pbigpXG4gICAgICByZXR1cm4gdGhpcy5qb2luUHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBjbG9zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjayl7XG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgZXJyb3JzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkVycm9yKGNhbGxiYWNrKXtcbiAgICByZXR1cm4gdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwgcmVhc29uID0+IGNhbGxiYWNrKHJlYXNvbikpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBvbiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBTdWJzY3JpcHRpb24gcmV0dXJucyBhIHJlZiBjb3VudGVyLCB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0b1xuICAgKiB1bnN1YnNjcmliZSB0aGUgZXhhY3QgZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY29uc3QgcmVmMiA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19vdGhlcl9zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKiAvLyBTaW5jZSB1bnN1YnNjcmlwdGlvbiwgZG9fc3R1ZmYgd29uJ3QgZmlyZSxcbiAgICogLy8gd2hpbGUgZG9fb3RoZXJfc3R1ZmYgd2lsbCBrZWVwIGZpcmluZyBvbiB0aGUgXCJldmVudFwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvbihldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLmJpbmRpbmdSZWYrK1xuICAgIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQsIHJlZiwgY2FsbGJhY2t9KVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgb2ZmIG9mIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFVzZSB0aGUgcmVmIHJldHVybmVkIGZyb20gYSBjaGFubmVsLm9uKCkgdG8gdW5zdWJzY3JpYmUgb25lXG4gICAqIGhhbmRsZXIsIG9yIHBhc3Mgbm90aGluZyBmb3IgdGhlIHJlZiB0byB1bnN1YnNjcmliZSBhbGxcbiAgICogaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5zdWJzY3JpYmUgdGhlIGRvX3N0dWZmIGhhbmRsZXJcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKlxuICAgKiAvLyBVbnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgZnJvbSBldmVudFxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb2ZmKGV2ZW50LCByZWYpe1xuICAgIHRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgcmV0dXJuICEoYmluZC5ldmVudCA9PT0gZXZlbnQgJiYgKHR5cGVvZiByZWYgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVmID09PSBiaW5kLnJlZikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuUHVzaCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLmlzSm9pbmVkKCkgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgYGV2ZW50YCB0byBwaG9lbml4IHdpdGggdGhlIHBheWxvYWQgYHBheWxvYWRgLlxuICAgKiBQaG9lbml4IHJlY2VpdmVzIHRoaXMgaW4gdGhlIGBoYW5kbGVfaW4oZXZlbnQsIHBheWxvYWQsIHNvY2tldClgXG4gICAqIGZ1bmN0aW9uLiBpZiBwaG9lbml4IHJlcGxpZXMgb3IgaXQgdGltZXMgb3V0IChkZWZhdWx0IDEwMDAwbXMpLFxuICAgKiB0aGVuIG9wdGlvbmFsbHkgdGhlIHJlcGx5IGNhbiBiZSByZWNlaXZlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5wdXNoKFwiZXZlbnRcIilcbiAgICogICAucmVjZWl2ZShcIm9rXCIsIHBheWxvYWQgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IHJlcGxpZWQ6XCIsIHBheWxvYWQpKVxuICAgKiAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgZXJyID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCBlcnJvcmVkXCIsIGVycikpXG4gICAqICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IGNvbnNvbGUubG9nKFwidGltZWQgb3V0IHB1c2hpbmdcIikpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge31cbiAgICBpZighdGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuam9pbigpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2ApXG4gICAgfVxuICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgZnVuY3Rpb24gKCl7IHJldHVybiBwYXlsb2FkIH0sIHRpbWVvdXQpXG4gICAgaWYodGhpcy5jYW5QdXNoKCkpe1xuICAgICAgcHVzaEV2ZW50LnNlbmQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcHVzaEV2ZW50XG4gIH1cblxuICAvKiogTGVhdmVzIHRoZSBjaGFubmVsXG4gICAqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZFxuICAgKiBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyXG4gICAqXG4gICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rc1xuICAgKlxuICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYHJlY2VpdmVgXG4gICAqIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAqXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGxlYXZlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgIHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpXG5cbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZ1xuICAgIGxldCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGxlYXZlICR7dGhpcy50b3BpY31gKVxuICAgICAgdGhpcy50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBcImxlYXZlXCIpXG4gICAgfVxuICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRpbWVvdXQpXG4gICAgbGVhdmVQdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICBpZighdGhpcy5jYW5QdXNoKCkpeyBsZWF2ZVB1c2gudHJpZ2dlcihcIm9rXCIsIHt9KSB9XG5cbiAgICByZXR1cm4gbGVhdmVQdXNoXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAqXG4gICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICogYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICpcbiAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBvbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKXsgcmV0dXJuIHBheWxvYWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmKXtcbiAgICBpZih0aGlzLnRvcGljICE9PSB0b3BpYyl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZihqb2luUmVmICYmIGpvaW5SZWYgIT09IHRoaXMuam9pblJlZigpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgWEhSX1NUQVRFU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcblxuICBzdGF0aWMgcmVxdWVzdChtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBpZihnbG9iYWwuWERvbWFpblJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWERvbWFpblJlcXVlc3QoKSAvLyBJRTgsIElFOVxuICAgICAgcmV0dXJuIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuWE1MSHR0cFJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKSAvLyBJRTcrLCBGaXJlZm94LCBDaHJvbWUsIE9wZXJhLCBTYWZhcmlcbiAgICAgIHJldHVybiB0aGlzLnhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuZmV0Y2ggJiYgZ2xvYmFsLkFib3J0Q29udHJvbGxlcil7XG4gICAgICAvLyBGZXRjaCB3aXRoIEFib3J0Q29udHJvbGxlciBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICByZXR1cm4gdGhpcy5mZXRjaFJlcXVlc3QobWV0aG9kLCBlbmRQb2ludCwgaGVhZGVycywgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3VpdGFibGUgWE1MSHR0cFJlcXVlc3QgaW1wbGVtZW50YXRpb24gZm91bmRcIilcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZmV0Y2hSZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGhlYWRlcnMsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgfVxuICAgIGxldCBjb250cm9sbGVyID0gbnVsbFxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuICAgICAgb3B0aW9ucy5zaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbFxuICAgIH1cbiAgICBnbG9iYWwuZmV0Y2goZW5kUG9pbnQsIG9wdGlvbnMpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAudGhlbihkYXRhID0+IHRoaXMucGFyc2VKU09OKGRhdGEpKVxuICAgICAgLnRoZW4oZGF0YSA9PiBjYWxsYmFjayAmJiBjYWxsYmFjayhkYXRhKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZihlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgJiYgb250aW1lb3V0KXtcbiAgICAgICAgICBvbnRpbWVvdXQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgcmV0dXJuIGNvbnRyb2xsZXJcbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gICAgcmV0dXJuIHJlcVxuICB9XG5cbiAgc3RhdGljIHhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50LCB0cnVlKVxuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIGZvcihsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKXtcbiAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJlcS5vbmVycm9yID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbClcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IFhIUl9TVEFURVMuY29tcGxldGUgJiYgY2FsbGJhY2spe1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgICBjYWxsYmFjayhyZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICAgIHJldHVybiByZXFcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgQVVUSF9UT0tFTl9QUkVGSVhcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEFqYXggZnJvbSBcIi4vYWpheFwiXG5cbmxldCBhcnJheUJ1ZmZlclRvQmFzZTY0ID0gKGJ1ZmZlcikgPT4ge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpXG4gIGxldCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoXG4gIGZvcihsZXQgaSA9IDA7IGkgPCBsZW47IGkrKyl7IGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKSB9XG4gIHJldHVybiBidG9hKGJpbmFyeSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBwcm90b2NvbHMpe1xuICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBzdWJwcm90b2NvbHMgZm9yIGF1dGhUb2tlblxuICAgIC8vIFtcInBob2VuaXhcIiwgXCJiYXNlNjR1cmwuYmVhcmVyLnBoeC5CQVNFNjRfRU5DT0RFRF9UT0tFTlwiXVxuICAgIGlmKHByb3RvY29scyAmJiBwcm90b2NvbHMubGVuZ3RoID09PSAyICYmIHByb3RvY29sc1sxXS5zdGFydHNXaXRoKEFVVEhfVE9LRU5fUFJFRklYKSl7XG4gICAgICB0aGlzLmF1dGhUb2tlbiA9IGF0b2IocHJvdG9jb2xzWzFdLnNsaWNlKEFVVEhfVE9LRU5fUFJFRklYLmxlbmd0aCkpXG4gICAgfVxuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsXG4gICAgdGhpcy50b2tlbiA9IG51bGxcbiAgICB0aGlzLnNraXBIZWFydGJlYXQgPSB0cnVlXG4gICAgdGhpcy5yZXFzID0gbmV3IFNldCgpXG4gICAgdGhpcy5hd2FpdGluZ0JhdGNoQWNrID0gZmFsc2VcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IG51bGxcbiAgICB0aGlzLmN1cnJlbnRCYXRjaFRpbWVyID0gbnVsbFxuICAgIHRoaXMuYmF0Y2hCdWZmZXIgPSBbXVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxlciB0byBmaW5pc2ggc2V0dGluZyB1cCBvdXIgY2FsbGJhY2tzIGFuZCB0aW1lb3V0IHByb3BlcnRpZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9sbCgpLCAwKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgdGhpcy5jbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICB9XG5cbiAgb250aW1lb3V0KCl7XG4gICAgdGhpcy5vbmVycm9yKFwidGltZW91dFwiKVxuICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDA1LCBcInRpbWVvdXRcIiwgZmFsc2UpXG4gIH1cblxuICBpc0FjdGl2ZSgpeyByZXR1cm4gdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcgfVxuXG4gIHBvbGwoKXtcbiAgICBjb25zdCBoZWFkZXJzID0ge1wiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwifVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIGhlYWRlcnNbXCJYLVBob2VuaXgtQXV0aFRva2VuXCJdID0gdGhpcy5hdXRoVG9rZW5cbiAgICB9XG4gICAgdGhpcy5hamF4KFwiR0VUXCIsIGhlYWRlcnMsIG51bGwsICgpID0+IHRoaXMub250aW1lb3V0KCksIHJlc3AgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdHMgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pLCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKHt9KVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDQwMylcbiAgICAgICAgICB0aGlzLmNsb3NlKDEwMDgsIFwiZm9yYmlkZGVuXCIsIGZhbHNlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDUwMClcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgNTAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHBvbGwgc3RhdHVzICR7c3RhdHVzfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHdlIGNvbGxlY3QgYWxsIHB1c2hlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCBieVxuICAvLyBzZXRUaW1lb3V0IDAsIHdoaWNoIG9wdGltaXplcyBiYWNrLXRvLWJhY2sgcHJvY2VkdXJhbFxuICAvLyBwdXNoZXMgYWdhaW5zdCBhbiBlbXB0eSBidWZmZXJcblxuICBzZW5kKGJvZHkpe1xuICAgIGlmKHR5cGVvZihib2R5KSAhPT0gXCJzdHJpbmdcIil7IGJvZHkgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KGJvZHkpIH1cbiAgICBpZih0aGlzLmN1cnJlbnRCYXRjaCl7XG4gICAgICB0aGlzLmN1cnJlbnRCYXRjaC5wdXNoKGJvZHkpXG4gICAgfSBlbHNlIGlmKHRoaXMuYXdhaXRpbmdCYXRjaEFjayl7XG4gICAgICB0aGlzLmJhdGNoQnVmZmVyLnB1c2goYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50QmF0Y2ggPSBbYm9keV1cbiAgICAgIHRoaXMuY3VycmVudEJhdGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5iYXRjaFNlbmQodGhpcy5jdXJyZW50QmF0Y2gpXG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gbnVsbFxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBiYXRjaFNlbmQobWVzc2FnZXMpe1xuICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IHRydWVcbiAgICB0aGlzLmFqYXgoXCJQT1NUXCIsIHtcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtbmRqc29uXCJ9LCBtZXNzYWdlcy5qb2luKFwiXFxuXCIpLCAoKSA9PiB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpLCByZXNwID0+IHtcbiAgICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IGZhbHNlXG4gICAgICBpZighcmVzcCB8fCByZXNwLnN0YXR1cyAhPT0gMjAwKXtcbiAgICAgICAgdGhpcy5vbmVycm9yKHJlc3AgJiYgcmVzcC5zdGF0dXMpXG4gICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDExLCBcImludGVybmFsIHNlcnZlciBlcnJvclwiLCBmYWxzZSlcbiAgICAgIH0gZWxzZSBpZih0aGlzLmJhdGNoQnVmZmVyLmxlbmd0aCA+IDApe1xuICAgICAgICB0aGlzLmJhdGNoU2VuZCh0aGlzLmJhdGNoQnVmZmVyKVxuICAgICAgICB0aGlzLmJhdGNoQnVmZmVyID0gW11cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2xvc2UoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgZm9yKGxldCByZXEgb2YgdGhpcy5yZXFzKXsgcmVxLmFib3J0KCkgfVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY2xvc2VkXG4gICAgbGV0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtjb2RlOiAxMDAwLCByZWFzb246IHVuZGVmaW5lZCwgd2FzQ2xlYW46IHRydWV9LCB7Y29kZSwgcmVhc29uLCB3YXNDbGVhbn0pXG4gICAgdGhpcy5iYXRjaEJ1ZmZlciA9IFtdXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudEJhdGNoVGltZXIpXG4gICAgdGhpcy5jdXJyZW50QmF0Y2hUaW1lciA9IG51bGxcbiAgICBpZih0eXBlb2YoQ2xvc2VFdmVudCkgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgdGhpcy5vbmNsb3NlKG5ldyBDbG9zZUV2ZW50KFwiY2xvc2VcIiwgb3B0cykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jbG9zZShvcHRzKVxuICAgIH1cbiAgfVxuXG4gIGFqYXgobWV0aG9kLCBoZWFkZXJzLCBib2R5LCBvbkNhbGxlclRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVxXG4gICAgbGV0IG9udGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVxcy5kZWxldGUocmVxKVxuICAgICAgb25DYWxsZXJUaW1lb3V0KClcbiAgICB9XG4gICAgcmVxID0gQWpheC5yZXF1ZXN0KG1ldGhvZCwgdGhpcy5lbmRwb2ludFVSTCgpLCBoZWFkZXJzLCBib2R5LCB0aGlzLnRpbWVvdXQsIG9udGltZW91dCwgcmVzcCA9PiB7XG4gICAgICB0aGlzLnJlcXMuZGVsZXRlKHJlcSlcbiAgICAgIGlmKHRoaXMuaXNBY3RpdmUoKSl7IGNhbGxiYWNrKHJlc3ApIH1cbiAgICB9KVxuICAgIHRoaXMucmVxcy5hZGQocmVxKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBwaHhXaW5kb3csXG4gIENIQU5ORUxfRVZFTlRTLFxuICBERUZBVUxUX1RJTUVPVVQsXG4gIERFRkFVTFRfVlNOLFxuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTLFxuICBXU19DTE9TRV9OT1JNQUwsXG4gIEFVVEhfVE9LRU5fUFJFRklYXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjayBpZiBXZWJTb2NrZXQgaXMgbm90IGRlZmluZWQuXG4gKiBUbyBmYWxsYmFjayB0byBMb25nUG9sbCB3aGVuIFdlYlNvY2tldCBhdHRlbXB0cyBmYWlsLCB1c2UgYGxvbmdQb2xsRmFsbGJhY2tNczogMjUwMGAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc10gLSBUaGUgbWlsbGlzZWNvbmQgdGltZSB0byBhdHRlbXB0IHRoZSBwcmltYXJ5IHRyYW5zcG9ydFxuICogYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgTG9uZ1BvbGwgdHJhbnNwb3J0LiBEaXNhYmxlZCBieSBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGVidWddIC0gV2hlbiB0cnVlLCBlbmFibGVzIGRlYnVnIGxvZ2dpbmcuIERlZmF1bHQgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZW5jb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTiBlbmNvZGVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmRlY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZGVjb2RlIGluY29taW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT046XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogKHBheWxvYWQsIGNhbGxiYWNrKSA9PiBjYWxsYmFjayhKU09OLnBhcnNlKHBheWxvYWQpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXRdIC0gVGhlIGRlZmF1bHQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBwdXNoIHRpbWVvdXRzLlxuICpcbiAqIERlZmF1bHRzIGBERUZBVUxUX1RJTUVPVVRgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNc10gLSBUaGUgbWlsbGlzZWMgaW50ZXJ2YWwgdG8gc2VuZCBhIGhlYXJ0YmVhdCBtZXNzYWdlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWNvbm5lY3RBZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gKiBzb2NrZXQgcmVjb25uZWN0IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKlxuICogRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWpvaW5BZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxpc2VjXG4gKiByZWpvaW4gaW50ZXJ2YWwgZm9yIGluZGl2aWR1YWwgY2hhbm5lbHMuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5sb2dnZXJdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLCBpZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbihraW5kLCBtc2csIGRhdGEpIHtcbiAqICAgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubG9uZ3BvbGxlclRpbWVvdXRdIC0gVGhlIG1heGltdW0gdGltZW91dCBvZiBhIGxvbmcgcG9sbCBBSkFYIHJlcXVlc3QuXG4gKlxuICogRGVmYXVsdHMgdG8gMjBzIChkb3VibGUgdGhlIHNlcnZlciBsb25nIHBvbGwgdGltZXIpLlxuICpcbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbil9IFtvcHRzLnBhcmFtc10gLSBUaGUgb3B0aW9uYWwgcGFyYW1zIHRvIHBhc3Mgd2hlbiBjb25uZWN0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYXV0aFRva2VuXSAtIHRoZSBvcHRpb25hbCBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byBiZSBleHBvc2VkIG9uIHRoZSBzZXJ2ZXJcbiAqIHVuZGVyIHRoZSBgOmF1dGhfdG9rZW5gIGNvbm5lY3RfaW5mbyBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluYXJ5VHlwZV0gLSBUaGUgYmluYXJ5IHR5cGUgdG8gdXNlIGZvciBiaW5hcnkgV2ViU29ja2V0IGZyYW1lcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBcImFycmF5YnVmZmVyXCJcbiAqXG4gKiBAcGFyYW0ge3Zzbn0gW29wdHMudnNuXSAtIFRoZSBzZXJpYWxpemVyJ3MgcHJvdG9jb2wgdmVyc2lvbiB0byBzZW5kIG9uIGNvbm5lY3QuXG4gKlxuICogRGVmYXVsdHMgdG8gREVGQVVMVF9WU04uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFBob2VuaXggdXNlcyBzZXNzaW9uU3RvcmFnZSBmb3IgbG9uZ3BvbGwgZmFsbGJhY2sgaGlzdG9yeS4gT3ZlcnJpZGluZyB0aGUgc3RvcmUgaXNcbiAqIHVzZWZ1bCB3aGVuIFBob2VuaXggd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYHNlc3Npb25TdG9yYWdlYC4gRm9yIGV4YW1wbGUsIFRoaXMgY291bGRcbiAqIGhhcHBlbiBpZiBhIHNpdGUgbG9hZHMgYSBjcm9zcy1kb21haW4gY2hhbm5lbCBpbiBhbiBpZnJhbWUuIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gKiAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhpcy5zdG9yYWdlID0ge30gfVxuICogICAgICAgZ2V0SXRlbShrZXlOYW1lKSB7IHJldHVybiB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfHwgbnVsbCB9XG4gKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gKiAgICAgICBzZXRJdGVtKGtleU5hbWUsIGtleVZhbHVlKSB7IHRoaXMuc3RvcmFnZVtrZXlOYW1lXSA9IGtleVZhbHVlIH1cbiAqICAgICB9XG4gKlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRzID0ge30pe1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7b3BlbjogW10sIGNsb3NlOiBbXSwgZXJyb3I6IFtdLCBtZXNzYWdlOiBbXX1cbiAgICB0aGlzLmNoYW5uZWxzID0gW11cbiAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIHRoaXMucmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVRcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG9wdHMudHJhbnNwb3J0IHx8IGdsb2JhbC5XZWJTb2NrZXQgfHwgTG9uZ1BvbGxcbiAgICB0aGlzLnByaW1hcnlQYXNzZWRIZWFsdGhDaGVjayA9IGZhbHNlXG4gICAgdGhpcy5sb25nUG9sbEZhbGxiYWNrTXMgPSBvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc1xuICAgIHRoaXMuZmFsbGJhY2tUaW1lciA9IG51bGxcbiAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgKGdsb2JhbCAmJiBnbG9iYWwuc2Vzc2lvblN0b3JhZ2UpXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zID0gMFxuICAgIHRoaXMuZGVmYXVsdEVuY29kZXIgPSBTZXJpYWxpemVyLmVuY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5kZWZhdWx0RGVjb2RlciA9IFNlcmlhbGl6ZXIuZGVjb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgaWYoIXRoaXMubG9nZ2VyICYmIG9wdHMuZGVidWcpe1xuICAgICAgdGhpcy5sb2dnZXIgPSAoa2luZCwgbXNnLCBkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKSB9XG4gICAgfVxuICAgIHRoaXMubG9uZ3BvbGxlclRpbWVvdXQgPSBvcHRzLmxvbmdwb2xsZXJUaW1lb3V0IHx8IDIwMDAwXG4gICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKG9wdHMucGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuZW5kUG9pbnQgPSBgJHtlbmRQb2ludH0vJHtUUkFOU1BPUlRTLndlYnNvY2tldH1gXG4gICAgdGhpcy52c24gPSBvcHRzLnZzbiB8fCBERUZBVUxUX1ZTTlxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gbnVsbFxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLmNvbm5lY3QoKSlcbiAgICB9LCB0aGlzLnJlY29ubmVjdEFmdGVyTXMpXG4gICAgdGhpcy5hdXRoVG9rZW4gPSBvcHRzLmF1dGhUb2tlblxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIExvbmdQb2xsIHRyYW5zcG9ydCByZWZlcmVuY2VcbiAgICovXG4gIGdldExvbmdQb2xsVHJhbnNwb3J0KCl7IHJldHVybiBMb25nUG9sbCB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSB0cnVlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgdGhpcy5jb25uLmNsb3NlKClcbiAgICAgIHRoaXMuY29ubiA9IG51bGxcbiAgICB9XG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBzb2NrZXQgdXJsXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlbmRQb2ludFVSTCgpe1xuICAgIGxldCB1cmkgPSBBamF4LmFwcGVuZFBhcmFtcyhcbiAgICAgIEFqYXguYXBwZW5kUGFyYW1zKHRoaXMuZW5kUG9pbnQsIHRoaXMucGFyYW1zKCkpLCB7dnNuOiB0aGlzLnZzbn0pXG4gICAgaWYodXJpLmNoYXJBdCgwKSAhPT0gXCIvXCIpeyByZXR1cm4gdXJpIH1cbiAgICBpZih1cmkuY2hhckF0KDEpID09PSBcIi9cIil7IHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9OiR7dXJpfWAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06Ly8ke2xvY2F0aW9uLmhvc3R9JHt1cml9YFxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXRcbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50I1N0YXR1c19jb2RlcyBmb3IgdmFsaWQgc3RhdHVzIGNvZGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBzb2NrZXQgaXMgZGlzY29ubmVjdGVkLlxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGNvZGUgLSBBIHN0YXR1cyBjb2RlIGZvciBkaXNjb25uZWN0aW9uIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBBIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB0byBkaXNjb25uZWN0LiAoT3B0aW9uYWwpXG4gICAqL1xuICBkaXNjb25uZWN0KGNhbGxiYWNrLCBjb2RlLCByZWFzb24pe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSB0cnVlXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gdHJ1ZVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy50ZWFyZG93bigoKSA9PiB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH0sIGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBzZW5kIHdoZW4gY29ubmVjdGluZywgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiB1c2VyVG9rZW59YFxuICAgKlxuICAgKiBQYXNzaW5nIHBhcmFtcyB0byBjb25uZWN0IGlzIGRlcHJlY2F0ZWQ7IHBhc3MgdGhlbSBpbiB0aGUgU29ja2V0IGNvbnN0cnVjdG9yIGluc3RlYWQ6XG4gICAqIGBuZXcgU29ja2V0KFwiL3NvY2tldFwiLCB7cGFyYW1zOiB7dXNlcl9pZDogdXNlclRva2VufX0pYC5cbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKXtcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uICYmICF0aGlzLmRpc2Nvbm5lY3RpbmcpeyByZXR1cm4gfVxuICAgIGlmKHRoaXMubG9uZ1BvbGxGYWxsYmFja01zICYmIHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmNvbm5lY3RXaXRoRmFsbGJhY2soTG9uZ1BvbGwsIHRoaXMubG9uZ1BvbGxGYWxsYmFja01zKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zcG9ydENvbm5lY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlciAmJiB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFBpbmdzIHRoZSBzZXJ2ZXIgYW5kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGggdGhlIFJUVCBpbiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwaW5nIHdhcyBwdXNoZWQgb3IgZmFsc2UgaWYgdW5hYmxlIHRvIGJlIHB1c2hlZC5cbiAgICovXG4gIHBpbmcoY2FsbGJhY2spe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gZmFsc2UgfVxuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiByZWZ9KVxuICAgIGxldCBvbk1zZ1JlZiA9IHRoaXMub25NZXNzYWdlKG1zZyA9PiB7XG4gICAgICBpZihtc2cucmVmID09PSByZWYpe1xuICAgICAgICB0aGlzLm9mZihbb25Nc2dSZWZdKVxuICAgICAgICBjYWxsYmFjayhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB0cmFuc3BvcnRDb25uZWN0KCl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgbGV0IHByb3RvY29scyA9IHVuZGVmaW5lZFxuICAgIC8vIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgYmFzZWQgdG9rZW5cbiAgICAvLyAobG9uZ3BvbGwgdXNlcyBBdXRob3JpemF0aW9uIGhlYWRlciBpbnN0ZWFkKVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIHByb3RvY29scyA9IFtcInBob2VuaXhcIiwgYCR7QVVUSF9UT0tFTl9QUkVGSVh9JHtidG9hKHRoaXMuYXV0aFRva2VuKS5yZXBsYWNlKC89L2csIFwiXCIpfWBdXG4gICAgfVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCksIHByb3RvY29scylcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIGdldFNlc3Npb24oa2V5KXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JlICYmIHRoaXMuc2Vzc2lvblN0b3JlLmdldEl0ZW0oa2V5KSB9XG5cbiAgc3RvcmVTZXNzaW9uKGtleSwgdmFsKXsgdGhpcy5zZXNzaW9uU3RvcmUgJiYgdGhpcy5zZXNzaW9uU3RvcmUuc2V0SXRlbShrZXksIHZhbCkgfVxuXG4gIGNvbm5lY3RXaXRoRmFsbGJhY2soZmFsbGJhY2tUcmFuc3BvcnQsIGZhbGxiYWNrVGhyZXNob2xkID0gMjUwMCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICBsZXQgZXN0YWJsaXNoZWQgPSBmYWxzZVxuICAgIGxldCBwcmltYXJ5VHJhbnNwb3J0ID0gdHJ1ZVxuICAgIGxldCBvcGVuUmVmLCBlcnJvclJlZlxuICAgIGxldCBmYWxsYmFjayA9IChyZWFzb24pID0+IHtcbiAgICAgIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBmYWxsaW5nIGJhY2sgdG8gJHtmYWxsYmFja1RyYW5zcG9ydC5uYW1lfS4uLmAsIHJlYXNvbilcbiAgICAgIHRoaXMub2ZmKFtvcGVuUmVmLCBlcnJvclJlZl0pXG4gICAgICBwcmltYXJ5VHJhbnNwb3J0ID0gZmFsc2VcbiAgICAgIHRoaXMucmVwbGFjZVRyYW5zcG9ydChmYWxsYmFja1RyYW5zcG9ydClcbiAgICAgIHRoaXMudHJhbnNwb3J0Q29ubmVjdCgpXG4gICAgfVxuICAgIGlmKHRoaXMuZ2V0U2Vzc2lvbihgcGh4OmZhbGxiYWNrOiR7ZmFsbGJhY2tUcmFuc3BvcnQubmFtZX1gKSl7IHJldHVybiBmYWxsYmFjayhcIm1lbW9yaXplZFwiKSB9XG5cbiAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcblxuICAgIGVycm9yUmVmID0gdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImVycm9yXCIsIHJlYXNvbilcbiAgICAgIGlmKHByaW1hcnlUcmFuc3BvcnQgJiYgIWVzdGFibGlzaGVkKXtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICAgICAgZmFsbGJhY2socmVhc29uKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5vbk9wZW4oKCkgPT4ge1xuICAgICAgZXN0YWJsaXNoZWQgPSB0cnVlXG4gICAgICBpZighcHJpbWFyeVRyYW5zcG9ydCl7XG4gICAgICAgIC8vIG9ubHkgbWVtb3JpemUgTFAgaWYgd2UgbmV2ZXIgY29ubmVjdGVkIHRvIHByaW1hcnlcbiAgICAgICAgaWYoIXRoaXMucHJpbWFyeVBhc3NlZEhlYWx0aENoZWNrKXsgdGhpcy5zdG9yZVNlc3Npb24oYHBoeDpmYWxsYmFjazoke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9YCwgXCJ0cnVlXCIpIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBlc3RhYmxpc2hlZCAke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9IGZhbGxiYWNrYClcbiAgICAgIH1cbiAgICAgIC8vIGlmIHdlJ3ZlIGVzdGFibGlzaGVkIHByaW1hcnksIGdpdmUgdGhlIGZhbGxiYWNrIGEgbmV3IHBlcmlvZCB0byBhdHRlbXB0IHBpbmdcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcbiAgICAgIHRoaXMucGluZyhydHQgPT4ge1xuICAgICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNvbm5lY3RlZCB0byBwcmltYXJ5IGFmdGVyXCIsIHJ0dClcbiAgICAgICAgdGhpcy5wcmltYXJ5UGFzc2VkSGVhbHRoQ2hlY2sgPSB0cnVlXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy50cmFuc3BvcnRDb25uZWN0KClcbiAgfVxuXG4gIGNsZWFySGVhcnRiZWF0cygpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVyKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVvdXRUaW1lcilcbiAgfVxuXG4gIG9uQ29ubk9wZW4oKXtcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgJHt0aGlzLnRyYW5zcG9ydC5uYW1lfSBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZFBvaW50VVJMKCl9YClcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLnJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpLCBXU19DTE9TRV9OT1JNQUwsIFwiaGVhcnRiZWF0IHRpbWVvdXRcIilcbiAgICB9XG4gIH1cblxuICByZXNldEhlYXJ0YmVhdCgpe1xuICAgIGlmKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4uc2tpcEhlYXJ0YmVhdCl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMuY2xlYXJIZWFydGJlYXRzKClcbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgdGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgaWYoIXRoaXMuY29ubil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cbiAgICBsZXQgY29ubmVjdENsb2NrID0gdGhpcy5jb25uZWN0Q2xvY2tcblxuICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoKCkgPT4ge1xuICAgICAgaWYoY29ubmVjdENsb2NrICE9PSB0aGlzLmNvbm5lY3RDbG9jayl7IHJldHVybiB9XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKGNvbm5lY3RDbG9jayAhPT0gdGhpcy5jb25uZWN0Q2xvY2speyByZXR1cm4gfVxuICAgICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICAgIHRoaXMuY29ubi5vbm9wZW4gPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4gPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB3YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8ICF0aGlzLmNvbm4uYnVmZmVyZWRBbW91bnQpe1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhaXRGb3JCdWZmZXJEb25lKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICB3YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyA9IDEpe1xuICAgIGlmKHRyaWVzID09PSA1IHx8ICF0aGlzLmNvbm4gfHwgdGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMuY2xvc2VkKXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICBvbkNvbm5DbG9zZShldmVudCl7XG4gICAgbGV0IGNsb3NlQ29kZSA9IGV2ZW50ICYmIGV2ZW50LmNvZGVcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNsb3NlXCIsIGV2ZW50KVxuICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdHMoKVxuICAgIGlmKCF0aGlzLmNsb3NlV2FzQ2xlYW4gJiYgY2xvc2VDb2RlICE9PSAxMDAwKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMgIT09IGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3JlZnN9IC0gbGlzdCBvZiByZWZzIHJldHVybmVkIGJ5IGNhbGxzIHRvXG4gICAqICAgICAgICAgICAgICAgICBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYFxuICAgKi9cbiAgb2ZmKHJlZnMpe1xuICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mpe1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldLmZpbHRlcigoW3JlZl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnMuaW5kZXhPZihyZWYpID09PSAtMVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGEgbmV3IGNoYW5uZWwgZm9yIHRoZSBnaXZlbiB0b3BpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5QYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Q2hhbm5lbH1cbiAgICovXG4gIGNoYW5uZWwodG9waWMsIGNoYW5QYXJhbXMgPSB7fSl7XG4gICAgbGV0IGNoYW4gPSBuZXcgQ2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbilcbiAgICByZXR1cm4gY2hhblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBwdXNoKGRhdGEpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpe1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gZGF0YVxuICAgICAgdGhpcy5sb2coXCJwdXNoXCIsIGAke3RvcGljfSAke2V2ZW50fSAoJHtqb2luX3JlZn0sICR7cmVmfSlgLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goKCkgPT4gdGhpcy5lbmNvZGUoZGF0YSwgcmVzdWx0ID0+IHRoaXMuY29ubi5zZW5kKHJlc3VsdCkpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbWFrZVJlZigpe1xuICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDFcbiAgICBpZihuZXdSZWYgPT09IHRoaXMucmVmKXsgdGhpcy5yZWYgPSAwIH0gZWxzZSB7IHRoaXMucmVmID0gbmV3UmVmIH1cblxuICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpXG4gIH1cblxuICBzZW5kSGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmICYmICF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWZ9KVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgICAgIH1cblxuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJyZWNlaXZlXCIsIGAke3BheWxvYWQuc3RhdHVzIHx8IFwiXCJ9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmICYmIFwiKFwiICsgcmVmICsgXCIpXCIgfHwgXCJcIn1gLCBwYXlsb2FkKVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2ldXG4gICAgICAgIGlmKCFjaGFubmVsLmlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pbl9yZWYpKXsgY29udGludWUgfVxuICAgICAgICBjaGFubmVsLnRyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWYpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UubGVuZ3RoOyBpKyspe1xuICAgICAgICBsZXQgWywgY2FsbGJhY2tdID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlW2ldXG4gICAgICAgIGNhbGxiYWNrKG1zZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbGVhdmVPcGVuVG9waWModG9waWMpe1xuICAgIGxldCBkdXBDaGFubmVsID0gdGhpcy5jaGFubmVscy5maW5kKGMgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuaXNKb2luZWQoKSB8fCBjLmlzSm9pbmluZygpKSlcbiAgICBpZihkdXBDaGFubmVsKXtcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIiR7dG9waWN9XCJgKVxuICAgICAgZHVwQ2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIjtcbmV4cG9ydCBjb25zdCBNQVhfUkVMT0FEUyA9IDEwO1xuZXhwb3J0IGNvbnN0IFJFTE9BRF9KSVRURVJfTUlOID0gNTAwMDtcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01BWCA9IDEwMDAwO1xuZXhwb3J0IGNvbnN0IEZBSUxTQUZFX0pJVFRFUiA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IFBIWF9FVkVOVF9DTEFTU0VTID0gW1xuICBcInBoeC1jbGljay1sb2FkaW5nXCIsXG4gIFwicGh4LWNoYW5nZS1sb2FkaW5nXCIsXG4gIFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIsXG4gIFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFxuICBcInBoeC1rZXl1cC1sb2FkaW5nXCIsXG4gIFwicGh4LWJsdXItbG9hZGluZ1wiLFxuICBcInBoeC1mb2N1cy1sb2FkaW5nXCIsXG4gIFwicGh4LWhvb2stbG9hZGluZ1wiLFxuXTtcbmV4cG9ydCBjb25zdCBQSFhfQ09NUE9ORU5UID0gXCJkYXRhLXBoeC1jb21wb25lbnRcIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19SRUYgPSBcImRhdGEtcGh4LXZpZXdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSQUNLX1NUQVRJQyA9IFwidHJhY2stc3RhdGljXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJTktfU1RBVEUgPSBcImRhdGEtcGh4LWxpbmstc3RhdGVcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQURJTkcgPSBcImRhdGEtcGh4LXJlZi1sb2FkaW5nXCI7XG5leHBvcnQgY29uc3QgUEhYX1JFRl9TUkMgPSBcImRhdGEtcGh4LXJlZi1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQ0sgPSBcImRhdGEtcGh4LXJlZi1sb2NrXCI7XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfUkVGUyA9IFwicGh4LXBlbmRpbmctcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQTE9BRF9SRUYgPSBcImRhdGEtcGh4LXVwbG9hZC1yZWZcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJFRkxJR0hURURfUkVGUyA9IFwiZGF0YS1waHgtcHJlZmxpZ2h0ZWQtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9EUk9QX1RBUkdFVCA9IFwiZHJvcC10YXJnZXRcIjtcbmV4cG9ydCBjb25zdCBQSFhfQUNUSVZFX0VOVFJZX1JFRlMgPSBcImRhdGEtcGh4LWFjdGl2ZS1yZWZzXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfU0tJUCA9IFwiZGF0YS1waHgtc2tpcFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9NQUdJQ19JRCA9IFwiZGF0YS1waHgtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJVTkUgPSBcImRhdGEtcGh4LXBydW5lXCI7XG5leHBvcnQgY29uc3QgUEhYX0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWNvbm5lY3RlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MT0FESU5HX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCI7XG5leHBvcnQgY29uc3QgUEhYX0NMSUVOVF9FUlJPUl9DTEFTUyA9IFwicGh4LWNsaWVudC1lcnJvclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9TRVJWRVJfRVJST1JfQ0xBU1MgPSBcInBoeC1zZXJ2ZXItZXJyb3JcIjtcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfTUFJTiA9IFwiZGF0YS1waHgtbWFpblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ST09UX0lEID0gXCJkYXRhLXBoeC1yb290LWlkXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX1RPUCA9IFwidmlld3BvcnQtdG9wXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX0JPVFRPTSA9IFwidmlld3BvcnQtYm90dG9tXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9IQVNfRk9DVVNFRCA9IFwicGh4LWhhcy1mb2N1c2VkXCI7XG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcbiAgXCJ0ZXh0XCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJudW1iZXJcIixcbiAgXCJlbWFpbFwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwidGVsXCIsXG4gIFwidXJsXCIsXG4gIFwiZGF0ZVwiLFxuICBcInRpbWVcIixcbiAgXCJkYXRldGltZS1sb2NhbFwiLFxuICBcImNvbG9yXCIsXG4gIFwicmFuZ2VcIixcbl07XG5leHBvcnQgY29uc3QgQ0hFQ0tBQkxFX0lOUFVUUyA9IFtcImNoZWNrYm94XCIsIFwicmFkaW9cIl07XG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCI7XG5leHBvcnQgY29uc3QgUEhYX1NFU1NJT04gPSBcImRhdGEtcGh4LXNlc3Npb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19TRUxFQ1RPUiA9IGBbJHtQSFhfU0VTU0lPTn1dYDtcbmV4cG9ydCBjb25zdCBQSFhfU1RJQ0tZID0gXCJkYXRhLXBoeC1zdGlja3lcIjtcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVBRE9OTFkgPSBcImRhdGEtcGh4LXJlYWRvbmx5XCI7XG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVEID0gXCJkYXRhLXBoeC1kaXNhYmxlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSA9IFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIjtcbmV4cG9ydCBjb25zdCBQSFhfSE9PSyA9IFwiaG9va1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIjtcbmV4cG9ydCBjb25zdCBQSFhfVEhST1RUTEUgPSBcInRocm90dGxlXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQREFURSA9IFwidXBkYXRlXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTSA9IFwic3RyZWFtXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTV9SRUYgPSBcImRhdGEtcGh4LXN0cmVhbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9QT1JUQUwgPSBcImRhdGEtcGh4LXBvcnRhbFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1JFRiA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1NSQyA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZC1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUlVOVElNRV9IT09LID0gXCJkYXRhLXBoeC1ydW50aW1lLWhvb2tcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfUElEID0gXCJkYXRhLXBoeC1waWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJJVkFURSA9IFwicGh4UHJpdmF0ZVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9BVVRPX1JFQ09WRVIgPSBcImF1dG8tcmVjb3ZlclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCI7XG5leHBvcnQgY29uc3QgUEhYX0xWX1BST0ZJTEUgPSBcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfTEFURU5DWV9TSU0gPSBcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OID0gXCJwaHg6bmF2LWhpc3RvcnktcG9zaXRpb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJPR1JFU1MgPSBcInByb2dyZXNzXCI7XG5leHBvcnQgY29uc3QgUEhYX01PVU5URUQgPSBcIm1vdW50ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVMT0FEX1NUQVRVUyA9IFwiX19waG9lbml4X3JlbG9hZF9zdGF0dXNfX1wiO1xuZXhwb3J0IGNvbnN0IExPQURFUl9USU1FT1VUID0gMTtcbmV4cG9ydCBjb25zdCBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUyA9IDM7XG5leHBvcnQgY29uc3QgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCA9IDIwMDtcbmV4cG9ydCBjb25zdCBESVNDT05ORUNURURfVElNRU9VVCA9IDUwMDtcbmV4cG9ydCBjb25zdCBCSU5ESU5HX1BSRUZJWCA9IFwicGh4LVwiO1xuZXhwb3J0IGNvbnN0IFBVU0hfVElNRU9VVCA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IExJTktfSEVBREVSID0gXCJ4LXJlcXVlc3RlZC13aXRoXCI7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVVJMX0hFQURFUiA9IFwieC1yZXNwb25zZS11cmxcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9UUklHR0VSID0gXCJkZWJvdW5jZS10cmlnZ2VyXCI7XG5leHBvcnQgY29uc3QgVEhST1RUTEVEID0gXCJ0aHJvdHRsZWRcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9QUkVWX0tFWSA9IFwiZGVib3VuY2UtcHJldi1rZXlcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgZGVib3VuY2U6IDMwMCxcbiAgdGhyb3R0bGU6IDMwMCxcbn07XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfQVRUUlMgPSBbUEhYX1JFRl9MT0FESU5HLCBQSFhfUkVGX1NSQywgUEhYX1JFRl9MT0NLXTtcbi8vIFJlbmRlcmVkXG5leHBvcnQgY29uc3QgU1RBVElDID0gXCJzXCI7XG5leHBvcnQgY29uc3QgUk9PVCA9IFwiclwiO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIjtcbmV4cG9ydCBjb25zdCBLRVlFRCA9IFwia1wiO1xuZXhwb3J0IGNvbnN0IEtFWUVEX0NPVU5UID0gXCJrY1wiO1xuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiO1xuZXhwb3J0IGNvbnN0IFJFUExZID0gXCJyXCI7XG5leHBvcnQgY29uc3QgVElUTEUgPSBcInRcIjtcbmV4cG9ydCBjb25zdCBURU1QTEFURVMgPSBcInBcIjtcbmV4cG9ydCBjb25zdCBTVFJFQU0gPSBcInN0cmVhbVwiO1xuIiwgImltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW50cnlVcGxvYWRlciB7XG4gIGNvbnN0cnVjdG9yKGVudHJ5LCBjb25maWcsIGxpdmVTb2NrZXQpIHtcbiAgICBjb25zdCB7IGNodW5rX3NpemUsIGNodW5rX3RpbWVvdXQgfSA9IGNvbmZpZztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua19zaXplO1xuICAgIHRoaXMuY2h1bmtUaW1lb3V0ID0gY2h1bmtfdGltZW91dDtcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsO1xuICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbCA9IGxpdmVTb2NrZXQuY2hhbm5lbChgbHZ1OiR7ZW50cnkucmVmfWAsIHtcbiAgICAgIHRva2VuOiBlbnRyeS5tZXRhZGF0YSgpLFxuICAgIH0pO1xuICB9XG5cbiAgZXJyb3IocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKTtcbiAgICB0aGlzLmVycm9yZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpO1xuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKTtcbiAgfVxuXG4gIHVwbG9hZCgpIHtcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwub25FcnJvcigocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbFxuICAgICAgLmpvaW4oKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoX2RhdGEpID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCAocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG5cbiAgaXNEb25lKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZTtcbiAgfVxuXG4gIHJlYWROZXh0Q2h1bmsoKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKCk7XG4gICAgY29uc3QgYmxvYiA9IHRoaXMuZW50cnkuZmlsZS5zbGljZShcbiAgICAgIHRoaXMub2Zmc2V0LFxuICAgICAgdGhpcy5jaHVua1NpemUgKyB0aGlzLm9mZnNldCxcbiAgICApO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmVycm9yID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpLmJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMucHVzaENodW5rKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcihcIlJlYWQgZXJyb3I6IFwiICsgZS50YXJnZXQuZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG5cbiAgcHVzaENodW5rKGNodW5rKSB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZENoYW5uZWwuaXNKb2luZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWxcbiAgICAgIC5wdXNoKFwiY2h1bmtcIiwgY2h1bmssIHRoaXMuY2h1bmtUaW1lb3V0KVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVhZE5leHRDaHVuaygpLFxuICAgICAgICAgICAgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsICh7IHJlYXNvbiB9KSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUEhYX1ZJRVdfU0VMRUNUT1IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIjtcblxuZXhwb3J0IGNvbnN0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopO1xuXG5leHBvcnQgY29uc3QgaXNDaWQgPSAoY2lkKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgY2lkO1xuICByZXR1cm4gdHlwZSA9PT0gXCJudW1iZXJcIiB8fCAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAvXigwfFsxLTldXFxkKikkLy50ZXN0KGNpZCkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdER1cGxpY2F0ZUlkcygpIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKTtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGlkcy5oYXMoZWxlbXNbaV0uaWQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTXVsdGlwbGUgSURzIGRldGVjdGVkOiAke2VsZW1zW2ldLmlkfS4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzLmFkZChlbGVtc1tpXS5pZCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyhpbnNlcnRzKSB7XG4gIGNvbnN0IGVycm9ycyA9IG5ldyBTZXQoKTtcbiAgT2JqZWN0LmtleXMoaW5zZXJ0cykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICBjb25zdCBzdHJlYW1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoXG4gICAgICBzdHJlYW1FbCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJwaHgtdXBkYXRlXCIpICE9PSBcInN0cmVhbVwiXG4gICAgKSB7XG4gICAgICBlcnJvcnMuYWRkKFxuICAgICAgICBgVGhlIHN0cmVhbSBjb250YWluZXIgd2l0aCBpZCBcIiR7c3RyZWFtRWwucGFyZW50RWxlbWVudC5pZH1cIiBpcyBtaXNzaW5nIHRoZSBwaHgtdXBkYXRlPVwic3RyZWFtXCIgYXR0cmlidXRlLiBFbnN1cmUgaXQgaXMgc2V0IGZvciBzdHJlYW1zIHRvIHdvcmsgcHJvcGVybHkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbiAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWJ1ZyA9ICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4ge1xuICBpZiAodmlldy5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopO1xuICB9XG59O1xuXG4vLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGNvbnN0IGNsb3N1cmUgPSAodmFsKSA9PlxuICB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IHZhbFxuICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfTtcblxuZXhwb3J0IGNvbnN0IGNsb25lID0gKG9iaikgPT4ge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbG9zZXN0UGh4QmluZGluZyA9IChlbCwgYmluZGluZywgYm9yZGVyRWwpID0+IHtcbiAgZG8ge1xuICAgIGlmIChlbC5tYXRjaGVzKGBbJHtiaW5kaW5nfV1gKSAmJiAhZWwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGU7XG4gIH0gd2hpbGUgKFxuICAgIGVsICE9PSBudWxsICYmXG4gICAgZWwubm9kZVR5cGUgPT09IDEgJiZcbiAgICAhKChib3JkZXJFbCAmJiBib3JkZXJFbC5pc1NhbWVOb2RlKGVsKSkgfHwgZWwubWF0Y2hlcyhQSFhfVklFV19TRUxFQ1RPUikpXG4gICk7XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgIShvYmogaW5zdGFuY2VvZiBBcnJheSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PlxuICBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMik7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IgKGNvbnN0IHggaW4gb2JqKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlID0gKGVsLCBjYWxsYmFjaykgPT4gZWwgJiYgY2FsbGJhY2soZWwpO1xuXG5leHBvcnQgY29uc3QgY2hhbm5lbFVwbG9hZGVyID0gZnVuY3Rpb24gKGVudHJpZXMsIG9uRXJyb3IsIHJlc3AsIGxpdmVTb2NrZXQpIHtcbiAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGVudHJ5VXBsb2FkZXIgPSBuZXcgRW50cnlVcGxvYWRlcihlbnRyeSwgcmVzcC5jb25maWcsIGxpdmVTb2NrZXQpO1xuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKCk7XG4gIH0pO1xufTtcbiIsICJjb25zdCBCcm93c2VyID0ge1xuICBjYW5QdXNoU3RhdGUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBoaXN0b3J5LnB1c2hTdGF0ZSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfSxcblxuICBkcm9wTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSk7XG4gIH0sXG5cbiAgdXBkYXRlTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSwgaW5pdGlhbCwgZnVuYykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IG5ld1ZhbCA9IGN1cnJlbnQgPT09IG51bGwgPyBpbml0aWFsIDogZnVuYyhjdXJyZW50KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG5ld1ZhbCkpO1xuICAgIHJldHVybiBuZXdWYWw7XG4gIH0sXG5cbiAgZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpKSk7XG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmNhblB1c2hTdGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgICAgY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksXG4gICAgICBcIlwiLFxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgKTtcbiAgfSxcblxuICBwdXNoU3RhdGUoa2luZCwgbWV0YSwgdG8pIHtcbiAgICBpZiAodGhpcy5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgaWYgKHRvICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xuICAgICAgICBpZiAobWV0YS50eXBlID09IFwicmVkaXJlY3RcIiAmJiBtZXRhLnNjcm9sbCkge1xuICAgICAgICAgIC8vIElmIHdlJ3JlIHJlZGlyZWN0aW5nIHN0b3JlIHRoZSBjdXJyZW50IHNjcm9sbFkgZm9yIHRoZSBjdXJyZW50IGhpc3Rvcnkgc3RhdGUuXG4gICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZSB8fCB7fTtcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2Nyb2xsID0gbWV0YS5zY3JvbGw7XG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgbWV0YS5zY3JvbGw7IC8vIE9ubHkgc3RvcmUgdGhlIHNjcm9sbCBpbiB0aGUgcmVkaXJlY3QgY2FzZS5cbiAgICAgICAgaGlzdG9yeVtraW5kICsgXCJTdGF0ZVwiXShtZXRhLCBcIlwiLCB0byB8fCBudWxsKTsgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbmF2aWdhdGUsIHdlJ2QgY2FsbCBwdXNoU3RhdGUgaW1tZWRpYXRlbHkgYmVmb3JlIHBhdGNoaW5nIHRoZSBET00sXG4gICAgICAgIC8vIGp1bXBpbmcgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBwYWdlLCBlZmZlY3RpdmVseSBpZ25vcmluZyB0aGUgc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSAoYWZ0ZXIgdGhlIERPTSBwYXRjaCkgYW5kIG9ubHkgdGhlbiB0cnlcbiAgICAgICAgLy8gdG8gc2Nyb2xsIHRvIHRoZSBoYXNoRWxcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzaEVsID0gdGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXG4gICAgICAgICAgaWYgKGhhc2hFbCkge1xuICAgICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXRhLnR5cGUgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZGlyZWN0KHRvKTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlLCBtYXhBZ2VTZWNvbmRzKSB7XG4gICAgY29uc3QgZXhwaXJlcyA9XG4gICAgICB0eXBlb2YgbWF4QWdlU2Vjb25kcyA9PT0gXCJudW1iZXJcIiA/IGAgbWF4LWFnZT0ke21heEFnZVNlY29uZHN9O2AgOiBcIlwiO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7dmFsdWV9OyR7ZXhwaXJlc30gcGF0aD0vYDtcbiAgfSxcblxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYCg/Oig/Ol58Lio7XFxzKikke25hbWV9XFxzKlxcPVxccyooW147XSopLiokKXxeLiokYCksXG4gICAgICBcIiQxXCIsXG4gICAgKTtcbiAgfSxcblxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgbWF4LWFnZT0tMTsgcGF0aD0vYDtcbiAgfSxcblxuICByZWRpcmVjdChcbiAgICB0b1VSTCxcbiAgICBmbGFzaCxcbiAgICBuYXZpZ2F0ZSA9ICh1cmwpID0+IHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgIH0sXG4gICkge1xuICAgIGlmIChmbGFzaCkge1xuICAgICAgdGhpcy5zZXRDb29raWUoXCJfX3Bob2VuaXhfZmxhc2hfX1wiLCBmbGFzaCwgNjApO1xuICAgIH1cbiAgICBuYXZpZ2F0ZSh0b1VSTCk7XG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpIHtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gO1xuICB9LFxuXG4gIGdldEhhc2hUYXJnZXRFbChtYXliZUhhc2gpIHtcbiAgICBjb25zdCBoYXNoID0gbWF5YmVIYXNoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgIGlmIChoYXNoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gICAgKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXI7XG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9WSUVXX1JFRixcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BSSVZBVEUsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVGX0xPQ0ssXG4gIFBIWF9QRU5ESU5HX0FUVFJTLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1NUSUNLWSxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFRIUk9UVExFRCxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1NUUkVBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgRE9NID0ge1xuICBieUlkKGlkKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCk7XG4gIH0sXG5cbiAgcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICBpZiAoZWwuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgYXJyYXkuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfSxcblxuICBjaGlsZE5vZGVMZW5ndGgoaHRtbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnQ7XG4gIH0sXG5cbiAgaXNVcGxvYWRJbnB1dChlbCkge1xuICAgIHJldHVybiBlbC50eXBlID09PSBcImZpbGVcIiAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQXV0b1VwbG9hZChpbnB1dEVsKSB7XG4gICAgcmV0dXJuIGlucHV0RWwuaGFzQXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIik7XG4gIH0sXG5cbiAgZmluZFVwbG9hZElucHV0cyhub2RlKSB7XG4gICAgY29uc3QgZm9ybUlkID0gbm9kZS5pZDtcbiAgICBjb25zdCBpbnB1dHNPdXRzaWRlRm9ybSA9IHRoaXMuYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgaW5wdXRbdHlwZT1cImZpbGVcIl1bJHtQSFhfVVBMT0FEX1JFRn1dW2Zvcm09XCIke2Zvcm1JZH1cIl1gLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWxsKG5vZGUsIGBpbnB1dFt0eXBlPVwiZmlsZVwiXVske1BIWF9VUExPQURfUkVGfV1gKS5jb25jYXQoXG4gICAgICBpbnB1dHNPdXRzaWRlRm9ybSxcbiAgICApO1xuICB9LFxuXG4gIGZpbmRDb21wb25lbnROb2RlTGlzdCh2aWV3SWQsIGNpZCwgZG9jID0gZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoXG4gICAgICBkb2MsXG4gICAgICBgWyR7UEhYX1ZJRVdfUkVGfT1cIiR7dmlld0lkfVwiXVske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdYCxcbiAgICApO1xuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5pZCAmJiBET00ucHJpdmF0ZShub2RlLCBcImRlc3Ryb3llZFwiKSA/IHRydWUgOiBmYWxzZTtcbiAgfSxcblxuICB3YW50c05ld1RhYihlKSB7XG4gICAgY29uc3Qgd2FudHNOZXdUYWIgPVxuICAgICAgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IChlLmJ1dHRvbiAmJiBlLmJ1dHRvbiA9PT0gMSk7XG4gICAgY29uc3QgaXNEb3dubG9hZCA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmXG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkb3dubG9hZFwiKTtcbiAgICBjb25zdCBpc1RhcmdldEJsYW5rID1cbiAgICAgIGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInRhcmdldFwiKSAmJlxuICAgICAgZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpLnRvTG93ZXJDYXNlKCkgPT09IFwiX2JsYW5rXCI7XG4gICAgY29uc3QgaXNUYXJnZXROYW1lZFRhYiA9XG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0YXJnZXRcIikgJiZcbiAgICAgICFlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIikuc3RhcnRzV2l0aChcIl9cIik7XG4gICAgcmV0dXJuIHdhbnRzTmV3VGFiIHx8IGlzVGFyZ2V0QmxhbmsgfHwgaXNEb3dubG9hZCB8fCBpc1RhcmdldE5hbWVkVGFiO1xuICB9LFxuXG4gIGlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkge1xuICAgIC8vIElnbm9yZSBmb3JtIHN1Ym1pc3Npb25zIGludGVuZGVkIHRvIGNsb3NlIGEgbmF0aXZlIDxkaWFsb2c+IGVsZW1lbnRcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvZGlhbG9nI3VzYWdlX25vdGVzXG4gICAgY29uc3QgaXNEaWFsb2dTdWJtaXQgPVxuICAgICAgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSA9PT0gXCJkaWFsb2dcIikgfHxcbiAgICAgIChlLnN1Ym1pdHRlciAmJiBlLnN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpID09PSBcImRpYWxvZ1wiKTtcblxuICAgIGlmIChpc0RpYWxvZ1N1Ym1pdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy53YW50c05ld1RhYihlKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNOZXdQYWdlQ2xpY2soZSwgY3VycmVudExvY2F0aW9uKSB7XG4gICAgY29uc3QgaHJlZiA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50XG4gICAgICAgID8gZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IHVybDtcblxuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQgfHwgaHJlZiA9PT0gbnVsbCB8fCB0aGlzLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJtYWlsdG86XCIpIHx8IGhyZWYuc3RhcnRzV2l0aChcInRlbDpcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGhyZWYsIGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYmFkIFVSTCwgZmFsbGJhY2sgdG8gbGV0IGJyb3dzZXIgdHJ5IGl0IGFzIGV4dGVybmFsXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHVybC5ob3N0ID09PSBjdXJyZW50TG9jYXRpb24uaG9zdCAmJlxuICAgICAgdXJsLnByb3RvY29sID09PSBjdXJyZW50TG9jYXRpb24ucHJvdG9jb2xcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdXJsLnBhdGhuYW1lID09PSBjdXJyZW50TG9jYXRpb24ucGF0aG5hbWUgJiZcbiAgICAgICAgdXJsLnNlYXJjaCA9PT0gY3VycmVudExvY2F0aW9uLnNlYXJjaFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB1cmwuaGFzaCA9PT0gXCJcIiAmJiAhdXJsLmhyZWYuZW5kc1dpdGgoXCIjXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsLnByb3RvY29sLnN0YXJ0c1dpdGgoXCJodHRwXCIpO1xuICB9LFxuXG4gIG1hcmtQaHhDaGlsZERlc3Ryb3llZChlbCkge1xuICAgIGlmICh0aGlzLmlzUGh4Q2hpbGQoZWwpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiZGVzdHJveWVkXCIsIHRydWUpO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0aGlzLmZpbmRQaHhDaGlsZHJlbih0ZW1wbGF0ZS5jb250ZW50LCBwYXJlbnRJZCk7XG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpIHx8IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXVwZGF0ZVwiKSkgPT09XG4gICAgICBcImlnbm9yZVwiXG4gICAgKTtcbiAgfSxcblxuICBpc1BoeFVwZGF0ZShlbCwgcGh4VXBkYXRlLCB1cGRhdGVUeXBlcykge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUgJiYgdXBkYXRlVHlwZXMuaW5kZXhPZihlbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkgPj0gMFxuICAgICk7XG4gIH0sXG5cbiAgZmluZFBoeFN0aWNreShlbCkge1xuICAgIHJldHVybiB0aGlzLmFsbChlbCwgYFske1BIWF9TVElDS1l9XWApO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbihlbCwgcGFyZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKTtcbiAgfSxcblxuICBmaW5kRXhpc3RpbmdQYXJlbnRDSURzKHZpZXdJZCwgY2lkcykge1xuICAgIC8vIHdlIG9ubHkgd2FudCB0byBmaW5kIHBhcmVudHMgdGhhdCBleGlzdCBvbiB0aGUgcGFnZVxuICAgIC8vIGlmIGEgY2lkIGlzIG5vdCBvbiB0aGUgcGFnZSwgdGhlIG9ubHkgd2F5IGl0IGNhbiBiZSBhZGRlZCBiYWNrIHRvIHRoZSBwYWdlXG4gICAgLy8gaXMgaWYgYSBwYXJlbnQgYWRkcyBpdCBiYWNrLCB0aGVyZWZvcmUgaWYgYSBjaWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHBhZ2UsXG4gICAgLy8gd2Ugc2hvdWxkIG5vdCB0cnkgdG8gcmVuZGVyIGl0IGJ5IGl0c2VsZiAoYmVjYXVzZSBpdCB3b3VsZCBiZSByZW5kZXJlZCB0d2ljZSxcbiAgICAvLyBvbmUgYnkgdGhlIHBhcmVudCwgYW5kIGEgc2Vjb25kIHRpbWUgYnkgaXRzZWxmKVxuICAgIGNvbnN0IHBhcmVudENpZHMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgY2hpbGRyZW5DaWRzID0gbmV3IFNldCgpO1xuXG4gICAgY2lkcy5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuYWxsKFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3ZpZXdJZH1cIl1bJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWAsXG4gICAgICApLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgICBwYXJlbnRDaWRzLmFkZChjaWQpO1xuICAgICAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHtQSFhfVklFV19SRUZ9PVwiJHt2aWV3SWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgICAgICAubWFwKChlbCkgPT4gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpKSlcbiAgICAgICAgICAuZm9yRWFjaCgoY2hpbGRDSUQpID0+IGNoaWxkcmVuQ2lkcy5hZGQoY2hpbGRDSUQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGRyZW5DaWRzLmZvckVhY2goKGNoaWxkQ2lkKSA9PiBwYXJlbnRDaWRzLmRlbGV0ZShjaGlsZENpZCkpO1xuXG4gICAgcmV0dXJuIHBhcmVudENpZHM7XG4gIH0sXG5cbiAgcHJpdmF0ZShlbCwga2V5KSB7XG4gICAgcmV0dXJuIGVsW1BIWF9QUklWQVRFXSAmJiBlbFtQSFhfUFJJVkFURV1ba2V5XTtcbiAgfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpIHtcbiAgICBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIGVsW1BIWF9QUklWQVRFXVtrZXldO1xuICB9LFxuXG4gIHB1dFByaXZhdGUoZWwsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsW1BIWF9QUklWQVRFXSkge1xuICAgICAgZWxbUEhYX1BSSVZBVEVdID0ge307XG4gICAgfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWU7XG4gIH0sXG5cbiAgdXBkYXRlUHJpdmF0ZShlbCwga2V5LCBkZWZhdWx0VmFsLCB1cGRhdGVGdW5jKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGRlZmF1bHRWYWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZXhpc3RpbmcpKTtcbiAgICB9XG4gIH0sXG5cbiAgc3luY1BlbmRpbmdBdHRycyhmcm9tRWwsIHRvRWwpIHtcbiAgICBpZiAoIWZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgZnJvbUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICYmIHRvRWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0pO1xuICAgIFBIWF9QRU5ESU5HX0FUVFJTLmZpbHRlcigoYXR0cikgPT4gZnJvbUVsLmhhc0F0dHJpYnV0ZShhdHRyKSkuZm9yRWFjaChcbiAgICAgIChhdHRyKSA9PiB7XG4gICAgICAgIHRvRWwuc2V0QXR0cmlidXRlKGF0dHIsIGZyb21FbC5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgfSxcbiAgICApO1xuICB9LFxuXG4gIGNvcHlQcml2YXRlcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmIChzb3VyY2VbUEhYX1BSSVZBVEVdKSB7XG4gICAgICB0YXJnZXRbUEhYX1BSSVZBVEVdID0gc291cmNlW1BIWF9QUklWQVRFXTtcbiAgICB9XG4gIH0sXG5cbiAgcHV0VGl0bGUoc3RyKSB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICBpZiAodGl0bGVFbCkge1xuICAgICAgY29uc3QgeyBwcmVmaXgsIHN1ZmZpeCwgZGVmYXVsdDogZGVmYXVsdFRpdGxlIH0gPSB0aXRsZUVsLmRhdGFzZXQ7XG4gICAgICBjb25zdCBpc0VtcHR5ID0gdHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiB8fCBzdHIudHJpbSgpID09PSBcIlwiO1xuICAgICAgaWYgKGlzRW1wdHkgJiYgdHlwZW9mIGRlZmF1bHRUaXRsZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlubmVyID0gaXNFbXB0eSA/IGRlZmF1bHRUaXRsZSA6IHN0cjtcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtpbm5lciB8fCBcIlwifSR7c3VmZml4IHx8IFwiXCJ9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQudGl0bGUgPSBzdHI7XG4gICAgfVxuICB9LFxuXG4gIGRlYm91bmNlKFxuICAgIGVsLFxuICAgIGV2ZW50LFxuICAgIHBoeERlYm91bmNlLFxuICAgIGRlZmF1bHREZWJvdW5jZSxcbiAgICBwaHhUaHJvdHRsZSxcbiAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgYXN5bmNGaWx0ZXIsXG4gICAgY2FsbGJhY2ssXG4gICkge1xuICAgIGxldCBkZWJvdW5jZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhEZWJvdW5jZSk7XG4gICAgbGV0IHRocm90dGxlID0gZWwuZ2V0QXR0cmlidXRlKHBoeFRocm90dGxlKTtcblxuICAgIGlmIChkZWJvdW5jZSA9PT0gXCJcIikge1xuICAgICAgZGVib3VuY2UgPSBkZWZhdWx0RGVib3VuY2U7XG4gICAgfVxuICAgIGlmICh0aHJvdHRsZSA9PT0gXCJcIikge1xuICAgICAgdGhyb3R0bGUgPSBkZWZhdWx0VGhyb3R0bGU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gZGVib3VuY2UgfHwgdGhyb3R0bGU7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBudWxsOlxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcblxuICAgICAgY2FzZSBcImJsdXJcIjpcbiAgICAgICAgdGhpcy5pbmNDeWNsZShlbCwgXCJkZWJvdW5jZS1ibHVyLWN5Y2xlXCIsICgpID0+IHtcbiAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImRlYm91bmNlLWJsdXJcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PlxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIFwiZGVib3VuY2UtYmx1ci1jeWNsZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9ICgpID0+XG4gICAgICAgICAgdGhyb3R0bGUgPyB0aGlzLmRlbGV0ZVByaXZhdGUoZWwsIFRIUk9UVExFRCkgOiBjYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBjdXJyZW50Q3ljbGUgPSB0aGlzLmluY0N5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCB0cmlnZ2VyKTtcbiAgICAgICAgaWYgKGlzTmFOKHRpbWVvdXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKGBpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aHJvdHRsZSkge1xuICAgICAgICAgIGxldCBuZXdLZXlEb3duID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSk7XG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZLCBldmVudC5rZXkpO1xuICAgICAgICAgICAgbmV3S2V5RG93biA9IHByZXZLZXkgIT09IGV2ZW50LmtleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5ld0tleURvd24gJiYgdGhpcy5wcml2YXRlKGVsLCBUSFJPVFRMRUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChhc3luY0ZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgY3VycmVudEN5Y2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm0gPSBlbC5mb3JtO1xuICAgICAgICBpZiAoZm9ybSAmJiB0aGlzLm9uY2UoZm9ybSwgXCJiaW5kLWRlYm91bmNlXCIpKSB7XG4gICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsICgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20obmV3IEZvcm1EYXRhKGZvcm0pLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke25hbWV9XCJdYCk7XG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVByaXZhdGUoaW5wdXQsIFRIUk9UVExFRCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImJpbmQtZGVib3VuY2VcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBiZWNhdXNlIHdlIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGhlcmUsXG4gICAgICAgICAgICAvLyB3ZSBhbHNvIGNsZWFyIHRoZSB0aHJvdHRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAvLyBmcm9tIGJlaW5nIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgdGltZW91dCBmaXJlc1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJpdmF0ZShlbCwgVEhST1RUTEVEKSk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSkge1xuICAgIGNvbnN0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKCFjdXJyZW50Q3ljbGUpIHtcbiAgICAgIGN1cnJlbnRDeWNsZSA9IGN5Y2xlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEN5Y2xlID09PSBjeWNsZSkge1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KTtcbiAgICAgIHRyaWdnZXIoKTtcbiAgICB9XG4gIH0sXG5cbiAgb25jZShlbCwga2V5KSB7XG4gICAgaWYgKHRoaXMucHJpdmF0ZShlbCwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgaW5jQ3ljbGUoZWwsIGtleSwgdHJpZ2dlciA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXTtcbiAgICBjdXJyZW50Q3ljbGUrKztcbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgW2N1cnJlbnRDeWNsZSwgdHJpZ2dlcl0pO1xuICAgIHJldHVybiBjdXJyZW50Q3ljbGU7XG4gIH0sXG5cbiAgLy8gbWFpbnRhaW5zIG9yIGFkZHMgcHJpdmF0ZWx5IHVzZWQgaG9vayBpbmZvcm1hdGlvblxuICAvLyBmcm9tRWwgYW5kIHRvRWwgY2FuIGJlIHRoZSBzYW1lIGVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBuZXdseSBhZGRlZCBub2RlXG4gIC8vIGZyb21FbCBhbmQgdG9FbCBjYW4gYmUgYW55IEhUTUwgbm9kZSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgYW4gZWxlbWVudCBub2RlXG4gIG1haW50YWluUHJpdmF0ZUhvb2tzKGZyb21FbCwgdG9FbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKSB7XG4gICAgLy8gbWFpbnRhaW4gdGhlIGhvb2tzIGNyZWF0ZWQgd2l0aCBjcmVhdGVIb29rXG4gICAgaWYgKFxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIikgJiZcbiAgICAgICF0b0VsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIilcbiAgICApIHtcbiAgICAgIHRvRWwuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiLCBmcm9tRWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiKSk7XG4gICAgfVxuICAgIC8vIGFkZCBob29rcyB0byBlbGVtZW50cyB3aXRoIHZpZXdwb3J0IGF0dHJpYnV0ZXNcbiAgICBpZiAoXG4gICAgICB0b0VsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgKHRvRWwuaGFzQXR0cmlidXRlKHBoeFZpZXdwb3J0VG9wKSB8fFxuICAgICAgICB0b0VsLmhhc0F0dHJpYnV0ZShwaHhWaWV3cG9ydEJvdHRvbSkpXG4gICAgKSB7XG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJQaG9lbml4LkluZmluaXRlU2Nyb2xsXCIpO1xuICAgIH1cbiAgfSxcblxuICBwdXRDdXN0b21FbEhvb2soZWwsIGhvb2spIHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxuICAgICAgICBob29rIGF0dGFjaGVkIHRvIG5vbi1jb25uZWN0ZWQgRE9NIGVsZW1lbnRcbiAgICAgICAgZW5zdXJlIHlvdSBhcmUgY2FsbGluZyBjcmVhdGVIb29rIHdpdGhpbiB5b3VyIGNvbm5lY3RlZENhbGxiYWNrLiAke2VsLm91dGVySFRNTH1cbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiY3VzdG9tLWVsLWhvb2tcIiwgaG9vayk7XG4gIH0sXG5cbiAgZ2V0Q3VzdG9tRWxIb29rKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJpdmF0ZShlbCwgXCJjdXN0b20tZWwtaG9va1wiKTtcbiAgfSxcblxuICBpc1VzZWRJbnB1dChlbCkge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICh0aGlzLnByaXZhdGUoZWwsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGVsLCBQSFhfSEFTX1NVQk1JVFRFRCkpXG4gICAgKTtcbiAgfSxcblxuICByZXNldEZvcm0oZm9ybSkge1xuICAgIEFycmF5LmZyb20oZm9ybS5lbGVtZW50cykuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VEKTtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19TVUJNSVRURUQpO1xuICAgIH0pO1xuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSkge1xuICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKTtcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TVElDS1kpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQ2hpbGRPZkFueShlbCwgcGFyZW50cykge1xuICAgIHJldHVybiAhIXBhcmVudHMuZmluZCgocGFyZW50KSA9PiBwYXJlbnQuY29udGFpbnMoZWwpKTtcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQaHhDaGlsZChlbCkgPyBlbCA6IHRoaXMuYWxsKGVsLCBgWyR7UEhYX1BBUkVOVF9JRH1dYClbMF07XG4gIH0sXG5cbiAgaXNQb3J0YWxUZW1wbGF0ZShlbCkge1xuICAgIHJldHVybiBlbC50YWdOYW1lID09PSBcIlRFTVBMQVRFXCIgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICB9LFxuXG4gIGNsb3Nlc3RWaWV3RWwoZWwpIHtcbiAgICAvLyBmaW5kIHRoZSBjbG9zZXN0IHBvcnRhbCBvciB2aWV3IGVsZW1lbnQsIHdoaWNoZXZlciBjb21lcyBmaXJzdFxuICAgIGNvbnN0IHBvcnRhbE9yVmlld0VsID0gZWwuY2xvc2VzdChcbiAgICAgIGBbJHtQSFhfVEVMRVBPUlRFRF9SRUZ9XSwke1BIWF9WSUVXX1NFTEVDVE9SfWAsXG4gICAgKTtcbiAgICBpZiAoIXBvcnRhbE9yVmlld0VsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAvLyBQSFhfVEVMRVBPUlRFRF9SRUYgaXMgc2V0IHRvIHRoZSBpZCBvZiB0aGUgdmlldyB0aGF0IG93bnMgdGhlIHBvcnRhbCBlbGVtZW50XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKHBvcnRhbE9yVmlld0VsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKTtcbiAgICB9IGVsc2UgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfU0VTU0lPTikpIHtcbiAgICAgIHJldHVybiBwb3J0YWxPclZpZXdFbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudCh0YXJnZXQsIG5hbWUsIG9wdHMgPSB7fSkge1xuICAgIGxldCBkZWZhdWx0QnViYmxlID0gdHJ1ZTtcbiAgICBjb25zdCBpc1VwbG9hZFRhcmdldCA9XG4gICAgICB0YXJnZXQubm9kZU5hbWUgPT09IFwiSU5QVVRcIiAmJiB0YXJnZXQudHlwZSA9PT0gXCJmaWxlXCI7XG4gICAgaWYgKGlzVXBsb2FkVGFyZ2V0ICYmIG5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgZGVmYXVsdEJ1YmJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBidWJibGVzID0gb3B0cy5idWJibGVzID09PSB1bmRlZmluZWQgPyBkZWZhdWx0QnViYmxlIDogISFvcHRzLmJ1YmJsZXM7XG4gICAgY29uc3QgZXZlbnRPcHRzID0ge1xuICAgICAgYnViYmxlczogYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICBkZXRhaWw6IG9wdHMuZGV0YWlsIHx8IHt9LFxuICAgIH07XG4gICAgY29uc3QgZXZlbnQgPVxuICAgICAgbmFtZSA9PT0gXCJjbGlja1wiXG4gICAgICAgID8gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCBldmVudE9wdHMpXG4gICAgICAgIDogbmV3IEN1c3RvbUV2ZW50KG5hbWUsIGV2ZW50T3B0cyk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKSB7XG4gICAgaWYgKHR5cGVvZiBodG1sID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsb25lZCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgIGNsb25lZC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gIH0sXG5cbiAgLy8gbWVyZ2UgYXR0cmlidXRlcyBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbiAgLy8gaWYgYW4gZWxlbWVudCBpcyBpZ25vcmVkLCB3ZSBvbmx5IG1lcmdlIGRhdGEgYXR0cmlidXRlc1xuICAvLyBpbmNsdWRpbmcgcmVtb3ZpbmcgZGF0YSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgc291cmNlXG4gIG1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBuZXcgU2V0KG9wdHMuZXhjbHVkZSB8fCBbXSk7XG4gICAgY29uc3QgaXNJZ25vcmVkID0gb3B0cy5pc0lnbm9yZWQ7XG4gICAgY29uc3Qgc291cmNlQXR0cnMgPSBzb3VyY2UuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKCFleGNsdWRlLmhhcyhuYW1lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQuZ2V0QXR0cmlidXRlKG5hbWUpICE9PSBzb3VyY2VWYWx1ZSAmJlxuICAgICAgICAgICghaXNJZ25vcmVkIHx8IChpc0lnbm9yZWQgJiYgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UgZXhjbHVkZSB0aGUgdmFsdWUgZnJvbSBiZWluZyBtZXJnZWQgb24gZm9jdXNlZCBpbnB1dHMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIHVzZXIncyBpbnB1dCBzaG91bGQgYWx3YXlzIHdpbi5cbiAgICAgICAgLy8gV2UgY2FuIHN0aWxsIGFzc2lnbiBpdCBhcyBsb25nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc2FtZSwgdGhvdWdoLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSB1cGRhdGVkIGhvb2sgaXMgbm90IGJlaW5nIHRyaWdnZXJlZFxuICAgICAgICAvLyB3aGVuIGFuIGlucHV0IGlzIGJhY2sgaW4gaXRzIFwib3JpZ2luYWwgc3RhdGVcIiwgYmVjYXVzZSB0aGUgYXR0cmlidXRlXG4gICAgICAgIC8vIHdhcyBuZXZlciBjaGFuZ2VkLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8yMTYzXG4gICAgICAgIGlmIChuYW1lID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS52YWx1ZSA/PyBzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgIGlmICh0YXJnZXQudmFsdWUgPT09IHNvdXJjZVZhbHVlKSB7XG4gICAgICAgICAgICAvLyBhY3R1YWxseSBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byBzeW5jIGl0IHdpdGggdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gdGFyZ2V0QXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXRBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKGlzSWdub3JlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiZcbiAgICAgICAgICAhc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSAmJlxuICAgICAgICAgICFQSFhfUEVORElOR19BVFRSUy5pbmNsdWRlcyhuYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1lcmdlRm9jdXNlZElucHV0KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHsgZXhjbHVkZTogW1widmFsdWVcIl0gfSk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZS5yZWFkT25seSkge1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIik7XG4gICAgfVxuICB9LFxuXG4gIGhhc1NlbGVjdGlvblJhbmdlKGVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlICYmIChlbC50eXBlID09PSBcInRleHRcIiB8fCBlbC50eXBlID09PSBcInRleHRhcmVhXCIpXG4gICAgKTtcbiAgfSxcblxuICByZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkge1xuICAgIGlmIChmb2N1c2VkIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcbiAgICAgIGZvY3VzZWQuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKCFET00uaXNUZXh0dWFsSW5wdXQoZm9jdXNlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpO1xuICAgIGlmICghd2FzRm9jdXNlZCkge1xuICAgICAgZm9jdXNlZC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSkge1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNGb3JtSW5wdXQoZWwpIHtcbiAgICBpZiAoZWwubG9jYWxOYW1lICYmIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpKSB7XG4gICAgICAvLyBDdXN0b20gRWxlbWVudHMgbWF5IGJlIGZvcm0gYXNzb2NpYXRlZC4gVGhpcyBhbGxvd3MgdGhlbVxuICAgICAgLy8gdG8gcGFydGljaXBhdGUgd2l0aGluIGEgZm9ybSdzIGxpZmVjeWNsZSwgaW5jbHVkaW5nIGZvcm1cbiAgICAgIC8vIHZhbGlkaXR5IGFuZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAgLy8gVGhlIHNwZWMgZm9yIEZvcm0gQXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgcmVxdWlyZXMgdGhlXG4gICAgICAvLyBjdXN0b20gZWxlbWVudCdzIGNsYXNzIHRvIGNvbnRhaW4gYSBzdGF0aWMgYm9vbGVhbiB2YWx1ZSBvZiBgZm9ybUFzc29jaWF0ZWRgXG4gICAgICAvLyB3aGljaCBpZGVudGlmaWVzIHRoaXMgY2xhc3MgYXMgYWxsb3dlZCB0byBhc3NvY2lhdGUgdG8gYSBmb3JtLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvZGV2L2N1c3RvbS1lbGVtZW50cy5odG1sI2N1c3RvbS1lbGVtZW50cy1mYWNlLWV4YW1wbGVcbiAgICAgIC8vIGZvciBkZXRhaWxzLlxuICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpW2Bmb3JtQXNzb2NpYXRlZGBdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiXG4gICAgKTtcbiAgfSxcblxuICBzeW5jQXR0cnNUb1Byb3BzKGVsKSB7XG4gICAgaWYgKFxuICAgICAgZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBDSEVDS0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA+PSAwXG4gICAgKSB7XG4gICAgICBlbC5jaGVja2VkID0gZWwuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSAhPT0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgaXNUZXh0dWFsSW5wdXQoZWwpIHtcbiAgICByZXR1cm4gRk9DVVNBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDA7XG4gIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWwuZ2V0QXR0cmlidXRlICYmXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUocGh4VHJpZ2dlckV4dGVybmFsKSAhPT0gbnVsbCAmJlxuICAgICAgZG9jdW1lbnQuYm9keS5jb250YWlucyhlbClcbiAgICApO1xuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSkge1xuICAgIGlmIChcbiAgICAgIERPTS5pc1BoeFVwZGF0ZShjb250YWluZXIsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiLCBQSFhfU1RSRUFNXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgICBjb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFjaGlsZE5vZGUuaWQpIHtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5VGV4dE5vZGUgPVxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJlxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVWYWx1ZS50cmltKCkgPT09IFwiXCI7XG4gICAgICAgICAgaWYgKCFpc0VtcHR5VGV4dE5vZGUgJiYgY2hpbGROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgICAgIFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIiArXG4gICAgICAgICAgICAgICAgYHJlbW92aW5nIGlsbGVnYWwgbm9kZTogXCIkeyhjaGlsZE5vZGUub3V0ZXJIVE1MIHx8IGNoaWxkTm9kZS5ub2RlVmFsdWUpLnRyaW0oKX1cIlxcblxcbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdG9SZW1vdmUuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiBjaGlsZE5vZGUucmVtb3ZlKCkpO1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhZ05hbWUsIGF0dHJzKSB7XG4gICAgY29uc3QgcmV0YWluZWRBdHRycyA9IG5ldyBTZXQoW1xuICAgICAgXCJpZFwiLFxuICAgICAgUEhYX1NFU1NJT04sXG4gICAgICBQSFhfU1RBVElDLFxuICAgICAgUEhYX01BSU4sXG4gICAgICBQSFhfUk9PVF9JRCxcbiAgICBdKTtcbiAgICBpZiAoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBBcnJheS5mcm9tKGNvbnRhaW5lci5hdHRyaWJ1dGVzKVxuICAgICAgICAuZmlsdGVyKChhdHRyKSA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpKTtcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSkpO1xuXG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKGF0dHIpID0+XG4gICAgICAgIG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pLFxuICAgICAgKTtcbiAgICAgIHJldGFpbmVkQXR0cnMuZm9yRWFjaCgoYXR0cikgPT5cbiAgICAgICAgbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSxcbiAgICAgICk7XG4gICAgICBuZXdDb250YWluZXIuaW5uZXJIVE1MID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChuZXdDb250YWluZXIpO1xuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0U3RpY2t5KGVsLCBuYW1lLCBkZWZhdWx0VmFsKSB7XG4gICAgY29uc3Qgb3AgPSAoRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpIHx8IFtdKS5maW5kKFxuICAgICAgKFtleGlzdGluZ05hbWVdKSA9PiBuYW1lID09PSBleGlzdGluZ05hbWUsXG4gICAgKTtcbiAgICBpZiAob3ApIHtcbiAgICAgIGNvbnN0IFtfbmFtZSwgX29wLCBzdGFzaGVkUmVzdWx0XSA9IG9wO1xuICAgICAgcmV0dXJuIHN0YXNoZWRSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbCA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbCgpIDogZGVmYXVsdFZhbDtcbiAgICB9XG4gIH0sXG5cbiAgZGVsZXRlU3RpY2t5KGVsLCBuYW1lKSB7XG4gICAgdGhpcy51cGRhdGVQcml2YXRlKGVsLCBcInN0aWNreVwiLCBbXSwgKG9wcykgPT4ge1xuICAgICAgcmV0dXJuIG9wcy5maWx0ZXIoKFtleGlzdGluZ05hbWUsIF9dKSA9PiBleGlzdGluZ05hbWUgIT09IG5hbWUpO1xuICAgIH0pO1xuICB9LFxuXG4gIHB1dFN0aWNreShlbCwgbmFtZSwgb3ApIHtcbiAgICBjb25zdCBzdGFzaGVkUmVzdWx0ID0gb3AoZWwpO1xuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIChvcHMpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBvcHMuZmluZEluZGV4KFxuICAgICAgICAoW2V4aXN0aW5nTmFtZV0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAgIG9wc1tleGlzdGluZ0luZGV4XSA9IFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChbbmFtZSwgb3AsIHN0YXNoZWRSZXN1bHRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHM7XG4gICAgfSk7XG4gIH0sXG5cbiAgYXBwbHlTdGlja3lPcGVyYXRpb25zKGVsKSB7XG4gICAgY29uc3Qgb3BzID0gRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpO1xuICAgIGlmICghb3BzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3BzLmZvckVhY2goKFtuYW1lLCBvcCwgX3N0YXNoZWRdKSA9PiB0aGlzLnB1dFN0aWNreShlbCwgbmFtZSwgb3ApKTtcbiAgfSxcblxuICBpc0xvY2tlZChlbCkge1xuICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBET007XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgY2hhbm5lbFVwbG9hZGVyLCBsb2dFcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRFbnRyeSB7XG4gIHN0YXRpYyBpc0FjdGl2ZShmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBpc05ldyA9IGZpbGUuX3BoeFJlZiA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGl2ZVJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwO1xuICAgIHJldHVybiBmaWxlLnNpemUgPiAwICYmIChpc05ldyB8fCBpc0FjdGl2ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWxcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpXG4gICAgICAuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzUHJlZmxpZ2h0ZWQgPVxuICAgICAgcHJlZmxpZ2h0ZWRSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDA7XG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpO1xuICB9XG5cbiAgc3RhdGljIGlzUHJlZmxpZ2h0SW5Qcm9ncmVzcyhmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPT09IHRydWU7XG4gIH1cblxuICBzdGF0aWMgbWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZmlsZSkge1xuICAgIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZmlsZUVsLCBmaWxlLCB2aWV3LCBhdXRvVXBsb2FkKSB7XG4gICAgdGhpcy5yZWYgPSBMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKTtcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbDtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgdGhpcy5tZXRhID0gbnVsbDtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Byb2dyZXNzID0gMDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gLTE7XG4gICAgdGhpcy5fb25Eb25lID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5maWxlRWwuYWRkRXZlbnRMaXN0ZW5lcihQSFhfTElWRV9GSUxFX1VQREFURUQsIHRoaXMuX29uRWxVcGRhdGVkKTtcbiAgICB0aGlzLmF1dG9VcGxvYWQgPSBhdXRvVXBsb2FkO1xuICB9XG5cbiAgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgfVxuXG4gIHByb2dyZXNzKHByb2dyZXNzKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKTtcbiAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPiB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50KSB7XG4gICAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPj0gMTAwKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzID0gMTAwO1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwO1xuICAgICAgICB0aGlzLl9pc0RvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIDEwMCwgKCkgPT4ge1xuICAgICAgICAgIExpdmVVcGxvYWRlci51bnRyYWNrRmlsZSh0aGlzLmZpbGVFbCwgdGhpcy5maWxlKTtcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQ2FuY2VsbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9vbkRvbmUoKTtcbiAgfVxuXG4gIGlzRG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEb25lO1xuICB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIikge1xuICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZCk7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7IGVycm9yOiByZWFzb24gfSk7XG4gICAgaWYgKCF0aGlzLmlzQXV0b1VwbG9hZCgpKSB7XG4gICAgICBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyh0aGlzLmZpbGVFbCk7XG4gICAgfVxuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkRvbmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVFbC5yZW1vdmVFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG5cbiAgb25FbFVwZGF0ZWQoKSB7XG4gICAgY29uc3QgYWN0aXZlUmVmcyA9IHRoaXMuZmlsZUVsXG4gICAgICAuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUylcbiAgICAgIC5zcGxpdChcIixcIik7XG4gICAgaWYgKGFjdGl2ZVJlZnMuaW5kZXhPZih0aGlzLnJlZikgPT09IC0xKSB7XG4gICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9tb2RpZmllZDogdGhpcy5maWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWU6IHRoaXMuZmlsZS5uYW1lLFxuICAgICAgcmVsYXRpdmVfcGF0aDogdGhpcy5maWxlLndlYmtpdFJlbGF0aXZlUGF0aCxcbiAgICAgIHNpemU6IHRoaXMuZmlsZS5zaXplLFxuICAgICAgdHlwZTogdGhpcy5maWxlLnR5cGUsXG4gICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgbWV0YTogdHlwZW9mIHRoaXMuZmlsZS5tZXRhID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmZpbGUubWV0YSgpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICB1cGxvYWRlcih1cGxvYWRlcnMpIHtcbiAgICBpZiAodGhpcy5tZXRhLnVwbG9hZGVyKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9XG4gICAgICAgIHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IHRoaXMubWV0YS51cGxvYWRlciwgY2FsbGJhY2s6IGNhbGxiYWNrIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiY2hhbm5lbFwiLCBjYWxsYmFjazogY2hhbm5lbFVwbG9hZGVyIH07XG4gICAgfVxuICB9XG5cbiAgemlwUG9zdEZsaWdodChyZXNwKSB7XG4gICAgdGhpcy5tZXRhID0gcmVzcC5lbnRyaWVzW3RoaXMucmVmXTtcbiAgICBpZiAoIXRoaXMubWV0YSkge1xuICAgICAgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7XG4gICAgICAgIGlucHV0OiB0aGlzLmZpbGVFbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3AsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfRE9ORV9SRUZTLFxuICBQSFhfUFJFRkxJR0hURURfUkVGUyxcbiAgUEhYX1VQTE9BRF9SRUYsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQge30gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIjtcblxubGV0IGxpdmVVcGxvYWRlckZpbGVSZWYgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlVXBsb2FkZXIge1xuICBzdGF0aWMgZ2VuRmlsZVJlZihmaWxlKSB7XG4gICAgY29uc3QgcmVmID0gZmlsZS5fcGh4UmVmO1xuICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBmaWxlLl9waHhSZWY7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEVudHJ5RGF0YVVSTChpbnB1dEVsLCByZWYsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYWN0aXZlRmlsZXMoaW5wdXRFbCkuZmluZChcbiAgICAgIChmaWxlKSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZixcbiAgICApO1xuICAgIGNhbGxiYWNrKFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpO1xuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkge1xuICAgIGxldCBhY3RpdmUgPSAwO1xuICAgIERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbCkuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT1cbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpXG4gICAgICApIHtcbiAgICAgICAgYWN0aXZlKys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZSA+IDA7XG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpO1xuICAgIGNvbnN0IGZpbGVEYXRhID0ge307XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7IHBhdGg6IGlucHV0RWwubmFtZSB9O1xuICAgICAgY29uc3QgdXBsb2FkUmVmID0gaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpO1xuICAgICAgZmlsZURhdGFbdXBsb2FkUmVmXSA9IGZpbGVEYXRhW3VwbG9hZFJlZl0gfHwgW107XG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSk7XG4gICAgICBlbnRyeS5sYXN0X21vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQ7XG4gICAgICBlbnRyeS5uYW1lID0gZmlsZS5uYW1lIHx8IGVudHJ5LnJlZjtcbiAgICAgIGVudHJ5LnJlbGF0aXZlX3BhdGggPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aDtcbiAgICAgIGVudHJ5LnR5cGUgPSBmaWxlLnR5cGU7XG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplO1xuICAgICAgaWYgKHR5cGVvZiBmaWxlLm1ldGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbnRyeS5tZXRhID0gZmlsZS5tZXRhKCk7XG4gICAgICB9XG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWxlRGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpIHtcbiAgICBpbnB1dEVsLnZhbHVlID0gbnVsbDtcbiAgICBpbnB1dEVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRik7XG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSk7XG4gIH1cblxuICBzdGF0aWMgdW50cmFja0ZpbGUoaW5wdXRFbCwgZmlsZSkge1xuICAgIERPTS5wdXRQcml2YXRlKFxuICAgICAgaW5wdXRFbCxcbiAgICAgIFwiZmlsZXNcIixcbiAgICAgIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKChmKSA9PiAhT2JqZWN0LmlzKGYsIGZpbGUpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXRFbFxuICAgKiBAcGFyYW0ge0FycmF5PEZpbGV8QmxvYj59IGZpbGVzXG4gICAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBbZGF0YVRyYW5zZmVyXVxuICAgKi9cbiAgc3RhdGljIHRyYWNrRmlsZXMoaW5wdXRFbCwgZmlsZXMsIGRhdGFUcmFuc2Zlcikge1xuICAgIGlmIChpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcihcbiAgICAgICAgKGZpbGUpID0+ICF0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoKGYpID0+IE9iamVjdC5pcyhmLCBmaWxlKSksXG4gICAgICApO1xuICAgICAgRE9NLnVwZGF0ZVByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSwgKGV4aXN0aW5nKSA9PlxuICAgICAgICBleGlzdGluZy5jb25jYXQobmV3RmlsZXMpLFxuICAgICAgKTtcbiAgICAgIGlucHV0RWwudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBpbnB1dEVsIGZpbGVzIHRvIGFsaWduIG91dHB1dCB3aXRoIHByb2dyYW1tYXRpYyBjaGFuZ2VzIChpLmUuIGRyYWcgYW5kIGRyb3ApXG4gICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlucHV0RWwuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9XG4gICAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpIHtcbiAgICBjb25zdCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoXG4gICAgICAoZWwpID0+IGVsLmZpbGVzICYmIHRoaXMuYWN0aXZlRmlsZXMoZWwpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhY3RpdmVGaWxlcyhpbnB1dCkge1xuICAgIHJldHVybiAoRE9NLnByaXZhdGUoaW5wdXQsIFwiZmlsZXNcIikgfHwgW10pLmZpbHRlcigoZikgPT5cbiAgICAgIFVwbG9hZEVudHJ5LmlzQWN0aXZlKGlucHV0LCBmKSxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGlucHV0c0F3YWl0aW5nUHJlZmxpZ2h0KGZvcm1FbCkge1xuICAgIGNvbnN0IGZpbGVJbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihcbiAgICAgIChpbnB1dCkgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwLFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgIVVwbG9hZEVudHJ5LmlzUHJlZmxpZ2h0ZWQoaW5wdXQsIGYpICYmXG4gICAgICAgICFVcGxvYWRFbnRyeS5pc1ByZWZsaWdodEluUHJvZ3Jlc3MoZiksXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBtYXJrUHJlZmxpZ2h0SW5Qcm9ncmVzcyhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gVXBsb2FkRW50cnkubWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZW50cnkuZmlsZSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoaW5wdXRFbCwgdmlldywgb25Db21wbGV0ZSkge1xuICAgIHRoaXMuYXV0b1VwbG9hZCA9IERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCk7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlO1xuICAgIHRoaXMuX2VudHJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgTGl2ZVVwbG9hZGVyLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXRFbCkgfHwgW10sXG4gICAgKS5tYXAoKGZpbGUpID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3LCB0aGlzLmF1dG9VcGxvYWQpKTtcblxuICAgIC8vIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGUgcHJlZmxpZ2h0IHJlcXVlc3RzXG4gICAgTGl2ZVVwbG9hZGVyLm1hcmtQcmVmbGlnaHRJblByb2dyZXNzKHRoaXMuX2VudHJpZXMpO1xuXG4gICAgdGhpcy5udW1FbnRyaWVzSW5Qcm9ncmVzcyA9IHRoaXMuX2VudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICBlbnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzO1xuICB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCkge1xuICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS5pc0NhbmNlbGxlZCgpKSB7XG4gICAgICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICB0aGlzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuemlwUG9zdEZsaWdodChyZXNwKTtcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS07XG4gICAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBncm91cGVkRW50cmllcyA9IHRoaXMuX2VudHJpZXMucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgICBpZiAoIWVudHJ5Lm1ldGEpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbmFtZSwgY2FsbGJhY2sgfSA9IGVudHJ5LnVwbG9hZGVyKGxpdmVTb2NrZXQudXBsb2FkZXJzKTtcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7IGNhbGxiYWNrOiBjYWxsYmFjaywgZW50cmllczogW10gfTtcbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIGVudHJpZXMgfSA9IGdyb3VwZWRFbnRyaWVzW25hbWVdO1xuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldCk7XG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgQVJJQSA9IHtcbiAgYW55T2YoaW5zdGFuY2UsIGNsYXNzZXMpIHtcbiAgICByZXR1cm4gY2xhc3Nlcy5maW5kKChuYW1lKSA9PiBpbnN0YW5jZSBpbnN0YW5jZW9mIG5hbWUpO1xuICB9LFxuXG4gIGlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWwucmVsICE9PSBcImlnbm9yZVwiKSB8fFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFyZWFFbGVtZW50ICYmIGVsLmhyZWYgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICghZWwuZGlzYWJsZWQgJiZcbiAgICAgICAgdGhpcy5hbnlPZihlbCwgW1xuICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgICAgICAgICBIVE1MQnV0dG9uRWxlbWVudCxcbiAgICAgICAgXSkpIHx8XG4gICAgICBlbCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50IHx8XG4gICAgICAoZWwudGFiSW5kZXggPj0gMCAmJiBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpIHx8XG4gICAgICAoIWludGVyYWN0aXZlT25seSAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAhPT0gbnVsbCAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpXG4gICAgKTtcbiAgfSxcblxuICBhdHRlbXB0Rm9jdXMoZWwsIGludGVyYWN0aXZlT25seSkge1xuICAgIGlmICh0aGlzLmlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIHRoYXQncyBmaW5lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5pc1NhbWVOb2RlKGVsKTtcbiAgfSxcblxuICBmb2N1c0ZpcnN0SW50ZXJhY3RpdmUoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCwgdHJ1ZSkgfHwgdGhpcy5mb2N1c0ZpcnN0SW50ZXJhY3RpdmUoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxuXG4gIGZvY3VzRmlyc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCkgfHwgdGhpcy5mb2N1c0ZpcnN0KGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgfSxcblxuICBmb2N1c0xhc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgaWYgKHRoaXMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCB0aGlzLmZvY3VzTGFzdChjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEFSSUE7XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuaW1wb3J0IEFSSUEgZnJvbSBcIi4vYXJpYVwiO1xuXG5jb25zdCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUyk7XG4gICAgfSxcblxuICAgIHByZWZsaWdodGVkUmVmcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfUFJFRkxJR0hURURfUkVGUyk7XG4gICAgfSxcblxuICAgIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlZCgpIHtcbiAgICAgIGNvbnN0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpO1xuICAgICAgaWYgKHRoaXMucHJlZmxpZ2h0ZWRXYXMgIT09IG5ld1ByZWZsaWdodHMpIHtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHM7XG4gICAgICAgIGlmIChuZXdQcmVmbGlnaHRzID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcoKS5jYW5jZWxTdWJtaXQodGhpcy5lbC5mb3JtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3RpdmVSZWZzKCkgPT09IFwiXCIpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCkpO1xuICAgIH0sXG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCkge1xuICAgICAgdGhpcy5yZWYgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWVudHJ5LXJlZlwiKTtcbiAgICAgIHRoaXMuaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLmdldEVudHJ5RGF0YVVSTCh0aGlzLmlucHV0RWwsIHRoaXMucmVmLCAodXJsKSA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveWVkKCkge1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnVybCk7XG4gICAgfSxcbiAgfSxcbiAgRm9jdXNXcmFwOiB7XG4gICAgbW91bnRlZCgpIHtcbiAgICAgIHRoaXMuZm9jdXNTdGFydCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICB0aGlzLmZvY3VzRW5kID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgdGhpcy5mb2N1c1N0YXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgQVJJQS5hdHRlbXB0Rm9jdXMobmV4dEZvY3VzKSB8fCBBUklBLmZvY3VzRmlyc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzTGFzdCh0aGlzLmVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvY3VzRW5kLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBTaGlmdCtUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIEFSSUEuYXR0ZW1wdEZvY3VzKG5leHRGb2N1cykgfHwgQVJJQS5mb2N1c0xhc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzRmlyc3QodGhpcy5lbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gb25seSB0cnkgdG8gY2hhbmdlIHRoZSBmb2N1cyBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnNpZGVcbiAgICAgIGlmICghdGhpcy5lbC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6c2hvdy1lbmRcIiwgKCkgPT4gdGhpcy5lbC5mb2N1cygpKTtcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgQVJJQS5mb2N1c0ZpcnN0KHRoaXMuZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IGZpbmRTY3JvbGxDb250YWluZXIgPSAoZWwpID0+IHtcbiAgLy8gdGhlIHNjcm9sbCBldmVudCB3b24ndCBiZSBmaXJlZCBvbiB0aGUgaHRtbC9ib2R5IGVsZW1lbnQgZXZlbiBpZiBvdmVyZmxvdyBpcyBzZXRcbiAgLy8gdGhlcmVmb3JlIHdlIHJldHVybiBudWxsIHRvIGluc3RlYWQgbGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzIG9uIGRvY3VtZW50XG4gIGlmIChbXCJIVE1MXCIsIFwiQk9EWVwiXS5pbmRleE9mKGVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpID49IDApIHJldHVybiBudWxsO1xuICBpZiAoW1wic2Nyb2xsXCIsIFwiYXV0b1wiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWwpLm92ZXJmbG93WSkgPj0gMClcbiAgICByZXR1cm4gZWw7XG4gIHJldHVybiBmaW5kU2Nyb2xsQ29udGFpbmVyKGVsLnBhcmVudEVsZW1lbnQpO1xufTtcblxuY29uc3Qgc2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG4gIH1cbn07XG5cbmNvbnN0IGJvdHRvbSA9IChzY3JvbGxDb250YWluZXIpID0+IHtcbiAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xuICAgIHJldHVybiBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xuICB9IGVsc2Uge1xuICAgIC8vIHdoZW4gd2UgaGF2ZSBubyBjb250YWluZXIsIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSBib3R0b20gY29vcmRpbmF0ZSBpcyB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICB9XG59O1xuXG5jb25zdCB0b3AgPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmIChzY3JvbGxDb250YWluZXIpIHtcbiAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aGVuIHdlIGhhdmUgbm8gY29udGFpbmVyIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSB0b3AgY29vcmRpbmF0ZSBpcyAwXG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbmNvbnN0IGlzQXRWaWV3cG9ydFRvcCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5jb25zdCBpc0F0Vmlld3BvcnRCb3R0b20gPSAoZWwsIHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiAoXG4gICAgTWF0aC5jZWlsKHJlY3QuYm90dG9tKSA+PSB0b3Aoc2Nyb2xsQ29udGFpbmVyKSAmJlxuICAgIE1hdGguY2VpbChyZWN0LmxlZnQpID49IDAgJiZcbiAgICBNYXRoLmZsb29yKHJlY3QuYm90dG9tKSA8PSBib3R0b20oc2Nyb2xsQ29udGFpbmVyKVxuICApO1xufTtcblxuY29uc3QgaXNXaXRoaW5WaWV3cG9ydCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5Ib29rcy5JbmZpbml0ZVNjcm9sbCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGZpbmRTY3JvbGxDb250YWluZXIodGhpcy5lbCk7XG4gICAgbGV0IHNjcm9sbEJlZm9yZSA9IHNjcm9sbFRvcCh0aGlzLnNjcm9sbENvbnRhaW5lcik7XG4gICAgbGV0IHRvcE92ZXJyYW4gPSBmYWxzZTtcbiAgICBjb25zdCB0aHJvdHRsZUludGVydmFsID0gNTAwO1xuICAgIGxldCBwZW5kaW5nT3AgPSBudWxsO1xuXG4gICAgY29uc3Qgb25Ub3BPdmVycnVuID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAodG9wRXZlbnQsIGZpcnN0Q2hpbGQpID0+IHtcbiAgICAgICAgcGVuZGluZ09wID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkLCBfb3ZlcnJhbjogdHJ1ZSB9LFxuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nT3AgPSBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25GaXJzdENoaWxkQXRUb3AgPSB0aGlzLnRocm90dGxlKFxuICAgICAgdGhyb3R0bGVJbnRlcnZhbCxcbiAgICAgICh0b3BFdmVudCwgZmlyc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkIH0sXG4gICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdPcCA9IG51bGw7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIHBhdGNoZWQgYnkgd2FpdGluZyBmb3IgdGhlIG5leHQgdGlja1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNXaXRoaW5WaWV3cG9ydChmaXJzdENoaWxkLCB0aGlzLnNjcm9sbENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgICBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBvbkxhc3RDaGlsZEF0Qm90dG9tID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAoYm90dG9tRXZlbnQsIGxhc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBsYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogXCJlbmRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCBib3R0b21FdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBsYXN0Q2hpbGQuaWQgfSxcbiAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ09wID0gbnVsbDtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgcGF0Y2hlZCBieSB3YWl0aW5nIGZvciB0aGUgbmV4dCB0aWNrXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1dpdGhpblZpZXdwb3J0KGxhc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpKSB7XG4gICAgICAgICAgICAgICAgbGFzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiZW5kXCIgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5vblNjcm9sbCA9IChfZSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsTm93ID0gc2Nyb2xsVG9wKHRoaXMuc2Nyb2xsQ29udGFpbmVyKTtcblxuICAgICAgaWYgKHBlbmRpbmdPcCkge1xuICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgICAgIHJldHVybiBwZW5kaW5nT3AoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9wRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC10b3BcIiksXG4gICAgICApO1xuICAgICAgY29uc3QgYm90dG9tRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC1ib3R0b21cIiksXG4gICAgICApO1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsTm93IDwgc2Nyb2xsQmVmb3JlO1xuICAgICAgY29uc3QgaXNTY3JvbGxpbmdEb3duID0gc2Nyb2xsTm93ID4gc2Nyb2xsQmVmb3JlO1xuXG4gICAgICAvLyBlbCBvdmVycmFuIHdoaWxlIHNjcm9sbGluZyB1cFxuICAgICAgaWYgKGlzU2Nyb2xsaW5nVXAgJiYgdG9wRXZlbnQgJiYgIXRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPj0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gdHJ1ZTtcbiAgICAgICAgb25Ub3BPdmVycnVuKHRvcEV2ZW50LCBmaXJzdENoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTY3JvbGxpbmdEb3duICYmIHRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPD0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdG9wRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdVcCAmJlxuICAgICAgICBpc0F0Vmlld3BvcnRUb3AoZmlyc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpXG4gICAgICApIHtcbiAgICAgICAgb25GaXJzdENoaWxkQXRUb3AodG9wRXZlbnQsIGZpcnN0Q2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgYm90dG9tRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdEb3duICYmXG4gICAgICAgIGlzQXRWaWV3cG9ydEJvdHRvbShsYXN0Q2hpbGQsIHRoaXMuc2Nyb2xsQ29udGFpbmVyKVxuICAgICAgKSB7XG4gICAgICAgIG9uTGFzdENoaWxkQXRCb3R0b20oYm90dG9tRXZlbnQsIGxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3llZCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgIH1cbiAgfSxcblxuICB0aHJvdHRsZShpbnRlcnZhbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgbGFzdENhbGxBdCA9IDA7XG4gICAgbGV0IHRpbWVyO1xuXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVtYWluaW5nVGltZSA9IGludGVydmFsIC0gKG5vdyAtIGxhc3RDYWxsQXQpO1xuXG4gICAgICBpZiAocmVtYWluaW5nVGltZSA8PSAwIHx8IHJlbWFpbmluZ1RpbWUgPiBpbnRlcnZhbCkge1xuICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsYXN0Q2FsbEF0ID0gbm93O1xuICAgICAgICBjYWxsYmFjayguLi5hcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGFzdENhbGxBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGNhbGxiYWNrKC4uLmFyZ3MpO1xuICAgICAgICB9LCByZW1haW5pbmdUaW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEhvb2tzO1xuIiwgImltcG9ydCB7XG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1BFTkRJTkdfUkVGUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX1JFQURPTkxZLFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbGVtZW50UmVmIHtcbiAgc3RhdGljIG9uVW5sb2NrKGVsLCBjYWxsYmFjaykge1xuICAgIGlmICghRE9NLmlzTG9ja2VkKGVsKSAmJiAhZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RMb2NrID0gZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKTtcbiAgICBjb25zdCByZWYgPSBjbG9zZXN0TG9ja1xuICAgICAgLmNsb3Nlc3QoYFske1BIWF9SRUZfTE9DS31dYClcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLKTtcbiAgICBjbG9zZXN0TG9jay5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDp1bmRvLWxvY2s6JHtyZWZ9YCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sXG4gICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5sb2FkaW5nUmVmID0gZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORylcbiAgICAgID8gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyksIDEwKVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMubG9ja1JlZiA9IGVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spXG4gICAgICA/IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spLCAxMClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIG1heWJlVW5kbyhyZWYsIHBoeEV2ZW50LCBlYWNoQ2xvbmVDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5pc1dpdGhpbihyZWYpKSB7XG4gICAgICAvLyB3ZSBjYW5ub3QgdW5kbyB0aGUgbG9jayAvIGxvYWRpbmcgbm93LCBhcyB0aGVyZSBpcyBhIG5ld2VyIG9uZSBhbHJlYWR5IHNldDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHJlZiB3ZSB0cmllZCB0byBzZW5kIHRoZSB1bmRvIGV2ZW50IGxhdGVyXG4gICAgICBET00udXBkYXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUEVORElOR19SRUZTLCBbXSwgKHBlbmRpbmdSZWZzKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdW5kbyBsb2NrcyBhbmQgYXBwbHkgY2xvbmVzXG4gICAgdGhpcy51bmRvTG9ja3MocmVmLCBwaHhFdmVudCwgZWFjaENsb25lQ2FsbGJhY2spO1xuXG4gICAgLy8gdW5kbyBsb2FkaW5nIHN0YXRlc1xuICAgIHRoaXMudW5kb0xvYWRpbmcocmVmLCBwaHhFdmVudCk7XG5cbiAgICAvLyBlbnN1cmUgdW5kbyBldmVudHMgYXJlIGZpcmVkIGZvciBwZW5kaW5nIHJlZnMgdGhhdFxuICAgIC8vIGFyZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCByZWYsIG90aGVyd2lzZSB3ZSdkIGxlYWsgZXZlbnQgbGlzdGVuZXJzXG4gICAgRE9NLnVwZGF0ZVByaXZhdGUodGhpcy5lbCwgUEhYX1BFTkRJTkdfUkVGUywgW10sIChwZW5kaW5nUmVmcykgPT4ge1xuICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzLmZpbHRlcigocGVuZGluZ1JlZikgPT4ge1xuICAgICAgICBsZXQgb3B0cyA9IHtcbiAgICAgICAgICBkZXRhaWw6IHsgcmVmOiBwZW5kaW5nUmVmLCBldmVudDogcGh4RXZlbnQgfSxcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nUmVmICYmIHRoaXMubG9hZGluZ1JlZiA+IHBlbmRpbmdSZWYpIHtcbiAgICAgICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvYWRpbmc6JHtwZW5kaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9ja1JlZiAmJiB0aGlzLmxvY2tSZWYgPiBwZW5kaW5nUmVmKSB7XG4gICAgICAgICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2NrOiR7cGVuZGluZ1JlZn1gLCBvcHRzKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVmID4gcmVmO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBjbGVhbiB1cCBpZiBmdWxseSByZXNvbHZlZFxuICAgIGlmICh0aGlzLmlzRnVsbHlSZXNvbHZlZEJ5KHJlZikpIHtcbiAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfU1JDKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG5cbiAgaXNXaXRoaW4ocmVmKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICB0aGlzLmxvYWRpbmdSZWYgIT09IG51bGwgJiZcbiAgICAgIHRoaXMubG9hZGluZ1JlZiA+IHJlZiAmJlxuICAgICAgdGhpcy5sb2NrUmVmICE9PSBudWxsICYmXG4gICAgICB0aGlzLmxvY2tSZWYgPiByZWZcbiAgICApO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGNsb25lZCBQSFhfUkVGX0xPQ0sgZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vcnBoZWQgYmVoaW5kXG4gIC8vIHRoZSBzY2VuZXMgd2hpbGUgdGhpcyBlbGVtZW50IHdhcyBsb2NrZWQgaW4gdGhlIERPTS5cbiAgLy8gV2hlbiB3ZSBhcHBseSB0aGUgY2xvbmVkIHRyZWUgdG8gdGhlIGFjdGl2ZSBET00gZWxlbWVudCwgd2UgbXVzdFxuICAvL1xuICAvLyAgIDEuIGV4ZWN1dGUgcGVuZGluZyBtb3VudGVkIGhvb2tzIGZvciBub2RlcyBub3cgaW4gdGhlIERPTVxuICAvLyAgIDIuIHVuZG8gYW55IHJlZiBpbnNpZGUgdGhlIGNsb25lZCB0cmVlIHRoYXQgaGFzIHNpbmNlIGJlZW4gYWNrJ2RcbiAgdW5kb0xvY2tzKHJlZiwgcGh4RXZlbnQsIGVhY2hDbG9uZUNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9ja1VuZG9uZUJ5KHJlZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9uZWRUcmVlID0gRE9NLnByaXZhdGUodGhpcy5lbCwgUEhYX1JFRl9MT0NLKTtcbiAgICBpZiAoY2xvbmVkVHJlZSkge1xuICAgICAgZWFjaENsb25lQ2FsbGJhY2soY2xvbmVkVHJlZSk7XG4gICAgICBET00uZGVsZXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUkVGX0xPQ0spO1xuICAgIH1cbiAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuXG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvY2s6JHt0aGlzLmxvY2tSZWZ9YCwgb3B0cyksXG4gICAgKTtcbiAgfVxuXG4gIHVuZG9Mb2FkaW5nKHJlZiwgcGh4RXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nVW5kb25lQnkocmVmKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNhblVuZG9Mb2FkaW5nKHJlZikgJiZcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJwaHgtY2hhbmdlLWxvYWRpbmdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKTtcbiAgICAgIGNvbnN0IGRpc2FibGVkVmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKTtcbiAgICAgIGNvbnN0IHJlYWRPbmx5VmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIC8vIHJlc3RvcmUgaW5wdXRzXG4gICAgICBpZiAocmVhZE9ubHlWYWwgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbC5yZWFkT25seSA9IHJlYWRPbmx5VmFsID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZFZhbCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZWRWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRUQpO1xuICAgICAgfVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgY29uc3QgZGlzYWJsZVJlc3RvcmUgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpO1xuICAgICAgaWYgKGRpc2FibGVSZXN0b3JlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVJlc3RvcmU7XG4gICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2FkaW5nOiR7dGhpcy5sb2FkaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgIGlmIChuYW1lICE9PSBcInBoeC1zdWJtaXQtbG9hZGluZ1wiIHx8IHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgICBET00ucmVtb3ZlQ2xhc3ModGhpcy5lbCwgbmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpc0xvYWRpbmdVbmRvbmVCeShyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nUmVmID09PSBudWxsID8gZmFsc2UgOiB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmO1xuICB9XG4gIGlzTG9ja1VuZG9uZUJ5KHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgPyBmYWxzZSA6IHRoaXMubG9ja1JlZiA8PSByZWY7XG4gIH1cblxuICBpc0Z1bGx5UmVzb2x2ZWRCeShyZWYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMubG9hZGluZ1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmKSAmJlxuICAgICAgKHRoaXMubG9ja1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvY2tSZWYgPD0gcmVmKVxuICAgICk7XG4gIH1cblxuICAvLyBvbmx5IHJlbW92ZSB0aGUgcGh4LXN1Ym1pdC1sb2FkaW5nIGNsYXNzIGlmIHdlIGFyZSBub3QgbG9ja2VkXG4gIGNhblVuZG9Mb2FkaW5nKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgfHwgdGhpcy5sb2NrUmVmIDw9IHJlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IG1heWJlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NUG9zdE1vcnBoUmVzdG9yZXIge1xuICBjb25zdHJ1Y3Rvcihjb250YWluZXJCZWZvcmUsIGNvbnRhaW5lckFmdGVyLCB1cGRhdGVUeXBlKSB7XG4gICAgY29uc3QgaWRzQmVmb3JlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGlkc0FmdGVyID0gbmV3IFNldChcbiAgICAgIFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKChjaGlsZCkgPT4gY2hpbGQuaWQpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50c1RvTW9kaWZ5ID0gW107XG5cbiAgICBBcnJheS5mcm9tKGNvbnRhaW5lckJlZm9yZS5jaGlsZHJlbikuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgICAvLyBhbGwgb2Ygb3VyIGNoaWxkcmVuIHNob3VsZCBiZSBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICBpZHNCZWZvcmUuYWRkKGNoaWxkLmlkKTtcbiAgICAgICAgaWYgKGlkc0FmdGVyLmhhcyhjaGlsZC5pZCkpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnRJZCA9XG4gICAgICAgICAgICBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQ7XG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogY2hpbGQuaWQsXG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZDtcbiAgICB0aGlzLnVwZGF0ZVR5cGUgPSB1cGRhdGVUeXBlO1xuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeSA9IGVsZW1lbnRzVG9Nb2RpZnk7XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcigoaWQpID0+ICFpZHNCZWZvcmUuaGFzKGlkKSk7XG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkuZm9yRWFjaCgoZWxlbWVudFRvTW9kaWZ5KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudFRvTW9kaWZ5LnByZXZpb3VzRWxlbWVudElkKSB7XG4gICAgICAgIG1heWJlKFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCksXG4gICAgICAgICAgKHByZXZpb3VzRWxlbSkgPT4ge1xuICAgICAgICAgICAgbWF5YmUoXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLFxuICAgICAgICAgICAgICAoZWxlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID1cbiAgICAgICAgICAgICAgICAgIGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkID09IHByZXZpb3VzRWxlbS5pZDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzSW5SaWdodFBsYWNlKSB7XG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCAoZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID09IG51bGw7XG4gICAgICAgICAgaWYgKCFpc0luUmlnaHRQbGFjZSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVwZGF0ZVR5cGUgPT0gXCJwcmVwZW5kXCIpIHtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKChlbGVtSWQpID0+IHtcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbUlkKSwgKGVsZW0pID0+XG4gICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJ2YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG5mdW5jdGlvbiBtb3JwaEF0dHJzKGZyb21Ob2RlLCB0b05vZGUpIHtcbiAgICB2YXIgdG9Ob2RlQXR0cnMgPSB0b05vZGUuYXR0cmlidXRlcztcbiAgICB2YXIgYXR0cjtcbiAgICB2YXIgYXR0ck5hbWU7XG4gICAgdmFyIGF0dHJOYW1lc3BhY2VVUkk7XG4gICAgdmFyIGF0dHJWYWx1ZTtcbiAgICB2YXIgZnJvbVZhbHVlO1xuXG4gICAgLy8gZG9jdW1lbnQtZnJhZ21lbnRzIGRvbnQgaGF2ZSBhdHRyaWJ1dGVzIHNvIGxldHMgbm90IGRvIGFueXRoaW5nXG4gICAgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBmcm9tTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50XG4gICAgZm9yICh2YXIgaSA9IHRvTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGF0dHIgPSB0b05vZGVBdHRyc1tpXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIucHJlZml4ID09PSAneG1sbnMnKXtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7IC8vIEl0J3Mgbm90IGFsbG93ZWQgdG8gc2V0IGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBYTUxOUyBuYW1lc3BhY2Ugd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBgeG1sbnNgIHByZWZpeFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgYXR0cmlidXRlcyBmb3VuZCBvbiB0aGUgb3JpZ2luYWwgRE9NIGVsZW1lbnQgdGhhdFxuICAgIC8vIHdlcmVuJ3QgZm91bmQgb24gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgIHZhciBmcm9tTm9kZUF0dHJzID0gZnJvbU5vZGUuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIGQgPSBmcm9tTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGF0dHIgPSBmcm9tTm9kZUF0dHJzW2RdO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuXG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHJhbmdlOyAvLyBDcmVhdGUgYSByYW5nZSBvYmplY3QgZm9yIGVmZmljZW50bHkgcmVuZGVyaW5nIHN0cmluZ3MgdG8gZWxlbWVudHMuXG52YXIgTlNfWEhUTUwgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG5cbnZhciBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZG9jdW1lbnQ7XG52YXIgSEFTX1RFTVBMQVRFX1NVUFBPUlQgPSAhIWRvYyAmJiAnY29udGVudCcgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG52YXIgSEFTX1JBTkdFX1NVUFBPUlQgPSAhIWRvYyAmJiBkb2MuY3JlYXRlUmFuZ2UgJiYgJ2NyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCcgaW4gZG9jLmNyZWF0ZVJhbmdlKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cikge1xuICAgIHZhciB0ZW1wbGF0ZSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gdGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpIHtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jLmJvZHkpO1xuICAgIH1cblxuICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHIpO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cikge1xuICAgIHZhciBmcmFnbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgZnJhZ21lbnQuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYWJvdXQgdGhlIHNhbWVcbiAqIHZhciBodG1sID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzdHIsICd0ZXh0L2h0bWwnKTtcbiAqIHJldHVybiBodG1sLmJvZHkuZmlyc3RDaGlsZDtcbiAqXG4gKiBAbWV0aG9kIHRvRWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiB0b0VsZW1lbnQoc3RyKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBpZiAoSEFTX1RFTVBMQVRFX1NVUFBPUlQpIHtcbiAgICAgIC8vIGF2b2lkIHJlc3RyaWN0aW9ucyBvbiBjb250ZW50IGZvciB0aGluZ3MgbGlrZSBgPHRyPjx0aD5IaTwvdGg+PC90cj5gIHdoaWNoXG4gICAgICAvLyBjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQgZG9lc24ndCBzdXBwb3J0XG4gICAgICAvLyA8dGVtcGxhdGU+IHN1cHBvcnQgbm90IGF2YWlsYWJsZSBpbiBJRVxuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cik7XG4gICAgfSBlbHNlIGlmIChIQVNfUkFOR0VfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdHdvIG5vZGUncyBuYW1lcyBhcmUgdGhlIHNhbWUuXG4gKlxuICogTk9URTogV2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGBuYW1lc3BhY2VVUklgIGJlY2F1c2UgeW91IHdpbGwgbmV2ZXIgZmluZCB0d28gSFRNTCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lXG4gKiAgICAgICBub2RlTmFtZSBhbmQgZGlmZmVyZW50IG5hbWVzcGFjZSBVUklzLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiIFRoZSB0YXJnZXQgZWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU5vZGVOYW1lcyhmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgZnJvbU5vZGVOYW1lID0gZnJvbUVsLm5vZGVOYW1lO1xuICAgIHZhciB0b05vZGVOYW1lID0gdG9FbC5ub2RlTmFtZTtcbiAgICB2YXIgZnJvbUNvZGVTdGFydCwgdG9Db2RlU3RhcnQ7XG5cbiAgICBpZiAoZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZyb21Db2RlU3RhcnQgPSBmcm9tTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcbiAgICB0b0NvZGVTdGFydCA9IHRvTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIHZpcnR1YWwgRE9NIG5vZGUgb3IgU1ZHIG5vZGUgdGhlbiB3ZSBtYXlcbiAgICAvLyBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgdGFnIG5hbWUgYmVmb3JlIGNvbXBhcmluZy4gTm9ybWFsIEhUTUwgZWxlbWVudHMgdGhhdCBhcmVcbiAgICAvLyBpbiB0aGUgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJcbiAgICAvLyBhcmUgY29udmVydGVkIHRvIHVwcGVyIGNhc2VcbiAgICBpZiAoZnJvbUNvZGVTdGFydCA8PSA5MCAmJiB0b0NvZGVTdGFydCA+PSA5NykgeyAvLyBmcm9tIGlzIHVwcGVyIGFuZCB0byBpcyBsb3dlclxuICAgICAgICByZXR1cm4gZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0b0NvZGVTdGFydCA8PSA5MCAmJiBmcm9tQ29kZVN0YXJ0ID49IDk3KSB7IC8vIHRvIGlzIHVwcGVyIGFuZCBmcm9tIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiB0b05vZGVOYW1lID09PSBmcm9tTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBOU19YSFRNTCA/XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpIDpcbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgY2hpbGRyZW4gb2Ygb25lIERPTSBlbGVtZW50IHRvIGFub3RoZXIgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbW92ZUNoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIHRvRWwuYXBwZW5kQ2hpbGQoY3VyQ2hpbGQpO1xuICAgICAgICBjdXJDaGlsZCA9IG5leHRDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvRWw7XG59XG5cbmZ1bmN0aW9uIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCBuYW1lKSB7XG4gICAgaWYgKGZyb21FbFtuYW1lXSAhPT0gdG9FbFtuYW1lXSkge1xuICAgICAgICBmcm9tRWxbbmFtZV0gPSB0b0VsW25hbWVdO1xuICAgICAgICBpZiAoZnJvbUVsW25hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzcGVjaWFsRWxIYW5kbGVycyA9IHtcbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGZyb21FbC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdTRUxFQ1QnICYmICFwYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tRWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpICYmICF0b0VsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE1TIEVkZ2UgYnVnIHdoZXJlIHRoZSAnc2VsZWN0ZWQnIGF0dHJpYnV0ZSBjYW4gb25seSBiZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGlmIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIwODc2NzkvXG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgc2VsZWN0IGVsZW1lbnQncyBzZWxlY3RlZEluZGV4IHRvIC0xLCBvdGhlcndpc2Ugc2V0dGluZ1xuICAgICAgICAgICAgICAgIC8vIGZyb21FbC5zZWxlY3RlZCB1c2luZyB0aGUgc3luY0Jvb2xlYW5BdHRyUHJvcCBiZWxvdyBoYXMgbm8gZWZmZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0IHNlbGVjdGVkSW5kZXggd2lsbCBiZSBzZXQgaW4gdGhlIFNFTEVDVCBzcGVjaWFsIGhhbmRsZXIgYmVsb3cuXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdzZWxlY3RlZCcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgaXMgc3BlY2lhbCBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBzaW5jZSBpdCBzZXRzXG4gICAgICogdGhlIGluaXRpYWwgdmFsdWUuIENoYW5naW5nIHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICogXCJ2YWx1ZVwiIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3Qgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIHRoZSBzZXQgdGhlXG4gICAgICogaW5pdGlhbCB2YWx1ZS4gIFNpbWlsYXIgZm9yIHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUsIGFuZCBcImRpc2FibGVkXCIuXG4gICAgICovXG4gICAgSU5QVVQ6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2NoZWNrZWQnKTtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IHRvRWwudmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIFRFWFRBUkVBOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgSUUuIEFwcGFyZW50bHkgSUUgc2V0cyB0aGUgcGxhY2Vob2xkZXIgYXMgdGhlXG4gICAgICAgICAgICAvLyBub2RlIHZhbHVlIGFuZCB2aXNlIHZlcnNhLiBUaGlzIGlnbm9yZXMgYW4gZW1wdHkgdXBkYXRlLlxuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAoIW5ld1ZhbHVlICYmIG9sZFZhbHVlID09IGZyb21FbC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFTEVDVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBvZiBmcm9tRWwsIG5vdCB0b0VsIHNpbmNlIG5vZGVzIGNhbiBiZSBtb3ZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0b0VsIHRvIGZyb21FbCBkaXJlY3RseSB3aGVuIG1vcnBoaW5nLlxuICAgICAgICAgICAgLy8gQXQgdGhlIHRpbWUgdGhpcyBzcGVjaWFsIGhhbmRsZXIgaXMgaW52b2tlZCwgYWxsIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBiZWVuIG1vcnBoZWRcbiAgICAgICAgICAgIC8vIGFuZCBhcHBlbmRlZCB0byAvIHJlbW92ZWQgZnJvbSBmcm9tRWwsIHNvIHVzaW5nIGZyb21FbCBoZXJlIGlzIHNhZmUgYW5kIGNvcnJlY3QuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBvcHRncm91cDtcbiAgICAgICAgICAgIHZhciBub2RlTmFtZTtcbiAgICAgICAgICAgIHdoaWxlKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjdXJDaGlsZC5ub2RlTmFtZSAmJiBjdXJDaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBlbXB0eSBvcHRncm91cHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1ckNoaWxkICYmIG9wdGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tRWwuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFJDEgPSAxMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgdG9Ob2RlLmlubmVySFRNTCA9IHRvTm9kZUh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICB0b05vZGUgPSB0b05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgfVxuXG4gICAgdmFyIGdldE5vZGVLZXkgPSBvcHRpb25zLmdldE5vZGVLZXkgfHwgZGVmYXVsdEdldE5vZGVLZXk7XG4gICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICB2YXIgb25CZWZvcmVFbFVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIHNraXBGcm9tQ2hpbGRyZW4gPSBvcHRpb25zLnNraXBGcm9tQ2hpbGRyZW4gfHwgbm9vcDtcbiAgICB2YXIgYWRkQ2hpbGQgPSBvcHRpb25zLmFkZENoaWxkIHx8IGZ1bmN0aW9uKHBhcmVudCwgY2hpbGQpeyByZXR1cm4gcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsgfTtcbiAgICB2YXIgY2hpbGRyZW5Pbmx5ID0gb3B0aW9ucy5jaGlsZHJlbk9ubHkgPT09IHRydWU7XG5cbiAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXllZFJlbW92YWxMaXN0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChza2lwS2V5ZWROb2RlcyAmJiAoa2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCkpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcga2V5ZWQgbm9kZXMgdGhlbiB3ZSBhZGQgdGhlIGtleVxuICAgICAgICAgICAgLy8gdG8gYSBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIGhhbmRsZWQgYXQgdGhlIHZlcnkgZW5kLlxuICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhjdXJDaGlsZCwgc2tpcEtleWVkTm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICpcbiAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlLCBwYXJlbnROb2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG9uQmVmb3JlTm9kZURpc2NhcmRlZChub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gLy8gVHJlZVdhbGtlciBpbXBsZW1lbnRhdGlvbiBpcyBubyBmYXN0ZXIsIGJ1dCBrZWVwaW5nIHRoaXMgYXJvdW5kIGluIGNhc2UgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgLy8gICAgICAgICByb290LFxuICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgIC8vXG4gICAgLy8gICAgIHZhciBlbDtcbiAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAvLyAgICAgdmFyIGVsO1xuICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHZhciB1bm1hdGNoZWRGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBba2V5XTtcbiAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgIC8vIGFuZCBtb3JwaCBpdCB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICBpZiAodW5tYXRjaGVkRnJvbUVsICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyQ2hpbGQsIHVubWF0Y2hlZEZyb21FbCkpIHtcbiAgICAgICAgICAgIGN1ckNoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgbW9ycGhFbCh1bm1hdGNoZWRGcm9tRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgLy8gZnJvbU5vZGVzTG9va3VwXG4gICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1ckNoaWxkID0gbmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKChjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCkpKSB7XG4gICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAvLyBET00gc28gY2xlYXIgaXQgb3V0IG9mIHRoZSBzYXZlZCBlbGVtZW50cyBjb2xsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgIHZhciBiZWZvcmVVcGRhdGVSZXN1bHQgPSBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpO1xuICAgICAgICBpZiAoYmVmb3JlVXBkYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVVcGRhdGVSZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGZyb21FbCA9IGJlZm9yZVVwZGF0ZVJlc3VsdDtcbiAgICAgICAgICAvLyByZWluZGV4IHRoZSBuZXcgZnJvbUVsIGluIGNhc2UgaXQncyBub3QgaW4gdGhlIHNhbWVcbiAgICAgICAgICAvLyB0cmVlIGFzIHRoZSBvcmlnaW5hbCBmcm9tRWxcbiAgICAgICAgICAvLyAoUGhvZW5peCBMaXZlVmlldyBzb21ldGltZXMgcmV0dXJucyBhIGNsb25lZCB0cmVlLFxuICAgICAgICAgIC8vICBidXQga2V5ZWQgbG9va3VwcyB3b3VsZCBzdGlsbCBwb2ludCB0byB0aGUgb3JpZ2luYWwgdHJlZSlcbiAgICAgICAgICBpbmRleFRyZWUoZnJvbUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgIHZhciBza2lwRnJvbSA9IHNraXBGcm9tQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIHZhciBjdXJUb05vZGVDaGlsZCA9IHRvRWwuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICB2YXIgY3VyVG9Ob2RlS2V5O1xuICAgICAgdmFyIGN1ckZyb21Ob2RlS2V5O1xuXG4gICAgICB2YXIgZnJvbU5leHRTaWJsaW5nO1xuICAgICAgdmFyIHRvTmV4dFNpYmxpbmc7XG4gICAgICB2YXIgbWF0Y2hpbmdGcm9tRWw7XG5cbiAgICAgIC8vIHdhbGsgdGhlIGNoaWxkcmVuXG4gICAgICBvdXRlcjogd2hpbGUgKGN1clRvTm9kZUNoaWxkKSB7XG4gICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgLy8gd2FsayB0aGUgZnJvbU5vZGUgY2hpbGRyZW4gYWxsIHRoZSB3YXkgdGhyb3VnaFxuICAgICAgICB3aGlsZSAoIXNraXBGcm9tICYmIGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgaWYgKGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUgJiYgY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZShjdXJGcm9tTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgIHZhciBjdXJGcm9tTm9kZVR5cGUgPSBjdXJGcm9tTm9kZUNoaWxkLm5vZGVUeXBlO1xuXG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IGN1clRvTm9kZUNoaWxkLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tTmV4dFNpYmxpbmcgPT09IG1hdGNoaW5nRnJvbUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaW5zdGVhZCBkaXNjYXJkIHRoZSBjdXJyZW50IG5vZGUgYW5kIHdhaXQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcga2V5ZWQgZWxlbWVudCBzb21ld2hlcmUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSB1c2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgcmVwbGFjZUNoaWxkIGJlY2F1c2Ugd2Ugd2FudCB0byBnbyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tRWwuaW5zZXJ0QmVmb3JlKG1hdGNoaW5nRnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBpc0NvbXBhdGlibGUgIT09IGZhbHNlICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgY29tcGF0aWJsZSBET00gZWxlbWVudHMgc28gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBURVhUX05PREUgfHwgY3VyRnJvbU5vZGVUeXBlID09IENPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gU2ltcGx5IHVwZGF0ZSBub2RlVmFsdWUgb24gdGhlIG9yaWdpbmFsIG5vZGUgdG9cbiAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgYm90aCB0aGUgXCJ0b1wiIGNoaWxkIGFuZCB0aGUgXCJmcm9tXCIgY2hpbGQgc2luY2Ugd2UgZm91bmQgYSBtYXRjaFxuICAgICAgICAgICAgLy8gTm90aGluZyBlbHNlIHRvIGRvIGFzIHdlIGFscmVhZHkgcmVjdXJzaXZlbHkgY2FsbGVkIG1vcnBoQ2hpbGRyZW4gYWJvdmVcbiAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgLy8gbWF0Y2ggaW4gdGhlIG9yaWdpbmFsIERPTS4gSG93ZXZlciwgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSBmcm9tIG5vZGUgaXMgbm90IGtleWVkXG4gICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAvLyBob21lIGluIHRoZSBmaW5hbCBET00gdHJlZS4gQWZ0ZXIgZXZlcnl0aGluZyBpcyBkb25lIHdlIHdpbGwgcmVtb3ZlIGFueSBrZXllZCBub2Rlc1xuICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgIC8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIHdlIGRpZCBub3QgZmluZCBhIGNhbmRpZGF0ZSBtYXRjaCBmb3JcbiAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgIC8vIHRvIHRoZSBlbmRcbiAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICBpZighc2tpcEZyb20peyBhZGRDaGlsZChmcm9tRWwsIG1hdGNoaW5nRnJvbUVsKTsgfVxuICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZENoaWxkKGZyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXIoZnJvbUVsLCB0b0VsKTtcbiAgICAgIH1cbiAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICB2YXIgbW9ycGhlZE5vZGVUeXBlID0gbW9ycGhlZE5vZGUubm9kZVR5cGU7XG4gICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHb2luZyBmcm9tIGFuIGVsZW1lbnQgbm9kZSB0byBhIHRleHQgbm9kZVxuICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IG1vcnBoZWROb2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7IC8vIFRleHQgb3IgY29tbWVudCBub2RlXG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAobW9ycGhlZE5vZGUubm9kZVZhbHVlICE9PSB0b05vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZS5ub2RlVmFsdWUgPSB0b05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICBtb3JwaGVkTm9kZSA9IHRvTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49a2V5ZWRSZW1vdmFsTGlzdC5sZW5ndGg7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICBtb3JwaGVkTm9kZSA9IG1vcnBoZWROb2RlLmFjdHVhbGl6ZShmcm9tTm9kZS5vd25lckRvY3VtZW50IHx8IGRvYyk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBoYWQgdG8gc3dhcCBvdXQgdGhlIGZyb20gbm9kZSB3aXRoIGEgbmV3IG5vZGUgYmVjYXVzZSB0aGUgb2xkXG4gICAgICAvLyBub2RlIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgbm9kZSB0aGVuIHdlIG5lZWQgdG9cbiAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBET00gbm9kZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuIFRoaXMgaXMgb25seVxuICAgICAgLy8gcG9zc2libGUgaWYgdGhlIG9yaWdpbmFsIERPTSBub2RlIHdhcyBwYXJ0IG9mIGEgRE9NIHRyZWUgd2hpY2hcbiAgICAgIC8vIHdlIGtub3cgaXMgdGhlIGNhc2UgaWYgaXQgaGFzIGEgcGFyZW50IG5vZGUuXG4gICAgICBmcm9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtb3JwaGVkTm9kZSwgZnJvbU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9NQUdJQ19JRCxcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSSUdHRVJfQUNUSU9OLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfU1RSRUFNLFxuICBQSFhfU1RSRUFNX1JFRixcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfVEVMRVBPUlRFRF9TUkMsXG4gIFBIWF9SVU5USU1FX0hPT0ssXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBkZXRlY3REdXBsaWNhdGVJZHMsIGRldGVjdEludmFsaWRTdHJlYW1JbnNlcnRzLCBpc0NpZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgRWxlbWVudFJlZiBmcm9tIFwiLi9lbGVtZW50X3JlZlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBET01Qb3N0TW9ycGhSZXN0b3JlciBmcm9tIFwiLi9kb21fcG9zdF9tb3JwaF9yZXN0b3JlclwiO1xuaW1wb3J0IG1vcnBoZG9tIGZyb20gXCJtb3JwaGRvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHZpZXcsIGNvbnRhaW5lciwgaWQsIGh0bWwsIHN0cmVhbXMsIHRhcmdldENJRCwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXQ7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkO1xuICAgIHRoaXMuaHRtbCA9IGh0bWw7XG4gICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtcztcbiAgICB0aGlzLnN0cmVhbUluc2VydHMgPSB7fTtcbiAgICB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmUgPSB7fTtcbiAgICB0aGlzLnRhcmdldENJRCA9IHRhcmdldENJRDtcbiAgICB0aGlzLmNpZFBhdGNoID0gaXNDaWQodGhpcy50YXJnZXRDSUQpO1xuICAgIHRoaXMucGVuZGluZ1JlbW92ZXMgPSBbXTtcbiAgICB0aGlzLnBoeFJlbW92ZSA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFwicmVtb3ZlXCIpO1xuICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyID0gdGhpcy5pc0NJRFBhdGNoKClcbiAgICAgID8gdGhpcy50YXJnZXRDSURDb250YWluZXIoaHRtbClcbiAgICAgIDogY29udGFpbmVyO1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge1xuICAgICAgYmVmb3JlYWRkZWQ6IFtdLFxuICAgICAgYmVmb3JldXBkYXRlZDogW10sXG4gICAgICBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLFxuICAgICAgYWZ0ZXJ1cGRhdGVkOiBbXSxcbiAgICAgIGFmdGVyZGlzY2FyZGVkOiBbXSxcbiAgICAgIGFmdGVycGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcnRyYW5zaXRpb25zRGlzY2FyZGVkOiBbXSxcbiAgICB9O1xuICAgIHRoaXMud2l0aENoaWxkcmVuID0gb3B0cy53aXRoQ2hpbGRyZW4gfHwgb3B0cy51bmRvUmVmIHx8IGZhbHNlO1xuICAgIHRoaXMudW5kb1JlZiA9IG9wdHMudW5kb1JlZjtcbiAgfVxuXG4gIGJlZm9yZShraW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICB0cmFja0JlZm9yZShraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGJlZm9yZSR7a2luZH1gXS5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICB9XG5cbiAgdHJhY2tBZnRlcihraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayguLi5hcmdzKSk7XG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpIHtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKTtcbiAgICBET00uYWxsKFxuICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICBgWyR7cGh4VXBkYXRlfT1hcHBlbmRdID4gKiwgWyR7cGh4VXBkYXRlfT1wcmVwZW5kXSA+ICpgLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUFJVTkUsIFwiXCIpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcGVyZm9ybShpc0pvaW5QYXRjaCkge1xuICAgIGNvbnN0IHsgdmlldywgbGl2ZVNvY2tldCwgaHRtbCwgY29udGFpbmVyIH0gPSB0aGlzO1xuICAgIGxldCB0YXJnZXRDb250YWluZXIgPSB0aGlzLnRhcmdldENvbnRhaW5lcjtcblxuICAgIGlmICh0aGlzLmlzQ0lEUGF0Y2goKSAmJiAhdGhpcy50YXJnZXRDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NJRFBhdGNoKCkpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L3B1bGwvMzk0MlxuICAgICAgLy8gd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBubyBwYXJlbnQgaXMgbG9ja2VkXG4gICAgICBjb25zdCBjbG9zZXN0TG9jayA9IHRhcmdldENvbnRhaW5lci5jbG9zZXN0KGBbJHtQSFhfUkVGX0xPQ0t9XWApO1xuICAgICAgaWYgKGNsb3Nlc3RMb2NrKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZFRyZWUgPSBET00ucHJpdmF0ZShjbG9zZXN0TG9jaywgUEhYX1JFRl9MT0NLKTtcbiAgICAgICAgaWYgKGNsb25lZFRyZWUpIHtcbiAgICAgICAgICAvLyBpZiBhIHBhcmVudCBpcyBsb2NrZWQgd2l0aCBhIGNsb25lZCB0cmVlLCB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBjbG9uZWQgdHJlZSBpbnN0ZWFkXG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyID0gY2xvbmVkVHJlZS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYFtkYXRhLXBoeC1jb21wb25lbnQ9XCIke3RoaXMudGFyZ2V0Q0lEfVwiXWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzZWQgPSBsaXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9XG4gICAgICBmb2N1c2VkICYmIERPTS5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSA/IGZvY3VzZWQgOiB7fTtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1VQREFURSk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRCb3R0b20gPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX0JPVFRPTSk7XG4gICAgY29uc3QgcGh4VHJpZ2dlckV4dGVybmFsID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9UUklHR0VSX0FDVElPTik7XG4gICAgY29uc3QgYWRkZWQgPSBbXTtcbiAgICBjb25zdCB1cGRhdGVzID0gW107XG4gICAgY29uc3QgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXTtcblxuICAgIC8vIGFzIHRoZSBwb3J0YWwgdGFyZ2V0IGl0c2VsZiBjb3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBET00sXG4gICAgLy8gaXQgbWF5IG5vdCBiZSBwcmVzZW50IHdoaWxlIG1vcnBoaW5nIHByZXZpb3VzIHBhcnRzO1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBhcHBseSBhbGwgdGVsZXBvcnRzIGFmdGVyIHRoZSBtb3JwaGluZyBpcyBkb25lK1xuICAgIGNvbnN0IHBvcnRhbENhbGxiYWNrcyA9IFtdO1xuXG4gICAgbGV0IGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IG51bGw7XG5cbiAgICBjb25zdCBtb3JwaCA9IChcbiAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgIHNvdXJjZSxcbiAgICAgIHdpdGhDaGlsZHJlbiA9IHRoaXMud2l0aENoaWxkcmVuLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgbW9ycGhDYWxsYmFja3MgPSB7XG4gICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBhcmUgcnVubmluZyB3aXRoIGNoaWxkcmVuT25seSwgYXMgdGhlIHBhdGNoIEhUTUwgZm9yIGEgTFZcbiAgICAgICAgLy8gZG9lcyBub3QgaW5jbHVkZSB0aGUgTFYgYXR0cnMgKGRhdGEtcGh4LXNlc3Npb24sIGV0Yy4pXG4gICAgICAgIC8vIHdoZW4gd2UgYXJlIHBhdGNoaW5nIGEgbGl2ZSBjb21wb25lbnQsIHdlIGRvIHdhbnQgdG8gcGF0Y2ggdGhlIHJvb3QgZWxlbWVudCBhcyB3ZWxsO1xuICAgICAgICAvLyBhbm90aGVyIGNhc2UgaXMgdGhlIHJlY3Vyc2l2ZSBwYXRjaCBvZiBhIHN0cmVhbSBpdGVtIHRoYXQgd2FzIGtlcHQgb24gcmVzZXQgKC0+IG9uQmVmb3JlTm9kZUFkZGVkKVxuICAgICAgICBjaGlsZHJlbk9ubHk6XG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gbnVsbCAmJiAhd2l0aENoaWxkcmVuLFxuICAgICAgICBnZXROb2RlS2V5OiAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChET00uaXNQaHhEZXN0cm95ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgam9pbiBwYXRjaCwgdGhlbiBieSBkZWZpbml0aW9uIHRoZXJlIHdhcyBubyBQSFhfTUFHSUNfSUQuXG4gICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZWxlbWVudHMgbW9ycGhkb20gZGlzY2FyZHMuXG4gICAgICAgICAgaWYgKGlzSm9pblBhdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5vZGUuaWQgfHwgKG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9NQUdJQ19JRCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2tpcCBpbmRleGluZyBmcm9tIGNoaWxkcmVuIHdoZW4gY29udGFpbmVyIGlzIHN0cmVhbVxuICAgICAgICBza2lwRnJvbUNoaWxkcmVuOiAoZnJvbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpID09PSBQSFhfU1RSRUFNO1xuICAgICAgICB9LFxuICAgICAgICAvLyB0ZWxsIG1vcnBoZG9tIGhvdyB0byBhZGQgYSBjaGlsZFxuICAgICAgICBhZGRDaGlsZDogKHBhcmVudCwgY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHJlZiwgc3RyZWFtQXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGNoaWxkKTtcbiAgICAgICAgICBpZiAocmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2V0U3RyZWFtUmVmKGNoaWxkLCByZWYpO1xuXG4gICAgICAgICAgLy8gc3RyZWFtaW5nXG4gICAgICAgICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBjaGlsZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1BdCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IHBhcmVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAmJiAhbGFzdENoaWxkLmhhc0F0dHJpYnV0ZShQSFhfU1RSRUFNX1JFRikpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9uU3RyZWFtQ2hpbGQgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZHJlbikuZmluZChcbiAgICAgICAgICAgICAgICAoYykgPT4gIWMuaGFzQXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9uU3RyZWFtQ2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUF0ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKVtzdHJlYW1BdF07XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBzaWJsaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBkb24ndCBhZGQgdXBkYXRlX29ubHkgbm9kZXMgaWYgdGhleSBkaWQgbm90IGFscmVhZHkgZXhpc3RcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmdldFN0cmVhbUluc2VydChlbCk/LnVwZGF0ZU9ubHkgJiZcbiAgICAgICAgICAgICF0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKGVsLCBlbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKTtcbiAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwiYWRkZWRcIiwgZWwpO1xuXG4gICAgICAgICAgbGV0IG1vcnBoZWRFbCA9IGVsO1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJlYW0gaXRlbSB0aGF0IHdhcyBrZXB0IG9uIHJlc2V0LCByZWN1cnNpdmVseSBtb3JwaCBpdFxuICAgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdKSB7XG4gICAgICAgICAgICBtb3JwaGVkRWwgPSB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtlbC5pZF07XG4gICAgICAgICAgICBtb3JwaChtb3JwaGVkRWwsIGVsLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbW9ycGhlZEVsO1xuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXliZVJlT3JkZXJTdHJlYW0oZWwsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgcG9ydGFsQ2FsbGJhY2tzLnB1c2goKCkgPT4gdGhpcy50ZWxlcG9ydChlbCwgbW9ycGgpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoYWNrIHRvIGZpeCBTYWZhcmkgaGFuZGxpbmcgb2YgaW1nIHNyY3NldCBhbmQgdmlkZW8gdGFnc1xuICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCAmJiBlbC5hdXRvcGxheSkge1xuICAgICAgICAgICAgZWwucGxheSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSkge1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoRE9NLmlzUGh4Q2hpbGQoZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwpKSB8fFxuICAgICAgICAgICAgKERPTS5pc1BoeFN0aWNreShlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbC5wYXJlbnROb2RlKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tBZnRlcihcInBoeENoaWxkQWRkZWRcIiwgZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRhdGEtcGh4LXJ1bnRpbWUtaG9va1xuICAgICAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gXCJTQ1JJUFRcIiAmJiBlbC5oYXNBdHRyaWJ1dGUoUEhYX1JVTlRJTUVfSE9PSykpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkZWQucHVzaChlbCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTm9kZURpc2NhcmRlZDogKGVsKSA9PiB0aGlzLm9uTm9kZURpc2NhcmRlZChlbCksXG4gICAgICAgIG9uQmVmb3JlTm9kZURpc2NhcmRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BSVU5FKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLmlkICYmXG4gICAgICAgICAgICBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50RWxlbWVudCwgcGh4VXBkYXRlLCBbXG4gICAgICAgICAgICAgIFBIWF9TVFJFQU0sXG4gICAgICAgICAgICAgIFwiYXBwZW5kXCIsXG4gICAgICAgICAgICAgIFwicHJlcGVuZFwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZG9uJ3QgcmVtb3ZlIHRlbGVwb3J0ZWQgZWxlbWVudHNcbiAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHBvcnRhbCB0ZW1wbGF0ZSBpdHNlbGYgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoZSB0ZWxlcG9ydGVkIGVsZW1lbnQgYXMgd2VsbDtcbiAgICAgICAgICAgIC8vIHdlIGFsc28gcGVyZm9ybSBhIGNoZWNrIGFmdGVyIG1vcnBoZG9tIGlzIGZpbmlzaGVkIHRvIGNhdGNoIHBhcmVudCByZW1vdmFsc1xuICAgICAgICAgICAgY29uc3QgdGVsZXBvcnRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICAgIGVsLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRlbGVwb3J0ZWRFbCkge1xuICAgICAgICAgICAgICB0ZWxlcG9ydGVkRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIG1vcnBoQ2FsbGJhY2tzLm9uTm9kZURpc2NhcmRlZCh0ZWxlcG9ydGVkRWwpO1xuICAgICAgICAgICAgICB0aGlzLnZpZXcuZHJvcFBvcnRhbEVsZW1lbnRJZCh0ZWxlcG9ydGVkRWwuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpIHtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpO1xuICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGVsLCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgLy8gaWYgd2UgYXJlIHBhdGNoaW5nIHRoZSByb290IHRhcmdldCBjb250YWluZXIgYW5kIHRoZSBpZCBoYXMgY2hhbmdlZCwgdHJlYXQgaXQgYXMgYSBuZXcgbm9kZVxuICAgICAgICAgIC8vIGJ5IHJlcGxhY2luZyB0aGUgZnJvbUVsIHdpdGggdGhlIHRvRWwsIHdoaWNoIGVuc3VyZXMgaG9va3MgYXJlIHRvcm4gZG93biBhbmQgcmUtY3JlYXRlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZyb21FbC5pZCAmJlxuICAgICAgICAgICAgZnJvbUVsLmlzU2FtZU5vZGUodGFyZ2V0Q29udGFpbmVyKSAmJlxuICAgICAgICAgICAgZnJvbUVsLmlkICE9PSB0b0VsLmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtb3JwaENhbGxiYWNrcy5vbk5vZGVEaXNjYXJkZWQoZnJvbUVsKTtcbiAgICAgICAgICAgIGZyb21FbC5yZXBsYWNlV2l0aCh0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiBtb3JwaENhbGxiYWNrcy5vbk5vZGVBZGRlZCh0b0VsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NLnN5bmNQZW5kaW5nQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICBET00ubWFpbnRhaW5Qcml2YXRlSG9va3MoXG4gICAgICAgICAgICBmcm9tRWwsXG4gICAgICAgICAgICB0b0VsLFxuICAgICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgICBwaHhWaWV3cG9ydEJvdHRvbSxcbiAgICAgICAgICApO1xuICAgICAgICAgIERPTS5jbGVhbkNoaWxkTm9kZXModG9FbCwgcGh4VXBkYXRlKTtcbiAgICAgICAgICBpZiAodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxpdmUgY29tcG9uZW50IHVzZWQgaW4gYSBzdHJlYW0sIHdlIG1heSBuZWVkIHRvIHJlb3JkZXIgaXRcbiAgICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChET00uaXNQaHhTdGlja3koZnJvbUVsKSkge1xuICAgICAgICAgICAgW1BIWF9TRVNTSU9OLCBQSFhfU1RBVElDLCBQSFhfUk9PVF9JRF1cbiAgICAgICAgICAgICAgLm1hcCgoYXR0cikgPT4gW1xuICAgICAgICAgICAgICAgIGF0dHIsXG4gICAgICAgICAgICAgICAgZnJvbUVsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmZvckVhY2goKFthdHRyLCBmcm9tVmFsLCB0b1ZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG9WYWwgJiYgZnJvbVZhbCAhPT0gdG9WYWwpIHtcbiAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdG9WYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkgfHxcbiAgICAgICAgICAgIChmcm9tRWwuZm9ybSAmJiBmcm9tRWwuZm9ybS5pc1NhbWVOb2RlKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7XG4gICAgICAgICAgICAgIGlzSWdub3JlZDogRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZnJvbUVsLnZhbGlkaXR5ICYmXG4gICAgICAgICAgICBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIFBIWF9SRUZfU1JDLCBpdCBpcyBsb2FkaW5nIG9yIGxvY2tlZCBhbmQgYXdhaXRpbmcgYW4gYWNrLlxuICAgICAgICAgIC8vIElmIGl0J3MgbG9ja2VkLCB3ZSBjbG9uZSB0aGUgZnJvbUVsIHRyZWUgYW5kIGluc3RydWN0IG1vcnBoZG9tIHRvIHVzZVxuICAgICAgICAgIC8vIHRoZSBjbG9uZWQgdHJlZSBhcyB0aGUgc291cmNlIG9mIHRoZSBtb3JwaCBmb3IgdGhpcyBicmFuY2ggZnJvbSBoZXJlIG9uIG91dC5cbiAgICAgICAgICAvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgdHJlZSBpbiB0aGUgZWxlbWVudCdzIHByaXZhdGUgZGF0YSwgYW5kXG4gICAgICAgICAgLy8gb24gYWNrICh2aWV3LnVuZG9SZWZzKSwgd2UgbW9ycGggdGhlIGNsb25lZCB0cmVlIHdpdGggdGhlIHRydWUgZnJvbUVsIGluIHRoZSBET00gdG9cbiAgICAgICAgICAvLyBhcHBseSBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHdoaWxlIHRoZSBlbGVtZW50IHdhcyBsb2NrZWQuXG4gICAgICAgICAgY29uc3QgaXNGb2N1c2VkRm9ybUVsID1cbiAgICAgICAgICAgIGZvY3VzZWQgJiYgZnJvbUVsLmlzU2FtZU5vZGUoZm9jdXNlZCkgJiYgRE9NLmlzRm9ybUlucHV0KGZyb21FbCk7XG4gICAgICAgICAgY29uc3QgZm9jdXNlZFNlbGVjdENoYW5nZWQgPVxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmIHRoaXMuaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBuZXcgRWxlbWVudFJlZihmcm9tRWwpO1xuICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIHRoZSBjbG9uZSBzdGVwIGlmIHRoaXMgaXMgbm90IGEgcGF0Y2ggdGhhdCB1bmxvY2tzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJlZi5sb2NrUmVmICYmXG4gICAgICAgICAgICAgICghdGhpcy51bmRvUmVmIHx8ICFyZWYuaXNMb2NrVW5kb25lQnkodGhpcy51bmRvUmVmKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSkge1xuICAgICAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwgeyBpc0lnbm9yZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlzTG9ja2VkID0gZnJvbUVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuICAgICAgICAgICAgICBjb25zdCBjbG9uZSA9IGlzTG9ja2VkXG4gICAgICAgICAgICAgICAgPyBET00ucHJpdmF0ZShmcm9tRWwsIFBIWF9SRUZfTE9DSykgfHwgZnJvbUVsLmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGX0xPQ0ssIGNsb25lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZEZvcm1FbCkge1xuICAgICAgICAgICAgICAgICAgZnJvbUVsID0gY2xvbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRE9NLmlzUGh4Q2hpbGQodG9FbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHsgZXhjbHVkZTogW1BIWF9TVEFUSUNdIH0pO1xuICAgICAgICAgICAgaWYgKHByZXZTZXNzaW9uICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdElEKTtcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgdW5kb2luZyBhIGxvY2ssIGNvcHkgcG90ZW50aWFsbHkgbmVzdGVkIGNsb25lcyBvdmVyXG4gICAgICAgICAgaWYgKHRoaXMudW5kb1JlZiAmJiBET00ucHJpdmF0ZSh0b0VsLCBQSFhfUkVGX0xPQ0spKSB7XG4gICAgICAgICAgICBET00ucHV0UHJpdmF0ZShcbiAgICAgICAgICAgICAgZnJvbUVsLFxuICAgICAgICAgICAgICBQSFhfUkVGX0xPQ0ssXG4gICAgICAgICAgICAgIERPTS5wcml2YXRlKHRvRWwsIFBIWF9SRUZfTE9DSyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBub3cgY29weSByZWd1bGFyIERPTS5wcml2YXRlIGRhdGFcbiAgICAgICAgICBET00uY29weVByaXZhdGVzKHRvRWwsIGZyb21FbCk7XG5cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKHRvRWwpKSB7XG4gICAgICAgICAgICBwb3J0YWxDYWxsYmFja3MucHVzaCgoKSA9PiB0aGlzLnRlbGVwb3J0KHRvRWwsIG1vcnBoKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2tpcCBwYXRjaGluZyBmb2N1c2VkIGlucHV0cyB1bmxlc3MgZm9jdXMgaXMgYSBzZWxlY3QgdGhhdCBoYXMgY2hhbmdlZCBvcHRpb25zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmXG4gICAgICAgICAgICBmcm9tRWwudHlwZSAhPT0gXCJoaWRkZW5cIiAmJlxuICAgICAgICAgICAgIWZvY3VzZWRTZWxlY3RDaGFuZ2VkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyhmcm9tRWwpO1xuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbCk7XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJsdXIgZm9jdXNlZCBzZWxlY3QgaWYgaXQgY2hhbmdlZCBzbyBuYXRpdmUgVUkgaXMgdXBkYXRlZCAoaWUgc2FmYXJpIHdvbid0IHVwZGF0ZSB2aXNpYmxlIG9wdGlvbnMpXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFNlbGVjdENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgZnJvbUVsLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChET00uaXNQaHhVcGRhdGUodG9FbCwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSkge1xuICAgICAgICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBET01Qb3N0TW9ycGhSZXN0b3JlcihcbiAgICAgICAgICAgICAgICAgIGZyb21FbCxcbiAgICAgICAgICAgICAgICAgIHRvRWwsXG4gICAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERPTS5zeW5jQXR0cnNUb1Byb3BzKHRvRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyh0b0VsKTtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICByZXR1cm4gZnJvbUVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIG1vcnBoZG9tKHRhcmdldENvbnRhaW5lciwgc291cmNlLCBtb3JwaENhbGxiYWNrcyk7XG4gICAgfTtcblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpO1xuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGNvbnRhaW5lciwgY29udGFpbmVyKTtcblxuICAgIGxpdmVTb2NrZXQudGltZShcIm1vcnBoZG9tXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RyZWFtcy5mb3JFYWNoKChbcmVmLCBpbnNlcnRzLCBkZWxldGVJZHMsIHJlc2V0XSkgPT4ge1xuICAgICAgICBpbnNlcnRzLmZvckVhY2goKFtrZXksIHN0cmVhbUF0LCBsaW1pdCwgdXBkYXRlT25seV0pID0+IHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUluc2VydHNba2V5XSA9IHsgcmVmLCBzdHJlYW1BdCwgbGltaXQsIHJlc2V0LCB1cGRhdGVPbmx5IH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIERPTS5hbGwoY29udGFpbmVyLCBgWyR7UEhYX1NUUkVBTV9SRUZ9PVwiJHtyZWZ9XCJdYCwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlSWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGNsZWFyIHN0cmVhbSBpdGVtcyBmcm9tIHRoZSBkZWFkIHJlbmRlciBpZiB0aGV5IGFyZSBub3QgaW5zZXJ0ZWQgYWdhaW5cbiAgICAgIGlmIChpc0pvaW5QYXRjaCkge1xuICAgICAgICBET00uYWxsKHRoaXMuY29udGFpbmVyLCBgWyR7cGh4VXBkYXRlfT0ke1BIWF9TVFJFQU19XWApXG4gICAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIGZpbHRlciB0aGUgZWxlbWVudCBiZWZvcmUgcmVtb3ZpbmcgdGhlbSwgYXNcbiAgICAgICAgICAvLyBpdCBtYXkgaGFwcGVuIHRoYXQgc3RyZWFtcyBhcmUgbmVzdGVkIGFuZCB0aGUgb3duZXIgY2hlY2sgZmFpbHMgaWZcbiAgICAgICAgICAvLyBhIHBhcmVudCBpcyByZW1vdmVkIGJlZm9yZSBhIGNoaWxkXG4gICAgICAgICAgLmZpbHRlcigoZWwpID0+IHRoaXMudmlldy5vd25zRWxlbWVudChlbCkpXG4gICAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IHBlcmZvcm1lZCB0aGUgb3duZXIgY2hlY2ssIGVhY2ggY2hpbGQgaXMgZ3VhcmFudGVlZCB0byBiZSBvd25lZFxuICAgICAgICAgICAgICAvLyBieSB0aGUgdmlldy4gVG8gcHJldmVudCB0aGUgbmVzdGVkIG93bmVyIGNoZWNrIGZyb20gZmFpbGluZyBpbiBjYXNlIG9mIG5lc3RlZFxuICAgICAgICAgICAgICAvLyBzdHJlYW1zIHdoZXJlIHRoZSBwYXJlbnQgaXMgcmVtb3ZlZCBiZWZvcmUgdGhlIGNoaWxkLCB3ZSBmb3JjZSB0aGUgcmVtb3ZhbFxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbW9ycGgodGFyZ2V0Q29udGFpbmVyLCBodG1sKTtcbiAgICAgIC8vIG5vcm1hbCBwYXRjaCBjb21wbGV0ZSwgdGVsZXBvcnQgZWxlbWVudHMgbm93XG4gICAgICBwb3J0YWxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKCkpO1xuICAgICAgLy8gY2hlY2sgZm9yIGFueSB0ZWxlcG9ydGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgdmlldyBhbnkgbW9yZVxuICAgICAgLy8gYW5kIHJlbW92ZSB0aGVtXG4gICAgICB0aGlzLnZpZXcucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGVsKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kcm9wUG9ydGFsRWxlbWVudElkKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSkge1xuICAgICAgZGV0ZWN0RHVwbGljYXRlSWRzKCk7XG4gICAgICBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyh0aGlzLnN0cmVhbUluc2VydHMpO1xuICAgICAgLy8gd2FybiBpZiB0aGVyZSBhcmUgYW55IGlucHV0cyBuYW1lZCBcImlkXCJcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9aWRdXCIpKS5mb3JFYWNoKFxuICAgICAgICAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBub2RlLmZvcm0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdEZXRlY3RlZCBhbiBpbnB1dCB3aXRoIG5hbWU9XCJpZFwiIGluc2lkZSBhIGZvcm0hIFRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyB3aGVuIHBhdGNoaW5nIHRoZSBET00uXFxuJyxcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXBwZW5kUHJlcGVuZFVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGl2ZVNvY2tldC50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4gdXBkYXRlLnBlcmZvcm0oKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXZlU29ja2V0LnNpbGVuY2VFdmVudHMoKCkgPT5cbiAgICAgIERPTS5yZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCksXG4gICAgKTtcbiAgICBET00uZGlzcGF0Y2hFdmVudChkb2N1bWVudCwgXCJwaHg6dXBkYXRlXCIpO1xuICAgIGFkZGVkLmZvckVhY2goKGVsKSA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLCBlbCkpO1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgoZWwpID0+IHRoaXMudHJhY2tBZnRlcihcInVwZGF0ZWRcIiwgZWwpKTtcblxuICAgIHRoaXMudHJhbnNpdGlvblBlbmRpbmdSZW1vdmVzKCk7XG5cbiAgICBpZiAoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKSB7XG4gICAgICBsaXZlU29ja2V0LnVubG9hZCgpO1xuICAgICAgLy8gY2hlY2sgZm9yIHN1Ym1pdHRlciBhbmQgaW5qZWN0IGl0IGFzIGhpZGRlbiBpbnB1dCBmb3IgZXh0ZXJuYWwgc3VibWl0O1xuICAgICAgLy8gSW4gdGhlb3J5LCBpdCBjb3VsZCBoYXBwZW4gdGhhdCB0aGUgc3RvcmVkIHN1Ym1pdHRlciBpcyBvdXRkYXRlZCBhbmQgZG9lc24ndFxuICAgICAgLy8gZXhpc3QgaW4gdGhlIERPTSBhbnkgbW9yZSwgYnV0IHRoaXMgaXMgdW5saWtlbHksIHNvIHdlIGp1c3QgYWNjZXB0IGl0IGZvciBub3cuXG4gICAgICBjb25zdCBzdWJtaXR0ZXIgPSBET00ucHJpdmF0ZShleHRlcm5hbEZvcm1UcmlnZ2VyZWQsIFwic3VibWl0dGVyXCIpO1xuICAgICAgaWYgKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIubmFtZSAmJiB0YXJnZXRDb250YWluZXIuY29udGFpbnMoc3VibWl0dGVyKSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIGNvbnN0IGZvcm1JZCA9IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtXCIpO1xuICAgICAgICBpZiAoZm9ybUlkKSB7XG4gICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwiZm9ybVwiLCBmb3JtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICAgICAgaW5wdXQudmFsdWUgPSBzdWJtaXR0ZXIudmFsdWU7XG4gICAgICAgIHN1Ym1pdHRlci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShpbnB1dCwgc3VibWl0dGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZSBwcm90b3R5cGUncyBzdWJtaXQgaW4gY2FzZSB0aGVyZSdzIGEgZm9ybSBjb250cm9sIHdpdGggbmFtZSBvciBpZCBvZiBcInN1Ym1pdFwiXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEZvcm1FbGVtZW50L3N1Ym1pdFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkuc3VibWl0LmNhbGwoXG4gICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25Ob2RlRGlzY2FyZGVkKGVsKSB7XG4gICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICBpZiAoRE9NLmlzUGh4Q2hpbGQoZWwpIHx8IERPTS5pc1BoeFN0aWNreShlbCkpIHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoZWwpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIiwgZWwpO1xuICB9XG5cbiAgbWF5YmVQZW5kaW5nUmVtb3ZlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUodGhpcy5waHhSZW1vdmUpICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBlbmRpbmdSZW1vdmVzLnB1c2gobm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgIC8vIG1ha2Ugc3VyZSB0byBvbmx5IHJlbW92ZSBlbGVtZW50cyBvd25lZCBieSB0aGUgY3VycmVudCB2aWV3XG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zMDQ3XG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zNjgxXG4gICAgaWYgKCFmb3JjZSAmJiAhdGhpcy52aWV3Lm93bnNFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG5vZGUgaWYgaXQgaXMgYWN0dWFsbHkgcmUtYWRkZWQgaW4gdGhlIHNhbWUgcGF0Y2hcbiAgICAvLyB3ZSBkbyBOT1Qgd2FudCB0byBleGVjdXRlIHBoeC1yZW1vdmUsIHdlIGRvIE5PVCB3YW50IHRvIGNhbGwgb25Ob2RlRGlzY2FyZGVkXG4gICAgaWYgKHRoaXMuc3RyZWFtSW5zZXJ0c1tjaGlsZC5pZF0pIHtcbiAgICAgIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtjaGlsZC5pZF0gPSBjaGlsZDtcbiAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IHJlbW92ZSB0aGUgZWxlbWVudCBub3cgaWYgaXQgaGFzIG5vIHBoeC1yZW1vdmUgYmluZGluZ1xuICAgICAgaWYgKCF0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShjaGlsZCkpIHtcbiAgICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRTdHJlYW1JbnNlcnQoZWwpIHtcbiAgICBjb25zdCBpbnNlcnQgPSBlbC5pZCA/IHRoaXMuc3RyZWFtSW5zZXJ0c1tlbC5pZF0gOiB7fTtcbiAgICByZXR1cm4gaW5zZXJ0IHx8IHt9O1xuICB9XG5cbiAgc2V0U3RyZWFtUmVmKGVsLCByZWYpIHtcbiAgICBET00ucHV0U3RpY2t5KGVsLCBQSFhfU1RSRUFNX1JFRiwgKGVsKSA9PlxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGLCByZWYpLFxuICAgICk7XG4gIH1cblxuICBtYXliZVJlT3JkZXJTdHJlYW0oZWwsIGlzTmV3KSB7XG4gICAgY29uc3QgeyByZWYsIHN0cmVhbUF0LCByZXNldCB9ID0gdGhpcy5nZXRTdHJlYW1JbnNlcnQoZWwpO1xuICAgIGlmIChzdHJlYW1BdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBzZXQgdGhlIFBIWF9TVFJFQU1fUkVGIGhlcmUgYXMgd2VsbCBhcyBhZGRDaGlsZCBpcyBpbnZva2VkIG9ubHkgZm9yIHBhcmVudHNcbiAgICB0aGlzLnNldFN0cmVhbVJlZihlbCwgcmVmKTtcblxuICAgIGlmICghcmVzZXQgJiYgIWlzTmV3KSB7XG4gICAgICAvLyB3ZSBvbmx5IHJlb3JkZXIgaWYgdGhlIGVsZW1lbnQgaXMgbmV3IG9yIGl0J3MgYSBzdHJlYW0gcmVzZXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSBwYXJlbnQgZWxlbWVudDtcbiAgICAvLyBpdCBkb2Vzbid0IGlmIHdlIGFyZSBjdXJyZW50bHkgcmVjdXJzaXZlbHkgbW9ycGhpbmcgKHJlc3RvcmluZyBhIHNhdmVkIHN0cmVhbSBjaGlsZClcbiAgICAvLyBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgYWRkZWQgdG8gdGhlIHJlYWwgZG9tO1xuICAgIC8vIHJlb3JkZXJpbmcgZG9lcyBub3QgbWFrZSBzZW5zZSBpbiB0aGF0IGNhc2UgYW55d2F5XG4gICAgaWYgKCFlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICBlbC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShlbCwgZWwucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1BdCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IG9sZEluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbCk7XG4gICAgICBpZiAoc3RyZWFtQXQgPj0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBlbC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjaGlsZHJlbltzdHJlYW1BdF07XG4gICAgICAgIGlmIChvbGRJbmRleCA+IHN0cmVhbUF0KSB7XG4gICAgICAgICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWwsIHNpYmxpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsLCBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1heWJlTGltaXRTdHJlYW0oZWwpO1xuICB9XG5cbiAgbWF5YmVMaW1pdFN0cmVhbShlbCkge1xuICAgIGNvbnN0IHsgbGltaXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGVsKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGxpbWl0ICE9PSBudWxsICYmIEFycmF5LmZyb20oZWwucGFyZW50RWxlbWVudC5jaGlsZHJlbik7XG4gICAgaWYgKGxpbWl0ICYmIGxpbWl0IDwgMCAmJiBjaGlsZHJlbi5sZW5ndGggPiBsaW1pdCAqIC0xKSB7XG4gICAgICBjaGlsZHJlblxuICAgICAgICAuc2xpY2UoMCwgY2hpbGRyZW4ubGVuZ3RoICsgbGltaXQpXG4gICAgICAgIC5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5yZW1vdmVTdHJlYW1DaGlsZEVsZW1lbnQoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKGxpbWl0ICYmIGxpbWl0ID49IDAgJiYgY2hpbGRyZW4ubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIGNoaWxkcmVuXG4gICAgICAgIC5zbGljZShsaW1pdClcbiAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCkpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb25QZW5kaW5nUmVtb3ZlcygpIHtcbiAgICBjb25zdCB7IHBlbmRpbmdSZW1vdmVzLCBsaXZlU29ja2V0IH0gPSB0aGlzO1xuICAgIGlmIChwZW5kaW5nUmVtb3Zlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaXZlU29ja2V0LnRyYW5zaXRpb25SZW1vdmVzKHBlbmRpbmdSZW1vdmVzLCAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBET00uZmlyc3RQaHhDaGlsZChlbCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICBsaXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50cmFja0FmdGVyKFwidHJhbnNpdGlvbnNEaXNjYXJkZWRcIiwgcGVuZGluZ1JlbW92ZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCkge1xuICAgIGlmICghKGZyb21FbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB8fCBmcm9tRWwubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZyb21FbC5vcHRpb25zLmxlbmd0aCAhPT0gdG9FbC5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIHRvRWwudmFsdWUgPSBmcm9tRWwudmFsdWU7XG5cbiAgICAvLyBpbiBnZW5lcmFsIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHdpdGggdXNpbmcgaXNFcXVhbE5vZGUgYXMgaXQgZG9lcyBub3QgYSByZWxpYWJsZVxuICAgIC8vIERPTSB0cmVlIGVxdWFsaXR5IGNoZWNrLCBidXQgZm9yIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIGFuZCBvcHRpb25zIGl0IHdvcmtzIGZpbmVcbiAgICByZXR1cm4gIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKTtcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuY2lkUGF0Y2g7XG4gIH1cblxuICBza2lwQ0lEU2libGluZyhlbCkge1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9TS0lQKTtcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKSB7XG4gICAgaWYgKCF0aGlzLmlzQ0lEUGF0Y2goKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdChcbiAgICAgIHRoaXMudmlldy5pZCxcbiAgICAgIHRoaXMudGFyZ2V0Q0lELFxuICAgICk7XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwICYmIERPTS5jaGlsZE5vZGVMZW5ndGgoaHRtbCkgPT09IDEpIHtcbiAgICAgIHJldHVybiBmaXJzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5kZXhPZihwYXJlbnQsIGNoaWxkKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKGNoaWxkKTtcbiAgfVxuXG4gIHRlbGVwb3J0KGVsLCBtb3JwaCkge1xuICAgIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICAgIGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuICAgIGlmICghcG9ydGFsQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwicG9ydGFsIHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiICsgdGFyZ2V0U2VsZWN0b3IgKyBcIiBub3QgZm91bmRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIHBoeC1wb3J0YWwgdGVtcGxhdGVzIG11c3QgaGF2ZSBhIHNpbmdsZSByb290IGVsZW1lbnQsIHNvIHdlIGFzc3VtZSB0aGlzIHRvIGJlXG4gICAgLy8gdGhlIGNhc2UgaGVyZVxuICAgIGNvbnN0IHRvVGVsZXBvcnQgPSBlbC5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgIC8vIHRoZSBQSFhfU0tJUCBvcHRpbWl6YXRpb24gY2FuIGFsc28gYXBwbHkgaW5zaWRlIG9mIHRoZSA8dGVtcGxhdGU+IGVsZW1lbnRzXG4gICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcodG9UZWxlcG9ydCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0b1RlbGVwb3J0Py5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInBoeC1wb3J0YWwgdGVtcGxhdGUgbXVzdCBoYXZlIGEgc2luZ2xlIHJvb3QgZWxlbWVudCB3aXRoIElEIVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0b1RlbGVwb3J0LmlkKTtcbiAgICBsZXQgcG9ydGFsVGFyZ2V0O1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYW5vdGhlciB0YXJnZXRcbiAgICAgIGlmICghcG9ydGFsQ29udGFpbmVyLmNvbnRhaW5zKGV4aXN0aW5nKSkge1xuICAgICAgICBwb3J0YWxDb250YWluZXIuYXBwZW5kQ2hpbGQoZXhpc3RpbmcpO1xuICAgICAgfVxuICAgICAgLy8gd2UgYWxyZWFkeSB0ZWxlcG9ydGVkIGluIGEgcHJldmlvdXMgcGF0Y2hcbiAgICAgIHBvcnRhbFRhcmdldCA9IGV4aXN0aW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjcmVhdGUgZW1wdHkgdGFyZ2V0IGFuZCBtb3JwaCBpdCByZWN1cnNpdmVseVxuICAgICAgcG9ydGFsVGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b1RlbGVwb3J0LnRhZ05hbWUpO1xuICAgICAgcG9ydGFsQ29udGFpbmVyLmFwcGVuZENoaWxkKHBvcnRhbFRhcmdldCk7XG4gICAgfVxuICAgIC8vIG1hcmsgdGhlIHRhcmdldCBhcyB0ZWxlcG9ydGVkO1xuICAgIC8vIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgYXR0cmlidXRlIG1vZGlmaWNhdGlvbnMsIHdlIHNldCB0aGUgYXR0cmlidXRlXG4gICAgLy8gb24gdGhlIHNvdXJjZSBhbmQgcmVtb3ZlIGl0IGFmdGVyIG1vcnBoaW5nICh3ZSBjb3VsZCBhbHNvIGp1c3Qga2VlcCBpdClcbiAgICAvLyBvdGhlcndpc2UgbW9ycGhkb20gd291bGQgcmVtb3ZlIGl0LCBhcyB0aGUgcmVmIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzb3VyY2VcbiAgICAvLyBhbmQgd2UnZCBuZWVkIHRvIHNldCBpdCBiYWNrIGFmdGVyIGVhY2ggbW9ycGhcbiAgICB0b1RlbGVwb3J0LnNldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYsIHRoaXMudmlldy5pZCk7XG4gICAgdG9UZWxlcG9ydC5zZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDLCBlbC5pZCk7XG4gICAgbW9ycGgocG9ydGFsVGFyZ2V0LCB0b1RlbGVwb3J0LCB0cnVlKTtcbiAgICB0b1RlbGVwb3J0LnJlbW92ZUF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpO1xuICAgIHRvVGVsZXBvcnQucmVtb3ZlQXR0cmlidXRlKFBIWF9URUxFUE9SVEVEX1NSQyk7XG4gICAgLy8gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRlbGVwb3J0ZWQgZWxlbWVudCBpbiB0aGUgdmlld1xuICAgIC8vIHRvIGNsZWFudXAgd2hlbiB0aGUgdmlldyBpcyBkZXN0cm95ZWQsIGluIGNhc2UgdGhlIHBvcnRhbCB0YXJnZXRcbiAgICAvLyBpcyBvdXRzaWRlIHRoZSB2aWV3IGl0c2VsZlxuICAgIHRoaXMudmlldy5wdXNoUG9ydGFsRWxlbWVudElkKHRvVGVsZXBvcnQuaWQpO1xuICB9XG5cbiAgaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSkge1xuICAgIC8vIHVzdWFsbHksIHNjcmlwdHMgYXJlIG5vdCBleGVjdXRlZCB3aGVuIG1vcnBoZG9tIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIHJ1bnRpbWUgY29sb2NhdGVkIGhvb2tzXG4gICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZShQSFhfUlVOVElNRV9IT09LKTtcbiAgICBsZXQgbm9uY2UgPSBlbC5oYXNBdHRyaWJ1dGUoXCJub25jZVwiKSA/IGVsLmdldEF0dHJpYnV0ZShcIm5vbmNlXCIpIDogbnVsbDtcbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKFwibm9uY2VcIikpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc291cmNlO1xuICAgICAgbm9uY2UgPSB0ZW1wbGF0ZS5jb250ZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gKVxuICAgICAgICAuZ2V0QXR0cmlidXRlKFwibm9uY2VcIik7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0LnRleHRDb250ZW50ID0gZWwudGV4dENvbnRlbnQ7XG4gICAgRE9NLm1lcmdlQXR0cnMoc2NyaXB0LCBlbCwgeyBpc0lnbm9yZWQ6IGZhbHNlIH0pO1xuICAgIGlmIChub25jZSkge1xuICAgICAgc2NyaXB0Lm5vbmNlID0gbm9uY2U7XG4gICAgfVxuICAgIGVsLnJlcGxhY2VXaXRoKHNjcmlwdCk7XG4gICAgZWwgPSBzY3JpcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBDT01QT05FTlRTLFxuICBURU1QTEFURVMsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1ZJRVdfUkVGLFxuICBQSFhfU0tJUCxcbiAgUEhYX01BR0lDX0lELFxuICBSRVBMWSxcbiAgU1RBVElDLFxuICBUSVRMRSxcbiAgU1RSRUFNLFxuICBST09ULFxuICBLRVlFRCxcbiAgS0VZRURfQ09VTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBpc09iamVjdCwgbG9nRXJyb3IsIGlzQ2lkIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgVk9JRF9UQUdTID0gbmV3IFNldChbXG4gIFwiYXJlYVwiLFxuICBcImJhc2VcIixcbiAgXCJiclwiLFxuICBcImNvbFwiLFxuICBcImNvbW1hbmRcIixcbiAgXCJlbWJlZFwiLFxuICBcImhyXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJrZXlnZW5cIixcbiAgXCJsaW5rXCIsXG4gIFwibWV0YVwiLFxuICBcInBhcmFtXCIsXG4gIFwic291cmNlXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ3YnJcIixcbl0pO1xuY29uc3QgcXVvdGVDaGFycyA9IG5ldyBTZXQoW1wiJ1wiLCAnXCInXSk7XG5cbmV4cG9ydCBjb25zdCBtb2RpZnlSb290ID0gKGh0bWwsIGF0dHJzLCBjbGVhcklubmVySFRNTCkgPT4ge1xuICBsZXQgaSA9IDA7XG4gIGxldCBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIGxldCBiZWZvcmVUYWcsIGFmdGVyVGFnLCB0YWcsIHRhZ05hbWVFbmRzQXQsIGlkLCBuZXdIVE1MO1xuXG4gIGNvbnN0IGxvb2thaGVhZCA9IGh0bWwubWF0Y2goL14oXFxzKig/OjwhLS0uKj8tLT5cXHMqKSopPChbXlxcc1xcLz5dKykvKTtcbiAgaWYgKGxvb2thaGVhZCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWFsZm9ybWVkIGh0bWwgJHtodG1sfWApO1xuICB9XG5cbiAgaSA9IGxvb2thaGVhZFswXS5sZW5ndGg7XG4gIGJlZm9yZVRhZyA9IGxvb2thaGVhZFsxXTtcbiAgdGFnID0gbG9va2FoZWFkWzJdO1xuICB0YWdOYW1lRW5kc0F0ID0gaTtcblxuICAvLyBTY2FuIHRoZSBvcGVuaW5nIHRhZyBmb3IgaWQsIGlmIHRoZXJlIGlzIGFueVxuICBmb3IgKGk7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGh0bWwuY2hhckF0KGkpID09PSBcIj5cIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChodG1sLmNoYXJBdChpKSA9PT0gXCI9XCIpIHtcbiAgICAgIGNvbnN0IGlzSWQgPSBodG1sLnNsaWNlKGkgLSAzLCBpKSA9PT0gXCIgaWRcIjtcbiAgICAgIGkrKztcbiAgICAgIGNvbnN0IGNoYXIgPSBodG1sLmNoYXJBdChpKTtcbiAgICAgIGlmIChxdW90ZUNoYXJzLmhhcyhjaGFyKSkge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRzQXQgPSBpO1xuICAgICAgICBpKys7XG4gICAgICAgIGZvciAoaTsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaHRtbC5jaGFyQXQoaSkgPT09IGNoYXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJZCkge1xuICAgICAgICAgIGlkID0gaHRtbC5zbGljZShhdHRyU3RhcnRzQXQgKyAxLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBjbG9zZUF0ID0gaHRtbC5sZW5ndGggLSAxO1xuICBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIHdoaWxlIChjbG9zZUF0ID49IGJlZm9yZVRhZy5sZW5ndGggKyB0YWcubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGh0bWwuY2hhckF0KGNsb3NlQXQpO1xuICAgIGlmIChpbnNpZGVDb21tZW50KSB7XG4gICAgICBpZiAoY2hhciA9PT0gXCItXCIgJiYgaHRtbC5zbGljZShjbG9zZUF0IC0gMywgY2xvc2VBdCkgPT09IFwiPCEtXCIpIHtcbiAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICBjbG9zZUF0IC09IDQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZUF0IC09IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIj5cIiAmJiBodG1sLnNsaWNlKGNsb3NlQXQgLSAyLCBjbG9zZUF0KSA9PT0gXCItLVwiKSB7XG4gICAgICBpbnNpZGVDb21tZW50ID0gdHJ1ZTtcbiAgICAgIGNsb3NlQXQgLT0gMztcbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiPlwiKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvc2VBdCAtPSAxO1xuICAgIH1cbiAgfVxuICBhZnRlclRhZyA9IGh0bWwuc2xpY2UoY2xvc2VBdCArIDEsIGh0bWwubGVuZ3RoKTtcblxuICBjb25zdCBhdHRyc1N0ciA9IE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoKGF0dHIpID0+IChhdHRyc1thdHRyXSA9PT0gdHJ1ZSA/IGF0dHIgOiBgJHthdHRyfT1cIiR7YXR0cnNbYXR0cl19XCJgKSlcbiAgICAuam9pbihcIiBcIik7XG5cbiAgaWYgKGNsZWFySW5uZXJIVE1MKSB7XG4gICAgLy8gS2VlcCB0aGUgaWQgaWYgYW55XG4gICAgY29uc3QgaWRBdHRyU3RyID0gaWQgPyBgIGlkPVwiJHtpZH1cImAgOiBcIlwiO1xuICAgIGlmIChWT0lEX1RBR1MuaGFzKHRhZykpIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0vPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0+PC8ke3RhZ30+YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzdCA9IGh0bWwuc2xpY2UodGFnTmFtZUVuZHNBdCwgY2xvc2VBdCArIDEpO1xuICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0ke3Jlc3R9YDtcbiAgfVxuXG4gIHJldHVybiBbbmV3SFRNTCwgYmVmb3JlVGFnLCBhZnRlclRhZ107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlZCB7XG4gIHN0YXRpYyBleHRyYWN0KGRpZmYpIHtcbiAgICBjb25zdCB7IFtSRVBMWV06IHJlcGx5LCBbRVZFTlRTXTogZXZlbnRzLCBbVElUTEVdOiB0aXRsZSB9ID0gZGlmZjtcbiAgICBkZWxldGUgZGlmZltSRVBMWV07XG4gICAgZGVsZXRlIGRpZmZbRVZFTlRTXTtcbiAgICBkZWxldGUgZGlmZltUSVRMRV07XG4gICAgcmV0dXJuIHsgZGlmZiwgdGl0bGUsIHJlcGx5OiByZXBseSB8fCBudWxsLCBldmVudHM6IGV2ZW50cyB8fCBbXSB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Iodmlld0lkLCByZW5kZXJlZCkge1xuICAgIHRoaXMudmlld0lkID0gdmlld0lkO1xuICAgIHRoaXMucmVuZGVyZWQgPSB7fTtcbiAgICB0aGlzLm1hZ2ljSWQgPSAwO1xuICAgIHRoaXMubWVyZ2VEaWZmKHJlbmRlcmVkKTtcbiAgfVxuXG4gIHBhcmVudFZpZXdJZCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SWQ7XG4gIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcykge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkLFxuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICAgIG9ubHlDaWRzLFxuICAgICAgdHJ1ZSxcbiAgICAgIHt9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfTtcbiAgfVxuXG4gIHJlY3Vyc2l2ZVRvU3RyaW5nKFxuICAgIHJlbmRlcmVkLFxuICAgIGNvbXBvbmVudHMgPSByZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICBvbmx5Q2lkcyxcbiAgICBjaGFuZ2VUcmFja2luZyxcbiAgICByb290QXR0cnMsXG4gICkge1xuICAgIG9ubHlDaWRzID0gb25seUNpZHMgPyBuZXcgU2V0KG9ubHlDaWRzKSA6IG51bGw7XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgYnVmZmVyOiBcIlwiLFxuICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgIG9ubHlDaWRzOiBvbmx5Q2lkcyxcbiAgICAgIHN0cmVhbXM6IG5ldyBTZXQoKSxcbiAgICB9O1xuICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIG51bGwsIG91dHB1dCwgY2hhbmdlVHJhY2tpbmcsIHJvb3RBdHRycyk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBvdXRwdXQuYnVmZmVyLCBzdHJlYW1zOiBvdXRwdXQuc3RyZWFtcyB9O1xuICB9XG5cbiAgY29tcG9uZW50Q0lEcyhkaWZmKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmZbQ09NUE9ORU5UU10gfHwge30pLm1hcCgoaSkgPT4gcGFyc2VJbnQoaSkpO1xuICB9XG5cbiAgaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKSB7XG4gICAgaWYgKCFkaWZmW0NPTVBPTkVOVFNdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPT09IDE7XG4gIH1cblxuICBnZXRDb21wb25lbnQoZGlmZiwgY2lkKSB7XG4gICAgcmV0dXJuIGRpZmZbQ09NUE9ORU5UU11bY2lkXTtcbiAgfVxuXG4gIHJlc2V0UmVuZGVyKGNpZCkge1xuICAgIC8vIHdlIGFyZSByYWNpbmcgYSBjb21wb25lbnQgZGVzdHJveSwgaXQgY291bGQgbm90IGV4aXN0LCBzb1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyeSB0byBzZXQgcmVzZXQgb24gdW5kZWZpbmVkXG4gICAgaWYgKHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdLnJlc2V0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBtZXJnZURpZmYoZGlmZikge1xuICAgIGNvbnN0IG5ld2MgPSBkaWZmW0NPTVBPTkVOVFNdO1xuICAgIGNvbnN0IGNhY2hlID0ge307XG4gICAgZGVsZXRlIGRpZmZbQ09NUE9ORU5UU107XG4gICAgdGhpcy5yZW5kZXJlZCA9IHRoaXMubXV0YWJsZU1lcmdlKHRoaXMucmVuZGVyZWQsIGRpZmYpO1xuICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdIHx8IHt9O1xuXG4gICAgaWYgKG5ld2MpIHtcbiAgICAgIGNvbnN0IG9sZGMgPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG5ld2NbY2lkXSA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChjaWQsIG5ld2NbY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG9sZGNbY2lkXSA9IG5ld2NbY2lkXTtcbiAgICAgIH1cbiAgICAgIGRpZmZbQ09NUE9ORU5UU10gPSBuZXdjO1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBjZGlmZiwgb2xkYywgbmV3YywgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGVbY2lkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlW2NpZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZGlmZixcbiAgICAgICAgc3RhdCxcbiAgICAgICAgc2NpZCA9IGNkaWZmW1NUQVRJQ107XG5cbiAgICAgIGlmIChpc0NpZChzY2lkKSkge1xuICAgICAgICBsZXQgdGRpZmY7XG5cbiAgICAgICAgaWYgKHNjaWQgPiAwKSB7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRkaWZmID0gb2xkY1stc2NpZF07XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ID0gdGRpZmZbU1RBVElDXTtcbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmLCB0cnVlKTtcbiAgICAgICAgbmRpZmZbU1RBVElDXSA9IHN0YXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZGlmZiA9XG4gICAgICAgICAgY2RpZmZbU1RBVElDXSAhPT0gdW5kZWZpbmVkIHx8IG9sZGNbY2lkXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGNkaWZmXG4gICAgICAgICAgICA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0sIGNkaWZmLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGNhY2hlW2NpZF0gPSBuZGlmZjtcbiAgICAgIHJldHVybiBuZGlmZjtcbiAgICB9XG4gIH1cblxuICBtdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIGRvTXV0YWJsZU1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZVtLRVlFRF0pIHtcbiAgICAgIHRoaXMubWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsID0gdGFyZ2V0W2tleV07XG4gICAgICAgIGNvbnN0IGlzT2JqVmFsID0gaXNPYmplY3QodmFsKTtcbiAgICAgICAgaWYgKGlzT2JqVmFsICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSkge1xuICAgICAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0VmFsLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXRbUk9PVF0pIHtcbiAgICAgIHRhcmdldC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKGRpZmYpIHtcbiAgICBpZiAoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoZGlmZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbGxiYWNrIGZvciBqZXN0XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkaWZmKSk7XG4gICAgfVxuICB9XG5cbiAgLy8ga2V5ZWQgY29tcHJlaGVuc2lvbnNcbiAgbWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgIC8vIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHRhcmdldCBzaW5jZSBlbGVtZW50cyBjYW4gbW92ZSBhbmQgb3RoZXJ3aXNlXG4gICAgLy8gaXQgY291bGQgaGFwcGVuIHRoYXQgd2UgbW9kaWZ5IGFuIGVsZW1lbnQgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlZmVyIHRvXG4gICAgLy8gbGF0ZXJcbiAgICBjb25zdCBjbG9uZWRUYXJnZXQgPSB0aGlzLmNsb25lKHRhcmdldCk7XG4gICAgT2JqZWN0LmVudHJpZXMoc291cmNlW0tFWUVEXSkuZm9yRWFjaCgoW2ksIGVudHJ5XSkgPT4ge1xuICAgICAgaWYgKGkgPT09IEtFWUVEX0NPVU5UKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAvLyBbb2xkX2lkeCwgZGlmZl1cbiAgICAgICAgLy8gbW92ZWQgd2l0aCBkaWZmXG4gICAgICAgIGNvbnN0IFtvbGRfaWR4LCBkaWZmXSA9IGVudHJ5O1xuICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0gY2xvbmVkVGFyZ2V0W0tFWUVEXVtvbGRfaWR4XTtcbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBkaWZmKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8vIG1vdmVkIHdpdGhvdXQgZGlmZlxuICAgICAgICBjb25zdCBvbGRfaWR4ID0gZW50cnk7XG4gICAgICAgIHRhcmdldFtLRVlFRF1baV0gPSBjbG9uZWRUYXJnZXRbS0VZRURdW29sZF9pZHhdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgLy8gZGlmZiwgc2FtZSBwb3NpdGlvblxuICAgICAgICBpZiAoIXRhcmdldFtLRVlFRF1baV0pIHtcbiAgICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBlbnRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZHJvcCBleHRyYSBlbnRyaWVzXG4gICAgaWYgKHNvdXJjZVtLRVlFRF1bS0VZRURfQ09VTlRdIDwgdGFyZ2V0W0tFWUVEXVtLRVlFRF9DT1VOVF0pIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgICAgIGkgPCB0YXJnZXRbS0VZRURdW0tFWUVEX0NPVU5UXTtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIHRhcmdldFtLRVlFRF1baV07XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldFtLRVlFRF1bS0VZRURfQ09VTlRdID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgaWYgKHNvdXJjZVtTVFJFQU1dKSB7XG4gICAgICB0YXJnZXRbU1RSRUFNXSA9IHNvdXJjZVtTVFJFQU1dO1xuICAgIH1cbiAgICBpZiAoc291cmNlW1RFTVBMQVRFU10pIHtcbiAgICAgIHRhcmdldFtURU1QTEFURVNdID0gc291cmNlW1RFTVBMQVRFU107XG4gICAgfVxuICB9XG5cbiAgLy8gTWVyZ2VzIGNpZCB0cmVlcyB0b2dldGhlciwgY29weWluZyBzdGF0aWNzIGZyb20gc291cmNlIHRyZWUuXG4gIC8vXG4gIC8vIFRoZSBgcHJ1bmVNYWdpY0lkYCBpcyBwYXNzZWQgdG8gY29udHJvbCBwcnVuaW5nIHRoZSBtYWdpY0lkIG9mIHRoZVxuICAvLyB0YXJnZXQuIFdlIG11c3QgYWx3YXlzIHBydW5lIHRoZSBtYWdpY0lkIHdoZW4gd2UgYXJlIHNoYXJpbmcgc3RhdGljc1xuICAvLyBmcm9tIGFub3RoZXIgY29tcG9uZW50LiBJZiBub3QgcHJ1bmluZywgd2UgcmVwbGljYXRlIHRoZSBsb2dpYyBmcm9tXG4gIC8vIG11dGFibGVNZXJnZSwgd2hlcmUgd2Ugc2V0IG5ld1JlbmRlciB0byB0cnVlIGlmIHRoZXJlIGlzIGEgcm9vdFxuICAvLyAoZWZmZWN0aXZlbHkgZm9yY2luZyB0aGUgbmV3IHZlcnNpb24gdG8gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBza2lwcGVkKVxuICAvL1xuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlLCBwcnVuZU1hZ2ljSWQpIHtcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCwgLi4uc291cmNlIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VkKSB7XG4gICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbCkgJiYgdmFsW1NUQVRJQ10gPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwgdmFsLCBwcnVuZU1hZ2ljSWQpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwge30sIHBydW5lTWFnaWNJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcnVuZU1hZ2ljSWQpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubWFnaWNJZDtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubmV3UmVuZGVyO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0W1JPT1RdKSB7XG4gICAgICBtZXJnZWQubmV3UmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIGNvbXBvbmVudFRvU3RyaW5nKGNpZCkge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLFxuICAgICAgY2lkLFxuICAgICAgbnVsbCxcbiAgICApO1xuICAgIGNvbnN0IFtzdHJpcHBlZEhUTUwsIF9iZWZvcmUsIF9hZnRlcl0gPSBtb2RpZnlSb290KHN0ciwge30pO1xuICAgIHJldHVybiB7IGJ1ZmZlcjogc3RyaXBwZWRIVE1MLCBzdHJlYW1zOiBzdHJlYW1zIH07XG4gIH1cblxuICBwcnVuZUNJRHMoY2lkcykge1xuICAgIGNpZHMuZm9yRWFjaCgoY2lkKSA9PiBkZWxldGUgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWQ7XG4gIH1cblxuICBpc05ld0ZpbmdlcnByaW50KGRpZmYgPSB7fSkge1xuICAgIHJldHVybiAhIWRpZmZbU1RBVElDXTtcbiAgfVxuXG4gIHRlbXBsYXRlU3RhdGljKHBhcnQsIHRlbXBsYXRlcykge1xuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlc1twYXJ0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfVxuICB9XG5cbiAgbmV4dE1hZ2ljSUQoKSB7XG4gICAgdGhpcy5tYWdpY0lkKys7XG4gICAgcmV0dXJuIGBtJHt0aGlzLm1hZ2ljSWR9LSR7dGhpcy5wYXJlbnRWaWV3SWQoKX1gO1xuICB9XG5cbiAgLy8gQ29udmVydHMgcmVuZGVyZWQgdHJlZSB0byBvdXRwdXQgYnVmZmVyLlxuICAvL1xuICAvLyBjaGFuZ2VUcmFja2luZyBjb250cm9scyBpZiB3ZSBjYW4gYXBwbHkgdGhlIFBIWF9TS0lQIG9wdGltaXphdGlvbi5cbiAgdG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywgcm9vdEF0dHJzID0ge30pIHtcbiAgICBpZiAocmVuZGVyZWRbS0VZRURdKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIoXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICB0ZW1wbGF0ZXMsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgY2hhbmdlVHJhY2tpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlcyBhcmUgYSB3YXkgb2Ygc2hhcmluZyBzdGF0aWNzIGJldHdlZW4gbXVsdGlwbGUgcmVuZGVyZWQgc3RydWN0cy5cbiAgICAvLyBTaW5jZSBMaXZlVmlldyAxLjEsIHRob3NlIGNhbiBhbHNvIGFwcGVhciBhdCB0aGUgcm9vdCAtIGZvciBleGFtcGxlIGlmIG9uZSByZW5kZXJzXG4gICAgLy8gdHdvIGNvbXByZWhlbnNpb25zIHRoYXQgY2FuIHNoYXJlIHN0YXRpY3MuXG4gICAgLy8gV2hlbmV2ZXIgd2UgZmluZCB0ZW1wbGF0ZXMsIHdlIG5lZWQgdG8gdXNlIHRoZW0gcmVjdXJzaXZlbHkuIEFsc28sIHRlbXBsYXRlcyBjYW5cbiAgICAvLyBiZSBzZW50IGZvciBlYWNoIGRpZmYsIG5vdCBvbmx5IGZvciB0aGUgaW5pdGlhbCBvbmUuIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhlbVxuICAgIC8vIHRob3VnaCwgc28gd2UgYWx3YXlzIHJlc29sdmUgdGhlbSBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcmVuZGVyZWQgb2JqZWN0LlxuICAgIGlmIChyZW5kZXJlZFtURU1QTEFURVNdKSB7XG4gICAgICB0ZW1wbGF0ZXMgPSByZW5kZXJlZFtURU1QTEFURVNdO1xuICAgICAgZGVsZXRlIHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgfVxuXG4gICAgbGV0IHsgW1NUQVRJQ106IHN0YXRpY3MgfSA9IHJlbmRlcmVkO1xuICAgIHN0YXRpY3MgPSB0aGlzLnRlbXBsYXRlU3RhdGljKHN0YXRpY3MsIHRlbXBsYXRlcyk7XG4gICAgcmVuZGVyZWRbU1RBVElDXSA9IHN0YXRpY3M7XG4gICAgY29uc3QgaXNSb290ID0gcmVuZGVyZWRbUk9PVF07XG4gICAgY29uc3QgcHJldkJ1ZmZlciA9IG91dHB1dC5idWZmZXI7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IFwiXCI7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25kaXRpb24gaXMgY2FsbGVkIHdoZW4gZmlyc3QgcmVuZGVyaW5nIGFuIG9wdGltaXphYmxlIGZ1bmN0aW9uIGNvbXBvbmVudC5cbiAgICAvLyBMQyBoYXZlIHRoZWlyIG1hZ2ljSWQgcHJldmlvdXNseSBzZXRcbiAgICBpZiAoY2hhbmdlVHJhY2tpbmcgJiYgaXNSb290ICYmICFyZW5kZXJlZC5tYWdpY0lkKSB7XG4gICAgICByZW5kZXJlZC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgICAgcmVuZGVyZWQubWFnaWNJZCA9IHRoaXMubmV4dE1hZ2ljSUQoKTtcbiAgICB9XG5cbiAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZFtpIC0gMV0sIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZyk7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbaV07XG4gICAgfVxuXG4gICAgLy8gQXBwbGllcyB0aGUgcm9vdCB0YWcgXCJza2lwXCIgb3B0aW1pemF0aW9uIGlmIHN1cHBvcnRlZCwgd2hpY2ggY2xlYXJzXG4gICAgLy8gdGhlIHJvb3QgdGFnIGF0dHJpYnV0ZXMgYW5kIGlubmVySFRNTCwgYW5kIG9ubHkgbWFpbnRhaW5zIHRoZSBtYWdpY0lkLlxuICAgIC8vIFdlIGNhbiBvbmx5IHNraXAgd2hlbiBjaGFuZ2VUcmFja2luZyBpcyBzdXBwb3J0ZWQsXG4gICAgLy8gYW5kIHdoZW4gdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgZXhwZXJpZW5jZWQgYW4gdW5yZW5kZXJlZCBtZXJnZSAobmV3UmVuZGVyIHRydWUpLlxuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGxldCBza2lwID0gZmFsc2U7XG4gICAgICBsZXQgYXR0cnM7XG4gICAgICAvLyBXaGVuIGEgTEMgaXMgcmUtYWRkZWQgdG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gcmUtcmVuZGVyIHRoZSBlbnRpcmUgTEMgdHJlZSxcbiAgICAgIC8vIHRoZXJlZm9yZSBjaGFuZ2VUcmFja2luZyBpcyBmYWxzZTsgaG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIGFsbCB0aGUgbWFnaWNJZHNcbiAgICAgIC8vIGZyb20gYW55IGZ1bmN0aW9uIGNvbXBvbmVudCBzbyB0aGUgbmV4dCB0aW1lIHRoZSBMQyBpcyB1cGRhdGVkLCB3ZSBjYW4gYXBwbHlcbiAgICAgIC8vIHRoZSBza2lwIG9wdGltaXphdGlvblxuICAgICAgaWYgKGNoYW5nZVRyYWNraW5nIHx8IHJlbmRlcmVkLm1hZ2ljSWQpIHtcbiAgICAgICAgc2tpcCA9IGNoYW5nZVRyYWNraW5nICYmICFyZW5kZXJlZC5uZXdSZW5kZXI7XG4gICAgICAgIGF0dHJzID0geyBbUEhYX01BR0lDX0lEXTogcmVuZGVyZWQubWFnaWNJZCwgLi4ucm9vdEF0dHJzIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRycyA9IHJvb3RBdHRycztcbiAgICAgIH1cbiAgICAgIGlmIChza2lwKSB7XG4gICAgICAgIGF0dHJzW1BIWF9TS0lQXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBbbmV3Um9vdCwgY29tbWVudEJlZm9yZSwgY29tbWVudEFmdGVyXSA9IG1vZGlmeVJvb3QoXG4gICAgICAgIG91dHB1dC5idWZmZXIsXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBza2lwLFxuICAgICAgKTtcbiAgICAgIHJlbmRlcmVkLm5ld1JlbmRlciA9IGZhbHNlO1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IHByZXZCdWZmZXIgKyBjb21tZW50QmVmb3JlICsgbmV3Um9vdCArIGNvbW1lbnRBZnRlcjtcbiAgICB9XG4gIH1cblxuICBjb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZykge1xuICAgIGNvbnN0IGtleWVkVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgY29uc3Qgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMocmVuZGVyZWRbU1RBVElDXSwgdGVtcGxhdGVzKTtcbiAgICByZW5kZXJlZFtTVEFUSUNdID0gc3RhdGljcztcbiAgICBkZWxldGUgcmVuZGVyZWRbVEVNUExBVEVTXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkW0tFWUVEXVtLRVlFRF9DT1VOVF07IGkrKykge1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdO1xuICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBzdGF0aWNzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKFxuICAgICAgICAgIHJlbmRlcmVkW0tFWUVEXVtpXVtqIC0gMV0sXG4gICAgICAgICAga2V5ZWRUZW1wbGF0ZXMsXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgICApO1xuICAgICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3Nbal07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgdGhlIHJlbmRlcmVkIHRyZWUgZm9yIHN0cmVhbXNcbiAgICBpZiAocmVuZGVyZWRbU1RSRUFNXSkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgIGNvbnN0IFtfcmVmLCBfaW5zZXJ0cywgZGVsZXRlSWRzLCByZXNldF0gPSBzdHJlYW0gfHwgW251bGwsIHt9LCBbXSwgbnVsbF07XG4gICAgICBpZiAoXG4gICAgICAgIHN0cmVhbSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChyZW5kZXJlZFtLRVlFRF1bS0VZRURfQ09VTlRdID4gMCB8fCBkZWxldGVJZHMubGVuZ3RoID4gMCB8fCByZXNldClcbiAgICAgICkge1xuICAgICAgICBkZWxldGUgcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgICAgcmVuZGVyZWRbS0VZRURdID0ge1xuICAgICAgICAgIFtLRVlFRF9DT1VOVF06IDAsXG4gICAgICAgIH07XG4gICAgICAgIG91dHB1dC5zdHJlYW1zLmFkZChzdHJlYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQsIGNoYW5nZVRyYWNraW5nKSB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXJlZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgeyBidWZmZXI6IHN0ciwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVDSURUb1N0cmluZyhcbiAgICAgICAgb3V0cHV0LmNvbXBvbmVudHMsXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICBvdXRwdXQub25seUNpZHMsXG4gICAgICApO1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdHI7XG4gICAgICBvdXRwdXQuc3RyZWFtcyA9IG5ldyBTZXQoWy4uLm91dHB1dC5zdHJlYW1zLCAuLi5zdHJlYW1zXSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChyZW5kZXJlZCkpIHtcbiAgICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHJlbmRlcmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2l2ZUNJRFRvU3RyaW5nKGNvbXBvbmVudHMsIGNpZCwgb25seUNpZHMpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPVxuICAgICAgY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKTtcbiAgICBjb25zdCBhdHRycyA9IHsgW1BIWF9DT01QT05FTlRdOiBjaWQsIFtQSFhfVklFV19SRUZdOiB0aGlzLnZpZXdJZCB9O1xuICAgIGNvbnN0IHNraXAgPSBvbmx5Q2lkcyAmJiAhb25seUNpZHMuaGFzKGNpZCk7XG4gICAgLy8gVHdvIG9wdGltaXphdGlvbiBwYXRocyBhcHBseSBoZXJlOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgb25seUNpZHMgb3B0aW1pemF0aW9uIHdvcmtzIGJ5IHRoZSBzZXJ2ZXIgZGlmZiB0ZWxsaW5nIHVzIG9ubHkgc3BlY2lmaWNcbiAgICAvLyAgICAgY2lkJ3MgaGF2ZSBjaGFuZ2VkLiBUaGlzIGFsbG93cyB1cyB0byBza2lwIHJlbmRlcmluZyBhbnkgY29tcG9uZW50IHRoYXQgaGFzbid0IGNoYW5nZWQsXG4gICAgLy8gICAgIHdoaWNoIHVsdGltYXRlbHkgc2V0cyBQSFhfU0tJUCByb290IGF0dHJpYnV0ZSBhbmQgYXZvaWRzIHJlbmRlcmluZyB0aGUgaW5uZXJIVE1MLlxuICAgIC8vXG4gICAgLy8gICAyLiBUaGUgcm9vdCBQSFhfU0tJUCBvcHRpbWl6YXRpb24gZ2VuZXJhbGl6ZXMgdG8gYWxsIEhFRXggZnVuY3Rpb24gY29tcG9uZW50cywgYW5kXG4gICAgLy8gICAgIHdvcmtzIGluIHRoZSBzYW1lIFBIWF9TS0lQIGF0dHJpYnV0ZSBmYXNoaW9uIGFzIDEsIGJ1dCB0aGUgbmV3UmVuZGVyIHRyYWNraW5nIGlzIGRvbmVcbiAgICAvLyAgICAgYXQgdGhlIGdlbmVyYWwgZGlmZiBtZXJnZSBsZXZlbC4gSWYgd2UgbWVyZ2UgYSBkaWZmIHdpdGggbmV3IGR5bmFtaWNzLCB3ZSBuZWNlc3NhcmlseSBoYXZlXG4gICAgLy8gICAgIGV4cGVyaWVuY2VkIGEgY2hhbmdlIHdoaWNoIG11c3QgYmUgYSBuZXdSZW5kZXIsIGFuZCB0aHVzIHdlIGNhbid0IHNraXAgdGhlIHJlbmRlci5cbiAgICAvL1xuICAgIC8vIEJvdGggb3B0aW1pemF0aW9uIGZsb3dzIGFwcGx5IGhlcmUuIG5ld1JlbmRlciBpcyBzZXQgYmFzZWQgb24gdGhlIG9ubHlDaWRzIG9wdGltaXphdGlvbiwgYW5kXG4gICAgLy8gd2UgdHJhY2sgYSBkZXRlcm1pbmlzdGljIG1hZ2ljSWQgYmFzZWQgb24gdGhlIGNpZC5cbiAgICAvL1xuICAgIC8vIGNoYW5nZVRyYWNraW5nIGlzIGFib3V0IHRoZSBlbnRpcmUgdHJlZVxuICAgIC8vIG5ld1JlbmRlciBpcyBhYm91dCB0aGUgY3VycmVudCByb290IGluIHRoZSB0cmVlXG4gICAgLy9cbiAgICAvLyBCeSBkZWZhdWx0IGNoYW5nZVRyYWNraW5nIGlzIGVuYWJsZWQsIGJ1dCB3ZSBzcGVjaWFsIGNhc2UgdGhlIGZsb3cgd2hlcmUgdGhlIGNsaWVudCBpcyBwcnVuaW5nXG4gICAgLy8gY2lkcyBhbmQgdGhlIHNlcnZlciBhZGRzIHRoZSBjb21wb25lbnQgYmFjay4gSW4gc3VjaCBjYXNlcywgd2UgZXhwbGljaXRseSBkaXNhYmxlIGNoYW5nZVRyYWNraW5nXG4gICAgLy8gd2l0aCByZXNldFJlbmRlciBmb3IgdGhpcyBjaWQsIHRoZW4gcmUtZW5hYmxlIGl0IGFmdGVyIHRoZSByZWN1cnNpdmUgY2FsbCB0byBza2lwIHRoZSBvcHRpbWl6YXRpb25cbiAgICAvLyBmb3IgdGhlIGVudGlyZSBjb21wb25lbnQgdHJlZS5cbiAgICBjb21wb25lbnQubmV3UmVuZGVyID0gIXNraXA7XG4gICAgY29tcG9uZW50Lm1hZ2ljSWQgPSBgYyR7Y2lkfS0ke3RoaXMucGFyZW50Vmlld0lkKCl9YDtcbiAgICAvLyBlbmFibGUgY2hhbmdlIHRyYWNraW5nIGFzIGxvbmcgYXMgdGhlIGNvbXBvbmVudCBoYXNuJ3QgYmVlbiByZXNldFxuICAgIGNvbnN0IGNoYW5nZVRyYWNraW5nID0gIWNvbXBvbmVudC5yZXNldDtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyhcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudHMsXG4gICAgICBvbmx5Q2lkcyxcbiAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgYXR0cnMsXG4gICAgKTtcbiAgICAvLyBkaXNhYmxlIHJlc2V0IGFmdGVyIHdlJ3ZlIHJlbmRlcmVkXG4gICAgZGVsZXRlIGNvbXBvbmVudC5yZXNldDtcblxuICAgIHJldHVybiB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtczogc3RyZWFtcyB9O1xuICB9XG59XG4iLCAiaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBBUklBIGZyb20gXCIuL2FyaWFcIjtcblxuY29uc3QgZm9jdXNTdGFjayA9IFtdO1xuY29uc3QgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWUgPSAyMDA7XG5cbmNvbnN0IEpTID0ge1xuICAvLyBwcml2YXRlXG4gIGV4ZWMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGRlZmF1bHRzKSB7XG4gICAgY29uc3QgW2RlZmF1bHRLaW5kLCBkZWZhdWx0QXJnc10gPSBkZWZhdWx0cyB8fCBbXG4gICAgICBudWxsLFxuICAgICAgeyBjYWxsYmFjazogZGVmYXVsdHMgJiYgZGVmYXVsdHMuY2FsbGJhY2sgfSxcbiAgICBdO1xuICAgIGNvbnN0IGNvbW1hbmRzID1cbiAgICAgIHBoeEV2ZW50LmNoYXJBdCgwKSA9PT0gXCJbXCJcbiAgICAgICAgPyBKU09OLnBhcnNlKHBoeEV2ZW50KVxuICAgICAgICA6IFtbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXV07XG5cbiAgICBjb21tYW5kcy5mb3JFYWNoKChba2luZCwgYXJnc10pID0+IHtcbiAgICAgIGlmIChraW5kID09PSBkZWZhdWx0S2luZCkge1xuICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBhcmdzLCBidXQga2VlcCBleGlzdGluZyBrZXlzIGZyb20gdGhlIGRlZmF1bHRBcmdzXG4gICAgICAgIGFyZ3MgPSB7IC4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzIH07XG4gICAgICAgIGFyZ3MuY2FsbGJhY2sgPSBhcmdzLmNhbGxiYWNrIHx8IGRlZmF1bHRBcmdzLmNhbGxiYWNrO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJUb0Vscyh2aWV3LmxpdmVTb2NrZXQsIHNvdXJjZUVsLCBhcmdzKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICB0aGlzW2BleGVjXyR7a2luZH1gXShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgaXNWaXNpYmxlKGVsKSB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZWwub2Zmc2V0V2lkdGggfHxcbiAgICAgIGVsLm9mZnNldEhlaWdodCB8fFxuICAgICAgZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfSxcblxuICAvLyByZXR1cm5zIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSB2aWV3cG9ydFxuICBpc0luVmlld3BvcnQoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID1cbiAgICAgIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHdpbmRvd1dpZHRoID1cbiAgICAgIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblxuICAgIHJldHVybiAoXG4gICAgICByZWN0LnJpZ2h0ID4gMCAmJlxuICAgICAgcmVjdC5ib3R0b20gPiAwICYmXG4gICAgICByZWN0LmxlZnQgPCB3aW5kb3dXaWR0aCAmJlxuICAgICAgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHRcbiAgICApO1xuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICAvLyBjb21tYW5kc1xuXG4gIGV4ZWNfZXhlYyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0ciwgdG8gfSkge1xuICAgIGNvbnN0IGVuY29kZWRKUyA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICBpZiAoIWVuY29kZWRKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke2F0dHJ9IHRvIGNvbnRhaW4gSlMgY29tbWFuZCBvbiBcIiR7dG99XCJgKTtcbiAgICB9XG4gICAgdmlldy5saXZlU29ja2V0LmV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUpO1xuICB9LFxuXG4gIGV4ZWNfZGlzcGF0Y2goXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGV2ZW50LCBkZXRhaWwsIGJ1YmJsZXMsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIGRldGFpbCA9IGRldGFpbCB8fCB7fTtcbiAgICBkZXRhaWwuZGlzcGF0Y2hlciA9IHNvdXJjZUVsO1xuICAgIGlmIChibG9ja2luZykge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICAgIGRldGFpbC5kb25lID0gcmVzb2x2ZTtcbiAgICAgIH0pO1xuICAgICAgdmlldy5saXZlU29ja2V0LmFzeW5jVHJhbnNpdGlvbihwcm9taXNlKTtcbiAgICB9XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZWwsIGV2ZW50LCB7IGRldGFpbCwgYnViYmxlcyB9KTtcbiAgfSxcblxuICBleGVjX3B1c2goZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlzcGF0Y2hlcixcbiAgICAgIGNhbGxiYWNrLFxuICAgIH0gPSBhcmdzO1xuICAgIGNvbnN0IHB1c2hPcHRzID0ge1xuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRTcmMgPVxuICAgICAgZXZlbnRUeXBlID09PSBcImNoYW5nZVwiICYmIGRpc3BhdGNoZXIgPyBkaXNwYXRjaGVyIDogc291cmNlRWw7XG4gICAgY29uc3QgcGh4VGFyZ2V0ID1cbiAgICAgIHRhcmdldCB8fCB0YXJnZXRTcmMuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhcInRhcmdldFwiKSkgfHwgdGFyZ2V0U3JjO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZiAoIXRhcmdldFZpZXcuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGxldCB7IG5ld0NpZCwgX3RhcmdldCB9ID0gYXJncztcbiAgICAgICAgX3RhcmdldCA9XG4gICAgICAgICAgX3RhcmdldCB8fCAoRE9NLmlzRm9ybUlucHV0KHNvdXJjZUVsKSA/IHNvdXJjZUVsLm5hbWUgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoX3RhcmdldCkge1xuICAgICAgICAgIHB1c2hPcHRzLl90YXJnZXQgPSBfdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFZpZXcucHVzaElucHV0KFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBuZXdDaWQsXG4gICAgICAgICAgZXZlbnQgfHwgcGh4RXZlbnQsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gXCJzdWJtaXRcIikge1xuICAgICAgICBjb25zdCB7IHN1Ym1pdHRlciB9ID0gYXJncztcbiAgICAgICAgdGFyZ2V0Vmlldy5zdWJtaXRGb3JtKFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBldmVudCB8fCBwaHhFdmVudCxcbiAgICAgICAgICBzdWJtaXR0ZXIsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRWaWV3LnB1c2hFdmVudChcbiAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgc291cmNlRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIGV2ZW50IHx8IHBoeEV2ZW50LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBpbiBjYXNlIG9mIGZvcm1SZWNvdmVyeSwgdGFyZ2V0VmlldyBhbmQgdGFyZ2V0Q3R4IGFyZSBwYXNzZWQgYXMgYXJndW1lbnRcbiAgICAvLyBhcyB0aGV5IGFyZSBsb29rZWQgdXAgaW4gYSB0ZW1wbGF0ZSBlbGVtZW50LCBub3QgdGhlIHJlYWwgRE9NXG4gICAgaWYgKGFyZ3MudGFyZ2V0VmlldyAmJiBhcmdzLnRhcmdldEN0eCkge1xuICAgICAgaGFuZGxlcihhcmdzLnRhcmdldFZpZXcsIGFyZ3MudGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgaGFuZGxlcik7XG4gICAgfVxuICB9LFxuXG4gIGV4ZWNfbmF2aWdhdGUoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGhyZWYsIHJlcGxhY2UgfSkge1xuICAgIHZpZXcubGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgbnVsbCxcbiAgICAgIHNvdXJjZUVsLFxuICAgICk7XG4gIH0sXG5cbiAgZXhlY19wYXRjaChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgaHJlZiwgcmVwbGFjZSB9KSB7XG4gICAgdmlldy5saXZlU29ja2V0LnB1c2hIaXN0b3J5UGF0Y2goXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgc291cmNlRWwsXG4gICAgKTtcbiAgfSxcblxuICBleGVjX2ZvY3VzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCkge1xuICAgIEFSSUEuYXR0ZW1wdEZvY3VzKGVsKTtcbiAgICAvLyBpbiBjYXNlIHRoZSBKUy5mb2N1cyBjb21tYW5kIGlzIGluIGEgSlMuc2hvdy9oaWRlL3RvZ2dsZSBjaGFpbiwgZm9yIHNob3cgd2UgbmVlZFxuICAgIC8vIHRvIHdhaXQgZm9yIEpTLnNob3cgdG8gaGF2ZSB1cGRhdGVkIHRoZSBlbGVtZW50J3MgZGlzcGxheSBwcm9wZXJ0eSAoc2VlIGV4ZWNfdG9nZ2xlKVxuICAgIC8vIGJ1dCB0aGF0IHJ1biBpbiBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgdGhlcmVmb3JlIHdlIG5lZWQgdG8gdXNlIHRoZW0gaGVyZSBhcyB3ZWxsXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IEFSSUEuYXR0ZW1wdEZvY3VzKGVsKSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgZXhlY19mb2N1c19maXJzdChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwpIHtcbiAgICBBUklBLmZvY3VzRmlyc3RJbnRlcmFjdGl2ZShlbCkgfHwgQVJJQS5mb2N1c0ZpcnN0KGVsKTtcbiAgICAvLyBpZiB5b3Ugd29uZGVyIGFib3V0IHRoZSBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgc2VlIGV4ZWNfZm9jdXNcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICgpID0+IEFSSUEuZm9jdXNGaXJzdEludGVyYWN0aXZlKGVsKSB8fCBBUklBLmZvY3VzRmlyc3QoZWwpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcblxuICBleGVjX3B1c2hfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKSB7XG4gICAgZm9jdXNTdGFjay5wdXNoKGVsIHx8IHNvdXJjZUVsKTtcbiAgfSxcblxuICBleGVjX3BvcF9mb2N1cyhfZSwgX2V2ZW50VHlwZSwgX3BoeEV2ZW50LCBfdmlldywgX3NvdXJjZUVsLCBfZWwpIHtcbiAgICBjb25zdCBlbCA9IGZvY3VzU3RhY2sucG9wKCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5mb2N1cygpO1xuICAgICAgLy8gaWYgeW91IHdvbmRlciBhYm91dCB0aGUgbmVzdGVkIGFuaW1hdGlvbiBmcmFtZXMsIHNlZSBleGVjX2ZvY3VzXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBlbC5mb2N1cygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBleGVjX2FkZF9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBuYW1lcywgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3JlbW92ZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMudG9nZ2xlQ2xhc3NlcyhlbCwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9hdHRyKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBhdHRyOiBbYXR0ciwgdmFsMSwgdmFsMl0gfSxcbiAgKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgfSxcblxuICBleGVjX2lnbm9yZV9hdHRycyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0cnMgfSkge1xuICAgIHRoaXMuaWdub3JlQXR0cnMoZWwsIGF0dHJzKTtcbiAgfSxcblxuICBleGVjX3RyYW5zaXRpb24oXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IHRpbWUsIHRyYW5zaXRpb24sIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZShcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3Nob3coXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuc2hvdyhldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyk7XG4gIH0sXG5cbiAgZXhlY19oaWRlKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLmhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpO1xuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGF0dHI6IFthdHRyLCB2YWxdIH0sXG4gICkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWxdXSwgW10pO1xuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGF0dHIgfSkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSk7XG4gIH0sXG5cbiAgaWdub3JlQXR0cnMoZWwsIGF0dHJzKSB7XG4gICAgRE9NLnB1dFByaXZhdGUoZWwsIFwiSlM6aWdub3JlX2F0dHJzXCIsIHtcbiAgICAgIGFwcGx5OiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgIEFycmF5LmZyb20oZnJvbUVsLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhdHRycy5zb21lKFxuICAgICAgICAgICAgICAodG9JZ25vcmUpID0+XG4gICAgICAgICAgICAgICAgYXR0ci5uYW1lID09IHRvSWdub3JlIHx8XG4gICAgICAgICAgICAgICAgdG9JZ25vcmUgPT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgKHRvSWdub3JlLmluY2x1ZGVzKFwiKlwiKSAmJiBhdHRyLm5hbWUubWF0Y2godG9JZ25vcmUpICE9IG51bGwpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcblxuICBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpIHtcbiAgICBjb25zdCBpZ25vcmVBdHRycyA9IERPTS5wcml2YXRlKGZyb21FbCwgXCJKUzppZ25vcmVfYXR0cnNcIik7XG4gICAgaWYgKGlnbm9yZUF0dHJzKSB7XG4gICAgICBpZ25vcmVBdHRycy5hcHBseShmcm9tRWwsIHRvRWwpO1xuICAgIH1cbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgIHRoaXMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIHZpZXcsXG4gICAgICAgIGVsLFxuICAgICAgICBkaXNwbGF5LFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aW1lLFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIGhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUoZWwpKSB7XG4gICAgICB0aGlzLnRvZ2dsZShcbiAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICB2aWV3LFxuICAgICAgICBlbCxcbiAgICAgICAgZGlzcGxheSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbixcbiAgICAgICAgdGltZSxcbiAgICAgICAgYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICB0b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZykge1xuICAgIHRpbWUgPSB0aW1lIHx8IGRlZmF1bHRfdHJhbnNpdGlvbl90aW1lO1xuICAgIGNvbnN0IFtpbkNsYXNzZXMsIGluU3RhcnRDbGFzc2VzLCBpbkVuZENsYXNzZXNdID0gaW5zIHx8IFtbXSwgW10sIFtdXTtcbiAgICBjb25zdCBbb3V0Q2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzLCBvdXRFbmRDbGFzc2VzXSA9IG91dHMgfHwgW1tdLCBbXSwgW11dO1xuICAgIGlmIChpbkNsYXNzZXMubGVuZ3RoID4gMCB8fCBvdXRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgY29uc3Qgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgb3V0U3RhcnRDbGFzc2VzLFxuICAgICAgICAgICAgaW5DbGFzc2VzLmNvbmNhdChpblN0YXJ0Q2xhc3NlcykuY29uY2F0KGluRW5kQ2xhc3NlcyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRDbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRFbmRDbGFzc2VzLCBvdXRTdGFydENsYXNzZXMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfTtcbiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgIGlmIChibG9ja2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgICAgc2V0VGltZW91dChvbkVuZCwgdGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gXCJyZW1vdmVcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBpblN0YXJ0Q2xhc3NlcyxcbiAgICAgICAgICAgIG91dENsYXNzZXMuY29uY2F0KG91dFN0YXJ0Q2xhc3NlcykuY29uY2F0KG91dEVuZENsYXNzZXMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RpY2t5RGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5kZWZhdWx0RGlzcGxheShlbCk7XG4gICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBmaXJzdCBhZGQgdGhlIHN0YXJ0aW5nICsgYWN0aXZlIGNsYXNzLCBUSEVOIG1ha2UgdGhlIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGlmIHdlIHRvZ2dsZWQgdGhlIHZpc2liaWxpdHkgZWFybGllciBjc3MgYW5pbWF0aW9uc1xuICAgICAgICAgICAgLy8gd291bGQgZmxpY2tlciwgYXMgdGhlIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlIGJlZm9yZSB0aGUgYWN0aXZlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gY2xhc3MgaXMgc2V0IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM0NTYpXG4gICAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5DbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICAvLyBhZGRPclJlbW92ZUNsYXNzZXMgdXNlcyBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpdHNlbGYsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIG1vdmUgdGhlIHB1dFN0aWNreVxuICAgICAgICAgICAgLy8gaW50byB0aGUgbmV4dCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuLi5cbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAgIFwidG9nZ2xlXCIsXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkVuZENsYXNzZXMsIGluU3RhcnRDbGFzc2VzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVuZCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIGluQ2xhc3Nlcy5jb25jYXQoaW5FbmRDbGFzc2VzKSk7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1lbmRcIikpO1xuICAgICAgICB9O1xuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIG9uU3RhcnQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KG9uRW5kLCB0aW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25FbmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgICBjb25zdCBzdGlja3lEaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLmRlZmF1bHREaXNwbGF5KGVsKTtcbiAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcInRvZ2dsZVwiLFxuICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2dnbGVDbGFzc2VzKGVsLCBjbGFzc2VzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZykge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3QgbmV3QWRkcyA9IGNsYXNzZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSkgPT4gcHJldkFkZHMuaW5kZXhPZihuYW1lKSA8IDAgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gY2xhc3Nlcy5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBuZXdBZGRzLFxuICAgICAgICBuZXdSZW1vdmVzLFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICB0aW1lLFxuICAgICAgICB2aWV3LFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdG9nZ2xlQXR0cihlbCwgYXR0ciwgdmFsMSwgdmFsMikge1xuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cikpIHtcbiAgICAgIGlmICh2YWwyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdG9nZ2xlIGJldHdlZW4gdmFsMSBhbmQgdmFsMlxuICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGF0dHIpID09PSB2YWwxKSB7XG4gICAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDJdXSwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWwxXV0sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGF0dHJcbiAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbXSwgW2F0dHJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDFdXSwgW10pO1xuICAgIH1cbiAgfSxcblxuICBhZGRPclJlbW92ZUNsYXNzZXMoZWwsIGFkZHMsIHJlbW92ZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKSB7XG4gICAgdGltZSA9IHRpbWUgfHwgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWU7XG4gICAgY29uc3QgW3RyYW5zaXRpb25SdW4sIHRyYW5zaXRpb25TdGFydCwgdHJhbnNpdGlvbkVuZF0gPSB0cmFuc2l0aW9uIHx8IFtcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICBdO1xuICAgIGlmICh0cmFuc2l0aW9uUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHRyYW5zaXRpb25TdGFydCxcbiAgICAgICAgICBbXS5jb25jYXQodHJhbnNpdGlvblJ1bikuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICApO1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgdHJhbnNpdGlvblJ1biwgW10pO1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uRW5kLCB0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGFkZHMuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICAgIHJlbW92ZXMuY29uY2F0KHRyYW5zaXRpb25SdW4pLmNvbmNhdCh0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICApO1xuICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgIHNldFRpbWVvdXQob25Eb25lLCB0aW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3Qga2VlcEFkZHMgPSBhZGRzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZBZGRzLmluZGV4T2YobmFtZSkgPCAwICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgY29uc3Qga2VlcFJlbW92ZXMgPSByZW1vdmVzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZSZW1vdmVzLmluZGV4T2YobmFtZSkgPCAwICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdBZGRzID0gcHJldkFkZHNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gcmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwQWRkcyk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gYWRkcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwUmVtb3Zlcyk7XG5cbiAgICAgIERPTS5wdXRTdGlja3koZWwsIFwiY2xhc3Nlc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm5ld1JlbW92ZXMpO1xuICAgICAgICBjdXJyZW50RWwuY2xhc3NMaXN0LmFkZCguLi5uZXdBZGRzKTtcbiAgICAgICAgcmV0dXJuIFtuZXdBZGRzLCBuZXdSZW1vdmVzXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuXG4gIHNldE9yUmVtb3ZlQXR0cnMoZWwsIHNldHMsIHJlbW92ZXMpIHtcbiAgICBjb25zdCBbcHJldlNldHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiYXR0cnNcIiwgW1tdLCBbXV0pO1xuXG4gICAgY29uc3QgYWx0ZXJlZEF0dHJzID0gc2V0cy5tYXAoKFthdHRyLCBfdmFsXSkgPT4gYXR0cikuY29uY2F0KHJlbW92ZXMpO1xuICAgIGNvbnN0IG5ld1NldHMgPSBwcmV2U2V0c1xuICAgICAgLmZpbHRlcigoW2F0dHIsIF92YWxdKSA9PiAhYWx0ZXJlZEF0dHJzLmluY2x1ZGVzKGF0dHIpKVxuICAgICAgLmNvbmNhdChzZXRzKTtcbiAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgIC5maWx0ZXIoKGF0dHIpID0+ICFhbHRlcmVkQXR0cnMuaW5jbHVkZXMoYXR0cikpXG4gICAgICAuY29uY2F0KHJlbW92ZXMpO1xuXG4gICAgRE9NLnB1dFN0aWNreShlbCwgXCJhdHRyc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICBuZXdSZW1vdmVzLmZvckVhY2goKGF0dHIpID0+IGN1cnJlbnRFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgbmV3U2V0cy5mb3JFYWNoKChbYXR0ciwgdmFsXSkgPT4gY3VycmVudEVsLnNldEF0dHJpYnV0ZShhdHRyLCB2YWwpKTtcbiAgICAgIHJldHVybiBbbmV3U2V0cywgbmV3UmVtb3Zlc107XG4gICAgfSk7XG4gIH0sXG5cbiAgaGFzQWxsQ2xhc3NlcyhlbCwgY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLmV2ZXJ5KChuYW1lKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpO1xuICB9LFxuXG4gIGlzVG9nZ2xlZE91dChlbCwgb3V0Q2xhc3Nlcykge1xuICAgIHJldHVybiAhdGhpcy5pc1Zpc2libGUoZWwpIHx8IHRoaXMuaGFzQWxsQ2xhc3NlcyhlbCwgb3V0Q2xhc3Nlcyk7XG4gIH0sXG5cbiAgZmlsdGVyVG9FbHMobGl2ZVNvY2tldCwgc291cmNlRWwsIHsgdG8gfSkge1xuICAgIGNvbnN0IGRlZmF1bHRRdWVyeSA9ICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodG8pO1xuICAgICAgfSBlbHNlIGlmICh0by5jbG9zZXN0KSB7XG4gICAgICAgIGNvbnN0IHRvRWwgPSBzb3VyY2VFbC5jbG9zZXN0KHRvLmNsb3Nlc3QpO1xuICAgICAgICByZXR1cm4gdG9FbCA/IFt0b0VsXSA6IFtdO1xuICAgICAgfSBlbHNlIGlmICh0by5pbm5lcikge1xuICAgICAgICByZXR1cm4gc291cmNlRWwucXVlcnlTZWxlY3RvckFsbCh0by5pbm5lcik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdG9cbiAgICAgID8gbGl2ZVNvY2tldC5qc1F1ZXJ5U2VsZWN0b3JBbGwoc291cmNlRWwsIHRvLCBkZWZhdWx0UXVlcnkpXG4gICAgICA6IFtzb3VyY2VFbF07XG4gIH0sXG5cbiAgZGVmYXVsdERpc3BsYXkoZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgeyB0cjogXCJ0YWJsZS1yb3dcIiwgdGQ6IFwidGFibGUtY2VsbFwiIH1bZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBcImJsb2NrXCJcbiAgICApO1xuICB9LFxuXG4gIHRyYW5zaXRpb25DbGFzc2VzKHZhbCkge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgW3RyYW5zLCB0U3RhcnQsIHRFbmRdID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBbdmFsLnNwbGl0KFwiIFwiKSwgW10sIFtdXTtcbiAgICB0cmFucyA9IEFycmF5LmlzQXJyYXkodHJhbnMpID8gdHJhbnMgOiB0cmFucy5zcGxpdChcIiBcIik7XG4gICAgdFN0YXJ0ID0gQXJyYXkuaXNBcnJheSh0U3RhcnQpID8gdFN0YXJ0IDogdFN0YXJ0LnNwbGl0KFwiIFwiKTtcbiAgICB0RW5kID0gQXJyYXkuaXNBcnJheSh0RW5kKSA/IHRFbmQgOiB0RW5kLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gW3RyYW5zLCB0U3RhcnQsIHRFbmRdO1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgSlM7XG4iLCAiaW1wb3J0IEpTIGZyb20gXCIuL2pzXCI7XG5pbXBvcnQgTGl2ZVNvY2tldCBmcm9tIFwiLi9saXZlX3NvY2tldFwiO1xuXG50eXBlIFRyYW5zaXRpb24gPSBzdHJpbmcgfCBzdHJpbmdbXTtcblxuLy8gQmFzZSBvcHRpb25zIGZvciBjb21tYW5kcyBpbnZvbHZpbmcgdHJhbnNpdGlvbnMgYW5kIHRpbWluZ1xudHlwZSBCYXNlT3B0cyA9IHtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIHRvIHNldC5cbiAgICogQWNjZXB0cyBhIHN0cmluZyBvZiBjbGFzc2VzIG9yIGEgMy10dXBsZSBsaWtlOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0wXCIsIFwib3BhY2l0eS0xMDBcIl1gXG4gICAqL1xuICB0cmFuc2l0aW9uPzogVHJhbnNpdGlvbjtcbiAgLyoqIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgMjAwLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG50eXBlIFNob3dPcHRzID0gQmFzZU9wdHMgJiB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRvZ2dsZU9wdHMgPSB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ1NTIHRyYW5zaXRpb24gY2xhc3NlcyBmb3Igc2hvd2luZy5cbiAgICogQWNjZXB0cyBlaXRoZXIgdGhlIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgaW4sIG9yXG4gICAqIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICogdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqIGBbXCJlYXNlLW91dCBkdXJhdGlvbi0zMDBcIiwgXCJvcGFjaXR5LTBcIiwgXCJvcGFjaXR5LTEwMFwiXWBcbiAgICovXG4gIGluPzogVHJhbnNpdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIGZvciBoaWRpbmcuXG4gICAqIEFjY2VwdHMgZWl0aGVyIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgb3V0LCBvclxuICAgKiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGVuZGluZyB0cmFuc2l0aW9uIGNsYXNzLCBzdWNoIGFzOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1gXG4gICAqL1xuICBvdXQ/OiBUcmFuc2l0aW9uO1xuICAvKiogVGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG4vLyBPcHRpb25zIHNwZWNpZmljIHRvIHRoZSAndHJhbnNpdGlvbicgY29tbWFuZFxudHlwZSBUcmFuc2l0aW9uQ29tbWFuZE9wdHMgPSB7XG4gIC8qKiBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuICovXG4gIHRpbWU/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGJsb2NrIFVJIGR1cmluZyB0cmFuc2l0aW9uLiBEZWZhdWx0cyBgdHJ1ZWAuICovXG4gIGJsb2NraW5nPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUHVzaE9wdHMgPSB7XG4gIC8qKiBEYXRhIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSBldmVudCBwYXlsb2FkLiAqL1xuICB2YWx1ZT86IGFueTtcbiAgLyoqIEZvciB0YXJnZXRpbmcgYSBMaXZlQ29tcG9uZW50IGJ5IGl0cyBJRCwgYSBjb21wb25lbnQgSUQgKG51bWJlciksIG9yIGEgQ1NTIHNlbGVjdG9yIHN0cmluZy4gKi9cbiAgdGFyZ2V0PzogSFRNTEVsZW1lbnQgfCBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBJbmRpY2F0ZXMgaWYgYSBwYWdlIGxvYWRpbmcgc3RhdGUgc2hvdWxkIGJlIHNob3duLiAqL1xuICBwYWdlX2xvYWRpbmc/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93IG90aGVyIHByb3BlcnRpZXMgbGlrZSAnY2lkJywgJ3JlZGlyZWN0JywgZXRjLlxufTtcblxudHlwZSBOYXZpZ2F0aW9uT3B0cyA9IHtcbiAgLyoqIFdoZXRoZXIgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2YgcHVzaGluZyBhIG5ldyBvbmUuICovXG4gIHJlcGxhY2U/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFsbCBwb3NzaWJsZSBKUyBjb21tYW5kcyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIGZhY3RvcnkuXG4gKiBUaGlzIGlzIHVzZWQgYXMgYSBiYXNlIGZvciBMaXZlU29ja2V0SlNDb21tYW5kcyBhbmQgSG9va0pTQ29tbWFuZHMuXG4gKi9cbmludGVyZmFjZSBBbGxKU0NvbW1hbmRzIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZWxlbWVudC5cbiAgICogVGhpcyB2ZXJzaW9uIGlzIGZvciBnZW5lcmFsIHVzZSB2aWEgbGl2ZVNvY2tldC5qcygpLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCBpbiB3aG9zZSBjb250ZXh0IHRvIGV4ZWN1dGUgdGhlIEphdmFTY3JpcHQuXG4gICAqIEBwYXJhbSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbDogSFRNTEVsZW1lbnQsIGVuY29kZWRKUzogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogU2hvd3MgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gc2hvdy5cbiAgICogQHBhcmFtIHtTaG93T3B0c30gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYGRpc3BsYXlgLCBgdHJhbnNpdGlvbmAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICBzaG93KGVsOiBIVE1MRWxlbWVudCwgb3B0cz86IFNob3dPcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogSGlkZXMgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gaGlkZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGhpZGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGBkaXNwbGF5YCwgYGluYCwgYG91dGAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0b2dnbGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogVG9nZ2xlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgQ1NTIGNsYXNzZXMgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYWRkIGNsYXNzZXMgdG8uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIGFkZC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGFkZENsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIENTUyBjbGFzc2VzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVtb3ZlIGNsYXNzZXMgZnJvbS5cbiAgICogQHBhcmFtIG5hbWVzIC0gVGhlIGNsYXNzIG5hbWUocykgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYHRyYW5zaXRpb25gLCBgdGltZWAsIGFuZCBgYmxvY2tpbmdgLlxuICAgKi9cbiAgcmVtb3ZlQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBuYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdHM/OiBCYXNlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgQ1NTIGNsYXNzZXMgb24gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gdG9nZ2xlIGNsYXNzZXMgb24uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIHRvZ2dsZUNsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgQ1NTIHRyYW5zaXRpb24gdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHRyYW5zaXRpb24gdG8uXG4gICAqIEBwYXJhbSB0cmFuc2l0aW9uIC0gVGhlIHRyYW5zaXRpb24gY2xhc3MoZXMpIHRvIGFwcGx5LlxuICAgKiAgIEFjY2VwdHMgYSBzdHJpbmcgb2YgY2xhc3NlcyB0byBhcHBseSB3aGVuIHRyYW5zaXRpb25pbmcgb3JcbiAgICogICBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqXG4gICAqICAgICAgIFtcImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiLCBcIm9wYWNpdHktMTAwXCIsIFwib3BhY2l0eS0wXCJdXG4gICAqXG4gICAqIEBwYXJhbSBbb3B0cz17fV0gLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGltaW5nIGFuZCBibG9ja2luZyBiZWhhdmlvci5cbiAgICogICBBY2NlcHRzOiBgdGltZWAgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0cmFuc2l0aW9uKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICB0cmFuc2l0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRzPzogVHJhbnNpdGlvbkNvbW1hbmRPcHRzLFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2V0LlxuICAgKiBAcGFyYW0gdmFsIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYW4gYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgYmV0d2VlbiB0d28gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gdG9nZ2xlLlxuICAgKiBAcGFyYW0gdmFsMSAtIFRoZSBmaXJzdCB2YWx1ZSB0byB0b2dnbGUgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHZhbDIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIHRvZ2dsZSBiZXR3ZWVuLlxuICAgKi9cbiAgdG9nZ2xlQXR0cmlidXRlKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICBhdHRyOiBzdHJpbmcsXG4gICAgdmFsMTogc3RyaW5nLFxuICAgIHZhbDI6IHN0cmluZyxcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUHVzaGVzIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIEFuIGVsZW1lbnQgdGhhdCBiZWxvbmdzIHRvIHRoZSB0YXJnZXQgTGl2ZVZpZXcgLyBMaXZlQ29tcG9uZW50IG9yIGEgY29tcG9uZW50IElELlxuICAgKiAgIFRvIHRhcmdldCBhIExpdmVDb21wb25lbnQgYnkgaXRzIElELCBwYXNzIGEgc2VwYXJhdGUgYHRhcmdldGAgaW4gdGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIGV2ZW50IG5hbWUgdG8gcHVzaC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB2YWx1ZWAsIGB0YXJnZXRgLCBgcGFnZV9sb2FkaW5nYC5cbiAgICovXG4gIHB1c2goZWw6IEhUTUxFbGVtZW50LCB0eXBlOiBzdHJpbmcsIG9wdHM/OiBQdXNoT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbmF2aWdhdGlvbiBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIG5hdmlnYXRlKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogU2VuZHMgYSBwYXRjaCBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBwYXRjaCB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIHBhdGNoKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogTWFyayBhdHRyaWJ1dGVzIGFzIGlnbm9yZWQsIHNraXBwaW5nIHRoZW0gd2hlbiBwYXRjaGluZyB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBpZ25vcmUgYXR0cmlidXRlcyBvbi5cbiAgICogQHBhcmFtIGF0dHJzIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIG9yIG5hbWVzIHRvIGlnbm9yZS5cbiAgICovXG4gIGlnbm9yZUF0dHJpYnV0ZXMoZWw6IEhUTUxFbGVtZW50LCBhdHRyczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoXG4gIGxpdmVTb2NrZXQ6IExpdmVTb2NrZXQsXG4gIGV2ZW50VHlwZTogc3RyaW5nIHwgbnVsbCxcbik6IEFsbEpTQ29tbWFuZHMgPT4ge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZWwsIGVuY29kZWRKUykge1xuICAgICAgbGl2ZVNvY2tldC5leGVjSlMoZWwsIGVuY29kZWRKUywgZXZlbnRUeXBlKTtcbiAgICB9LFxuICAgIHNob3coZWwsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLnNob3coXG4gICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIGVsLFxuICAgICAgICBvcHRzLmRpc3BsYXksXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBoaWRlKGVsLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5oaWRlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZShlbCwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgY29uc3QgaW5UcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5pbik7XG4gICAgICBjb25zdCBvdXRUcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5vdXQpO1xuICAgICAgSlMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgb3B0cy5kaXNwbGF5LFxuICAgICAgICBpblRyYW5zaXRpb24sXG4gICAgICAgIG91dFRyYW5zaXRpb24sXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhZGRDbGFzcyhlbCwgbmFtZXMsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IEFycmF5LmlzQXJyYXkobmFtZXMpID8gbmFtZXMgOiBuYW1lcy5zcGxpdChcIiBcIik7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgSlMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIG9wdHMuYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVtb3ZlQ2xhc3MoZWwsIG5hbWVzLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogbmFtZXMuc3BsaXQoXCIgXCIpO1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgZWwsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGFzc05hbWVzLFxuICAgICAgICBKUy50cmFuc2l0aW9uQ2xhc3NlcyhvcHRzLnRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZUNsYXNzKGVsLCBuYW1lcywgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IG5hbWVzLnNwbGl0KFwiIFwiKTtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy50b2dnbGVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvd25lcixcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICB0cmFuc2l0aW9uKGVsLCB0cmFuc2l0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBbXSxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKHRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgdmFsKSB7XG4gICAgICBKUy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbF1dLCBbXSk7XG4gICAgfSxcbiAgICByZW1vdmVBdHRyaWJ1dGUoZWwsIGF0dHIpIHtcbiAgICAgIEpTLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtdLCBbYXR0cl0pO1xuICAgIH0sXG4gICAgdG9nZ2xlQXR0cmlidXRlKGVsLCBhdHRyLCB2YWwxLCB2YWwyKSB7XG4gICAgICBKUy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgICB9LFxuICAgIHB1c2goZWwsIHR5cGUsIG9wdHMgPSB7fSkge1xuICAgICAgbGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZWwsICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBvcHRzLnZhbHVlIHx8IHt9O1xuICAgICAgICBkZWxldGUgb3B0cy52YWx1ZTtcbiAgICAgICAgbGV0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiLCB7IGRldGFpbDogeyBzb3VyY2VFbGVtZW50OiBlbCB9IH0pO1xuICAgICAgICBKUy5leGVjKGUsIGV2ZW50VHlwZSwgdHlwZSwgdmlldywgZWwsIFtcInB1c2hcIiwgeyBkYXRhLCAuLi5vcHRzIH1dKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoaHJlZiwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIpO1xuICAgICAgbGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICAgIGN1c3RvbUV2ZW50LFxuICAgICAgICBocmVmLFxuICAgICAgICBvcHRzLnJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHBhdGNoKGhyZWYsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiKTtcbiAgICAgIGxpdmVTb2NrZXQucHVzaEhpc3RvcnlQYXRjaChcbiAgICAgICAgY3VzdG9tRXZlbnQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIG9wdHMucmVwbGFjZSA/IFwicmVwbGFjZVwiIDogXCJwdXNoXCIsXG4gICAgICAgIG51bGwsXG4gICAgICApO1xuICAgIH0sXG4gICAgaWdub3JlQXR0cmlidXRlcyhlbCwgYXR0cnMpIHtcbiAgICAgIEpTLmlnbm9yZUF0dHJzKGVsLCBBcnJheS5pc0FycmF5KGF0dHJzKSA/IGF0dHJzIDogW2F0dHJzXSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogSlNDb21tYW5kcyBmb3IgdXNlIHdpdGggYGxpdmVTb2NrZXQuanMoKWAuXG4gKiBJbmNsdWRlcyB0aGUgZ2VuZXJhbCBgZXhlY2AgY29tbWFuZCB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIExpdmVTb2NrZXRKU0NvbW1hbmRzID0gQWxsSlNDb21tYW5kcztcblxuLyoqXG4gKiBKU0NvbW1hbmRzIGZvciB1c2Ugd2l0aGluIGEgSG9vay5cbiAqIFRoZSBgZXhlY2AgY29tbWFuZCBpcyB0YWlsb3JlZCBmb3IgaG9va3MsIG5vdCByZXF1aXJpbmcgYW4gZXhwbGljaXQgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb29rSlNDb21tYW5kcyBleHRlbmRzIE9taXQ8QWxsSlNDb21tYW5kcywgXCJleGVjXCI+IHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaG9vaydzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbmNvZGVkSlM6IHN0cmluZyk6IHZvaWQ7XG59XG4iLCAiaW1wb3J0IGpzQ29tbWFuZHMsIHsgSG9va0pTQ29tbWFuZHMgfSBmcm9tIFwiLi9qc19jb21tYW5kc1wiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBMaXZlU29ja2V0IGZyb20gXCIuL2xpdmVfc29ja2V0XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5cbmNvbnN0IEhPT0tfSUQgPSBcImhvb2tJZFwiO1xubGV0IHZpZXdIb29rSUQgPSAxO1xuXG5leHBvcnQgdHlwZSBPblJlcGx5ID0gKHJlcGx5OiBhbnksIHJlZjogbnVtYmVyKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBDYWxsYmFja1JlZiA9IHsgZXZlbnQ6IHN0cmluZzsgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSB9O1xuXG5leHBvcnQgdHlwZSBQaHhUYXJnZXQgPSBzdHJpbmcgfCBudW1iZXIgfCBIVE1MRWxlbWVudDtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rSW50ZXJmYWNlPEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgRE9NIGVsZW1lbnQgdGhhdCB0aGUgaG9vayBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIGVsOiBFO1xuXG4gIC8qKlxuICAgKiBUaGUgTGl2ZVNvY2tldCBpbnN0YW5jZSB0aGF0IHRoZSBob29rIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICAvKipcbiAgICogVGhlIG1vdW50ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBET00gYW5kIGl0cyBzZXJ2ZXIgTGl2ZVZpZXcgaGFzIGZpbmlzaGVkIG1vdW50aW5nLlxuICAgKi9cbiAgbW91bnRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWZvcmVVcGRhdGUgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGFib3V0IHRvIGJlIHVwZGF0ZWQgaW4gdGhlIERPTS5cbiAgICogTm90ZTogYW55IGNhbGwgaGVyZSBtdXN0IGJlIHN5bmNocm9ub3VzIGFzIHRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGRlZmVycmVkIG9yIGNhbmNlbGxlZC5cbiAgICovXG4gIGJlZm9yZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0cm95ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSwgZWl0aGVyIGJ5IGEgcGFyZW50IHVwZGF0ZSwgb3IgYnkgdGhlIHBhcmVudCBiZWluZyByZW1vdmVkIGVudGlyZWx5XG4gICAqL1xuICBkZXN0cm95ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzY29ubmVjdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCdzIHBhcmVudCBMaXZlVmlldyBoYXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBtYW5pcGx1YXRlIHRoZSBET00gYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdC5cbiAgICogVGhlIGFwcGxpZWQgY2hhbmdlcyBpbnRlZ3JhdGUgd2l0aCBzZXJ2ZXIgRE9NIHBhdGNoaW5nLlxuICAgKi9cbiAganMoKTogSG9va0pTQ29tbWFuZHM7XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhbiBldmVudCB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIFtwYXlsb2FkXSAtIFRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICAgKiBAcGFyYW0gW29uUmVwbHldIC0gQSBjYWxsYmFjayB0byBoYW5kbGUgdGhlIHNlcnZlcidzIHJlcGx5LlxuICAgKlxuICAgKiBXaGVuIG9uUmVwbHkgaXMgbm90IHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgYSBQcm9taXNlIHRoYXRcbiAgICogV2hlbiBvblJlcGx5IGlzIHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgdm9pZC5cbiAgICovXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkOiBhbnksIG9uUmVwbHk6IE9uUmVwbHkpOiB2b2lkO1xuICBwdXNoRXZlbnQoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IFByb21pc2U8YW55PjtcblxuICAvKipcbiAgICogUHVzaGVkIGEgdGFyZ2V0ZWQgZXZlbnQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogSXQgc2VuZHMgdGhlIGV2ZW50IHRvIHRoZSBMaXZlQ29tcG9uZW50IG9yIExpdmVWaWV3IHRoZSBgc2VsZWN0b3JPclRhcmdldGAgaXMgZGVmaW5lZCBpbixcbiAgICogd2hlcmUgaXRzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBxdWVyeSBzZWxlY3RvciwgYW4gYWN0dWFsIERPTSBlbGVtZW50LCBvciBhIENJRCAoY29tcG9uZW50IGlkKVxuICAgKiByZXR1cm5lZCBieSB0aGUgYEBteXNlbGZgIGFzc2lnbi5cbiAgICpcbiAgICogSWYgdGhlIHF1ZXJ5IHNlbGVjdG9yIHJldHVybnMgbW9yZSB0aGFuIG9uZSBlbGVtZW50IGl0IHdpbGwgc2VuZCB0aGUgZXZlbnQgdG8gYWxsIG9mIHRoZW0sXG4gICAqIGV2ZW4gaWYgYWxsIHRoZSBlbGVtZW50cyBhcmUgaW4gdGhlIHNhbWUgTGl2ZUNvbXBvbmVudCBvciBMaXZlVmlldy4gQmVjYXVzZSBvZiB0aGlzLFxuICAgKiBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWQsIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IG1hdGNoZXMgdGhlIHJldHVybiB2YWx1ZSBvZlxuICAgKiBbYFByb21pc2UuYWxsU2V0dGxlZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZS9hbGxTZXR0bGVkI3JldHVybl92YWx1ZSkuXG4gICAqIEluZGl2aWR1YWwgZnVsZmlsbGVkIHZhbHVlcyBhcmUgb2YgdGhlIGZvcm1hdCBgeyByZXBseSwgcmVmIH1gLCB3aGVyZSBgcmVwbHlgIGlzIHRoZSBzZXJ2ZXIncyByZXBseS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdG9yT3JUYXJnZXQgLSBUaGUgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIENJRCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuICAgKiBAcGFyYW0gW3BheWxvYWRdIC0gVGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QuXG4gICAqIEBwYXJhbSBbb25SZXBseV0gLSBBIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgc2VydmVyJ3MgcmVwbHkuXG4gICAqXG4gICAqIFdoZW4gb25SZXBseSBpcyBub3QgcHJvdmlkZWQsIHRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2UuXG4gICAqIFdoZW4gb25SZXBseSBpcyBwcm92aWRlZCwgdGhlIG1ldGhvZCByZXR1cm5zIHZvaWQuXG4gICAqL1xuICBwdXNoRXZlbnRUbyhcbiAgICBzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBvYmplY3QsXG4gICAgb25SZXBseTogT25SZXBseSxcbiAgKTogdm9pZDtcbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDx7IHJlcGx5OiBhbnk7IHJlZjogbnVtYmVyIH0+W10+O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUgYHB1c2hFdmVudGAgY2FsbHMgZnJvbSB0aGUgc2VydmVyLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgcmVjZWl2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsYmFjaywgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYHJlbW92ZUhhbmRsZUV2ZW50YCB0byByZW1vdmUgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSk6IENhbGxiYWNrUmVmO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGBoYW5kbGVFdmVudGAuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1JlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gdHJpZ2dlciBhIGxpdmUgZmlsZSB1cGxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHVwbG9hZCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGBQaG9lbml4LkxpdmVWaWV3LmFsbG93X3VwbG9hZC8zYCBjYWxsLlxuICAgKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdXBsb2FkLlxuICAgKi9cbiAgdXBsb2FkKG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvKipcbiAgICogQWxsb3dzIHRvIHRyaWdnZXIgYSBsaXZlIGZpbGUgdXBsb2FkIHRvIGEgc3BlY2lmaWMgdGFyZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0b3JPclRhcmdldCAtIFRoZSB0YXJnZXQgdG8gdXBsb2FkIHRoZSBmaWxlcyB0by5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgdXBsb2FkIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgYFBob2VuaXguTGl2ZVZpZXcuYWxsb3dfdXBsb2FkLzNgIGNhbGwuXG4gICAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byB1cGxvYWQuXG4gICAqL1xuICB1cGxvYWRUbyhzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsIG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvLyBhbGxvdyB1bmtub3duIG1ldGhvZHMsIGFzIHBlb3BsZSBjYW4gZGVmaW5lIHRoZW0gaW4gdGhlaXIgaG9va3NcbiAgW2tleTogUHJvcGVydHlLZXldOiBhbnk7XG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL2Jsb2IvZmFjMWFhNzVhY2RkZGJmNGYxYTk1ZTk4ZWUyMjk3YjU0Y2U0YjRjOS90eXBlcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5kLnRzI0wyNlxuLy8gbGljZW5zZWQgdW5kZXIgTUlUXG5leHBvcnQgaW50ZXJmYWNlIEhvb2s8b3V0IFQgPSBvYmplY3QsIEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgbW91bnRlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTSBhbmQgaXRzIHNlcnZlciBMaXZlVmlldyBoYXMgZmluaXNoZWQgbW91bnRpbmcuXG4gICAqL1xuICBtb3VudGVkPzogKHRoaXM6IFQgJiBIb29rSW50ZXJmYWNlPEU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgYmVmb3JlVXBkYXRlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhYm91dCB0byBiZSB1cGRhdGVkIGluIHRoZSBET00uXG4gICAqIE5vdGU6IGFueSBjYWxsIGhlcmUgbXVzdCBiZSBzeW5jaHJvbm91cyBhcyB0aGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBkZWZlcnJlZCBvciBjYW5jZWxsZWQuXG4gICAqL1xuICBiZWZvcmVVcGRhdGU/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRlc3Ryb3llZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLCBlaXRoZXIgYnkgYSBwYXJlbnQgdXBkYXRlLCBvciBieSB0aGUgcGFyZW50IGJlaW5nIHJlbW92ZWQgZW50aXJlbHlcbiAgICovXG4gIGRlc3Ryb3llZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRpc2Nvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBkaXNjb25uZWN0ZWQ/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvLyBBbGxvdyBjdXN0b20gbWV0aG9kcyB3aXRoIGFueSBzaWduYXR1cmUgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gIFtrZXk6IFByb3BlcnR5S2V5XTogYW55O1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIExpdmVWaWV3IGhvb2tzLiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyB0byBkZWZpbmUgdGhlaXIgaG9va3MuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15Q3VzdG9tSG9vayBleHRlbmRzIFZpZXdIb29rIHtcbiAqICAgbXlTdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICpcbiAqICAgbW91bnRlZCgpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkhvb2sgbW91bnRlZCBvbiBlbGVtZW50OlwiLCB0aGlzLmVsKTtcbiAqICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gKiAgICAgICB0aGlzLnB1c2hFdmVudChcImVsZW1lbnQtY2xpY2tlZFwiLCB7IHN0YXRlOiB0aGlzLm15U3RhdGUgfSk7XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIHVwZGF0ZWQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJIb29rIHVwZGF0ZWRcIiwgdGhpcy5lbC5pZCk7XG4gKiAgIH1cbiAqXG4gKiAgIG15Q3VzdG9tTWV0aG9kKHNvbWVBcmc6IHN0cmluZykge1xuICogICAgIGNvbnNvbGUubG9nKFwibXlDdXN0b21NZXRob2QgY2FsbGVkIHdpdGg6XCIsIHNvbWVBcmcsIFwiQ3VycmVudCBzdGF0ZTpcIiwgdGhpcy5teVN0YXRlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhlIGB0aGlzYCBjb250ZXh0IHdpdGhpbiB0aGUgaG9vayBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20gbWV0aG9kcywgZXRjLilcbiAqIHdpbGwgcmVmZXIgdG8gdGhlIGhvb2sgaW5zdGFuY2UsIHByb3ZpZGluZyBhY2Nlc3MgdG8gYHRoaXMuZWxgLCBgdGhpcy5saXZlU29ja2V0YCxcbiAqIGB0aGlzLnB1c2hFdmVudCgpYCwgZXRjLiwgYXMgd2VsbCBhcyBhbnkgcHJvcGVydGllcyBvciBtZXRob2RzIGRlZmluZWQgb24gdGhlIHN1YmNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVmlld0hvb2s8RSBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+XG4gIGltcGxlbWVudHMgSG9va0ludGVyZmFjZTxFPlxue1xuICBlbDogRTtcbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICBwcml2YXRlIF9fbGlzdGVuZXJzOiBTZXQ8Q2FsbGJhY2tSZWY+O1xuICBwcml2YXRlIF9faXNEaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX192aWV3OiAoKSA9PiBWaWV3O1xuXG4gIHN0YXRpYyBtYWtlSUQoKSB7XG4gICAgcmV0dXJuIHZpZXdIb29rSUQrKztcbiAgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBET00ucHJpdmF0ZShlbCwgSE9PS19JRCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3OiBWaWV3IHwgbnVsbCwgZWw6IEUsIGNhbGxiYWNrcz86IEhvb2spIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5fX2F0dGFjaFZpZXcodmlldyk7XG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBET00ucHV0UHJpdmF0ZSh0aGlzLmVsLCBIT09LX0lELCBWaWV3SG9vay5tYWtlSUQoKSk7XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAvLyBUaGlzIGluc3RhbmNlIGlzIGZvciBhbiBvYmplY3QtbGl0ZXJhbCBob29rLiBDb3B5IG1ldGhvZHMvcHJvcGVydGllcy5cbiAgICAgIC8vIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIE5PVCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsYmFja3Mgb2JqZWN0LlxuICAgICAgY29uc3QgcHJvdGVjdGVkUHJvcHMgPSBuZXcgU2V0KFtcbiAgICAgICAgXCJlbFwiLFxuICAgICAgICBcImxpdmVTb2NrZXRcIixcbiAgICAgICAgXCJfX3ZpZXdcIixcbiAgICAgICAgXCJfX2xpc3RlbmVyc1wiLFxuICAgICAgICBcIl9faXNEaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJjb25zdHJ1Y3RvclwiLCAvLyBTdGFuZGFyZCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAvLyBDb3JlIFZpZXdIb29rIEFQSSBtZXRob2RzXG4gICAgICAgIFwianNcIixcbiAgICAgICAgXCJwdXNoRXZlbnRcIixcbiAgICAgICAgXCJwdXNoRXZlbnRUb1wiLFxuICAgICAgICBcImhhbmRsZUV2ZW50XCIsXG4gICAgICAgIFwicmVtb3ZlSGFuZGxlRXZlbnRcIixcbiAgICAgICAgXCJ1cGxvYWRcIixcbiAgICAgICAgXCJ1cGxvYWRUb1wiLFxuICAgICAgICAvLyBJbnRlcm5hbCBsaWZlY3ljbGUgY2FsbGVyc1xuICAgICAgICBcIl9fbW91bnRlZFwiLFxuICAgICAgICBcIl9fdXBkYXRlZFwiLFxuICAgICAgICBcIl9fYmVmb3JlVXBkYXRlXCIsXG4gICAgICAgIFwiX19kZXN0cm95ZWRcIixcbiAgICAgICAgXCJfX3JlY29ubmVjdGVkXCIsXG4gICAgICAgIFwiX19kaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJfX2NsZWFudXBfX1wiLFxuICAgICAgXSk7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhbGxiYWNrcywga2V5KSkge1xuICAgICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IGNhbGxiYWNrc1trZXldO1xuICAgICAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWxsb3cgdGhlIG92ZXJ3cml0ZSwgYnV0IHdlIGxvZyBhIHdhcm5pbmdcbiAgICAgICAgICBpZiAocHJvdGVjdGVkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEhvb2sgb2JqZWN0IGZvciBlbGVtZW50ICMke2VsLmlkfSBvdmVyd3JpdGVzIGNvcmUgcHJvcGVydHkgJyR7a2V5fSchYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpZmVjeWNsZU1ldGhvZHM6IChrZXlvZiBIb29rKVtdID0gW1xuICAgICAgICBcIm1vdW50ZWRcIixcbiAgICAgICAgXCJiZWZvcmVVcGRhdGVcIixcbiAgICAgICAgXCJ1cGRhdGVkXCIsXG4gICAgICAgIFwiZGVzdHJveWVkXCIsXG4gICAgICAgIFwiZGlzY29ubmVjdGVkXCIsXG4gICAgICAgIFwicmVjb25uZWN0ZWRcIixcbiAgICAgIF07XG4gICAgICBsaWZlY3ljbGVNZXRob2RzLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGxiYWNrc1ttZXRob2ROYW1lXSAmJlxuICAgICAgICAgIHR5cGVvZiBjYWxsYmFja3NbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW21ldGhvZE5hbWVdID0gY2FsbGJhY2tzW21ldGhvZE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgJ2NhbGxiYWNrcycgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIGEgdXNlci1kZWZpbmVkIGNsYXNzIChlLmcuLCBNeUhvb2spLlxuICAgIC8vIEl0cyBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20pIGFyZSBhbHJlYWR5IHBhcnQgb2YgaXRzIHByb3RvdHlwZSBvciBpbnN0YW5jZSxcbiAgICAvLyBhbmQgd2lsbCBjb3JyZWN0bHkgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZyb20gVmlld0hvb2sucHJvdG90eXBlLlxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2F0dGFjaFZpZXcodmlldzogVmlldyB8IG51bGwpIHtcbiAgICBpZiAodmlldykge1xuICAgICAgdGhpcy5fX3ZpZXcgPSAoKSA9PiB2aWV3O1xuICAgICAgdGhpcy5saXZlU29ja2V0ID0gdmlldy5saXZlU29ja2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdmlldyA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBob29rIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSBsaXZlIHZpZXc6ICR7dGhpcy5lbC5vdXRlckhUTUx9YCxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmxpdmVTb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlmZWN5Y2xlIG1ldGhvZHNcbiAgbW91bnRlZCgpOiB2b2lkIHt9XG4gIGJlZm9yZVVwZGF0ZSgpOiB2b2lkIHt9XG4gIHVwZGF0ZWQoKTogdm9pZCB7fVxuICBkZXN0cm95ZWQoKTogdm9pZCB7fVxuICBkaXNjb25uZWN0ZWQoKTogdm9pZCB7fVxuICByZWNvbm5lY3RlZCgpOiB2b2lkIHt9XG5cbiAgLy8gSW50ZXJuYWwgbGlmZWN5Y2xlIGNhbGxlcnMgLSBjYWxsZWQgYnkgdGhlIFZpZXdcblxuICAvKiogQGludGVybmFsICovXG4gIF9fbW91bnRlZCgpIHtcbiAgICB0aGlzLm1vdW50ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fdXBkYXRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fYmVmb3JlVXBkYXRlKCkge1xuICAgIHRoaXMuYmVmb3JlVXBkYXRlKCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rlc3Ryb3llZCgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCgpO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIEhPT0tfSUQpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhvZW5peGZyYW1ld29yay9waG9lbml4X2xpdmVfdmlldy9pc3N1ZXMvMzQ5NlxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19yZWNvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5fX2lzRGlzY29ubmVjdGVkKSB7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVjb25uZWN0ZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rpc2Nvbm5lY3RlZCgpIHtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBqcygpOiBIb29rSlNDb21tYW5kcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmpzQ29tbWFuZHModGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LCBcImhvb2tcIiksXG4gICAgICBleGVjOiAoZW5jb2RlZEpTOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LmV4ZWNKUyh0aGlzLmVsLCBlbmNvZGVkSlMsIFwiaG9va1wiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55LCBvblJlcGx5PzogT25SZXBseSkge1xuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl9fdmlldygpLnB1c2hIb29rRXZlbnQoXG4gICAgICB0aGlzLmVsLFxuICAgICAgbnVsbCxcbiAgICAgIGV2ZW50LFxuICAgICAgcGF5bG9hZCB8fCB7fSxcbiAgICApO1xuICAgIGlmIChvblJlcGx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKHsgcmVwbHkgfSkgPT4gcmVwbHkpO1xuICAgIH1cbiAgICBwcm9taXNlLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgICBvblJlcGx5PzogT25SZXBseSxcbiAgKSB7XG4gICAgaWYgKG9uUmVwbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGFyZ2V0UGFpcjogeyB2aWV3OiBWaWV3OyB0YXJnZXRDdHg6IGFueSB9W10gPSBbXTtcbiAgICAgIHRoaXMuX192aWV3KCkud2l0aGluVGFyZ2V0cyhzZWxlY3Rvck9yVGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIHRhcmdldFBhaXIucHVzaCh7IHZpZXcsIHRhcmdldEN0eCB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXJnZXRQYWlyLm1hcCgoeyB2aWV3LCB0YXJnZXRDdHggfSkgPT4ge1xuICAgICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRoaXMuZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQgfHwge30pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9XG4gICAgdGhpcy5fX3ZpZXcoKS53aXRoaW5UYXJnZXRzKHNlbGVjdG9yT3JUYXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHZpZXdcbiAgICAgICAgLnB1c2hIb29rRXZlbnQodGhpcy5lbCwgdGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCB8fCB7fSlcbiAgICAgICAgLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAocGF5bG9hZDogYW55KSA9PiBhbnkpOiBDYWxsYmFja1JlZiB7XG4gICAgY29uc3QgY2FsbGJhY2tSZWY6IENhbGxiYWNrUmVmID0ge1xuICAgICAgZXZlbnQsXG4gICAgICBjYWxsYmFjazogKGN1c3RvbUV2ZW50OiBDdXN0b21FdmVudCkgPT4gY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKSxcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDoke2V2ZW50fWAsXG4gICAgICBjYWxsYmFja1JlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5hZGQoY2FsbGJhY2tSZWYpO1xuICAgIHJldHVybiBjYWxsYmFja1JlZjtcbiAgfVxuXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIGBwaHg6JHtyZWYuZXZlbnR9YCxcbiAgICAgIHJlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUocmVmKTtcbiAgfVxuXG4gIHVwbG9hZChuYW1lOiBzdHJpbmcsIGZpbGVzOiBGaWxlTGlzdCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3KCkuZGlzcGF0Y2hVcGxvYWRzKG51bGwsIG5hbWUsIGZpbGVzKTtcbiAgfVxuXG4gIHVwbG9hZFRvKHNlbGVjdG9yT3JUYXJnZXQ6IFBoeFRhcmdldCwgbmFtZTogc3RyaW5nLCBmaWxlczogRmlsZUxpc3QpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fdmlldygpLndpdGhpblRhcmdldHMoc2VsZWN0b3JPclRhcmdldCwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5kaXNwYXRjaFVwbG9hZHModGFyZ2V0Q3R4LCBuYW1lLCBmaWxlcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9fY2xlYW51cF9fKCkge1xuICAgIHRoaXMuX19saXN0ZW5lcnMuZm9yRWFjaCgoY2FsbGJhY2tSZWYpID0+XG4gICAgICB0aGlzLnJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tzT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBWaWV3SG9vayB8IEhvb2s+O1xuXG5leHBvcnQgZGVmYXVsdCBWaWV3SG9vaztcbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfVklFV19SRUYsXG4gIFBIWF9DT05ORUNURURfQ0xBU1MsXG4gIFBIWF9ESVNBQkxFX1dJVEgsXG4gIFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSxcbiAgUEhYX0RJU0FCTEVELFxuICBQSFhfTE9BRElOR19DTEFTUyxcbiAgUEhYX0VSUk9SX0NMQVNTLFxuICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfSE9PSyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BST0dSRVNTLFxuICBQSFhfUkVBRE9OTFksXG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9SRUZfTE9DSyxcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfU1RJQ0tZLFxuICBQSFhfVFJBQ0tfU1RBVElDLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUEhYX1VQREFURSxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfTUFJTixcbiAgUEhYX01PVU5URUQsXG4gIFBVU0hfVElNRU9VVCxcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgTUFYX0NISUxEX0pPSU5fQVRURU1QVFMsXG4gIFBIWF9MVl9QSUQsXG4gIFBIWF9QT1JUQUwsXG4gIFBIWF9URUxFUE9SVEVEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBFbGVtZW50UmVmIGZyb20gXCIuL2VsZW1lbnRfcmVmXCI7XG5pbXBvcnQgRE9NUGF0Y2ggZnJvbSBcIi4vZG9tX3BhdGNoXCI7XG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIjtcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiO1xuaW1wb3J0IHsgVmlld0hvb2sgfSBmcm9tIFwiLi92aWV3X2hvb2tcIjtcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiO1xuXG5pbXBvcnQgbW9ycGhkb20gZnJvbSBcIm1vcnBoZG9tXCI7XG5cbmV4cG9ydCBjb25zdCBwcmVwZW5kRm9ybURhdGFLZXkgPSAoa2V5LCBwcmVmaXgpID0+IHtcbiAgY29uc3QgaXNBcnJheSA9IGtleS5lbmRzV2l0aChcIltdXCIpO1xuICAvLyBSZW1vdmUgdGhlIFwiW11cIiBpZiBpdCdzIGFuIGFycmF5XG4gIGxldCBiYXNlS2V5ID0gaXNBcnJheSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG4gIC8vIFJlcGxhY2UgbGFzdCBvY2N1cnJlbmNlIG9mIGtleSBiZWZvcmUgYSBjbG9zaW5nIGJyYWNrZXQgb3IgdGhlIGVuZCB3aXRoIGtleSBwbHVzIHN1ZmZpeFxuICBiYXNlS2V5ID0gYmFzZUtleS5yZXBsYWNlKC8oW15cXFtcXF1dKykoXFxdPyQpLywgYCR7cHJlZml4fSQxJDJgKTtcbiAgLy8gQWRkIGJhY2sgdGhlIFwiW11cIiBpZiBpdCB3YXMgYW4gYXJyYXlcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICBiYXNlS2V5ICs9IFwiW11cIjtcbiAgfVxuICByZXR1cm4gYmFzZUtleTtcbn07XG5cbmNvbnN0IHNlcmlhbGl6ZUZvcm0gPSAoZm9ybSwgb3B0cywgb25seU5hbWVzID0gW10pID0+IHtcbiAgY29uc3QgeyBzdWJtaXR0ZXIgfSA9IG9wdHM7XG5cbiAgLy8gV2UgbXVzdCBpbmplY3QgdGhlIHN1Ym1pdHRlciBpbiB0aGUgb3JkZXIgdGhhdCBpdCBleGlzdHMgaW4gdGhlIERPTVxuICAvLyByZWxhdGl2ZSB0byBvdGhlciBpbnB1dHMuIEZvciBleGFtcGxlLCBmb3IgY2hlY2tib3ggZ3JvdXBzLCB0aGUgb3JkZXIgbXVzdCBiZSBtYWludGFpbmVkLlxuICBsZXQgaW5qZWN0ZWRFbGVtZW50O1xuICBpZiAoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgLy8gc2V0IHRoZSBmb3JtIGF0dHJpYnV0ZSBpZiB0aGUgc3VibWl0dGVyIGhhcyBvbmU7XG4gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGFjdHVhbCBmb3JtIGVsZW1lbnRcbiAgICBjb25zdCBmb3JtSWQgPSBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybVwiKTtcbiAgICBpZiAoZm9ybUlkKSB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJmb3JtXCIsIGZvcm1JZCk7XG4gICAgfVxuICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHN1Ym1pdHRlci52YWx1ZTtcbiAgICBzdWJtaXR0ZXIucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaW5wdXQsIHN1Ym1pdHRlcik7XG4gICAgaW5qZWN0ZWRFbGVtZW50ID0gaW5wdXQ7XG4gIH1cblxuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgY29uc3QgdG9SZW1vdmUgPSBbXTtcblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHRvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsZWFudXAgYWZ0ZXIgYnVpbGRpbmcgZmlsZURhdGFcbiAgdG9SZW1vdmUuZm9yRWFjaCgoa2V5KSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSk7XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXG4gIGNvbnN0IHsgaW5wdXRzVW51c2VkLCBvbmx5SGlkZGVuSW5wdXRzIH0gPSBBcnJheS5mcm9tKGZvcm0uZWxlbWVudHMpLnJlZHVjZShcbiAgICAoYWNjLCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dHNVbnVzZWQsIG9ubHlIaWRkZW5JbnB1dHMgfSA9IGFjYztcbiAgICAgIGNvbnN0IGtleSA9IGlucHV0Lm5hbWU7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXRzVW51c2VkW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnB1dHNVbnVzZWRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob25seUhpZGRlbklucHV0c1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25seUhpZGRlbklucHV0c1trZXldID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVc2VkID1cbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHxcbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfU1VCTUlUVEVEKTtcbiAgICAgIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gXCJoaWRkZW5cIjtcbiAgICAgIGlucHV0c1VudXNlZFtrZXldID0gaW5wdXRzVW51c2VkW2tleV0gJiYgIWlzVXNlZDtcbiAgICAgIG9ubHlIaWRkZW5JbnB1dHNba2V5XSA9IG9ubHlIaWRkZW5JbnB1dHNba2V5XSAmJiBpc0hpZGRlbjtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHsgaW5wdXRzVW51c2VkOiB7fSwgb25seUhpZGRlbklucHV0czoge30gfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgaWYgKG9ubHlOYW1lcy5sZW5ndGggPT09IDAgfHwgb25seU5hbWVzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICBjb25zdCBpc1VudXNlZCA9IGlucHV0c1VudXNlZFtrZXldO1xuICAgICAgY29uc3QgaGlkZGVuID0gb25seUhpZGRlbklucHV0c1trZXldO1xuICAgICAgaWYgKGlzVW51c2VkICYmICEoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lID09IGtleSkgJiYgIWhpZGRlbikge1xuICAgICAgICBwYXJhbXMuYXBwZW5kKHByZXBlbmRGb3JtRGF0YUtleShrZXksIFwiX3VudXNlZF9cIiksIFwiXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcGFyYW1zLmFwcGVuZChrZXksIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIHRoZSBpbmplY3RlZCBlbGVtZW50IGFnYWluXG4gIC8vIChpdCB3b3VsZCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IGRvbSBwYXRjaCBhbnl3YXksIGJ1dCB0aGlzIGlzIGNsZWFuZXIpXG4gIGlmIChzdWJtaXR0ZXIgJiYgaW5qZWN0ZWRFbGVtZW50KSB7XG4gICAgc3VibWl0dGVyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaW5qZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMudG9TdHJpbmcoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBzdGF0aWMgY2xvc2VzdFZpZXcoZWwpIHtcbiAgICBjb25zdCBsaXZlVmlld0VsID0gZWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUik7XG4gICAgcmV0dXJuIGxpdmVWaWV3RWwgPyBET00ucHJpdmF0ZShsaXZlVmlld0VsLCBcInZpZXdcIikgOiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwsIGxpdmVTb2NrZXQsIHBhcmVudFZpZXcsIGZsYXNoLCBsaXZlUmVmZXJlcikge1xuICAgIHRoaXMuaXNEZWFkID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldDtcbiAgICB0aGlzLmZsYXNoID0gZmxhc2g7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvcHVsbC8zNzIxXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBib3VuZCB0byBhIHZpZXdcbiAgICBjb25zdCBib3VuZFZpZXcgPSBET00ucHJpdmF0ZSh0aGlzLmVsLCBcInZpZXdcIik7XG4gICAgaWYgKGJvdW5kVmlldyAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVmlldy5pc0RlYWQgIT09IHRydWUpIHtcbiAgICAgIGxvZ0Vycm9yKFxuICAgICAgICBgVGhlIERPTSBlbGVtZW50IGZvciB0aGlzIHZpZXcgaGFzIGFscmVhZHkgYmVlbiBib3VuZCB0byBhIHZpZXcuXG5cbiAgICAgICAgQW4gZWxlbWVudCBjYW4gb25seSBldmVyIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSB2aWV3IVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGFyZSBub3QgdHJ5aW5nIHRvIGluaXRpYWxpemUgbXVsdGlwbGUgTGl2ZVNvY2tldHMgb24gdGhlIHNhbWUgcGFnZS5cbiAgICAgICAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91J3JlIGFjY2lkZW50YWxseSB0cnlpbmcgdG8gcmVuZGVyIHlvdXIgcm9vdCBsYXlvdXQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgIEVuc3VyZSB0aGF0IHRoZSB0ZW1wbGF0ZSBzZXQgb24gdGhlIExpdmVWaWV3IGlzIGRpZmZlcmVudCB0aGFuIHRoZSByb290IGxheW91dC5cbiAgICAgIGAsXG4gICAgICAgIHsgdmlldzogYm91bmRWaWV3IH0sXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGJpbmQgbXVsdGlwbGUgdmlld3MgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQuXCIpO1xuICAgIH1cbiAgICAvLyBiaW5kIHRoZSB2aWV3IHRvIHRoZSBlbGVtZW50XG4gICAgRE9NLnB1dFByaXZhdGUodGhpcy5lbCwgXCJ2aWV3XCIsIHRoaXMpO1xuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkO1xuICAgIHRoaXMucmVmID0gMDtcbiAgICB0aGlzLmxhc3RBY2tSZWYgPSBudWxsO1xuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgLyoqXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLmxvYWRlclRpbWVyID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgdGhpcy5wZW5kaW5nRm9ybXMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlO1xuICAgIHRoaXMuaHJlZiA9IG51bGw7XG4gICAgdGhpcy5qb2luQ291bnQgPSB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmpvaW5Db3VudCAtIDEgOiAwO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzID0gMDtcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24gKG9uRG9uZSkge1xuICAgICAgb25Eb25lICYmIG9uRG9uZSgpO1xuICAgIH07XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAvLyB1c3VhbGx5LCBvbmx5IHRoZSByb290IExpdmVWaWV3IHN0b3JlcyBwZW5kaW5nXG4gICAgLy8gam9pbiBvcGVyYXRpb25zIGZvciBhbGwgY2hpbGRyZW4gKGFuZCBpdHNlbGYpLFxuICAgIC8vIGJ1dCBpbiBjYXNlIG9mIHJlam9pbnMgKGpvaW5Db3VudCA+IDEpIGVhY2ggY2hpbGRcbiAgICAvLyBzdG9yZXMgaXRzIG93biBldmVudHMgaW5zdGVhZFxuICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9O1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSBbXTtcbiAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5wYXJlbnQgPyBudWxsIDoge307XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge307XG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5jaGFubmVsID0gdGhpcy5saXZlU29ja2V0LmNoYW5uZWwoYGx2OiR7dGhpcy5pZH1gLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmhyZWYgJiYgdGhpcy5leHBhbmRVUkwodGhpcy5ocmVmKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0ID8gdXJsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHRoaXMucmVkaXJlY3QgPyB1bmRlZmluZWQgOiB1cmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdFBhcmFtcyhsaXZlUmVmZXJlciksXG4gICAgICAgIHNlc3Npb246IHRoaXMuZ2V0U2Vzc2lvbigpLFxuICAgICAgICBzdGF0aWM6IHRoaXMuZ2V0U3RhdGljKCksXG4gICAgICAgIGZsYXNoOiB0aGlzLmZsYXNoLFxuICAgICAgICBzdGlja3k6IHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9TVElDS1kpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLnBvcnRhbEVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICBzZXRIcmVmKGhyZWYpIHtcbiAgICB0aGlzLmhyZWYgPSBocmVmO1xuICB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZikge1xuICAgIHRoaXMucmVkaXJlY3QgPSB0cnVlO1xuICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gIH1cblxuICBpc01haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9NQUlOKTtcbiAgfVxuXG4gIGNvbm5lY3RQYXJhbXMobGl2ZVJlZmVyZXIpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmxpdmVTb2NrZXQucGFyYW1zKHRoaXMuZWwpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgIC5tYXAoKG5vZGUpID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZilcbiAgICAgIC5maWx0ZXIoKHVybCkgPT4gdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIik7XG5cbiAgICBpZiAobWFuaWZlc3QubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0O1xuICAgIH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnQ7XG4gICAgcGFyYW1zW1wiX21vdW50X2F0dGVtcHRzXCJdID0gdGhpcy5qb2luQXR0ZW1wdHM7XG4gICAgcGFyYW1zW1wiX2xpdmVfcmVmZXJlclwiXSA9IGxpdmVSZWZlcmVyO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzKys7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gIH1cblxuICBnZXRTdGF0aWMoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gXCJcIiA/IG51bGwgOiB2YWw7XG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpO1xuICAgIHRoaXMuZGVzdHJveVBvcnRhbEVsZW1lbnRzKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIFwidmlld1wiKTtcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdO1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnBhcmVudC5pZF1bdGhpcy5pZF07XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjb25zdCBvbkZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBET00ubWFya1BoeENoaWxkRGVzdHJveWVkKHRoaXMuZWwpO1xuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKTtcbiAgICB0aGlzLmNoYW5uZWxcbiAgICAgIC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZCk7XG4gIH1cblxuICBzZXRDb250YWluZXJDbGFzc2VzKC4uLmNsYXNzZXMpIHtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICAgICAgUEhYX0xPQURJTkdfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1MsXG4gICAgICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICAgICAgUEhYX1NFUlZFUl9FUlJPUl9DTEFTUyxcbiAgICApO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcbiAgfVxuXG4gIHNob3dMb2FkZXIodGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMudmlld0hvb2tzKSB7XG4gICAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX2Rpc2Nvbm5lY3RlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9MT0FESU5HX0NMQVNTKTtcbiAgICB9XG4gIH1cblxuICBleGVjQWxsKGJpbmRpbmcpIHtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtiaW5kaW5nfV1gLCAoZWwpID0+XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUoYmluZGluZykpLFxuICAgICk7XG4gIH1cblxuICBoaWRlTG9hZGVyKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5kaXNjb25uZWN0ZWRUaW1lcik7XG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpO1xuICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJjb25uZWN0ZWRcIikpO1xuICB9XG5cbiAgdHJpZ2dlclJlY29ubmVjdGVkKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX3JlY29ubmVjdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbG9nKGtpbmQsIG1zZ0NhbGxiYWNrKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLCBraW5kLCBtc2dDYWxsYmFjayk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKTtcbiAgfVxuXG4gIC8vIGNhbGxzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB2aWV3IGFuZCB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHBoeFRhcmdldFxuICAvLyB0YXJnZXRzIGNhbiBiZTpcbiAgLy8gICogYW4gZWxlbWVudCBpdHNlbGYsIHRoZW4gaXQgaXMgc2ltcGx5IHBhc3NlZCB0byBsaXZlU29ja2V0Lm93bmVyO1xuICAvLyAgKiBhIENJRCAoQ29tcG9uZW50IElEKSwgdGhlbiB3ZSBmaXJzdCBzZWFyY2ggdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQgaW4gdGhlIERPTVxuICAvLyAgKiBhIHNlbGVjdG9yLCB0aGVuIHdlIHNlYXJjaCB0aGUgc2VsZWN0b3IgaW4gdGhlIERPTSBhbmQgY2FsbCB0aGUgY2FsbGJhY2tcbiAgLy8gICAgZm9yIGVhY2ggZWxlbWVudCBmb3VuZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG93bmVyIHZpZXdcbiAgd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20gPSBkb2N1bWVudCkge1xuICAgIC8vIGluIHRoZSBmb3JtIHJlY292ZXJ5IGNhc2Ugd2Ugc2VhcmNoIGluIGEgdGVtcGxhdGUgZnJhZ21lbnQgaW5zdGVhZCBvZlxuICAgIC8vIHRoZSByZWFsIGRvbSwgdGhlcmVmb3JlIHdlIG9wdGlvbmFsbHkgcGFzcyBkb20gYW5kIHZpZXdFbFxuXG4gICAgaWYgKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHBoeFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCAodmlldykgPT5cbiAgICAgICAgY2FsbGJhY2sodmlldywgcGh4VGFyZ2V0KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2lkKHBoeFRhcmdldCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuaWQsIHBoeFRhcmdldCwgZG9tKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dFcnJvcihgbm8gY29tcG9uZW50IGZvdW5kIG1hdGNoaW5nIHBoeC10YXJnZXQgb2YgJHtwaHhUYXJnZXR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayh0aGlzLCBwYXJzZUludChwaHhUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IEFycmF5LmZyb20oZG9tLnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT5cbiAgICAgICAgdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIHRhcmdldCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmxvZyh0eXBlLCAoKSA9PiBbXCJcIiwgY2xvbmUocmF3RGlmZildKTtcbiAgICBjb25zdCB7IGRpZmYsIHJlcGx5LCBldmVudHMsIHRpdGxlIH0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpO1xuICAgIGNhbGxiYWNrKHsgZGlmZiwgcmVwbHksIGV2ZW50cyB9KTtcbiAgICBpZiAodHlwZW9mIHRpdGxlID09PSBcInN0cmluZ1wiIHx8ICh0eXBlID09IFwibW91bnRcIiAmJiB0aGlzLmlzTWFpbigpKSkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBET00ucHV0VGl0bGUodGl0bGUpKTtcbiAgICB9XG4gIH1cblxuICBvbkpvaW4ocmVzcCkge1xuICAgIGNvbnN0IHsgcmVuZGVyZWQsIGNvbnRhaW5lciwgbGl2ZXZpZXdfdmVyc2lvbiwgcGlkIH0gPSByZXNwO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IFt0YWcsIGF0dHJzXSA9IGNvbnRhaW5lcjtcbiAgICAgIHRoaXMuZWwgPSBET00ucmVwbGFjZVJvb3RDb250YWluZXIodGhpcy5lbCwgdGFnLCBhdHRycyk7XG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgdGhpcy5qb2luUGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0gdGhpcy5nZXRGb3Jtc0ZvclJlY292ZXJ5KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTWFpbigpICYmIHdpbmRvdy5oaXN0b3J5LnN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBzZXQgaW5pdGlhbCBoaXN0b3J5IGVudHJ5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhZ2UgbG9hZCAobm8gaGlzdG9yeSlcbiAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFwicmVwbGFjZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmxpdmVTb2NrZXQuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsaXZldmlld192ZXJzaW9uICE9PSB0aGlzLmxpdmVTb2NrZXQudmVyc2lvbigpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTGl2ZVZpZXcgYXNzZXQgdmVyc2lvbiBtaXNtYXRjaC4gSmF2YVNjcmlwdCB2ZXJzaW9uICR7dGhpcy5saXZlU29ja2V0LnZlcnNpb24oKX0gdnMuIHNlcnZlciAke2xpdmV2aWV3X3ZlcnNpb259LiBUbyBhdm9pZCBpc3N1ZXMsIHBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGFzc2V0cyB1c2UgdGhlIHNhbWUgdmVyc2lvbiBhcyB0aGUgc2VydmVyLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoZSBwaWQgaXMgb25seSBzZW50IGlmXG4gICAgLy9cbiAgICAvLyAgICBjb25maWcgOnBob2VuaXhfbGl2ZV92aWV3LCA6ZGVidWdfYXR0cmlidXRlc1xuICAgIC8vXG4gICAgLy8gaWYgc2V0IHRvIHRydWUuIEl0IGlzIHRvIGhlbHAgZGVidWdnaW5nIGluIGRldmVsb3BtZW50LlxuICAgIGlmIChwaWQpIHtcbiAgICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9MVl9QSUQsIHBpZCk7XG4gICAgfVxuXG4gICAgQnJvd3Nlci5kcm9wTG9jYWwoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgICApO1xuICAgIHRoaXMuYXBwbHlEaWZmKFwibW91bnRcIiwgcmVuZGVyZWQsICh7IGRpZmYsIGV2ZW50cyB9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpO1xuICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIobnVsbCwgXCJqb2luXCIpO1xuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKTtcbiAgICAgIHRoaXMuam9pbkNvdW50Kys7XG4gICAgICB0aGlzLmpvaW5BdHRlbXB0cyA9IDA7XG5cbiAgICAgIHRoaXMubWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIHN0cmVhbXMsIGV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3BQZW5kaW5nUmVmcygpIHtcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7UEhYX1JFRl9TUkN9PVwiJHt0aGlzLnJlZlNyYygpfVwiXWAsIChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpO1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5Db21wbGV0ZSh7IGxpdmVfcGF0Y2ggfSwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJvdmlkZSBhIGJldHRlciBleHBlcmllbmNlLCB3ZSB3YW50IHRvIGpvaW5cbiAgICAvLyBhbGwgTGl2ZVZpZXdzIGZpcnN0IGFuZCBvbmx5IHRoZW4gYXBwbHkgdGhlaXIgcGF0Y2hlcy5cbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKTtcbiAgICB9XG5cbiAgICAvLyBPbmUgZG93bnNpZGUgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHdlIG5lZWQgdG8gZmluZCBwaHhDaGlsZHJlblxuICAgIC8vIGluIHRoZSBodG1sIGZyYWdtZW50LCBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBET00uIFRoZSBmcmFnbWVudFxuICAgIC8vIGFsc28gZG9lcyBub3QgaW5jbHVkZSBQSFhfU1RBVElDLCBzbyB3ZSBuZWVkIHRvIGNvcHkgaXQgb3ZlciBmcm9tXG4gICAgLy8gdGhlIERPTS5cbiAgICBjb25zdCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcihcbiAgICAgICh0b0VsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYCk7XG4gICAgICAgIGNvbnN0IHBoeFN0YXRpYyA9IGZyb21FbCAmJiBmcm9tRWwuZ2V0QXR0cmlidXRlKFBIWF9TVEFUSUMpO1xuICAgICAgICBpZiAocGh4U3RhdGljKSB7XG4gICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgUEhYX1JPT1RfSUQgdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRvIHRoZSByb290IHZpZXdcbiAgICAgICAgLy8gd2hpbGUgdGhlIGNoaWxkIGpvaW4gaXMgc3RpbGwgcGVuZGluZ1xuICAgICAgICBpZiAoZnJvbUVsKSB7XG4gICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCwgdGhpcy5yb290LmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5qb2luQ2hpbGQodG9FbCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW1xuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKCkgPT4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbXG4gICAgICAgIHRoaXMsXG4gICAgICAgICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpIHtcbiAgICB0aGlzLmVsID0gRE9NLmJ5SWQodGhpcy5pZCk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gIH1cblxuICAvLyB0aGlzIGlzIGludm9rZWQgZm9yIGRlYWQgYW5kIGxpdmUgdmlld3MsIHNvIHdlIG11c3QgZmlsdGVyIGJ5XG4gIC8vIGJ5IG93bmVyIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgZHVwbGljYXRpbmcgaG9va3MgYWNyb3NzIGRpc2Nvbm5lY3RcbiAgLy8gYW5kIGNvbm5lY3RlZCBzdGF0ZXMuIFRoaXMgYWxzbyBoYW5kbGVzIGNhc2VzIHdoZXJlIGhvb2tzIGV4aXN0XG4gIC8vIGluIGEgcm9vdCBsYXlvdXQgd2l0aCBhIExWIGluIHRoZSBib2R5XG4gIGV4ZWNOZXdNb3VudGVkKHBhcmVudCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IHBoeFZpZXdwb3J0VG9wID0gdGhpcy5iaW5kaW5nKFBIWF9WSUVXUE9SVF9UT1ApO1xuICAgIGxldCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICB0aGlzLmFsbChcbiAgICAgIHBhcmVudCxcbiAgICAgIGBbJHtwaHhWaWV3cG9ydFRvcH1dLCBbJHtwaHhWaWV3cG9ydEJvdHRvbX1dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKFxuICAgICAgICAgIGhvb2tFbCxcbiAgICAgICAgICBob29rRWwsXG4gICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgcGh4Vmlld3BvcnRCb3R0b20sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWF5YmVBZGROZXdIb29rKGhvb2tFbCk7XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5hbGwoXG4gICAgICBwYXJlbnQsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFBIWF9IT09LKX1dLCBbZGF0YS1waHgtJHtQSFhfSE9PS31dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgdGhpcy5tYXliZUFkZE5ld0hvb2soaG9va0VsKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX01PVU5URUQpfV1gLCAoZWwpID0+IHtcbiAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFsbChwYXJlbnQsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGVsKSA9PiB7XG4gICAgICBpZiAodGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgICAgY2FsbGJhY2soZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gaW4gY2FzZSBvZiByZWpvaW5zLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IHBlcmZvcm0gYWxsXG4gICAgLy8gcGVuZGluZyBvcHNcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nSm9pbk9wcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChjYikgPT4gdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIgJiYgY2IoKSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hdHRhY2hUcnVlRG9jRWwoKTtcbiAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBzdHJlYW1zLCBudWxsKTtcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpO1xuICAgIHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKTtcbiAgICB0aGlzLmV4ZWNOZXdNb3VudGVkKCk7XG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKCk7XG5cbiAgICBpZiAobGl2ZV9wYXRjaCkge1xuICAgICAgY29uc3QgeyBraW5kLCB0byB9ID0gbGl2ZV9wYXRjaDtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKTtcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpO1xuICAgIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjaygpO1xuICB9XG5cbiAgdHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSk7XG4gICAgY29uc3QgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpO1xuICAgIGNvbnN0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSk7XG4gICAgaWYgKFxuICAgICAgaG9vayAmJlxuICAgICAgIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKSAmJlxuICAgICAgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSlcbiAgICApIHtcbiAgICAgIGhvb2suX19iZWZvcmVVcGRhdGUoKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH1cbiAgfVxuXG4gIG1heWJlTW91bnRlZChlbCkge1xuICAgIGNvbnN0IHBoeE1vdW50ZWQgPSBlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9NT1VOVEVEKSk7XG4gICAgY29uc3QgaGFzQmVlbkludm9rZWQgPSBwaHhNb3VudGVkICYmIERPTS5wcml2YXRlKGVsLCBcIm1vdW50ZWRcIik7XG4gICAgaWYgKHBoeE1vdW50ZWQgJiYgIWhhc0JlZW5JbnZva2VkKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBwaHhNb3VudGVkKTtcbiAgICAgIERPTS5wdXRQcml2YXRlKGVsLCBcIm1vdW50ZWRcIiwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWF5YmVBZGROZXdIb29rKGVsKSB7XG4gICAgY29uc3QgbmV3SG9vayA9IHRoaXMuYWRkSG9vayhlbCk7XG4gICAgaWYgKG5ld0hvb2spIHtcbiAgICAgIG5ld0hvb2suX19tb3VudGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMsIGlzSm9pblBhdGNoID0gZmFsc2UpIHtcbiAgICBjb25zdCByZW1vdmVkRWxzID0gW107XG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZTtcbiAgICBjb25zdCB1cGRhdGVkSG9va0lkcyA9IG5ldyBTZXQoKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaFN0YXJ0XCIsIFtwYXRjaC50YXJnZXRDb250YWluZXJdKTtcblxuICAgIHBhdGNoLmFmdGVyKFwiYWRkZWRcIiwgKGVsKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uTm9kZUFkZGVkXCIsIFtlbF0pO1xuICAgICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSB0aGlzLmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgICBjb25zdCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICAgIERPTS5tYWludGFpblByaXZhdGVIb29rcyhlbCwgZWwsIHBoeFZpZXdwb3J0VG9wLCBwaHhWaWV3cG9ydEJvdHRvbSk7XG4gICAgICB0aGlzLm1heWJlQWRkTmV3SG9vayhlbCk7XG4gICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGlmIChET00uaXNQaHhTdGlja3koZWwpKSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5qb2luUm9vdFZpZXdzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmJlZm9yZShcInVwZGF0ZWRcIiwgKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IHRoaXMudHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIHVwZGF0ZWRIb29rSWRzLmFkZChmcm9tRWwuaWQpO1xuICAgICAgfVxuICAgICAgLy8gdHJpZ2dlciBKUyBzcGVjaWZpYyB1cGRhdGUgbG9naWMgKGZvciBleGFtcGxlIGZvciBKUy5pZ25vcmVfYXR0cmlidXRlcylcbiAgICAgIEpTLm9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCk7XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSkge1xuICAgICAgICB0aGlzLmdldEhvb2soZWwpLl9fdXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGF0Y2guYWZ0ZXIoXCJkaXNjYXJkZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHJlbW92ZWRFbHMucHVzaChlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIChlbHMpID0+XG4gICAgICB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKGVscywgcHJ1bmVDaWRzKSxcbiAgICApO1xuICAgIHBhdGNoLnBlcmZvcm0oaXNKb2luUGF0Y2gpO1xuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaEVuZFwiLCBbcGF0Y2gudGFyZ2V0Q29udGFpbmVyXSk7XG4gICAgcmV0dXJuIHBoeENoaWxkcmVuQWRkZWQ7XG4gIH1cblxuICBhZnRlckVsZW1lbnRzUmVtb3ZlZChlbGVtZW50cywgcHJ1bmVDaWRzKSB7XG4gICAgY29uc3QgZGVzdHJveWVkQ0lEcyA9IFtdO1xuICAgIGVsZW1lbnRzLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3RoaXMuaWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rcyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LWhvb2tdYCxcbiAgICAgICk7XG4gICAgICBjb21wb25lbnRzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMuY29tcG9uZW50SUQoZWwpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDaWQoY2lkKSAmJlxuICAgICAgICAgIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSAmJlxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfVklFV19SRUYpID09PSB0aGlzLmlkXG4gICAgICAgICkge1xuICAgICAgICAgIGRlc3Ryb3llZENJRHMucHVzaChjaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhvb2tzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGhvb2tFbCkgPT4ge1xuICAgICAgICBjb25zdCBob29rID0gdGhpcy5nZXRIb29rKGhvb2tFbCk7XG4gICAgICAgIGhvb2sgJiYgdGhpcy5kZXN0cm95SG9vayhob29rKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFdlIHNob3VsZCBub3QgcHJ1bmVDaWRzIG9uIGpvaW5zLiBPdGhlcndpc2UsIGluIGNhc2Ugb2ZcbiAgICAvLyByZWpvaW5zLCB3ZSBtYXkgbm90aWZ5IGNpZHMgdGhhdCBubyBsb25nZXIgYmVsb25nIHRvIHRoZVxuICAgIC8vIGN1cnJlbnQgTGl2ZVZpZXcgdG8gYmUgcmVtb3ZlZC5cbiAgICBpZiAocHJ1bmVDaWRzKSB7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyk7XG4gICAgfVxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCkge1xuICAgIERPTS5maW5kUGh4Q2hpbGRyZW4oZG9jdW1lbnQsIHRoaXMuaWQpLmZvckVhY2goKGVsKSA9PiB0aGlzLmpvaW5DaGlsZChlbCkpO1xuICB9XG5cbiAgbWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIik7XG4gICAgY29uc3Qgb2xkRm9ybXMgPSB0aGlzLnJvb3QuZm9ybXNGb3JSZWNvdmVyeTtcbiAgICAvLyBTbyB3aHkgZG8gd2UgY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBoZXJlP1xuICAgIC8vIE9uZSB3YXkgdG8gcmVjb3ZlciBmb3JtcyB3b3VsZCBiZSB0byBpbW1lZGlhdGVseSBhcHBseSB0aGUgbW91bnRcbiAgICAvLyBwYXRjaCBhbmQgdGhlbiBhZnRlcndhcmRzIHJlY292ZXIgdGhlIGZvcm1zLiBIb3dldmVyLCB0aGlzIHdvdWxkXG4gICAgLy8gY2F1c2UgYSBmbGlja2VyLCBiZWNhdXNlIHRoZSBtb3VudCBwYXRjaCB3b3VsZCByZW1vdmUgdGhlIGZvcm0gY29udGVudFxuICAgIC8vIHVudGlsIGl0IGlzIHJlc3RvcmVkLiBUaGVyZWZvcmUgTFYgZGVjaWRlZCB0byBkbyBmb3JtIHJlY292ZXJ5IHdpdGggdGhlXG4gICAgLy8gcmF3IEhUTUwgYmVmb3JlIGl0IGlzIGFwcGxpZWQgYW5kIGRlbGF5IHRoZSBtb3VudCBwYXRjaCB1bnRpbCB0aGUgZm9ybVxuICAgIC8vIHJlY292ZXJ5IGV2ZW50cyBhcmUgZG9uZS5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIDwucG9ydGFsPiBoZXJlIGFuZCB0ZWxlcG9ydCBpdCBpbnRvIG91ciB0ZW1wb3JhcnkgRE9NIGZvciByZWNvdmVyeVxuICAgIC8vIGFzIHdlJ2Qgb3RoZXJ3aXNlIG5vdCBmaW5kIHRlbGVwb3J0ZWQgZm9ybXNcbiAgICBET00uYWxsKHRlbXBsYXRlLmNvbnRlbnQsIGBbJHtQSFhfUE9SVEFMfV1gKS5mb3JFYWNoKChwb3J0YWxUZW1wbGF0ZSkgPT4ge1xuICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5hcHBlbmRDaGlsZChcbiAgICAgICAgcG9ydGFsVGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBiZWNhdXNlIHdlIHdvcmsgd2l0aCBhIHRlbXBsYXRlIGVsZW1lbnQsIHdlIG11c3QgbWFudWFsbHkgY29weSB0aGUgYXR0cmlidXRlc1xuICAgIC8vIG90aGVyd2lzZSB0aGUgb3duZXIgLyB0YXJnZXQgaGVscGVycyBkb24ndCB3b3JrIHByb3Blcmx5XG4gICAgY29uc3Qgcm9vdEVsID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICByb290RWwuaWQgPSB0aGlzLmlkO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfU0VTU0lPTiwgdGhpcy5nZXRTZXNzaW9uKCkpO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgdGhpcy5nZXRTdGF0aWMoKSk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lELCB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmlkIDogbnVsbCk7XG5cbiAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtIGVsZW1lbnRzIGluIHRoZSBuZXcgSFRNTCBmb3IgdGhlIExWXG4gICAgLy8gYW5kIGxvb2sgZm9yIG9sZCBmb3JtcyBpbiB0aGUgYGZvcm1zRm9yUmVjb3ZlcnlgIG9iamVjdDtcbiAgICAvLyB0aGUgZm9ybXNGb3JSZWNvdmVyeSBjYW4gYWxzbyBjb250YWluIGZvcm1zIGZyb20gY2hpbGQgdmlld3NcbiAgICBjb25zdCBmb3Jtc1RvUmVjb3ZlciA9XG4gICAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtcyBpbiB0aGUgbmV3IERPTTsgYmVjYXVzZSB0aGlzIGlzIG9ubHkgdGhlIEhUTUwgZm9yIHRoZSBjdXJyZW50XG4gICAgICAvLyB2aWV3LCB3ZSBjYW4gYmUgc3VyZSB0aGF0IGFsbCBmb3JtcyBhcmUgb3duZWQgYnkgdGhpcyB2aWV3OlxuICAgICAgRE9NLmFsbCh0ZW1wbGF0ZS5jb250ZW50LCBcImZvcm1cIilcbiAgICAgICAgLy8gb25seSByZWNvdmVyIGZvcm1zIHRoYXQgaGF2ZSBhbiBpZCBhbmQgYXJlIGluIHRoZSBvbGQgRE9NXG4gICAgICAgIC5maWx0ZXIoKG5ld0Zvcm0pID0+IG5ld0Zvcm0uaWQgJiYgb2xkRm9ybXNbbmV3Rm9ybS5pZF0pXG4gICAgICAgIC8vIGFiYW5kb24gZm9ybXMgd2UgYWxyZWFkeSB0cmllZCB0byByZWNvdmVyIHRvIHByZXZlbnQgbG9vcGluZyBhIGZhaWxlZCBzdGF0ZVxuICAgICAgICAuZmlsdGVyKChuZXdGb3JtKSA9PiAhdGhpcy5wZW5kaW5nRm9ybXMuaGFzKG5ld0Zvcm0uaWQpKVxuICAgICAgICAvLyBvbmx5IHJlY292ZXIgaWYgdGhlIGZvcm0gaGFzIHRoZSBzYW1lIHBoeC1jaGFuZ2UgdmFsdWVcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobmV3Rm9ybSkgPT5cbiAgICAgICAgICAgIG9sZEZvcm1zW25ld0Zvcm0uaWRdLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpID09PVxuICAgICAgICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChuZXdGb3JtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtvbGRGb3Jtc1tuZXdGb3JtLmlkXSwgbmV3Rm9ybV07XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKGZvcm1zVG9SZWNvdmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZm9ybXNUb1JlY292ZXIuZm9yRWFjaCgoW29sZEZvcm0sIG5ld0Zvcm1dLCBpKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdGb3Jtcy5hZGQobmV3Rm9ybS5pZCk7XG4gICAgICAvLyBpdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBmaXJzdEVsZW1lbnRDaGlsZCBvZiB0aGUgdGVtcGxhdGUgY29udGVudFxuICAgICAgLy8gYmVjYXVzZSB3aGVuIHRyYXZlcnNpbmcgYSBkb2N1bWVudEZyYWdtZW50IHVzaW5nIHBhcmVudE5vZGUsIHdlIHdvbid0IGV2ZXIgYXJyaXZlIGF0XG4gICAgICAvLyB0aGUgZnJhZ21lbnQ7IGFzIHRoZSB0ZW1wbGF0ZSBpcyBhbHdheXMgYSBMaXZlVmlldywgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5XG4gICAgICAvLyBvbmUgY2hpbGQgb24gdGhlIHJvb3QgbGV2ZWxcbiAgICAgIHRoaXMucHVzaEZvcm1SZWNvdmVyeShcbiAgICAgICAgb2xkRm9ybSxcbiAgICAgICAgbmV3Rm9ybSxcbiAgICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0Zvcm1zLmRlbGV0ZShuZXdGb3JtLmlkKTtcbiAgICAgICAgICAvLyB3ZSBvbmx5IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYWxsIGZvcm1zIGhhdmUgYmVlbiByZWNvdmVyZWRcbiAgICAgICAgICBpZiAoaSA9PT0gZm9ybXNUb1JlY292ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF07XG4gIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCkge1xuICAgIGlmIChlbC5pZCA9PT0gdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2VsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKV0/LltlbC5pZF07XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveURlc2NlbmRlbnQoaWQpIHtcbiAgICBmb3IgKGNvbnN0IHBhcmVudElkIGluIHRoaXMucm9vdC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pIHtcbiAgICAgICAgaWYgKGNoaWxkSWQgPT09IGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF1bY2hpbGRJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKSB7XG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZCk7XG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLmxpdmVTb2NrZXQsIHRoaXMpO1xuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlldztcbiAgICAgIHZpZXcuam9pbigpO1xuICAgICAgdGhpcy5jaGlsZEpvaW5zKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpc0pvaW5QZW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmpvaW5QZW5kaW5nO1xuICB9XG5cbiAgYWNrSm9pbihfY2hpbGQpIHtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLTtcblxuICAgIGlmICh0aGlzLmNoaWxkSm9pbnMgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCkge1xuICAgIC8vIHdlIGNhbiBjbGVhciBwZW5kaW5nIGZvcm0gcmVjb3ZlcmllcyBub3cgdGhhdCB3ZSd2ZSBqb2luZWQuXG4gICAgLy8gVGhleSBlaXRoZXIgYWxsIHJlc29sdmVkIG9yIHdlcmUgYWJhbmRvbmVkXG4gICAgdGhpcy5wZW5kaW5nRm9ybXMuY2xlYXIoKTtcbiAgICAvLyB3ZSBjYW4gYWxzbyBjbGVhciB0aGUgZm9ybXNGb3JSZWNvdmVyeSBvYmplY3QgdG8gbm90IGtlZXAgb2xkIGZvcm0gZWxlbWVudHMgYXJvdW5kXG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5qb2luQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICAgIGlmICghdmlldy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICAgb3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW107XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoZGlmZiwgZXZlbnRzLCBpc1BlbmRpbmcgPSBmYWxzZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNKb2luUGVuZGluZygpIHx8XG4gICAgICAodGhpcy5saXZlU29ja2V0Lmhhc1BlbmRpbmdMaW5rKCkgJiYgdGhpcy5yb290LmlzTWFpbigpKVxuICAgICkge1xuICAgICAgLy8gZG9uJ3QgbXV0YXRlIGlmIHRoaXMgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZGlmZlxuICAgICAgaWYgKCFpc1BlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7IGRpZmYsIGV2ZW50cyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihkaWZmKTtcbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlO1xuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZiAodGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudENpZHMgPSBET00uZmluZEV4aXN0aW5nUGFyZW50Q0lEcyhcbiAgICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgIHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSxcbiAgICAgICAgKTtcbiAgICAgICAgcGFyZW50Q2lkcy5mb3JFYWNoKChwYXJlbnRDSUQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFBhdGNoKFxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLmdldENvbXBvbmVudChkaWZmLCBwYXJlbnRDSUQpLFxuICAgICAgICAgICAgICBwYXJlbnRDSUQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaXNFbXB0eShkaWZmKSkge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJmdWxsIHBhdGNoIGNvbXBsZXRlXCIsICgpID0+IHtcbiAgICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIik7XG4gICAgICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIG51bGwpO1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgaWYgKHBoeENoaWxkcmVuQWRkZWQpIHtcbiAgICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW5kZXJDb250YWluZXIoZGlmZiwga2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWcgPSB0aGlzLmVsLnRhZ05hbWU7XG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBjb25zdCBjaWRzID0gZGlmZiA/IHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSA6IG51bGw7XG4gICAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC50b1N0cmluZyhjaWRzKTtcbiAgICAgIHJldHVybiBbYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmAsIHN0cmVhbXNdO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKSB7XG4gICAgaWYgKGlzRW1wdHkoZGlmZikpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC5jb21wb25lbnRUb1N0cmluZyhjaWQpO1xuICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIGNpZCk7XG4gICAgY29uc3QgY2hpbGRyZW5BZGRlZCA9IHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCB0cnVlKTtcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZDtcbiAgfVxuXG4gIGdldEhvb2soZWwpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGVsKV07XG4gIH1cblxuICBhZGRIb29rKGVsKSB7XG4gICAgY29uc3QgaG9va0VsSWQgPSBWaWV3SG9vay5lbGVtZW50SUQoZWwpO1xuXG4gICAgLy8gb25seSBldmVyIHRyeSB0byBhZGQgaG9va3MgdG8gZWxlbWVudHMgb3duZWQgYnkgdGhpcyB2aWV3XG4gICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiAhdGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9va0VsSWQgJiYgIXRoaXMudmlld0hvb2tzW2hvb2tFbElkXSkge1xuICAgICAgLy8gaG9vayBjcmVhdGVkLCBidXQgbm90IGF0dGFjaGVkIChjcmVhdGVIb29rIGZvciB3ZWIgY29tcG9uZW50KVxuICAgICAgY29uc3QgaG9vayA9XG4gICAgICAgIERPTS5nZXRDdXN0b21FbEhvb2soZWwpIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyBob29rIGZvdW5kIGZvciBjdXN0b20gZWxlbWVudDogJHtlbC5pZH1gKTtcbiAgICAgIHRoaXMudmlld0hvb2tzW2hvb2tFbElkXSA9IGhvb2s7XG4gICAgICBob29rLl9fYXR0YWNoVmlldyh0aGlzKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH0gZWxzZSBpZiAoaG9va0VsSWQgfHwgIWVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgLy8gbm8gaG9vayBmb3VuZFxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZXcgaG9vayBmb3VuZCB3aXRoIHBoeC1ob29rIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgaG9va05hbWUgPVxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHxcbiAgICAgICAgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpO1xuXG4gICAgICBpZiAoIWhvb2tOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9va0RlZmluaXRpb24gPSB0aGlzLmxpdmVTb2NrZXQuZ2V0SG9va0RlZmluaXRpb24oaG9va05hbWUpO1xuXG4gICAgICBpZiAoaG9va0RlZmluaXRpb24pIHtcbiAgICAgICAgaWYgKCFlbC5pZCkge1xuICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBob29rSW5zdGFuY2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGhvb2tEZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIGhvb2tEZWZpbml0aW9uLnByb3RvdHlwZSBpbnN0YW5jZW9mIFZpZXdIb29rXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJdCdzIGEgY2xhc3MgY29uc3RydWN0b3IgKHN1YmNsYXNzIG9mIFZpZXdIb29rKVxuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IGhvb2tEZWZpbml0aW9uKHRoaXMsIGVsKTsgLy8gYHRoaXNgIGlzIHRoZSBWaWV3IGluc3RhbmNlXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBob29rRGVmaW5pdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaG9va0RlZmluaXRpb24gIT09IG51bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEl0J3MgYW4gb2JqZWN0IGxpdGVyYWwsIHBhc3MgaXQgdG8gdGhlIFZpZXdIb29rIGNvbnN0cnVjdG9yIGZvciB3cmFwcGluZ1xuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IFZpZXdIb29rKHRoaXMsIGVsLCBob29rRGVmaW5pdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBob29rIGRlZmluaXRpb24gZm9yIFwiJHtob29rTmFtZX1cIi4gRXhwZWN0ZWQgYSBjbGFzcyBleHRlbmRpbmcgVmlld0hvb2sgb3IgYW4gb2JqZWN0IGRlZmluaXRpb24uYCxcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcbiAgICAgICAgICBsb2dFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBob29rIFwiJHtob29rTmFtZX1cIjogJHtlcnJvck1lc3NhZ2V9YCwgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld0hvb2tzW1ZpZXdIb29rLmVsZW1lbnRJRChob29rSW5zdGFuY2UuZWwpXSA9IGhvb2tJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIGhvb2tJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoaG9va05hbWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nRXJyb3IoYHVua25vd24gaG9vayBmb3VuZCBmb3IgXCIke2hvb2tOYW1lfVwiYCwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spIHtcbiAgICAvLyBfX2Rlc3Ryb3llZCBjbGVhcnMgdGhlIGVsZW1lbnRJRCBmcm9tIHRoZSBob29rLCB0aGVyZWZvcmVcbiAgICAvLyB3ZSBuZWVkIHRvIGdldCBpdCBiZWZvcmUgY2FsbGluZyBfX2Rlc3Ryb3llZFxuICAgIGNvbnN0IGhvb2tJZCA9IFZpZXdIb29rLmVsZW1lbnRJRChob29rLmVsKTtcbiAgICBob29rLl9fZGVzdHJveWVkKCk7XG4gICAgaG9vay5fX2NsZWFudXBfXygpO1xuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tob29rSWRdO1xuICB9XG5cbiAgYXBwbHlQZW5kaW5nVXBkYXRlcygpIHtcbiAgICAvLyBUbyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVyZSB3ZSBtaWdodCBzdGlsbCBiZSBwZW5kaW5nIGEgbmV3XG4gICAgLy8gbmF2aWdhdGlvbiBvciB0aGUgam9pbiBpcyBzdGlsbCBwZW5kaW5nLCBgdGhpcy51cGRhdGVgIHJldHVybnMgZmFsc2VcbiAgICAvLyBpZiB0aGUgZGlmZiB3YXMgbm90IGFwcGxpZWQuXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSB0aGlzLnBlbmRpbmdEaWZmcy5maWx0ZXIoXG4gICAgICAoeyBkaWZmLCBldmVudHMgfSkgPT4gIXRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cywgdHJ1ZSksXG4gICAgKTtcbiAgICB0aGlzLmVhY2hDaGlsZCgoY2hpbGQpID0+IGNoaWxkLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSk7XG4gIH1cblxuICBlYWNoQ2hpbGQoY2FsbGJhY2spIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGlkIGluIGNoaWxkcmVuKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLmdldENoaWxkQnlJZChpZCkpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbm5lbChldmVudCwgY2IpIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgZXZlbnQsIChyZXNwKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0pvaW5QZW5kaW5nKCkpIHtcbiAgICAgICAgLy8gaW4gY2FzZSB0aGlzIGlzIGEgcmVqb2luIChqb2luQ291bnQgPiAxKSB3ZSBzdG9yZSBvdXIgb3duIGpvaW4gb3BzXG4gICAgICAgIGlmICh0aGlzLmpvaW5Db3VudCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdKb2luT3BzLnB1c2goKCkgPT4gY2IocmVzcCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiBjYihyZXNwKV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiBjYihyZXNwKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpIHtcbiAgICAvLyBUaGUgZGlmZiBldmVudCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgcmVndWxhciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICAvLyBBbGwgb3RoZXIgb3BlcmF0aW9ucyBhcmUgcXVldWVkIHRvIGJlIGFwcGxpZWQgb25seSBhZnRlciBqb2luLlxuICAgIHRoaXMubGl2ZVNvY2tldC5vbkNoYW5uZWwodGhpcy5jaGFubmVsLCBcImRpZmZcIiwgKHJhd0RpZmYpID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmF3RGlmZiwgKHsgZGlmZiwgZXZlbnRzIH0pID0+XG4gICAgICAgICAgdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMub25DaGFubmVsKFwicmVkaXJlY3RcIiwgKHsgdG8sIGZsYXNoIH0pID0+XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bywgZmxhc2ggfSksXG4gICAgKTtcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSk7XG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpO1xuICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKChyZWFzb24pID0+IHRoaXMub25FcnJvcihyZWFzb24pKTtcbiAgICB0aGlzLmNoYW5uZWwub25DbG9zZSgocmVhc29uKSA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSk7XG4gIH1cblxuICBkZXN0cm95QWxsQ2hpbGRyZW4oKSB7XG4gICAgdGhpcy5lYWNoQ2hpbGQoKGNoaWxkKSA9PiBjaGlsZC5kZXN0cm95KCkpO1xuICB9XG5cbiAgb25MaXZlUmVkaXJlY3QocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kLCBmbGFzaCB9ID0gcmVkaXI7XG4gICAgY29uc3QgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pO1xuICAgIGNvbnN0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6c2VydmVyLW5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyB0bywga2luZCwgZmxhc2ggfSxcbiAgICB9KTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KGUsIHVybCwga2luZCwgZmxhc2gpO1xuICB9XG5cbiAgb25MaXZlUGF0Y2gocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kIH0gPSByZWRpcjtcbiAgICB0aGlzLmhyZWYgPSB0aGlzLmV4cGFuZFVSTCh0byk7XG4gICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlQYXRjaCh0bywga2luZCk7XG4gIH1cblxuICBleHBhbmRVUkwodG8pIHtcbiAgICByZXR1cm4gdG8uc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0ke3RvfWBcbiAgICAgIDogdG87XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7dG86IHN0cmluZywgZmxhc2g/OiBzdHJpbmcsIHJlbG9hZFRva2VuPzogc3RyaW5nfX0gcmVkaXJlY3RcbiAgICovXG4gIG9uUmVkaXJlY3QoeyB0bywgZmxhc2gsIHJlbG9hZFRva2VuIH0pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoLCByZWxvYWRUb2tlbik7XG4gIH1cblxuICBpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cblxuICBqb2luRGVhZCgpIHtcbiAgICB0aGlzLmlzRGVhZCA9IHRydWU7XG4gIH1cblxuICBqb2luUHVzaCgpIHtcbiAgICB0aGlzLmpvaW5QdXNoID0gdGhpcy5qb2luUHVzaCB8fCB0aGlzLmNoYW5uZWwuam9pbigpO1xuICAgIHJldHVybiB0aGlzLmpvaW5QdXNoO1xuICB9XG5cbiAgam9pbihjYWxsYmFjaykge1xuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5iaW5kQ2hhbm5lbCgpO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLnN0b3BDYWxsYmFjayA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe1xuICAgICAgICB0bzogdGhpcy5ocmVmLFxuICAgICAgICBraW5kOiBcImluaXRpYWxcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IChvbkRvbmUpID0+IHtcbiAgICAgIG9uRG9uZSA9IG9uRG9uZSB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2sodGhpcy5qb2luQ291bnQsIG9uRG9uZSkgOiBvbkRvbmUoKTtcbiAgICB9O1xuXG4gICAgdGhpcy53cmFwUHVzaCgoKSA9PiB0aGlzLmNoYW5uZWwuam9pbigpLCB7XG4gICAgICBvazogKHJlc3ApID0+IHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHRoaXMub25Kb2luKHJlc3ApKSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMub25Kb2luRXJyb3IoZXJyb3IpLFxuICAgICAgdGltZW91dDogKCkgPT4gdGhpcy5vbkpvaW5FcnJvcih7IHJlYXNvbjogXCJ0aW1lb3V0XCIgfSksXG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5FcnJvcihyZXNwKSB7XG4gICAgaWYgKHJlc3AucmVhc29uID09PSBcInJlbG9hZFwiKSB7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcbiAgICAgICAgYGZhaWxlZCBtb3VudCB3aXRoICR7cmVzcC5zdGF0dXN9LiBGYWxsaW5nIGJhY2sgdG8gcGFnZSByZWxvYWRgLFxuICAgICAgICByZXNwLFxuICAgICAgXSk7XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bzogdGhpcy5yb290LmhyZWYsIHJlbG9hZFRva2VuOiByZXNwLnRva2VuIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocmVzcC5yZWFzb24gPT09IFwidW5hdXRob3JpemVkXCIgfHwgcmVzcC5yZWFzb24gPT09IFwic3RhbGVcIikge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgIFwidW5hdXRob3JpemVkIGxpdmVfcmVkaXJlY3QuIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlcXVlc3RcIixcbiAgICAgICAgcmVzcCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5vblJlZGlyZWN0KHsgdG86IHRoaXMucm9vdC5ocmVmLCBmbGFzaDogdGhpcy5mbGFzaCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QgfHwgcmVzcC5saXZlX3JlZGlyZWN0KSB7XG4gICAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNoYW5uZWwubGVhdmUoKTtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgfVxuICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hYmxlIHRvIGpvaW5cIiwgcmVzcF0pO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NdLFxuICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5saXZlU29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmpvaW5BdHRlbXB0cyA+PSBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUykge1xuICAgICAgICAvLyBwdXQgdGhlIHJvb3QgcmV2aWV3IGludG8gcGVybWFuZW50IGVycm9yIHN0YXRlLCBidXQgZG9uJ3QgZGVzdHJveSBpdCBhcyBpdCBjYW4gcmVtYWluIGFjdGl2ZVxuICAgICAgICB0aGlzLnJvb3QuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgICAgYGdpdmluZyB1cCB0cnlpbmcgdG8gbW91bnQgYWZ0ZXIgJHtNQVhfQ0hJTERfSk9JTl9BVFRFTVBUU30gdHJpZXNgLFxuICAgICAgICAgIHJlc3AsXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRydWVDaGlsZEVsID0gRE9NLmJ5SWQodGhpcy5lbC5pZCk7XG4gICAgICBpZiAodHJ1ZUNoaWxkRWwpIHtcbiAgICAgICAgRE9NLm1lcmdlQXR0cnModHJ1ZUNoaWxkRWwsIHRoaXMuZWwpO1xuICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgICBbUEhYX0xPQURJTkdfQ0xBU1MsIFBIWF9FUlJPUl9DTEFTUywgUEhYX1NFUlZFUl9FUlJPUl9DTEFTU10sXG4gICAgICAgICAgeyB1bnN0cnVjdHVyZWRFcnJvcjogcmVzcCwgZXJyb3JLaW5kOiBcInNlcnZlclwiIH0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWwgPSB0cnVlQ2hpbGRFbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTWFpbigpICYmXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJlxuICAgICAgcmVhc29uICE9PSBcImxlYXZlXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuZHJvcEFjdGl2ZUVsZW1lbnQodGhpcyk7XG4gICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpIHtcbiAgICAgIHRoaXMuc2hvd0xvYWRlcihCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUKTtcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlYXNvbikge1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pO1xuICAgIGlmICh0aGlzLmxpdmVTb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSkge1xuICAgICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZWFzb24sIGVycm9yS2luZDogXCJzZXJ2ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9DTElFTlRfRVJST1JfQ0xBU1NdLFxuICAgICAgICAgIHsgdW5zdHJ1Y3R1cmVkRXJyb3I6IHJlYXNvbiwgZXJyb3JLaW5kOiBcImNsaWVudFwiIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheUVycm9yKGNsYXNzZXMsIGRldGFpbHMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7XG4gICAgICAgIGRldGFpbDogeyB0bzogdGhpcy5ocmVmLCBraW5kOiBcImVycm9yXCIsIC4uLmRldGFpbHMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNob3dMb2FkZXIoKTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyk7XG4gICAgdGhpcy5kZWxheWVkRGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBkZWxheWVkRGlzY29ubmVjdGVkKCkge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJkaXNjb25uZWN0ZWRcIikpO1xuICAgIH0sIHRoaXMubGl2ZVNvY2tldC5kaXNjb25uZWN0ZWRUaW1lb3V0KTtcbiAgfVxuXG4gIHdyYXBQdXNoKGNhbGxlclB1c2gsIHJlY2VpdmVzKSB7XG4gICAgY29uc3QgbGF0ZW5jeSA9IHRoaXMubGl2ZVNvY2tldC5nZXRMYXRlbmN5U2ltKCk7XG4gICAgY29uc3Qgd2l0aExhdGVuY3kgPSBsYXRlbmN5XG4gICAgICA/IChjYikgPT4gc2V0VGltZW91dCgoKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIGNiKCksIGxhdGVuY3kpXG4gICAgICA6IChjYikgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiBjYigpO1xuXG4gICAgd2l0aExhdGVuY3koKCkgPT4ge1xuICAgICAgY2FsbGVyUHVzaCgpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgKHJlc3ApID0+XG4gICAgICAgICAgd2l0aExhdGVuY3koKCkgPT4gcmVjZWl2ZXMub2sgJiYgcmVjZWl2ZXMub2socmVzcCkpLFxuICAgICAgICApXG4gICAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgKHJlYXNvbikgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy5lcnJvciAmJiByZWNlaXZlcy5lcnJvcihyZWFzb24pKSxcbiAgICAgICAgKVxuICAgICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy50aW1lb3V0ICYmIHJlY2VpdmVzLnRpbWVvdXQoKSksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5vIGNvbm5lY3Rpb25cIikpO1xuICAgIH1cblxuICAgIGNvbnN0IFtyZWYsIFtlbF0sIG9wdHNdID0gcmVmR2VuZXJhdG9yXG4gICAgICA/IHJlZkdlbmVyYXRvcih7IHBheWxvYWQgfSlcbiAgICAgIDogW251bGwsIFtdLCB7fV07XG4gICAgY29uc3Qgb2xkSm9pbkNvdW50ID0gdGhpcy5qb2luQ291bnQ7XG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBpZiAob3B0cy5wYWdlX2xvYWRpbmcpIHtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtcbiAgICAgICAga2luZDogXCJlbGVtZW50XCIsXG4gICAgICAgIHRhcmdldDogZWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQuY2lkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICBkZWxldGUgcGF5bG9hZC5jaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMud3JhcFB1c2goKCkgPT4gdGhpcy5jaGFubmVsLnB1c2goZXZlbnQsIHBheWxvYWQsIFBVU0hfVElNRU9VVCksIHtcbiAgICAgICAgb2s6IChyZXNwKSA9PiB7XG4gICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNrUmVmID0gcmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaW5pc2ggPSAoaG9va1JlcGx5KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcC5yZWRpcmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcC5saXZlX3BhdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Mb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHJlc3A6IHJlc3AsIHJlcGx5OiBob29rUmVwbHksIHJlZiB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZXNwLmRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmVzcC5kaWZmLCAoeyBkaWZmLCByZXBseSwgZXZlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZmluaXNoKHJlcGx5KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5pc2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKHJlYXNvbikgPT5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBmYWlsZWQgd2l0aCByZWFzb246ICR7SlNPTi5zdHJpbmdpZnkocmVhc29uKX1gKSksXG4gICAgICAgIHRpbWVvdXQ6ICgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidGltZW91dFwiKSk7XG4gICAgICAgICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSBvbGRKb2luQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2coXCJ0aW1lb3V0XCIsICgpID0+IFtcbiAgICAgICAgICAgICAgICBcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIixcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuZG9SZWZzKHJlZiwgcGh4RXZlbnQsIG9ubHlFbHMpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZXhpdCBpZiBleHRlcm5hbCBmb3JtIHRyaWdnZXJlZFxuICAgIGNvbnN0IHNlbGVjdG9yID0gYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gO1xuXG4gICAgaWYgKG9ubHlFbHMpIHtcbiAgICAgIG9ubHlFbHMgPSBuZXcgU2V0KG9ubHlFbHMpO1xuICAgICAgRE9NLmFsbChkb2N1bWVudCwgc2VsZWN0b3IsIChwYXJlbnQpID0+IHtcbiAgICAgICAgaWYgKG9ubHlFbHMgJiYgIW9ubHlFbHMuaGFzKHBhcmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5kbyBhbnkgY2hpbGQgcmVmcyB3aXRoaW4gcGFyZW50IGZpcnN0XG4gICAgICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGNoaWxkKSA9PlxuICAgICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51bmRvRWxSZWYocGFyZW50LCByZWYsIHBoeEV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBET00uYWxsKGRvY3VtZW50LCBzZWxlY3RvciwgKGVsKSA9PiB0aGlzLnVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGVsUmVmID0gbmV3IEVsZW1lbnRSZWYoZWwpO1xuXG4gICAgZWxSZWYubWF5YmVVbmRvKHJlZiwgcGh4RXZlbnQsIChjbG9uZWRUcmVlKSA9PiB7XG4gICAgICAvLyB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBmdWxsIHBhdGNoIG9uIHVubG9ja2VkIGVsZW1lbnRzXG4gICAgICAvLyB0byBwZXJmb3JtIGFsbCB0aGUgbmVjZXNzYXJ5IGxvZ2ljIChsaWtlIGNhbGxpbmcgdXBkYXRlZCBmb3IgaG9va3MsIGV0Yy4pXG4gICAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCBlbCwgdGhpcy5pZCwgY2xvbmVkVHJlZSwgW10sIG51bGwsIHtcbiAgICAgICAgdW5kb1JlZjogcmVmLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgRE9NLmFsbChlbCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gLCAoY2hpbGQpID0+XG4gICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICk7XG4gICAgICBpZiAocGh4Q2hpbGRyZW5BZGRlZCkge1xuICAgICAgICB0aGlzLmpvaW5OZXdDaGlsZHJlbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVmU3JjKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmlkO1xuICB9XG5cbiAgcHV0UmVmKGVsZW1lbnRzLCBwaHhFdmVudCwgZXZlbnRUeXBlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBuZXdSZWYgPSB0aGlzLnJlZisrO1xuICAgIGNvbnN0IGRpc2FibGVXaXRoID0gdGhpcy5iaW5kaW5nKFBIWF9ESVNBQkxFX1dJVEgpO1xuICAgIGlmIChvcHRzLmxvYWRpbmcpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdFbHMgPSBET00uYWxsKGRvY3VtZW50LCBvcHRzLmxvYWRpbmcpLm1hcCgoZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZWwsIGxvY2s6IHRydWUsIGxvYWRpbmc6IHRydWUgfTtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudHMgPSBlbGVtZW50cy5jb25jYXQobG9hZGluZ0Vscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGVsLCBsb2NrLCBsb2FkaW5nIH0gb2YgZWxlbWVudHMpIHtcbiAgICAgIGlmICghbG9jayAmJiAhbG9hZGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwdXRSZWYgcmVxdWlyZXMgbG9jayBvciBsb2FkaW5nXCIpO1xuICAgICAgfVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQURJTkcsIG5ld1JlZik7XG4gICAgICB9XG4gICAgICBpZiAobG9jaykge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLLCBuZXdSZWYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICFsb2FkaW5nIHx8XG4gICAgICAgIChvcHRzLnN1Ym1pdHRlciAmJiAhKGVsID09PSBvcHRzLnN1Ym1pdHRlciB8fCBlbCA9PT0gb3B0cy5mb3JtKSlcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9ja0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoYHBoeDp1bmRvLWxvY2s6JHtuZXdSZWZ9YCwgKCkgPT4gcmVzb2x2ZShkZXRhaWwpLCB7XG4gICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGluZ0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgYHBoeDp1bmRvLWxvYWRpbmc6JHtuZXdSZWZ9YCxcbiAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgZWwuY2xhc3NMaXN0LmFkZChgcGh4LSR7ZXZlbnRUeXBlfS1sb2FkaW5nYCk7XG4gICAgICBjb25zdCBkaXNhYmxlVGV4dCA9IGVsLmdldEF0dHJpYnV0ZShkaXNhYmxlV2l0aCk7XG4gICAgICBpZiAoZGlzYWJsZVRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVUZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUEhYX0RJU0FCTEVEIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBpbiBkaXNhYmxlRm9ybVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgUEhYX0RJU0FCTEVELFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpIHx8IGVsLmRpc2FibGVkLFxuICAgICAgICApO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGV0YWlsID0ge1xuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICByZWY6IG5ld1JlZixcbiAgICAgICAgaXNMb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBpc0xvY2tlZDogbG9jayxcbiAgICAgICAgbG9ja0VsZW1lbnRzOiBlbGVtZW50cy5maWx0ZXIoKHsgbG9jayB9KSA9PiBsb2NrKS5tYXAoKHsgZWwgfSkgPT4gZWwpLFxuICAgICAgICBsb2FkaW5nRWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgICAgLmZpbHRlcigoeyBsb2FkaW5nIH0pID0+IGxvYWRpbmcpXG4gICAgICAgICAgLm1hcCgoeyBlbCB9KSA9PiBlbCksXG4gICAgICAgIHVubG9jazogKGVscykgPT4ge1xuICAgICAgICAgIGVscyA9IEFycmF5LmlzQXJyYXkoZWxzKSA/IGVscyA6IFtlbHNdO1xuICAgICAgICAgIHRoaXMudW5kb1JlZnMobmV3UmVmLCBwaHhFdmVudCwgZWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9ja0NvbXBsZXRlOiBsb2NrQ29tcGxldGVQcm9taXNlLFxuICAgICAgICBsb2FkaW5nQ29tcGxldGU6IGxvYWRpbmdDb21wbGV0ZVByb21pc2UsXG4gICAgICAgIGxvY2s6IChsb2NrRWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWNrZWQobmV3UmVmKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZXRhaWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9ja0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0ssIG5ld1JlZik7XG4gICAgICAgICAgICBsb2NrRWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgICAgICAgIGxvY2tFbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBgcGh4OmxvY2stc3RvcDoke25ld1JlZn1gLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0cy5wYXlsb2FkKSB7XG4gICAgICAgIGRldGFpbFtcInBheWxvYWRcIl0gPSBvcHRzLnBheWxvYWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy50YXJnZXQpIHtcbiAgICAgICAgZGV0YWlsW1widGFyZ2V0XCJdID0gb3B0cy50YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgIGRldGFpbFtcIm9yaWdpbmFsRXZlbnRcIl0gPSBvcHRzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB9XG4gICAgICBlbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6cHVzaFwiLCB7XG4gICAgICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKHBoeEV2ZW50KSB7XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6cHVzaDoke3BoeEV2ZW50fWAsIHtcbiAgICAgICAgICAgIGRldGFpbDogZGV0YWlsLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25ld1JlZiwgZWxlbWVudHMubWFwKCh7IGVsIH0pID0+IGVsKSwgb3B0c107XG4gIH1cblxuICBpc0Fja2VkKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY2tSZWYgIT09IG51bGwgJiYgdGhpcy5sYXN0QWNrUmVmID49IHJlZjtcbiAgfVxuXG4gIGNvbXBvbmVudElEKGVsKSB7XG4gICAgY29uc3QgY2lkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKTtcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGw7XG4gIH1cblxuICB0YXJnZXRDb21wb25lbnRJRCh0YXJnZXQsIHRhcmdldEN0eCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRDdHg7XG4gICAgfVxuXG4gICAgY29uc3QgY2lkT3JTZWxlY3RvciA9XG4gICAgICBvcHRzLnRhcmdldCB8fCB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSk7XG4gICAgaWYgKGlzQ2lkKGNpZE9yU2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY2lkT3JTZWxlY3Rvcik7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRDdHggJiYgKGNpZE9yU2VsZWN0b3IgIT09IG51bGwgfHwgb3B0cy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eCkge1xuICAgIGlmIChpc0NpZCh0YXJnZXRDdHgpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Q3R4O1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0Q3R4KSB7XG4gICAgICByZXR1cm4gbWF5YmUoXG4gICAgICAgIHRhcmdldEN0eC5jbG9zZXN0KGBbJHtQSFhfQ09NUE9ORU5UfV1gKSxcbiAgICAgICAgKGVsKSA9PiB0aGlzLm93bnNFbGVtZW50KGVsKSAmJiB0aGlzLmNvbXBvbmVudElEKGVsKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQoZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJob29rXCIsICgpID0+IFtcbiAgICAgICAgXCJ1bmFibGUgdG8gcHVzaCBob29rIGV2ZW50LiBMaXZlVmlldyBub3QgY29ubmVjdGVkXCIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcInVuYWJsZSB0byBwdXNoIGhvb2sgZXZlbnQuIExpdmVWaWV3IG5vdCBjb25uZWN0ZWRcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZkdlbmVyYXRvciA9ICgpID0+XG4gICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgZXZlbnQsIFwiaG9va1wiLCB7XG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0Q3R4LFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiBcImhvb2tcIixcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIHZhbHVlOiBwYXlsb2FkLFxuICAgICAgY2lkOiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpLFxuICAgIH0pLnRoZW4oKHsgcmVzcDogX3Jlc3AsIHJlcGx5LCByZWYgfSkgPT4gKHsgcmVwbHksIHJlZiB9KSk7XG4gIH1cblxuICBleHRyYWN0TWV0YShlbCwgbWV0YSwgdmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLmJpbmRpbmcoXCJ2YWx1ZS1cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgbWV0YSA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IGVsLmF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBtZXRhW25hbWUucmVwbGFjZShwcmVmaXgsIFwiXCIpXSA9IGVsLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShlbCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcbiAgICAgIGlmICghbWV0YSkge1xuICAgICAgICBtZXRhID0ge307XG4gICAgICB9XG4gICAgICBtZXRhLnZhbHVlID0gZWwudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmXG4gICAgICAgIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwICYmXG4gICAgICAgICFlbC5jaGVja2VkXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIG1ldGEudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgIG1ldGEgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIG1ldGFba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXRhO1xuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhLCBvcHRzID0ge30sIG9uUmVwbHkpIHtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoXG4gICAgICAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgcGh4RXZlbnQsIHR5cGUsIHtcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgIHBheWxvYWQ6IG1heWJlUGF5bG9hZD8ucGF5bG9hZCxcbiAgICAgICAgfSksXG4gICAgICBcImV2ZW50XCIsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IHRoaXMuZXh0cmFjdE1ldGEoZWwsIG1ldGEsIG9wdHMudmFsdWUpLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZWwsIHRhcmdldEN0eCwgb3B0cyksXG4gICAgICB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IHJlcGx5IH0pID0+IG9uUmVwbHkgJiYgb25SZXBseShyZXBseSkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICBwdXNoRmlsZVByb2dyZXNzKGZpbGVFbCwgZW50cnlSZWYsIHByb2dyZXNzLCBvblJlcGx5ID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGZpbGVFbC5mb3JtLCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICB2aWV3XG4gICAgICAgIC5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICAgIGV2ZW50OiBmaWxlRWwuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhQSFhfUFJPR1JFU1MpKSxcbiAgICAgICAgICByZWY6IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgICAgIGNpZDogdmlldy50YXJnZXRDb21wb25lbnRJRChmaWxlRWwuZm9ybSwgdGFyZ2V0Q3R4KSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gb25SZXBseSgpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGZpbGUgcHJvZ3Jlc3NcIiwgZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hJbnB1dChpbnB1dEVsLCB0YXJnZXRDdHgsIGZvcmNlQ2lkLCBwaHhFdmVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlucHV0RWwuZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybSBldmVudHMgcmVxdWlyZSB0aGUgaW5wdXQgdG8gYmUgaW5zaWRlIGEgZm9ybVwiKTtcbiAgICB9XG5cbiAgICBsZXQgdXBsb2FkcztcbiAgICBjb25zdCBjaWQgPSBpc0NpZChmb3JjZUNpZClcbiAgICAgID8gZm9yY2VDaWRcbiAgICAgIDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCwgb3B0cyk7XG4gICAgY29uc3QgcmVmR2VuZXJhdG9yID0gKG1heWJlUGF5bG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFxuICAgICAgICBbXG4gICAgICAgICAgeyBlbDogaW5wdXRFbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICAgIHsgZWw6IGlucHV0RWwuZm9ybSwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgeyAuLi5vcHRzLCBwYXlsb2FkOiBtYXliZVBheWxvYWQ/LnBheWxvYWQgfSxcbiAgICAgICk7XG4gICAgfTtcbiAgICBsZXQgZm9ybURhdGE7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoaW5wdXRFbC5mb3JtLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplT3B0cyA9IHt9O1xuICAgIGlmIChpbnB1dEVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIHNlcmlhbGl6ZU9wdHMuc3VibWl0dGVyID0gaW5wdXRFbDtcbiAgICB9XG4gICAgaWYgKGlucHV0RWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSkpIHtcbiAgICAgIGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShpbnB1dEVsLmZvcm0sIHNlcmlhbGl6ZU9wdHMsIFtpbnB1dEVsLm5hbWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwgc2VyaWFsaXplT3B0cyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmXG4gICAgICBpbnB1dEVsLmZpbGVzICYmXG4gICAgICBpbnB1dEVsLmZpbGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpO1xuICAgIH1cbiAgICB1cGxvYWRzID0gTGl2ZVVwbG9hZGVyLnNlcmlhbGl6ZVVwbG9hZHMoaW5wdXRFbCk7XG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgbWV0YToge1xuICAgICAgICAvLyBubyB0YXJnZXQgd2FzIGltcGxpY2l0bHkgc2VudCBhcyBcInVuZGVmaW5lZFwiIGluIExWIDw9IDEuMC41LCB0aGVyZWZvcmVcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBrZWVwIGl0LiBJbiAxLjAuNiB3ZSBzd2l0Y2hlZCBmcm9tIHBhc3NpbmcgbWV0YSBhcyBVUkwgZW5jb2RlZCBkYXRhXG4gICAgICAgIC8vIHRvIHBhc3NpbmcgaXQgZGlyZWN0bHkgaW4gdGhlIGV2ZW50LCBidXQgdGhlIEpTT04gZW5jb2RlIHdvdWxkIGRyb3Aga2V5cyB3aXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgICAgIF90YXJnZXQ6IG9wdHMuX3RhcmdldCB8fCBcInVuZGVmaW5lZFwiLFxuICAgICAgICAuLi5tZXRhLFxuICAgICAgfSxcbiAgICAgIHVwbG9hZHM6IHVwbG9hZHMsXG4gICAgICBjaWQ6IGNpZCxcbiAgICB9O1xuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQpXG4gICAgICAudGhlbigoeyByZXNwIH0pID0+IHtcbiAgICAgICAgaWYgKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCkpIHtcbiAgICAgICAgICAvLyB0aGUgZWxlbWVudCBjb3VsZCBiZSBpbnNpZGUgYSBsb2NrZWQgcGFyZW50IGZvciBvdGhlciB1bnJlbGF0ZWQgY2hhbmdlcztcbiAgICAgICAgICAvLyB3ZSBjYW4gb25seSBzdGFydCB1cGxvYWRzIHdoZW4gdGhlIHRyZWUgaXMgdW5sb2NrZWQgYW5kIHRoZVxuICAgICAgICAgIC8vIG5lY2Vzc2FyeSBkYXRhIGF0dHJpYnV0ZXMgYXJlIHNldCBpbiB0aGUgcmVhbCBET01cbiAgICAgICAgICBFbGVtZW50UmVmLm9uVW5sb2NrKGlucHV0RWwsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICAgICAgICAgIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCwgW2lucHV0RWwuZm9ybV0pO1xuICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKFxuICAgICAgICAgICAgICAgIGlucHV0RWwuZm9ybSxcbiAgICAgICAgICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgICAgICAgICB0YXJnZXRDdHgsXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIGNpZCxcbiAgICAgICAgICAgICAgICAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQXdhaXRpbmdTdWJtaXQoaW5wdXRFbC5mb3JtLCBwaHhFdmVudCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGlucHV0IGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICB0cmlnZ2VyQXdhaXRpbmdTdWJtaXQoZm9ybUVsLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKTtcbiAgICBpZiAoYXdhaXRpbmdTdWJtaXQpIHtcbiAgICAgIGNvbnN0IFtfZWwsIF9yZWYsIF9vcHRzLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdDtcbiAgICAgIHRoaXMuY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pdHMuZmluZCgoW2VsLCBfcmVmLCBfb3B0cywgX2NhbGxiYWNrXSkgPT5cbiAgICAgIGVsLmlzU2FtZU5vZGUoZm9ybUVsKSxcbiAgICApO1xuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmZvcm1TdWJtaXRzLnB1c2goW2Zvcm1FbCwgcmVmLCBvcHRzLCBjYWxsYmFja10pO1xuICB9XG5cbiAgY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gdGhpcy5mb3JtU3VibWl0cy5maWx0ZXIoXG4gICAgICAoW2VsLCByZWYsIF9vcHRzLCBfY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgIGlmIChlbC5pc1NhbWVOb2RlKGZvcm1FbCkpIHtcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZGlzYWJsZUZvcm0oZm9ybUVsLCBwaHhFdmVudCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZmlsdGVySWdub3JlZCA9IChlbCkgPT4ge1xuICAgICAgY29uc3QgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhcbiAgICAgICAgZWwsXG4gICAgICAgIGAke3RoaXMuYmluZGluZyhQSFhfVVBEQVRFKX09aWdub3JlYCxcbiAgICAgICAgZWwuZm9ybSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgdXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKVxuICAgICAgKTtcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlckRpc2FibGVzID0gKGVsKSA9PiB7XG4gICAgICByZXR1cm4gZWwuaGFzQXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKSk7XG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJCdXR0b24gPSAoZWwpID0+IGVsLnRhZ05hbWUgPT0gXCJCVVRUT05cIjtcblxuICAgIGNvbnN0IGZpbHRlcklucHV0ID0gKGVsKSA9PlxuICAgICAgW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiLCBcIlNFTEVDVFwiXS5pbmNsdWRlcyhlbC50YWdOYW1lKTtcblxuICAgIGNvbnN0IGZvcm1FbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsLmVsZW1lbnRzKTtcbiAgICBjb25zdCBkaXNhYmxlcyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyRGlzYWJsZXMpO1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpO1xuICAgIGNvbnN0IGlucHV0cyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVySW5wdXQpLmZpbHRlcihmaWx0ZXJJZ25vcmVkKTtcblxuICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKTtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSk7XG4gICAgICBpbnB1dC5yZWFkT25seSA9IHRydWU7XG4gICAgICBpZiAoaW5wdXQuZmlsZXMpIHtcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgaW5wdXQuZGlzYWJsZWQpO1xuICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZm9ybUVscyA9IGRpc2FibGVzXG4gICAgICAuY29uY2F0KGJ1dHRvbnMpXG4gICAgICAuY29uY2F0KGlucHV0cylcbiAgICAgIC5tYXAoKGVsKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGVsLCBsb2FkaW5nOiB0cnVlLCBsb2NrOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgIC8vIHdlIHJldmVyc2UgdGhlIG9yZGVyIHNvIGZvcm0gY2hpbGRyZW4gYXJlIGFscmVhZHkgbG9ja2VkIGJ5IHRoZSB0aW1lXG4gICAgLy8gdGhlIGZvcm0gaXMgbG9ja2VkXG4gICAgY29uc3QgZWxzID0gW3sgZWw6IGZvcm1FbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogZmFsc2UgfV1cbiAgICAgIC5jb25jYXQoZm9ybUVscylcbiAgICAgIC5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHRoaXMucHV0UmVmKGVscywgcGh4RXZlbnQsIFwic3VibWl0XCIsIG9wdHMpO1xuICB9XG5cbiAgcHVzaEZvcm1TdWJtaXQoZm9ybUVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBzdWJtaXR0ZXIsIG9wdHMsIG9uUmVwbHkpIHtcbiAgICBjb25zdCByZWZHZW5lcmF0b3IgPSAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgdGhpcy5kaXNhYmxlRm9ybShmb3JtRWwsIHBoeEV2ZW50LCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGZvcm06IGZvcm1FbCxcbiAgICAgICAgcGF5bG9hZDogbWF5YmVQYXlsb2FkPy5wYXlsb2FkLFxuICAgICAgICBzdWJtaXR0ZXI6IHN1Ym1pdHRlcixcbiAgICAgIH0pO1xuICAgIC8vIHN0b3JlIHRoZSBzdWJtaXR0ZXIgaW4gdGhlIGZvcm0gZWxlbWVudCBpbiBvcmRlciB0byB0cmlnZ2VyIGl0XG4gICAgLy8gZm9yIHBoeC10cmlnZ2VyLWFjdGlvblxuICAgIERPTS5wdXRQcml2YXRlKGZvcm1FbCwgXCJzdWJtaXR0ZXJcIiwgc3VibWl0dGVyKTtcbiAgICBjb25zdCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KTtcbiAgICBpZiAoTGl2ZVVwbG9hZGVyLmhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkpIHtcbiAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwdXNoID0gKCkgPT5cbiAgICAgICAgdGhpcy5wdXNoRm9ybVN1Ym1pdChcbiAgICAgICAgICBmb3JtRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIHBoeEV2ZW50LFxuICAgICAgICAgIHN1Ym1pdHRlcixcbiAgICAgICAgICBvcHRzLFxuICAgICAgICAgIG9uUmVwbHksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgb3B0cywgcHVzaCk7XG4gICAgfSBlbHNlIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVscywgb3B0c107XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIChfdXBsb2FkcykgPT4ge1xuICAgICAgICAvLyBpZiB3ZSBzdGlsbCBoYXZpbmcgcGVuZGluZyBwcmVmbGlnaHRzIGl0IG1lYW5zIHdlIGhhdmUgaW52YWxpZCBlbnRyaWVzXG4gICAgICAgIC8vIGFuZCB0aGUgcGh4LXN1Ym1pdCBjYW5ub3QgYmUgY29tcGxldGVkXG4gICAgICAgIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoZm9ybUVsLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHsgc3VibWl0dGVyIH0pO1xuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgbWV0YTogbWV0YSxcbiAgICAgICAgICBjaWQ6IGNpZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoeyByZXNwIH0pID0+IG9uUmVwbHkocmVzcCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICEoXG4gICAgICAgIGZvcm1FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpICYmXG4gICAgICAgIGZvcm1FbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmV4dHJhY3RNZXRhKGZvcm1FbCwge30sIG9wdHMudmFsdWUpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGZvcm1FbCwgeyBzdWJtaXR0ZXIgfSk7XG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIHtcbiAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICBtZXRhOiBtZXRhLFxuICAgICAgICBjaWQ6IGNpZCxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4gb25SZXBseShyZXNwKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIHVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIG9uQ29tcGxldGUpIHtcbiAgICBjb25zdCBqb2luQ291bnRBdFVwbG9hZCA9IHRoaXMuam9pbkNvdW50O1xuICAgIGNvbnN0IGlucHV0RWxzID0gTGl2ZVVwbG9hZGVyLmFjdGl2ZUZpbGVJbnB1dHMoZm9ybUVsKTtcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGg7XG5cbiAgICAvLyBnZXQgZWFjaCBmaWxlIGlucHV0XG4gICAgaW5wdXRFbHMuZm9yRWFjaCgoaW5wdXRFbCkgPT4ge1xuICAgICAgY29uc3QgdXBsb2FkZXIgPSBuZXcgTGl2ZVVwbG9hZGVyKGlucHV0RWwsIHRoaXMsICgpID0+IHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKG51bUZpbGVJbnB1dHNJblByb2dyZXNzID09PSAwKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW50cmllcyA9IHVwbG9hZGVyXG4gICAgICAgIC5lbnRyaWVzKClcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnRvUHJlZmxpZ2h0UGF5bG9hZCgpKTtcblxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcmVmOiBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbXCJzZW5kaW5nIHByZWZsaWdodCByZXF1ZXN0XCIsIHBheWxvYWRdKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiYWxsb3dfdXBsb2FkXCIsIHBheWxvYWQpXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcImdvdCBwcmVmbGlnaHQgcmVzcG9uc2VcIiwgcmVzcF0pO1xuICAgICAgICAgIC8vIHRoZSBwcmVmbGlnaHQgd2lsbCByZWplY3QgZW50cmllcyBiZXlvbmQgdGhlIG1heCBlbnRyaWVzXG4gICAgICAgICAgLy8gc28gd2UgZXJyb3IgYW5kIGNhbmNlbCBlbnRyaWVzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3AuZW50cmllcyAmJiAhcmVzcC5lbnRyaWVzW2VudHJ5LnJlZl0pIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodChcbiAgICAgICAgICAgICAgICBlbnRyeS5yZWYsXG4gICAgICAgICAgICAgICAgXCJmYWlsZWQgcHJlZmxpZ2h0XCIsXG4gICAgICAgICAgICAgICAgdXBsb2FkZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gZm9yIGF1dG8gdXBsb2Fkcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgZW50cmllcyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyBmb3IgZm9ybSBzdWJtaXRzIHRoYXQgY29udGFpbiBpbnZhbGlkIGVudHJpZXNcbiAgICAgICAgICBpZiAocmVzcC5lcnJvciB8fCBPYmplY3Qua2V5cyhyZXNwLmVudHJpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYsIHBoeEV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3AuZXJyb3IgfHwgW107XG4gICAgICAgICAgICBlcnJvcnMubWFwKChbZW50cnlfcmVmLCByZWFzb25dKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFpbGVkRW50cnlQcmVmbGlnaHQoZW50cnlfcmVmLCByZWFzb24sIHVwbG9hZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvbkVycm9yID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qb2luQ291bnQgPT09IGpvaW5Db3VudEF0VXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdXBsb2FkZXIuaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgdGhpcy5saXZlU29ja2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKFwiRmFpbGVkIHRvIHB1c2ggdXBsb2FkXCIsIGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodCh1cGxvYWRSZWYsIHJlYXNvbiwgdXBsb2FkZXIpIHtcbiAgICBpZiAodXBsb2FkZXIuaXNBdXRvVXBsb2FkKCkpIHtcbiAgICAgIC8vIHVwbG9hZFJlZiBtYXkgYmUgdG9wIGxldmVsIHVwbG9hZCBjb25maWcgcmVmIG9yIGVudHJ5IHJlZlxuICAgICAgY29uc3QgZW50cnkgPSB1cGxvYWRlclxuICAgICAgICAuZW50cmllcygpXG4gICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkucmVmID09PSB1cGxvYWRSZWYudG9TdHJpbmcoKSk7XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtgZXJyb3IgZm9yIGVudHJ5ICR7dXBsb2FkUmVmfWAsIHJlYXNvbl0pO1xuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKHRhcmdldEN0eCwgbmFtZSwgZmlsZXNPckJsb2JzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMudGFyZ2V0Q3R4RWxlbWVudCh0YXJnZXRDdHgpIHx8IHRoaXMuZWw7XG4gICAgY29uc3QgaW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHModGFyZ2V0RWxlbWVudCkuZmlsdGVyKFxuICAgICAgKGVsKSA9PiBlbC5uYW1lID09PSBuYW1lLFxuICAgICk7XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0Vycm9yKGBubyBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KGlucHV0c1swXSwgUEhYX1RSQUNLX1VQTE9BRFMsIHtcbiAgICAgICAgZGV0YWlsOiB7IGZpbGVzOiBmaWxlc09yQmxvYnMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldEN0eEVsZW1lbnQodGFyZ2V0Q3R4KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmlkLCB0YXJnZXRDdHgpO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldEN0eCkge1xuICAgICAgcmV0dXJuIHRhcmdldEN0eDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVzaEZvcm1SZWNvdmVyeShvbGRGb3JtLCBuZXdGb3JtLCB0ZW1wbGF0ZURvbSwgY2FsbGJhY2spIHtcbiAgICAvLyB3ZSBhcmUgb25seSByZWNvdmVyaW5nIGZvcm1zIGluc2lkZSB0aGUgY3VycmVudCB2aWV3LCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0b1xuICAgIC8vIHNraXAgd2l0aGluT3duZXJzIGhlcmUgYW5kIGFsd2F5cyB1c2UgdGhpcyB3aGVuIHJlZmVycmluZyB0byB0aGUgdmlld1xuICAgIGNvbnN0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKTtcbiAgICBjb25zdCBwaHhUYXJnZXQgPSBuZXdGb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpIHx8IG5ld0Zvcm07XG4gICAgY29uc3QgcGh4RXZlbnQgPVxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9BVVRPX1JFQ09WRVIpKSB8fFxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICBjb25zdCBpbnB1dHMgPSBBcnJheS5mcm9tKG9sZEZvcm0uZWxlbWVudHMpLmZpbHRlcihcbiAgICAgIChlbCkgPT4gRE9NLmlzRm9ybUlucHV0KGVsKSAmJiBlbC5uYW1lICYmICFlbC5oYXNBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICApO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG11c3QgY2xlYXIgdHJhY2tlZCB1cGxvYWRzIGJlZm9yZSByZWNvdmVyeSBhcyB0aGV5IG5vIGxvbmdlciBoYXZlIHZhbGlkIHJlZnNcbiAgICBpbnB1dHMuZm9yRWFjaChcbiAgICAgIChpbnB1dCkgPT5cbiAgICAgICAgaW5wdXQuaGFzQXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSAmJiBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyhpbnB1dCksXG4gICAgKTtcbiAgICAvLyBwdXNoSW5wdXQgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgc291cmNlIGVsZW1lbnQgdGhhdCBpbml0aWF0ZWQgdGhlIGNoYW5nZTtcbiAgICAvLyBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4gd2UgcmVjb3ZlciBmb3Jtcywgd2UgcHJvdmlkZSB0aGUgZmlyc3QgaW5wdXQgd2UgZmluZFxuICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzLmZpbmQoKGVsKSA9PiBlbC50eXBlICE9PSBcImhpZGRlblwiKSB8fCBpbnB1dHNbMF07XG5cbiAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSB0YXJnZXRzLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVjb3ZlcnkgZXZlbnRzXG4gICAgLy8gYW5kIG9ubHkgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBhbGwgZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICBsZXQgcGVuZGluZyA9IDA7XG4gICAgLy8gd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20sIHZpZXdFbClcbiAgICB0aGlzLndpdGhpblRhcmdldHMoXG4gICAgICBwaHhUYXJnZXQsXG4gICAgICAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQobmV3Rm9ybSwgdGFyZ2V0Q3R4KTtcbiAgICAgICAgcGVuZGluZysrO1xuICAgICAgICBsZXQgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpmb3JtLXJlY292ZXJ5XCIsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgc291cmNlRWxlbWVudDogb2xkRm9ybSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdGhpcywgaW5wdXQsIFtcbiAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGFyZ2V0OiBpbnB1dC5uYW1lLFxuICAgICAgICAgICAgdGFyZ2V0VmlldyxcbiAgICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICAgIG5ld0NpZDogY2lkLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgdGVtcGxhdGVEb20sXG4gICAgKTtcbiAgfVxuXG4gIHB1c2hMaW5rUGF0Y2goZSwgaHJlZiwgdGFyZ2V0RWwsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbGlua1JlZiA9IHRoaXMubGl2ZVNvY2tldC5zZXRQZW5kaW5nTGluayhocmVmKTtcbiAgICAvLyBvbmx5IGFkZCBsb2FkaW5nIHN0YXRlcyBpZiBldmVudCBpcyB0cnVzdGVkIChpdCB3YXMgdHJpZ2dlcmVkIGJ5IHVzZXIsIHN1Y2ggYXMgY2xpY2spIGFuZFxuICAgIC8vIGl0J3Mgbm90IGEgZm9yd2FyZC9iYWNrIG5hdmlnYXRpb24gZnJvbSBwb3BzdGF0ZVxuICAgIGNvbnN0IGxvYWRpbmcgPSBlLmlzVHJ1c3RlZCAmJiBlLnR5cGUgIT09IFwicG9wc3RhdGVcIjtcbiAgICBjb25zdCByZWZHZW4gPSB0YXJnZXRFbFxuICAgICAgPyAoKSA9PlxuICAgICAgICAgIHRoaXMucHV0UmVmKFxuICAgICAgICAgICAgW3sgZWw6IHRhcmdldEVsLCBsb2FkaW5nOiBsb2FkaW5nLCBsb2NrOiB0cnVlIH1dLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmFsbGJhY2sgPSAoKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGNvbnN0IHVybCA9IGhyZWYuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3R9JHtocmVmfWBcbiAgICAgIDogaHJlZjtcblxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW4sIFwibGl2ZV9wYXRjaFwiLCB7IHVybCB9KS50aGVuKFxuICAgICAgKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5saW5rX3JlZGlyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgY2FsbGJhY2ssIGxpbmtSZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKHsgZXJyb3I6IF9lcnJvciwgdGltZW91dDogX3RpbWVvdXQgfSkgPT4gZmFsbGJhY2soKSxcbiAgICApO1xuICB9XG5cbiAgZ2V0Rm9ybXNGb3JSZWNvdmVyeSgpIHtcbiAgICAvLyBGb3JtIHJlY292ZXJ5IGlzIGNvbXBsZXggaW4gTGl2ZVZpZXc6XG4gICAgLy8gV2Ugd2FudCB0byBzdXBwb3J0IG5lc3RlZCBMaXZlVmlld3MgYW5kIGFsc28gcHJvdmlkZSBhIGdvb2QgdXNlciBleHBlcmllbmNlLlxuICAgIC8vIFRoZXJlZm9yZSwgd2hlbiB0aGUgY2hhbm5lbCByZWpvaW5zLCB3ZSBjb3B5IGFsbCBmb3JtcyB0aGF0IGFyZSBlbGlnaWJsZSBmb3JcbiAgICAvLyByZWNvdmVyeSB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGVtIGxhdGVyLlxuICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRvIGNvcHkgdGhlbT8gQmVjYXVzZSB3aGVuIHRoZSBtYWluIExpdmVWaWV3IGpvaW5zLCBhbnkgZm9ybXNcbiAgICAvLyBpbiBuZXN0ZWQgTGl2ZVZpZXdzIHdvdWxkIGJlIGxvc3QuXG4gICAgLy9cbiAgICAvLyBXZSBzaG91bGQgcmV3b3JrIHRoaXMgaW4gdGhlIGZ1dHVyZSB0byBzZXJpYWxpemUgdGhlIGZvcm0gcGF5bG9hZCBoZXJlXG4gICAgLy8gaW5zdGVhZCBvZiBjbG9uaW5nIHRoZSBET00gbm9kZXMsIGJ1dCBtYWtpbmcgdGhpcyB3b3JrIGNvcnJlY3RseSBpcyB0ZWRpb3VzLFxuICAgIC8vIGFzIHNlbmRpbmcgdGhlIGNvcnJlY3QgZm9ybSBwYXlsb2FkIHJlbGllcyBvbiBKUy5wdXNoIHRvIGV4dHJhY3QgdmFsdWVzXG4gICAgLy8gZnJvbSBKUyBjb21tYW5kcyAocGh4LWNoYW5nZT17SlMucHVzaChcImV2ZW50XCIsIHZhbHVlOiAuLi4sIHRhcmdldDogLi4uKX0pLFxuICAgIC8vIGFzIHdlbGwgYXMgdmlldy5wdXNoSW5wdXQsIHdoaWNoIGV4cGVjdHMgRE9NIGVsZW1lbnRzLlxuXG4gICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuXG4gICAgcmV0dXJuIERPTS5hbGwoXG4gICAgICBkb2N1bWVudCxcbiAgICAgIGAjJHtDU1MuZXNjYXBlKHRoaXMuaWQpfSBmb3JtWyR7cGh4Q2hhbmdlfV0sIFske1BIWF9URUxFUE9SVEVEX1JFRn09XCIke0NTUy5lc2NhcGUodGhpcy5pZCl9XCJdIGZvcm1bJHtwaHhDaGFuZ2V9XWAsXG4gICAgKVxuICAgICAgLmZpbHRlcigoZm9ybSkgPT4gZm9ybS5pZClcbiAgICAgIC5maWx0ZXIoKGZvcm0pID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChmb3JtKSA9PlxuICAgICAgICAgIGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIsXG4gICAgICApXG4gICAgICAubWFwKChmb3JtKSA9PiB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgdGhlIHdob2xlIGZvcm0sIGFzIHJlbHlpbmcgb24gZm9ybS5lbGVtZW50cyBjYW4gbGVhZCB0b1xuICAgICAgICAvLyBzaXR1YXRpb25zIHdoZXJlIHdlIGhhdmVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICA8Zm9ybT48ZmllbGRzZXQgZGlzYWJsZWQ+PGlucHV0IG5hbWU9XCJmb29cIiB2YWx1ZT1cImJhclwiPjwvZmllbGRzZXQ+PC9mb3JtPlxuICAgICAgICAvL1xuICAgICAgICAvLyBhbmQgZm9ybS5lbGVtZW50cyByZXR1cm5zIGJvdGggdGhlIGZpZWxkc2V0IGFuZCB0aGUgaW5wdXQgc2VwYXJhdGVseS5cbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQsIHRoZSBpbnB1dCBzaG91bGQgTk9UIGJlIHNlbnQgdGhvdWdoLlxuICAgICAgICAvLyBXZSBjYW4gb25seSByZWxpYWJseSBzZXJpYWxpemUgdGhlIGZvcm0gYnkgY2xvbmluZyBpdCBmdWxseS5cbiAgICAgICAgY29uc3QgY2xvbmVkRm9ybSA9IGZvcm0uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAvLyB3ZSBjYWxsIG1vcnBoZG9tIHRvIGNvcHkgYW55IHNwZWNpYWwgc3RhdGVcbiAgICAgICAgLy8gbGlrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIGEgPHNlbGVjdD4gZWxlbWVudDtcbiAgICAgICAgLy8gYW55IGFsc28gY29weSBvdmVyIHByaXZhdGVzICh3aGljaCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRvdWNoZWQgZmllbGRzKVxuICAgICAgICBtb3JwaGRvbShjbG9uZWRGb3JtLCBmb3JtLCB7XG4gICAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICAgIERPTS5jb3B5UHJpdmF0ZXMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBuZXh0IHVwLCB3ZSBhbHNvIG5lZWQgdG8gY2xvbmUgYW55IGVsZW1lbnRzIHdpdGggZm9ybT1cImlkXCIgcGFyYW1ldGVyXG4gICAgICAgIGNvbnN0IGV4dGVybmFsRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgIGBbZm9ybT1cIiR7Zm9ybS5pZH1cIl1gLFxuICAgICAgICApO1xuICAgICAgICBBcnJheS5mcm9tKGV4dGVybmFsRWxlbWVudHMpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm0uY29udGFpbnMoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNsb25lZEVsID0gZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgIG1vcnBoZG9tKGNsb25lZEVsLCBlbCk7XG4gICAgICAgICAgRE9NLmNvcHlQcml2YXRlcyhjbG9uZWRFbCwgZWwpO1xuICAgICAgICAgIGNsb25lZEZvcm0uYXBwZW5kQ2hpbGQoY2xvbmVkRWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsb25lZEZvcm07XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBmb3JtKSA9PiB7XG4gICAgICAgIGFjY1tmb3JtLmlkXSA9IGZvcm07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICBtYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKGRlc3Ryb3llZENJRHMpIHtcbiAgICBsZXQgd2lsbERlc3Ryb3lDSURzID0gZGVzdHJveWVkQ0lEcy5maWx0ZXIoKGNpZCkgPT4ge1xuICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGNvbXBvbmVudHMgZGVzdHJveWVkXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHdpbGxEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyB3ZSBtdXN0IHJlc2V0IHRoZSByZW5kZXIgY2hhbmdlIHRyYWNraW5nIGZvciBjaWRzIHRoYXRcbiAgICAgIC8vIGNvdWxkIGJlIGFkZGVkIGJhY2sgZnJvbSB0aGUgc2VydmVyIHNvIHdlIGRvbid0IHNraXAgdGhlbVxuICAgICAgd2lsbERlc3Ryb3lDSURzLmZvckVhY2goKGNpZCkgPT4gdGhpcy5yZW5kZXJlZC5yZXNldFJlbmRlcihjaWQpKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwgeyBjaWRzOiB3aWxsRGVzdHJveUNJRHMgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgcGVuZGluZyB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgZGV0ZXJtaW5pbmdcbiAgICAgICAgICAvLyBpZiB0aGUgY2lkcyB3ZXJlIGFkZGVkIGJhY2sgdG8gdGhlIERPTSBpbiB0aGUgbWVhbnRpbWUgKCMzMTM5KVxuICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbnkgb2YgdGhlIGNpZHMgd2Ugd2FudGVkIHRvIGRlc3Ryb3kgd2VyZSBhZGRlZCBiYWNrLFxuICAgICAgICAgICAgLy8gaWYgdGhleSB3ZXJlIGFkZGVkIGJhY2ssIHdlIGRvbid0IGFjdHVhbGx5IGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKChjaWQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBsZXRlbHlEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImNpZHNfZGVzdHJveWVkXCIsIHtcbiAgICAgICAgICAgICAgICBjaWRzOiBjb21wbGV0ZWx5RGVzdHJveUNJRHMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLnBydW5lQ0lEcyhyZXNwLmNpZHMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3duc0VsZW1lbnQoZWwpIHtcbiAgICBsZXQgcGFyZW50Vmlld0VsID0gRE9NLmNsb3Nlc3RWaWV3RWwoZWwpO1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCkgPT09IHRoaXMuaWQgfHxcbiAgICAgIChwYXJlbnRWaWV3RWwgJiYgcGFyZW50Vmlld0VsLmlkID09PSB0aGlzLmlkKSB8fFxuICAgICAgKCFwYXJlbnRWaWV3RWwgJiYgdGhpcy5pc0RlYWQpXG4gICAgKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzID0ge30pIHtcbiAgICBET00ucHV0UHJpdmF0ZShmb3JtLCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSk7XG4gICAgY29uc3QgaW5wdXRzID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSkpO1xuICAgIHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKTtcbiAgICB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIHN1Ym1pdHRlciwgb3B0cywgKCkgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKTtcbiAgfVxuXG4gIC8vIHBoeC1wb3J0YWxcbiAgcHVzaFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5hZGQoaWQpO1xuICB9XG5cbiAgZHJvcFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5kZWxldGUoaWQpO1xuICB9XG5cbiAgZGVzdHJveVBvcnRhbEVsZW1lbnRzKCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIERJU0NPTk5FQ1RFRF9USU1FT1VULFxuICBNQVhfUkVMT0FEUyxcbiAgUEhYX0RFQk9VTkNFLFxuICBQSFhfRFJPUF9UQVJHRVQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0tFWSxcbiAgUEhYX0xJTktfU1RBVEUsXG4gIFBIWF9MSVZFX0xJTkssXG4gIFBIWF9MVl9ERUJVRyxcbiAgUEhYX0xWX0xBVEVOQ1lfU0lNLFxuICBQSFhfTFZfUFJPRklMRSxcbiAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gIFBIWF9NQUlOLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9USFJPVFRMRSxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9TRVNTSU9OLFxuICBSRUxPQURfSklUVEVSX01JTixcbiAgUkVMT0FEX0pJVFRFUl9NQVgsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVMT0FEX1NUQVRVUyxcbiAgUEhYX1JVTlRJTUVfSE9PSyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIG1heWJlLFxuICBsb2dFcnJvcixcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiO1xuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIjtcbmltcG9ydCBqc0NvbW1hbmRzIGZyb20gXCIuL2pzX2NvbW1hbmRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VzZWRJbnB1dCA9IChlbCkgPT4gRE9NLmlzVXNlZElucHV0KGVsKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKHVybCwgcGh4U29ja2V0LCBvcHRzID0ge30pIHtcbiAgICB0aGlzLnVubG9hZGVkID0gZmFsc2U7XG4gICAgaWYgKCFwaHhTb2NrZXQgfHwgcGh4U29ja2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICBhIHBob2VuaXggU29ja2V0IG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgTGl2ZVNvY2tldCBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG5cbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICAgICAgICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBwaHhTb2NrZXQodXJsLCBvcHRzKTtcbiAgICB0aGlzLmJpbmRpbmdQcmVmaXggPSBvcHRzLmJpbmRpbmdQcmVmaXggfHwgQklORElOR19QUkVGSVg7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pO1xuICAgIHRoaXMudmlld0xvZ2dlciA9IG9wdHMudmlld0xvZ2dlcjtcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fTtcbiAgICB0aGlzLmRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihjbG9uZShERUZBVUxUUyksIG9wdHMuZGVmYXVsdHMgfHwge30pO1xuICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGw7XG4gICAgdGhpcy5zaWxlbmNlZCA9IGZhbHNlO1xuICAgIHRoaXMubWFpbiA9IG51bGw7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5saW5rUmVmID0gMTtcbiAgICB0aGlzLnJvb3RzID0ge307XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZSh3aW5kb3cubG9jYXRpb24pO1xuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9O1xuICAgIHRoaXMudXBsb2FkZXJzID0gb3B0cy51cGxvYWRlcnMgfHwge307XG4gICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gb3B0cy5sb2FkZXJUaW1lb3V0IHx8IExPQURFUl9USU1FT1VUO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZW91dCA9IG9wdHMuZGlzY29ubmVjdGVkVGltZW91dCB8fCBESVNDT05ORUNURURfVElNRU9VVDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLm1heFJlbG9hZHMgPSBvcHRzLm1heFJlbG9hZHMgfHwgTUFYX1JFTE9BRFM7XG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNaW4gPSBvcHRzLnJlbG9hZEppdHRlck1pbiB8fCBSRUxPQURfSklUVEVSX01JTjtcbiAgICB0aGlzLnJlbG9hZEppdHRlck1heCA9IG9wdHMucmVsb2FkSml0dGVyTWF4IHx8IFJFTE9BRF9KSVRURVJfTUFYO1xuICAgIHRoaXMuZmFpbHNhZmVKaXR0ZXIgPSBvcHRzLmZhaWxzYWZlSml0dGVyIHx8IEZBSUxTQUZFX0pJVFRFUjtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG9wdHMubG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgd2luZG93LnNlc3Npb25TdG9yYWdlO1xuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlO1xuICAgIHRoaXMuYm91bmRFdmVudE5hbWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuYmxvY2tQaHhDaGFuZ2VXaGlsZUNvbXBvc2luZyA9XG4gICAgICBvcHRzLmJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3NpbmcgfHwgZmFsc2U7XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgdGhpcy5kb21DYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBqc1F1ZXJ5U2VsZWN0b3JBbGw6IG51bGwsXG4gICAgICAgIG9uUGF0Y2hTdGFydDogY2xvc3VyZSgpLFxuICAgICAgICBvblBhdGNoRW5kOiBjbG9zdXJlKCksXG4gICAgICAgIG9uTm9kZUFkZGVkOiBjbG9zdXJlKCksXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiBjbG9zdXJlKCksXG4gICAgICB9LFxuICAgICAgb3B0cy5kb20gfHwge30sXG4gICAgKTtcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFRyYW5zaXRpb25TZXQoKTtcbiAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24gPVxuICAgICAgcGFyc2VJbnQodGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OKSkgfHwgMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIChfZSkgPT4ge1xuICAgICAgdGhpcy51bmxvYWRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZSBhbmQgYnJvd3NlciBkb2VzIG5vdCBlbWl0IFwicGFnZXNob3dcIlxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWNcblxuICB2ZXJzaW9uKCkge1xuICAgIHJldHVybiBMVl9WU047XG4gIH1cblxuICBpc1Byb2ZpbGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX1BST0ZJTEUpID09PSBcInRydWVcIjtcbiAgfVxuXG4gIGlzRGVidWdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0RFQlVHKSA9PT0gXCJ0cnVlXCI7XG4gIH1cblxuICBpc0RlYnVnRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcImZhbHNlXCI7XG4gIH1cblxuICBlbmFibGVEZWJ1ZygpIHtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIik7XG4gIH1cblxuICBlbmFibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9QUk9GSUxFLCBcInRydWVcIik7XG4gIH1cblxuICBkaXNhYmxlRGVidWcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJmYWxzZVwiKTtcbiAgfVxuXG4gIGRpc2FibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9QUk9GSUxFKTtcbiAgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKSB7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIsXG4gICAgKTtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpO1xuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSk7XG4gIH1cblxuICBnZXRMYXRlbmN5U2ltKCkge1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfTEFURU5DWV9TSU0pO1xuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbDtcbiAgfVxuXG4gIGdldFNvY2tldCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gIH1cblxuICBjb25uZWN0KCkge1xuICAgIC8vIGVuYWJsZSBkZWJ1ZyBieSBkZWZhdWx0IGlmIG9uIGxvY2FsaG9zdCBhbmQgbm90IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiICYmICF0aGlzLmlzRGVidWdEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZURlYnVnKCk7XG4gICAgfVxuICAgIGNvbnN0IGRvQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzZXRSZWxvYWRTdGF0dXMoKTtcbiAgICAgIGlmICh0aGlzLmpvaW5Sb290Vmlld3MoKSkge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWFpbikge1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmpvaW5EZWFkVmlldygpO1xuICAgIH07XG4gICAgaWYgKFxuICAgICAgW1wiY29tcGxldGVcIiwgXCJsb2FkZWRcIiwgXCJpbnRlcmFjdGl2ZVwiXS5pbmRleE9mKGRvY3VtZW50LnJlYWR5U3RhdGUpID49IDBcbiAgICApIHtcbiAgICAgIGRvQ29ubmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBkb0Nvbm5lY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgZGlzY29ubmVjdChjYWxsYmFjaykge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcik7XG4gICAgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgY2xvc2UgbGlzdGVuZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIGhhbmRsZVxuICAgIC8vIGEgc2VydmVyIGNsb3NlIGV2ZW50IHdoZW4gaXQgaXMgYWN0dWFsbHkgY2F1c2VkIGJ5IHVzIGRpc2Nvbm5lY3RpbmdcbiAgICBpZiAodGhpcy5zZXJ2ZXJDbG9zZVJlZikge1xuICAgICAgdGhpcy5zb2NrZXQub2ZmKHRoaXMuc2VydmVyQ2xvc2VSZWYpO1xuICAgICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0LmRpc2Nvbm5lY3QoY2FsbGJhY2spO1xuICB9XG5cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuc29ja2V0LnJlcGxhY2VUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIGV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUgPSBudWxsKSB7XG4gICAgY29uc3QgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIsIHsgZGV0YWlsOiB7IHNvdXJjZUVsZW1lbnQ6IGVsIH0gfSk7XG4gICAgdGhpcy5vd25lcihlbCwgKHZpZXcpID0+IEpTLmV4ZWMoZSwgZXZlbnRUeXBlLCBlbmNvZGVkSlMsIHZpZXcsIGVsKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2pzX2NvbW1hbmRzXCIpLkxpdmVTb2NrZXRKU0NvbW1hbmRzfVxuICAgKi9cbiAganMoKSB7XG4gICAgcmV0dXJuIGpzQ29tbWFuZHModGhpcywgXCJqc1wiKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKHRoaXMudW5sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFpbiAmJiB0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIHRoaXMubG9nKHRoaXMubWFpbiwgXCJzb2NrZXRcIiwgKCkgPT4gW1wiZGlzY29ubmVjdCBmb3IgcGFnZSBuYXZcIl0pO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3lBbGxWaWV3cygpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgdHJpZ2dlckRPTShraW5kLCBhcmdzKSB7XG4gICAgdGhpcy5kb21DYWxsYmFja3Nba2luZF0oLi4uYXJncyk7XG4gIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpIHtcbiAgICBpZiAoIXRoaXMuaXNQcm9maWxlRW5hYmxlZCgpIHx8ICFjb25zb2xlLnRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jKCk7XG4gICAgfVxuICAgIGNvbnNvbGUudGltZShuYW1lKTtcbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgY29uc29sZS50aW1lRW5kKG5hbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBsb2codmlldywga2luZCwgbXNnQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy52aWV3TG9nZ2VyKSB7XG4gICAgICBjb25zdCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMudmlld0xvZ2dlcih2aWV3LCBraW5kLCBtc2csIG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpO1xuICAgICAgZGVidWcodmlldywga2luZCwgbXNnLCBvYmopO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RET01VcGRhdGUoY2FsbGJhY2spIHtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFmdGVyKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRBc3luY1RyYW5zaXRpb24ocHJvbWlzZSk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSk7XG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKSB7XG4gICAgY2hhbm5lbC5vbihldmVudCwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGxhdGVuY3kgPSB0aGlzLmdldExhdGVuY3lTaW0oKTtcbiAgICAgIGlmICghbGF0ZW5jeSkge1xuICAgICAgICBjYihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkV2l0aEppdHRlcih2aWV3LCBsb2cpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGNvbnN0IG1pbk1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNaW47XG4gICAgY29uc3QgbWF4TXMgPSB0aGlzLnJlbG9hZEppdHRlck1heDtcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXM7XG4gICAgY29uc3QgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKFxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UsXG4gICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBDT05TRUNVVElWRV9SRUxPQURTLFxuICAgICAgMCxcbiAgICAgIChjb3VudCkgPT4gY291bnQgKyAxLFxuICAgICk7XG4gICAgaWYgKHRyaWVzID49IHRoaXMubWF4UmVsb2Fkcykge1xuICAgICAgYWZ0ZXJNcyA9IHRoaXMuZmFpbHNhZmVKaXR0ZXI7XG4gICAgfVxuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBpZiB2aWV3IGhhcyByZWNvdmVyZWQsIHN1Y2ggYXMgdHJhbnNwb3J0IHJlcGxhY2VkLCB0aGVuIGNhbmNlbFxuICAgICAgaWYgKHZpZXcuaXNEZXN0cm95ZWQoKSB8fCB2aWV3LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmlldy5kZXN0cm95KCk7XG4gICAgICBsb2dcbiAgICAgICAgPyBsb2coKVxuICAgICAgICA6IHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgICBgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2AsXG4gICAgICAgICAgXSk7XG4gICAgICBpZiAodHJpZXMgPj0gdGhpcy5tYXhSZWxvYWRzKSB7XG4gICAgICAgIHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgYGV4Y2VlZGVkICR7dGhpcy5tYXhSZWxvYWRzfSBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlYCxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNQZW5kaW5nTGluaygpKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSwgYWZ0ZXJNcyk7XG4gIH1cblxuICBnZXRIb29rRGVmaW5pdGlvbihuYW1lKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1heWJlSW50ZXJuYWxIb29rKG5hbWUpIHx8XG4gICAgICB0aGlzLmhvb2tzW25hbWVdIHx8XG4gICAgICB0aGlzLm1heWJlUnVudGltZUhvb2sobmFtZSlcbiAgICApO1xuICB9XG5cbiAgbWF5YmVJbnRlcm5hbEhvb2sobmFtZSkge1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpICYmIEhvb2tzW25hbWUuc3BsaXQoXCIuXCIpWzFdXTtcbiAgfVxuXG4gIG1heWJlUnVudGltZUhvb2sobmFtZSkge1xuICAgIGNvbnN0IHJ1bnRpbWVIb29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gLFxuICAgICk7XG4gICAgaWYgKCFydW50aW1lSG9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gd2luZG93W2BwaHhfaG9va18ke25hbWV9YF07XG4gICAgaWYgKCFjYWxsYmFja3MgfHwgdHlwZW9mIGNhbGxiYWNrcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dFcnJvcihcImEgcnVudGltZSBob29rIG11c3QgYmUgYSBmdW5jdGlvblwiLCBydW50aW1lSG9vayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvb2tEZWZpbml0b24gPSBjYWxsYmFja3MoKTtcbiAgICBpZiAoXG4gICAgICBob29rRGVmaW5pdG9uICYmXG4gICAgICAodHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwiZnVuY3Rpb25cIilcbiAgICApIHtcbiAgICAgIHJldHVybiBob29rRGVmaW5pdG9uO1xuICAgIH1cbiAgICBsb2dFcnJvcihcbiAgICAgIFwicnVudGltZSBob29rIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGhvb2sgY2FsbGJhY2tzIG9yIGFuIGluc3RhbmNlIG9mIFZpZXdIb29rXCIsXG4gICAgICBydW50aW1lSG9vayxcbiAgICApO1xuICB9XG5cbiAgaXNVbmxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy51bmxvYWRlZDtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpO1xuICB9XG5cbiAgZ2V0QmluZGluZ1ByZWZpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4O1xuICB9XG5cbiAgYmluZGluZyhraW5kKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gO1xuICB9XG5cbiAgY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwodG9waWMsIHBhcmFtcyk7XG4gIH1cblxuICBqb2luRGVhZFZpZXcoKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgaWYgKFxuICAgICAgYm9keSAmJlxuICAgICAgIXRoaXMuaXNQaHhWaWV3KGJvZHkpICYmXG4gICAgICAhdGhpcy5pc1BoeFZpZXcoZG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpXG4gICAgKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhib2R5KTtcbiAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSk7XG4gICAgICB2aWV3LmpvaW5EZWFkKCk7XG4gICAgICBpZiAoIXRoaXMubWFpbikge1xuICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgfVxuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHZpZXcuZXhlY05ld01vdW50ZWQoKTtcbiAgICAgICAgLy8gcmVzdG9yZSBzY3JvbGwgcG9zaXRpb24gd2hlbiBuYXZpZ2F0aW5nIGZyb20gYW4gZXh0ZXJuYWwgLyBub24tbGl2ZSBwYWdlXG4gICAgICAgIHRoaXMubWF5YmVTY3JvbGwoaGlzdG9yeS5zdGF0ZT8uc2Nyb2xsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGpvaW5Sb290Vmlld3MoKSB7XG4gICAgbGV0IHJvb3RzRm91bmQgPSBmYWxzZTtcbiAgICBET00uYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLFxuICAgICAgKHJvb3RFbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSkge1xuICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLm5ld1Jvb3RWaWV3KHJvb3RFbCk7XG4gICAgICAgICAgLy8gc3RpY2tpZXMgY2Fubm90IGJlIG1vdW50ZWQgYXQgdGhlIHJvdXRlciBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3RcbiAgICAgICAgICAvLyBnZXQgYSBocmVmIHNldCBvbiB0aGVtXG4gICAgICAgICAgaWYgKCFET00uaXNQaHhTdGlja3kocm9vdEVsKSkge1xuICAgICAgICAgICAgdmlldy5zZXRIcmVmKHRoaXMuZ2V0SHJlZigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlldy5qb2luKCk7XG4gICAgICAgICAgaWYgKHJvb3RFbC5oYXNBdHRyaWJ1dGUoUEhYX01BSU4pKSB7XG4gICAgICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByb290c0ZvdW5kID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcm9vdHNGb3VuZDtcbiAgfVxuXG4gIHJlZGlyZWN0KHRvLCBmbGFzaCwgcmVsb2FkVG9rZW4pIHtcbiAgICBpZiAocmVsb2FkVG9rZW4pIHtcbiAgICAgIEJyb3dzZXIuc2V0Q29va2llKFBIWF9SRUxPQURfU1RBVFVTLCByZWxvYWRUb2tlbiwgNjApO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZCgpO1xuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKTtcbiAgfVxuXG4gIHJlcGxhY2VNYWluKFxuICAgIGhyZWYsXG4gICAgZmxhc2gsXG4gICAgY2FsbGJhY2sgPSBudWxsLFxuICAgIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpLFxuICApIHtcbiAgICBjb25zdCBsaXZlUmVmZXJlciA9IHRoaXMuY3VycmVudExvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IHRoaXMub3V0Z29pbmdNYWluRWwgfHwgdGhpcy5tYWluLmVsO1xuXG4gICAgY29uc3Qgc3RpY2tpZXMgPSBET00uZmluZFBoeFN0aWNreShkb2N1bWVudCkgfHwgW107XG4gICAgY29uc3QgcmVtb3ZlRWxzID0gRE9NLmFsbChcbiAgICAgIHRoaXMub3V0Z29pbmdNYWluRWwsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFwicmVtb3ZlXCIpfV1gLFxuICAgICkuZmlsdGVyKChlbCkgPT4gIURPTS5pc0NoaWxkT2ZBbnkoZWwsIHN0aWNraWVzKSk7XG5cbiAgICBjb25zdCBuZXdNYWluRWwgPSBET00uY2xvbmVOb2RlKHRoaXMub3V0Z29pbmdNYWluRWwsIFwiXCIpO1xuICAgIHRoaXMubWFpbi5zaG93TG9hZGVyKHRoaXMubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5tYWluLmRlc3Ryb3koKTtcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMubWFpbi5zZXRSZWRpcmVjdChocmVmKTtcbiAgICB0aGlzLnRyYW5zaXRpb25SZW1vdmVzKHJlbW92ZUVscyk7XG4gICAgdGhpcy5tYWluLmpvaW4oKGpvaW5Db3VudCwgb25Eb25lKSA9PiB7XG4gICAgICBpZiAoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAvLyByZW1vdmUgcGh4LXJlbW92ZSBlbHMgcmlnaHQgYmVmb3JlIHdlIHJlcGxhY2UgdGhlIG1haW4gZWxlbWVudFxuICAgICAgICAgIHJlbW92ZUVscy5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgICAgICAgIHN0aWNraWVzLmZvckVhY2goKGVsKSA9PiBuZXdNYWluRWwuYXBwZW5kQ2hpbGQoZWwpKTtcbiAgICAgICAgICB0aGlzLm91dGdvaW5nTWFpbkVsLnJlcGxhY2VXaXRoKG5ld01haW5FbCk7XG4gICAgICAgICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobGlua1JlZik7XG4gICAgICAgICAgb25Eb25lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNpdGlvblJlbW92ZXMoZWxlbWVudHMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVtb3ZlQXR0ciA9IHRoaXMuYmluZGluZyhcInJlbW92ZVwiKTtcbiAgICBjb25zdCBzaWxlbmNlRXZlbnRzID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgLy8gcHJldmVudCBhbGwgbGlzdGVuZXJzIHdlIGNhcmUgYWJvdXQgZnJvbSBidWJibGluZyB0byB3aW5kb3dcbiAgICAgIC8vIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZWxlbWVudFxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBzaWxlbmNlRXZlbnRzLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUocmVtb3ZlQXR0ciksIFwicmVtb3ZlXCIpO1xuICAgIH0pO1xuICAgIC8vIHJlbW92ZSB0aGUgc2lsZW5jZWQgbGlzdGVuZXJzIHdoZW4gdHJhbnNpdGlvbnMgYXJlIGRvbmUgaW5jYXNlIHRoZSBlbGVtZW50IGlzIHJlLXVzZWRcbiAgICAvLyBhbmQgY2FsbCBjYWxsZXIncyBjYWxsYmFjayBhcyBzb29uIGFzIHdlIGFyZSBkb25lIHdpdGggdHJhbnNpdGlvbnNcbiAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIHNpbGVuY2VFdmVudHMsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBpc1BoeFZpZXcoZWwpIHtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgIT09IG51bGw7XG4gIH1cblxuICBuZXdSb290VmlldyhlbCwgZmxhc2gsIGxpdmVSZWZlcmVyKSB7XG4gICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMucm9vdHNbdmlldy5pZF0gPSB2aWV3O1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgb3duZXIoY2hpbGRFbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgdmlldztcbiAgICBjb25zdCB2aWV3RWwgPSBET00uY2xvc2VzdFZpZXdFbChjaGlsZEVsKTtcbiAgICBpZiAodmlld0VsKSB7XG4gICAgICAvLyBpdCBjYW4gaGFwcGVuIHRoYXQgd2UgZmluZCBhIHZpZXcgdGhhdCBpcyBhbHJlYWR5IGRlc3Ryb3llZDtcbiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBETyBOT1Qgd2FudCB0byBmYWxsYmFjayB0byB0aGUgbWFpbiBlbGVtZW50XG4gICAgICB2aWV3ID0gdGhpcy5nZXRWaWV3QnlFbCh2aWV3RWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWV3ID0gdGhpcy5tYWluO1xuICAgIH1cbiAgICByZXR1cm4gdmlldyAmJiBjYWxsYmFjayA/IGNhbGxiYWNrKHZpZXcpIDogdmlldztcbiAgfVxuXG4gIHdpdGhpbk93bmVycyhjaGlsZEVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMub3duZXIoY2hpbGRFbCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpKTtcbiAgfVxuXG4gIGdldFZpZXdCeUVsKGVsKSB7XG4gICAgY29uc3Qgcm9vdElkID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ST09UX0lEKTtcbiAgICByZXR1cm4gbWF5YmUodGhpcy5nZXRSb290QnlJZChyb290SWQpLCAocm9vdCkgPT5cbiAgICAgIHJvb3QuZ2V0RGVzY2VuZGVudEJ5RWwoZWwpLFxuICAgICk7XG4gIH1cblxuICBnZXRSb290QnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLnJvb3RzW2lkXTtcbiAgfVxuXG4gIGRlc3Ryb3lBbGxWaWV3cygpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucm9vdHMpIHtcbiAgICAgIHRoaXMucm9vdHNbaWRdLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW2lkXTtcbiAgICB9XG4gICAgdGhpcy5tYWluID0gbnVsbDtcbiAgfVxuXG4gIGRlc3Ryb3lWaWV3QnlFbChlbCkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmdldFJvb3RCeUlkKGVsLmdldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCkpO1xuICAgIGlmIChyb290ICYmIHJvb3QuaWQgPT09IGVsLmlkKSB7XG4gICAgICByb290LmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdO1xuICAgIH0gZWxzZSBpZiAocm9vdCkge1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpIHtcbiAgICBpZiAodGhpcy5wcmV2QWN0aXZlICYmIHZpZXcub3duc0VsZW1lbnQodGhpcy5wcmV2QWN0aXZlKSkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJldkFjdGl2ZSAmJlxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKSB7XG4gICAgdGhpcy5wcmV2QWN0aXZlID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmJsdXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGVhZD86IGJvb2xlYW59fSBbb3B0aW9ucz17fV1cbiAgICovXG4gIGJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWU7XG4gICAgLy8gZW50ZXIgZmFpbHNhZmUgcmVsb2FkIGlmIHNlcnZlciBoYXMgZ29uZSBhd2F5IGludGVudGlvbmFsbHksIHN1Y2ggYXMgXCJkaXNjb25uZWN0XCIgYnJvYWRjYXN0XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBmYWlsc2FmZSByZWxvYWQgaWYgbm9ybWFsIGNsb3N1cmUgYW5kIHdlIHN0aWxsIGhhdmUgYSBtYWluIExWXG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuY29kZSA9PT0gMTAwMCAmJiB0aGlzLm1haW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkV2l0aEppdHRlcih0aGlzLm1haW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHt9KTsgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBhZ2VzaG93XCIsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5wZXJzaXN0ZWQpIHtcbiAgICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICAgIHRoaXMuZ2V0U29ja2V0KCkuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMud2l0aFBhZ2VMb2FkaW5nKHsgdG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCIgfSk7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kTmF2KCk7XG4gICAgfVxuICAgIHRoaXMuYmluZENsaWNrcygpO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kRm9ybXMoKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kKFxuICAgICAgeyBrZXl1cDogXCJrZXl1cFwiLCBrZXlkb3duOiBcImtleWRvd25cIiB9LFxuICAgICAgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCBwaHhFdmVudCwgX3BoeFRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaEtleSA9IHRhcmdldEVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0tFWSkpO1xuICAgICAgICBjb25zdCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKTsgLy8gY2hyb21lIGNsaWNrZWQgYXV0b2NvbXBsZXRlcyBzZW5kIGEga2V5ZG93biB3aXRob3V0IGtleVxuICAgICAgICBpZiAobWF0Y2hLZXkgJiYgbWF0Y2hLZXkudG9Mb3dlckNhc2UoKSAhPT0gcHJlc3NlZEtleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICBKUy5leGVjKGUsIHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7IGRhdGEgfV0pO1xuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuYmluZChcbiAgICAgIHsgYmx1cjogXCJmb2N1c291dFwiLCBmb2N1czogXCJmb2N1c2luXCIgfSxcbiAgICAgIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgICBpZiAoIXBoeFRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmJpbmQoXG4gICAgICB7IGJsdXI6IFwiYmx1clwiLCBmb2N1czogXCJmb2N1c1wiIH0sXG4gICAgICAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgICAgLy8gYmx1ciBhbmQgZm9jdXMgYXJlIHRyaWdnZXJlZCBvbiBkb2N1bWVudCBhbmQgd2luZG93LiBEaXNjYXJkIG9uZSB0byBhdm9pZCBkdXBzXG4gICAgICAgIGlmIChwaHhUYXJnZXQgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpO1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLm9uKFwiZHJhZ292ZXJcIiwgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgdGhpcy5vbihcImRyb3BcIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BUYXJnZXRJZCA9IG1heWJlKFxuICAgICAgICBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgdGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpLFxuICAgICAgICAodHJ1ZVRhcmdldCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0cnVlVGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgZHJvcFRhcmdldCA9IGRyb3BUYXJnZXRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcm9wVGFyZ2V0SWQpO1xuICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzIHx8IFtdKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRyb3BUYXJnZXQgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgfHxcbiAgICAgICAgZHJvcFRhcmdldC5kaXNhYmxlZCB8fFxuICAgICAgICBmaWxlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0LmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyhkcm9wVGFyZ2V0LCBmaWxlcywgZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gICAgdGhpcy5vbihQSFhfVFJBQ0tfVVBMT0FEUywgKGUpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZFRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgaWYgKCFET00uaXNVcGxvYWRJbnB1dCh1cGxvYWRUYXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAoZikgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IsXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXModXBsb2FkVGFyZ2V0LCBmaWxlcyk7XG4gICAgICB1cGxvYWRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXTtcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhlLCB0YXJnZXRFbCkgOiB7fTtcbiAgfVxuXG4gIHNldFBlbmRpbmdMaW5rKGhyZWYpIHtcbiAgICB0aGlzLmxpbmtSZWYrKztcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gaHJlZjtcbiAgICB0aGlzLnJlc2V0UmVsb2FkU3RhdHVzKCk7XG4gICAgcmV0dXJuIHRoaXMubGlua1JlZjtcbiAgfVxuXG4gIC8vIGFueXRpbWUgd2UgYXJlIG5hdmlnYXRpbmcgb3IgY29ubmVjdGluZywgZHJvcCByZWxvYWQgY29va2llIGluIGNhc2VcbiAgLy8gd2UgaXNzdWUgdGhlIGNvb2tpZSBidXQgdGhlIG5leHQgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgZHJvcHBlZCBpdFxuICByZXNldFJlbG9hZFN0YXR1cygpIHtcbiAgICBCcm93c2VyLmRlbGV0ZUNvb2tpZShQSFhfUkVMT0FEX1NUQVRVUyk7XG4gIH1cblxuICBjb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSB7XG4gICAgaWYgKHRoaXMubGlua1JlZiAhPT0gbGlua1JlZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rO1xuICAgICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCkge1xuICAgIHJldHVybiB0aGlzLmhyZWY7XG4gIH1cblxuICBoYXNQZW5kaW5nTGluaygpIHtcbiAgICByZXR1cm4gISF0aGlzLnBlbmRpbmdMaW5rO1xuICB9XG5cbiAgYmluZChldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGNvbnN0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdO1xuXG4gICAgICB0aGlzLm9uKGJyb3dzZXJFdmVudE5hbWUsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmcoZXZlbnQpO1xuICAgICAgICBjb25zdCB3aW5kb3dCaW5kaW5nID0gdGhpcy5iaW5kaW5nKGB3aW5kb3ctJHtldmVudH1gKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGh4RXZlbnQgPVxuICAgICAgICAgIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoYmluZGluZyk7XG4gICAgICAgIGlmICh0YXJnZXRQaHhFdmVudCkge1xuICAgICAgICAgIHRoaXMuZGVib3VuY2UoZS50YXJnZXQsIGUsIGJyb3dzZXJFdmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZS50YXJnZXQsIHRhcmdldFBoeEV2ZW50LCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCAoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBoeEV2ZW50ID0gZWwuZ2V0QXR0cmlidXRlKHdpbmRvd0JpbmRpbmcpO1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZShlbCwgZSwgYnJvd3NlckV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHBoeEV2ZW50LCBcIndpbmRvd1wiKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpIHtcbiAgICB0aGlzLm9uKFwibW91c2Vkb3duXCIsIChlKSA9PiAodGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IGUudGFyZ2V0KSk7XG4gICAgdGhpcy5iaW5kQ2xpY2soXCJjbGlja1wiLCBcImNsaWNrXCIpO1xuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUpIHtcbiAgICBjb25zdCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBsZXQgdGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gYSBzeW50aGV0aWMgY2xpY2sgZXZlbnQgKGRldGFpbCAwKSB3aWxsIG5vdCBoYXZlIGNhdXNlZCBhIG1vdXNlZG93biBldmVudCxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSBjbGlja1N0YXJ0ZWRBdFRhcmdldCBpcyBzdGFsZVxuICAgICAgICBpZiAoZS5kZXRhaWwgPT09IDApIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgY29uc3QgY2xpY2tTdGFydGVkQXRUYXJnZXQgPSB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0IHx8IGUudGFyZ2V0O1xuICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyB0aGUgdGFyZ2V0IGZvciB0aGUgY2xpY2sgZXZlbnQsIHdlIGFsd2F5cyB3YW50IHRvXG4gICAgICAgIC8vIHVzZSB0aGUgYWN0dWFsIGV2ZW50IHRhcmdldCwgc2VlICMzMzcyXG4gICAgICAgIHRhcmdldCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCBjbGljayk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXRUYXJnZXQpO1xuICAgICAgICB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljayk7XG4gICAgICAgIGlmICghcGh4RXZlbnQpIHtcbiAgICAgICAgICBpZiAoRE9NLmlzTmV3UGFnZUNsaWNrKGUsIHdpbmRvdy5sb2NhdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub29wIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGF3YWl0aW5nIGFuIGFjayBmb3IgdGhpcyBlbCBhbHJlYWR5XG4gICAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKFBIWF9SRUZfU1JDKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVib3VuY2UodGFyZ2V0LCBlLCBcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyh0YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgICBKUy5leGVjKGUsIFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldCwgW1xuICAgICAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICAgICAgeyBkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIHRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXQpIHtcbiAgICBjb25zdCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpO1xuICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHtwaHhDbGlja0F3YXl9XWAsIChlbCkgPT4ge1xuICAgICAgaWYgKCEoZWwuaXNTYW1lTm9kZShjbGlja1N0YXJ0ZWRBdCkgfHwgZWwuY29udGFpbnMoY2xpY2tTdGFydGVkQXQpKSkge1xuICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICBjb25zdCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpO1xuICAgICAgICAgIGlmIChKUy5pc1Zpc2libGUoZWwpICYmIEpTLmlzSW5WaWV3cG9ydChlbCkpIHtcbiAgICAgICAgICAgIEpTLmV4ZWMoZSwgXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgZWwsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgZGF0YTogdGhpcy5ldmVudE1ldGEoXCJjbGlja1wiLCBlLCBlLnRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kTmF2KCkge1xuICAgIGlmICghQnJvd3Nlci5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCI7XG4gICAgfVxuICAgIGxldCBzY3JvbGxUaW1lciA9IG51bGw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgKF9lKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpO1xuICAgICAgc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHsgc2Nyb2xsOiB3aW5kb3cuc2Nyb2xsWSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBvcHN0YXRlXCIsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR5cGUsIGJhY2tUeXBlLCBpZCwgc2Nyb2xsLCBwb3NpdGlvbiB9ID0gZXZlbnQuc3RhdGUgfHwge307XG4gICAgICAgIGNvbnN0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblxuICAgICAgICAvLyBDb21wYXJlIHBvc2l0aW9ucyB0byBkZXRlcm1pbmUgZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzRm9yd2FyZCA9IHBvc2l0aW9uID4gdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uO1xuICAgICAgICBjb25zdCBuYXZUeXBlID0gaXNGb3J3YXJkID8gdHlwZSA6IGJhY2tUeXBlIHx8IHR5cGU7XG5cbiAgICAgICAgLy8gVXBkYXRlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uID0gcG9zaXRpb24gfHwgMDtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OLFxuICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICApO1xuXG4gICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgIHBhdGNoOiBuYXZUeXBlID09PSBcInBhdGNoXCIsXG4gICAgICAgICAgICBwb3A6IHRydWUsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGlzRm9yd2FyZCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYXliZVNjcm9sbChzY3JvbGwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYWluLmlzQ29ubmVjdGVkKCkgJiZcbiAgICAgICAgICAgIG5hdlR5cGUgPT09IFwicGF0Y2hcIiAmJlxuICAgICAgICAgICAgaWQgPT09IHRoaXMubWFpbi5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goZXZlbnQsIGhyZWYsIG51bGwsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJjbGlja1wiLFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIFBIWF9MSVZFX0xJTkspO1xuICAgICAgICBjb25zdCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSyk7XG4gICAgICAgIGlmICghdHlwZSB8fCAhdGhpcy5pc0Nvbm5lY3RlZCgpIHx8ICF0aGlzLm1haW4gfHwgRE9NLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB3cmFwcGluZyBhbiBTVkcgZWxlbWVudCBpbiBhbiBhbmNob3IgdGFnLCB0aGUgaHJlZiBjYW4gYmUgYW4gU1ZHQW5pbWF0ZWRTdHJpbmdcbiAgICAgICAgY29uc3QgaHJlZiA9XG4gICAgICAgICAgdGFyZ2V0LmhyZWYgaW5zdGFuY2VvZiBTVkdBbmltYXRlZFN0cmluZ1xuICAgICAgICAgICAgPyB0YXJnZXQuaHJlZi5iYXNlVmFsXG4gICAgICAgICAgICA6IHRhcmdldC5ocmVmO1xuXG4gICAgICAgIGNvbnN0IGxpbmtTdGF0ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJTktfU1RBVEUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIGRvIG5vdCBidWJibGUgY2xpY2sgdG8gcmVndWxhciBwaHgtY2xpY2sgYmluZGluZ3NcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0xpbmsgPT09IGhyZWYpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlID09PSBcInBhdGNoXCIpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgbnVsbCwgdGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXhwZWN0ZWQgJHtQSFhfTElWRV9MSU5LfSB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICR7dHlwZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGh4Q2xpY2sgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNsaWNrXCIpKTtcbiAgICAgICAgICBpZiAocGh4Q2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLmV4ZWNKUyh0YXJnZXQsIHBoeENsaWNrLCBcImNsaWNrXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBtYXliZVNjcm9sbChzY3JvbGwpIHtcbiAgICBpZiAodHlwZW9mIHNjcm9sbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHNjcm9sbCk7XG4gICAgICB9KTsgLy8gdGhlIGJvZHkgbmVlZHMgdG8gcmVuZGVyIGJlZm9yZSB3ZSBzY3JvbGwuXG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9KSB7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBgcGh4OiR7ZXZlbnR9YCwgeyBkZXRhaWw6IHBheWxvYWQgfSk7XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpIHtcbiAgICBldmVudHMuZm9yRWFjaCgoW2V2ZW50LCBwYXlsb2FkXSkgPT4gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCBwYXlsb2FkKSk7XG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spIHtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7IGRldGFpbDogaW5mbyB9KTtcbiAgICBjb25zdCBkb25lID0gKCkgPT5cbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgeyBkZXRhaWw6IGluZm8gfSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZG9uZSkgOiBkb25lO1xuICB9XG5cbiAgcHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldEVsKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbi5pc01haW4oKSkge1xuICAgICAgcmV0dXJuIEJyb3dzZXIucmVkaXJlY3QoaHJlZik7XG4gICAgfVxuXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJwYXRjaFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLm1haW4ucHVzaExpbmtQYXRjaChlLCBocmVmLCB0YXJnZXRFbCwgKGxpbmtSZWYpID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBoaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmID0gdGhpcy5zZXRQZW5kaW5nTGluayhocmVmKSkge1xuICAgIGlmICghdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluY3JlbWVudCBwb3NpdGlvbiBmb3IgbmV3IHN0YXRlXG4gICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uKys7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24udG9TdHJpbmcoKSxcbiAgICApO1xuXG4gICAgLy8gc3RvcmUgdGhlIHR5cGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuICAgIEJyb3dzZXIudXBkYXRlQ3VycmVudFN0YXRlKChzdGF0ZSkgPT4gKHsgLi4uc3RhdGUsIGJhY2tUeXBlOiBcInBhdGNoXCIgfSkpO1xuXG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXG4gICAgICBsaW5rU3RhdGUsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMubWFpbi5pZCxcbiAgICAgICAgcG9zaXRpb246IHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0sXG4gICAgICBocmVmLFxuICAgICk7XG5cbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4Om5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyBwYXRjaDogdHJ1ZSwgaHJlZiwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICB9XG5cbiAgaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgZmxhc2gsIHRhcmdldEVsKSB7XG4gICAgY29uc3QgY2xpY2tMb2FkaW5nID0gdGFyZ2V0RWwgJiYgZS5pc1RydXN0ZWQgJiYgZS50eXBlICE9PSBcInBvcHN0YXRlXCI7XG4gICAgaWYgKGNsaWNrTG9hZGluZykge1xuICAgICAgdGFyZ2V0RWwuY2xhc3NMaXN0LmFkZChcInBoeC1jbGljay1sb2FkaW5nXCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSB8fCAhdGhpcy5tYWluLmlzTWFpbigpKSB7XG4gICAgICByZXR1cm4gQnJvd3Nlci5yZWRpcmVjdChocmVmLCBmbGFzaCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBmdWxsIGhyZWYgaWYgb25seSBwYXRoIHByZWZpeFxuICAgIGlmICgvXlxcLyR8XlxcL1teXFwvXSsuKiQvLnRlc3QoaHJlZikpIHtcbiAgICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3QgfSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgIGhyZWYgPSBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke2hyZWZ9YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFk7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJyZWRpcmVjdFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCAobGlua1JlZikgPT4ge1xuICAgICAgICBpZiAobGlua1JlZiA9PT0gdGhpcy5saW5rUmVmKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHBvc2l0aW9uIGZvciBuZXcgc3RhdGVcbiAgICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24rKztcbiAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICBQSFhfTFZfSElTVE9SWV9QT1NJVElPTixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBzdG9yZSB0aGUgdHlwZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG4gICAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBiYWNrVHlwZTogXCJyZWRpcmVjdFwiLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFxuICAgICAgICAgICAgbGlua1N0YXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgIGlkOiB0aGlzLm1haW4uaWQsXG4gICAgICAgICAgICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgICAgZGV0YWlsOiB7IGhyZWYsIHBhdGNoOiBmYWxzZSwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgdW5kbyBjbGljay1sb2FkaW5nIGNsYXNzXG4gICAgICAgIC8vIChpbiBjYXNlIGl0IG9yaWdpbmF0ZWQgaW4gYSBzdGlja3kgbGl2ZSB2aWV3LCBvdGhlcndpc2UgaXQgd291bGQgYmUgcmVtb3ZlZCBhbnl3YXkpXG4gICAgICAgIGlmIChjbGlja0xvYWRpbmcpIHtcbiAgICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKFwicGh4LWNsaWNrLWxvYWRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3Rlck5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvbjtcbiAgICBpZiAocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUobmV3TG9jYXRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgYmluZEZvcm1zKCkge1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBsZXQgZXh0ZXJuYWxGb3JtU3VibWl0dGVkID0gZmFsc2U7XG5cbiAgICAvLyBkaXNhYmxlIGZvcm1zIG9uIHN1Ym1pdCB0aGF0IHRyYWNrIHBoeC1jaGFuZ2UgYnV0IHBlcmZvcm0gZXh0ZXJuYWwgc3VibWl0XG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgcGh4U3VibWl0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSk7XG4gICAgICBjb25zdCBwaHhDaGFuZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICAgIGlmICghZXh0ZXJuYWxGb3JtU3VibWl0dGVkICYmIHBoeENoYW5nZSAmJiAhcGh4U3VibWl0KSB7XG4gICAgICAgIGV4dGVybmFsRm9ybVN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgdmlldy5kaXNhYmxlRm9ybShlLnRhcmdldCk7XG4gICAgICAgICAgLy8gc2FmYXJpIG5lZWRzIG5leHQgdGlja1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKERPTS5pc1VubG9hZGFibGVGb3JtU3VibWl0KGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLnRhcmdldC5zdWJtaXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIChlKSA9PiB7XG4gICAgICBjb25zdCBwaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJzdWJtaXRcIikpO1xuICAgICAgaWYgKCFwaHhFdmVudCkge1xuICAgICAgICBpZiAoRE9NLmlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkpIHtcbiAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICBKUy5leGVjKGUsIFwic3VibWl0XCIsIHBoeEV2ZW50LCB2aWV3LCBlLnRhcmdldCwgW1xuICAgICAgICAgIFwicHVzaFwiLFxuICAgICAgICAgIHsgc3VibWl0dGVyOiBlLnN1Ym1pdHRlciB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtcImNoYW5nZVwiLCBcImlucHV0XCJdKSB7XG4gICAgICB0aGlzLm9uKHR5cGUsIChlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlIGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQgJiZcbiAgICAgICAgICAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpICYmXG4gICAgICAgICAgZS50YXJnZXQuZm9ybSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRocm93IG9uIGludmFsaWQgSlMuZGlzcGF0Y2ggdGFyZ2V0IGFuZCBub29wIGlmIEN1c3RvbUV2ZW50IHRyaWdnZXJlZCBvdXRzaWRlIEpTLmRpc3BhdGNoXG4gICAgICAgICAgaWYgKGUuZGV0YWlsICYmIGUuZGV0YWlsLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGRpc3BhdGNoaW5nIGEgY3VzdG9tICR7dHlwZX0gZXZlbnQgaXMgb25seSBzdXBwb3J0ZWQgb24gaW5wdXQgZWxlbWVudHMgaW5zaWRlIGEgZm9ybWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0O1xuICAgICAgICBpZiAodGhpcy5ibG9ja1BoeENoYW5nZVdoaWxlQ29tcG9zaW5nICYmIGUuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgY29tcG9zaXRpb24tbGlzdGVuZXItJHt0eXBlfWA7XG4gICAgICAgICAgaWYgKCFET00ucHJpdmF0ZShpbnB1dCwga2V5KSkge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGEgbmV3IGlucHV0L2NoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgRE9NLmRlbGV0ZVByaXZhdGUoaW5wdXQsIGtleSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKTtcbiAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpO1xuICAgICAgICBjb25zdCBwaHhFdmVudCA9IGlucHV0RXZlbnQgfHwgZm9ybUV2ZW50O1xuICAgICAgICBpZiAoIXBoeEV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbnB1dC50eXBlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgaW5wdXQudmFsaWRpdHkgJiZcbiAgICAgICAgICBpbnB1dC52YWxpZGl0eS5iYWRJbnB1dFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gaW5wdXRFdmVudCA/IGlucHV0IDogaW5wdXQuZm9ybTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgIGNvbnN0IHsgYXQ6IGF0LCB0eXBlOiBsYXN0VHlwZSB9ID1cbiAgICAgICAgICBET00ucHJpdmF0ZShpbnB1dCwgXCJwcmV2LWl0ZXJhdGlvblwiKSB8fCB7fTtcbiAgICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIGFsd2F5cyBmaXJlIGF0IGxlYXN0IG9uZSBcImlucHV0XCIgZXZlbnQgYmVmb3JlIGV2ZXJ5IFwiY2hhbmdlXCJcbiAgICAgICAgLy8gSWdub3JlIFwiY2hhbmdlXCIgZXZlbnRzLCB1bmxlc3MgdGhlcmUgd2FzIG5vIHByaW9yIFwiaW5wdXRcIiBldmVudC5cbiAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdXNlciBjb2RlIHRyaWdnZXJzIGEgXCJjaGFuZ2VcIiBldmVudCwgb3IgaWYgdGhlIGJyb3dzZXIgaXMgbm9uLWNvbmZvcm1pbmcuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhdCA9PT0gY3VycmVudEl0ZXJhdGlvbnMgLSAxICYmXG4gICAgICAgICAgdHlwZSA9PT0gXCJjaGFuZ2VcIiAmJlxuICAgICAgICAgIGxhc3RUeXBlID09PSBcImlucHV0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge1xuICAgICAgICAgIGF0OiBjdXJyZW50SXRlcmF0aW9ucyxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlYm91bmNlKGlucHV0LCBlLCB0eXBlLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZGlzcGF0Y2hlciwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQsIHRydWUpO1xuICAgICAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgX3RhcmdldDogZS50YXJnZXQubmFtZSwgZGlzcGF0Y2hlcjogZGlzcGF0Y2hlciB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub24oXCJyZXNldFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuICAgICAgRE9NLnJlc2V0Rm9ybShmb3JtKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKS5maW5kKChlbCkgPT4gZWwudHlwZSA9PT0gXCJyZXNldFwiKTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAvLyB3YWl0IHVudGlsIG5leHQgdGljayB0byBnZXQgdXBkYXRlZCBpbnB1dCB2YWx1ZVxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlYm91bmNlKGVsLCBldmVudCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGlmIChldmVudFR5cGUgPT09IFwiYmx1clwiIHx8IGV2ZW50VHlwZSA9PT0gXCJmb2N1c291dFwiKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaHhEZWJvdW5jZSA9IHRoaXMuYmluZGluZyhQSFhfREVCT1VOQ0UpO1xuICAgIGNvbnN0IHBoeFRocm90dGxlID0gdGhpcy5iaW5kaW5nKFBIWF9USFJPVFRMRSk7XG4gICAgY29uc3QgZGVmYXVsdERlYm91bmNlID0gdGhpcy5kZWZhdWx0cy5kZWJvdW5jZS50b1N0cmluZygpO1xuICAgIGNvbnN0IGRlZmF1bHRUaHJvdHRsZSA9IHRoaXMuZGVmYXVsdHMudGhyb3R0bGUudG9TdHJpbmcoKTtcblxuICAgIHRoaXMud2l0aGluT3duZXJzKGVsLCAodmlldykgPT4ge1xuICAgICAgY29uc3QgYXN5bmNGaWx0ZXIgPSAoKSA9PlxuICAgICAgICAhdmlldy5pc0Rlc3Ryb3llZCgpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpO1xuICAgICAgRE9NLmRlYm91bmNlKFxuICAgICAgICBlbCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHBoeERlYm91bmNlLFxuICAgICAgICBkZWZhdWx0RGVib3VuY2UsXG4gICAgICAgIHBoeFRocm90dGxlLFxuICAgICAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgICAgIGFzeW5jRmlsdGVyLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zaWxlbmNlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2U7XG4gIH1cblxuICBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmJvdW5kRXZlbnROYW1lcy5hZGQoZXZlbnQpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNpbGVuY2VkKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAganNRdWVyeVNlbGVjdG9yQWxsKHNvdXJjZUVsLCBxdWVyeSwgZGVmYXVsdFF1ZXJ5KSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5kb21DYWxsYmFja3MuanNRdWVyeVNlbGVjdG9yQWxsO1xuICAgIHJldHVybiBhbGwgPyBhbGwoc291cmNlRWwsIHF1ZXJ5LCBkZWZhdWx0UXVlcnkpIDogZGVmYXVsdFF1ZXJ5KCk7XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNpdGlvblNldCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5wcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdPcHMgPSBbXTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMuZm9yRWFjaCgodGltZXIpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcik7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gIH1cblxuICBhZnRlcihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoUGVuZGluZ09wKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSkge1xuICAgIG9uU3RhcnQoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmFuc2l0aW9ucy5kZWxldGUodGltZXIpO1xuICAgICAgb25Eb25lKCk7XG4gICAgICB0aGlzLmZsdXNoUGVuZGluZ09wcygpO1xuICAgIH0sIHRpbWUpO1xuICAgIHRoaXMudHJhbnNpdGlvbnMuYWRkKHRpbWVyKTtcbiAgfVxuXG4gIGFkZEFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy5wcm9taXNlcy5hZGQocHJvbWlzZSk7XG4gICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucHJvbWlzZXMuZGVsZXRlKHByb21pc2UpO1xuICAgICAgdGhpcy5mbHVzaFBlbmRpbmdPcHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hQZW5kaW5nT3Aob3ApIHtcbiAgICB0aGlzLnBlbmRpbmdPcHMucHVzaChvcCk7XG4gIH1cblxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25zLnNpemUgKyB0aGlzLnByb21pc2VzLnNpemU7XG4gIH1cblxuICBmbHVzaFBlbmRpbmdPcHMoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSgpID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcCA9IHRoaXMucGVuZGluZ09wcy5zaGlmdCgpO1xuICAgIGlmIChvcCkge1xuICAgICAgb3AoKTtcbiAgICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5QaG9lbml4IExpdmVWaWV3IEphdmFTY3JpcHQgQ2xpZW50XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TZWUgdGhlIGhleGRvY3MgYXQgYGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlld2AgZm9yIGRvY3VtZW50YXRpb24uXG4qL1xuXG5pbXBvcnQgT3JpZ2luYWxMaXZlU29ja2V0LCB7IGlzVXNlZElucHV0IH0gZnJvbSBcIi4vbGl2ZV9zb2NrZXRcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCI7XG5pbXBvcnQgeyBWaWV3SG9vayB9IGZyb20gXCIuL3ZpZXdfaG9va1wiO1xuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiO1xuXG5pbXBvcnQgdHlwZSB7IExpdmVTb2NrZXRKU0NvbW1hbmRzIH0gZnJvbSBcIi4vanNfY29tbWFuZHNcIjtcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va3NPcHRpb25zIH0gZnJvbSBcIi4vdmlld19ob29rXCI7XG5pbXBvcnQgdHlwZSB7IFNvY2tldCBhcyBQaG9lbml4U29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgTGl2ZVNvY2tldCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXZlU29ja2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgcGh4LWRlYm91bmNlIGFuZCBwaHgtdGhyb3R0bGUuXG4gICAqL1xuICBkZWZhdWx0cz86IHtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICBkZWJvdW5jZT86IG51bWJlcjtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC10aHJvdHRsZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICB0aHJvdHRsZT86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIExpdmVWaWV3LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAgICpcbiAgICovXG4gIHBhcmFtcz86XG4gICAgfCAoKGVsOiBIVE1MRWxlbWVudCkgPT4geyBba2V5OiBzdHJpbmddOiBhbnkgfSlcbiAgICB8IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwicGh4LVwiLlxuICAgKi9cbiAgYmluZGluZ1ByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxiYWNrcyBmb3IgTGl2ZVZpZXcgaG9va3MuXG4gICAqXG4gICAqIFNlZSBbQ2xpZW50IGhvb2tzIHZpYSBgcGh4LWhvb2tgXShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sI2NsaWVudC1ob29rcy12aWEtcGh4LWhvb2spIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgaG9va3M/OiBIb29rc09wdGlvbnM7XG4gIC8qKiBDYWxsYmFja3MgZm9yIExpdmVWaWV3IHVwbG9hZGVycy4gKi9cbiAgdXBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTsgLy8gVE9ETzogZGVmaW5lIG1vcmUgc3BlY2lmaWNhbGx5XG4gIC8qKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGFwcGx5aW5nIGxvYWRpbmcgc3RhdGVzLiAqL1xuICBsb2FkZXJUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpbmcgcGh4LWRpc2Nvbm5lY3RlZCBjb21tYW5kcy4gKi9cbiAgZGlzY29ubmVjdGVkVGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmVsb2FkcyBiZWZvcmUgZW50ZXJpbmcgZmFpbHNhZmUgbW9kZS4gKi9cbiAgbWF4UmVsb2Fkcz86IG51bWJlcjtcbiAgLyoqIE1pbmltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1pbj86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1heD86IG51bWJlcjtcbiAgLyoqIFRpbWUgYmV0d2VlbiByZWxvYWQgYXR0ZW1wdHMgaW4gZmFpbHNhZmUgbW9kZS4gKi9cbiAgZmFpbHNhZmVKaXR0ZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBsb2cgZGVidWcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gICAqL1xuICB2aWV3TG9nZ2VyPzogKHZpZXc6IFZpZXcsIGtpbmQ6IHN0cmluZywgbXNnOiBzdHJpbmcsIG9iajogYW55KSA9PiB2b2lkO1xuICAvKipcbiAgICogT2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gZnVuY3Rpb25zIGZvciBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKlxuICAgKiAgICAgbWV0YWRhdGE6IHtcbiAgICogICAgICAgY2xpY2s6IChlLCBlbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiB7XG4gICAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAqICAgICAgICAgICBkZXRhaWw6IGUuZGV0YWlsIHx8IDEsXG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBrZXlkb3duOiAoZSwgZWwpID0+IHtcbiAgICogICAgICAgICByZXR1cm4ge1xuICAgKiAgICAgICAgICAga2V5OiBlLmtleSxcbiAgICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAgICogICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqXG4gICAqL1xuICBtZXRhZGF0YT86IHsgW2V2ZW50TmFtZTogc3RyaW5nXTogKGU6IEV2ZW50LCBlbDogSFRNTEVsZW1lbnQpID0+IG9iamVjdCB9O1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgc2Vzc2lvblN0b3JhZ2VgLiBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICAgKiBoYXBwZW4gaWYgYSBzaXRlIGxvYWRzIGEgY3Jvc3MtZG9tYWluIExpdmVWaWV3IGluIGFuIGlmcmFtZS5cbiAgICpcbiAgICogRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gICAqICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLnN0b3JhZ2UgPSB7fSB9XG4gICAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIHx8IG51bGwgfVxuICAgKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gICAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICAgKiAgICAgfVxuICAgKi9cbiAgc2Vzc2lvblN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogU2VlIGBzZXNzaW9uU3RvcmFnZWAgZm9yIGFuIGV4YW1wbGUuXG4gICAqL1xuICBsb2NhbFN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogSWYgc2V0IHRvIGB0cnVlYCwgYHBoeC1jaGFuZ2VgIGV2ZW50cyB3aWxsIGJlIGJsb2NrZWQgKHdpbGwgbm90IGZpcmUpXG4gICAqIHdoaWxlIHRoZSB1c2VyIGlzIGNvbXBvc2luZyBpbnB1dCB1c2luZyBhbiBJTUUgKElucHV0IE1ldGhvZCBFZGl0b3IpLlxuICAgKiBUaGlzIGlzIGRldGVybWluZWQgYnkgdGhlIGBlLmlzQ29tcG9zaW5nYCBwcm9wZXJ0eSBvbiBrZXlib2FyZCBldmVudHMsXG4gICAqIHdoaWNoIGlzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGVudGVyaW5nIGNvbXBvc2VkIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgKiB3aGVuIHR5cGluZyBKYXBhbmVzZSBvciBDaGluZXNlIHVzaW5nIHJvbWFqaSBvciBwaW55aW4gaW5wdXQgbWV0aG9kcykuXG4gICAqIEJ5IGRlZmF1bHQsIGBwaHgtY2hhbmdlYCB3aWxsIG5vdCBiZSBibG9ja2VkIGR1cmluZyBhIGNvbXBvc2l0aW9uIHNlc3Npb24sXG4gICAqIGJ1dCBub3RlIHRoYXQgdGhlcmUgd2VyZSBpc3N1ZXMgcmVwb3J0ZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpLFxuICAgKiB3aGVyZSBhIExpdmVWaWV3IHBhdGNoIHRvIHRoZSBpbnB1dCBjYXVzZWQgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICpcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2lzQ29tcG9zaW5nXG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzMzMjJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3Npbmc/OiBib29sZWFuO1xuICAvKiogRE9NIGNhbGxiYWNrcy4gKi9cbiAgZG9tPzoge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgcXVlcnlpbmcgZWxlbWVudHMgaW4gSlMgY29tbWFuZHMuXG4gICAgICogQHBhcmFtIHNvdXJjZUVsIC0gVGhlIHNvdXJjZSBlbGVtZW50LCBlLmcuIHRoZSBidXR0b24gdGhhdCB3YXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdmFsdWUuXG4gICAgICogQHBhcmFtIGRlZmF1bHRRdWVyeSAtIEEgZGVmYXVsdCBxdWVyeSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGlmIG5vIGN1c3RvbSBxdWVyeSBzaG91bGQgYmUgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGpzUXVlcnlTZWxlY3RvckFsbD86IChcbiAgICAgIHNvdXJjZUVsOiBIVE1MRWxlbWVudCxcbiAgICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgICBkZWZhdWx0UXVlcnk6ICgpID0+IEVsZW1lbnRbXSxcbiAgICApID0+IEVsZW1lbnRbXTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaFN0YXJ0PzogKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaEVuZD86IChjb250YWluZXI6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IERPTSBub2RlIGlzIGFkZGVkLlxuICAgICAqL1xuICAgIG9uTm9kZUFkZGVkPzogKG5vZGU6IE5vZGUpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJlZm9yZSBhbiBlbGVtZW50IGlzIHVwZGF0ZWQuXG4gICAgICovXG4gICAgb25CZWZvcmVFbFVwZGF0ZWQ/OiAoZnJvbUVsOiBFbGVtZW50LCB0b0VsOiBFbGVtZW50KSA9PiB2b2lkO1xuICB9O1xuICAvKiogQWxsb3cgcGFzc3Rocm91Z2ggb2Ygb3RoZXIgb3B0aW9ucyB0byB0aGUgUGhvZW5peCBTb2NrZXQgY29uc3RydWN0b3IuICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcHVibGljIEFQSSBvZiBhIExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZVNvY2tldEluc3RhbmNlSW50ZXJmYWNlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIExpdmVWaWV3IGNsaWVudC5cbiAgICovXG4gIHZlcnNpb24oKTogc3RyaW5nO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLiBTZWUgYGVuYWJsZVByb2ZpbGluZ2AgYW5kIGBkaXNhYmxlUHJvZmlsaW5nYC5cbiAgICovXG4gIGlzUHJvZmlsZUVuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gU2VlIGBlbmFibGVEZWJ1Z2AgYW5kIGBkaXNhYmxlRGVidWdgLlxuICAgKi9cbiAgaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIFNlZSBgZW5hYmxlRGVidWdgIGFuZCBgZGlzYWJsZURlYnVnYC5cbiAgICovXG4gIGlzRGVidWdEaXNhYmxlZCgpOiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlcyBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIFdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQsIHRoZSBMaXZlVmlldyBjbGllbnQgd2lsbCBsb2cgZGVidWcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIFNlZSBbRGVidWdnaW5nIGNsaWVudCBldmVudHNdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9qcy1pbnRlcm9wLmh0bWwjZGVidWdnaW5nLWNsaWVudC1ldmVudHMpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlRGVidWcoKTogdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcHJvZmlsaW5nLlxuICAgKlxuICAgKiBXaGVuIHByb2ZpbGluZyBpcyBlbmFibGVkLCB0aGUgTGl2ZVZpZXcgY2xpZW50IHdpbGwgbG9nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS5cbiAgICovXG4gIGVuYWJsZVByb2ZpbGluZygpOiB2b2lkO1xuICAvKipcbiAgICogRGlzYWJsZXMgZGVidWdnaW5nLlxuICAgKi9cbiAgZGlzYWJsZURlYnVnKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBwcm9maWxpbmcuXG4gICAqL1xuICBkaXNhYmxlUHJvZmlsaW5nKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGVzIGxhdGVuY3kgc2ltdWxhdGlvbi5cbiAgICpcbiAgICogV2hlbiBsYXRlbmN5IHNpbXVsYXRpb24gaXMgZW5hYmxlZCwgdGhlIExpdmVWaWV3IGNsaWVudCB3aWxsIGFkZCBhIGRlbGF5IHRvIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgc2VydmVyLlxuICAgKiBTZWUgW1NpbXVsYXRpbmcgTGF0ZW5jeV0oaHR0cHM6Ly9oZXhkb2NzLnBtL3Bob2VuaXhfbGl2ZV92aWV3L2pzLWludGVyb3AuaHRtbCNzaW11bGF0aW5nLWxhdGVuY3kpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlTGF0ZW5jeVNpbSh1cHBlckJvdW5kTXM6IG51bWJlcik6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBsYXRlbmN5IHNpbXVsYXRpb24uXG4gICAqL1xuICBkaXNhYmxlTGF0ZW5jeVNpbSgpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsYXRlbmN5IHNpbXVsYXRpb24gdXBwZXIgYm91bmQuXG4gICAqL1xuICBnZXRMYXRlbmN5U2ltKCk6IG51bWJlciB8IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBQaG9lbml4IFNvY2tldCBpbnN0YW5jZS5cbiAgICovXG4gIGdldFNvY2tldCgpOiBQaG9lbml4U29ja2V0O1xuICAvKipcbiAgICogQ29ubmVjdHMgdG8gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGNvbm5lY3QoKTogdm9pZDtcbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIHRyYW5zcG9ydCB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIFBob2VuaXggU29ja2V0LlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQ6IGFueSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBlbmNvZGVkIEpTIGNvbW1hbmQsIHRhcmdldGluZyB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogU2VlIFtgUGhvZW5peC5MaXZlVmlldy5KU2BdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9QaG9lbml4LkxpdmVWaWV3LkpTLmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZXhlY0pTKGVsOiBIVE1MRWxlbWVudCwgZW5jb2RlZEpTOiBzdHJpbmcsIGV2ZW50VHlwZT86IHN0cmluZyB8IG51bGwpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIFNlZSBbSmF2YVNjcmlwdCBpbnRlcm9wZXJhYmlsaXR5XShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGpzKCk6IExpdmVTb2NrZXRKU0NvbW1hbmRzO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVTb2NrZXRDb25zdHJ1Y3RvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9saXZlXCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICAgKiBAcGFyYW0gc29ja2V0IC0gdGhlIHJlcXVpcmVkIFBob2VuaXggU29ja2V0IGNsYXNzIGltcG9ydGVkIGZyb20gXCJwaG9lbml4XCIuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAgICogICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICogICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxuICAgKlxuICAgKiBAcGFyYW0gb3B0cyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBuZXcgKFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgc29ja2V0OiB0eXBlb2YgUGhvZW5peFNvY2tldCxcbiAgICBvcHRzPzogTGl2ZVNvY2tldE9wdGlvbnMsXG4gICk6IExpdmVTb2NrZXRJbnN0YW5jZUludGVyZmFjZTtcbn1cblxuLy8gYmVjYXVzZSBMaXZlU29ja2V0IGlzIGluIEpTIChmb3Igbm93KSwgd2UgY2FzdCBpdCB0byBvdXIgZGVmaW5lZCBUeXBlU2NyaXB0IGNvbnN0cnVjdG9yLlxuY29uc3QgTGl2ZVNvY2tldCA9IE9yaWdpbmFsTGl2ZVNvY2tldCBhcyB1bmtub3duIGFzIExpdmVTb2NrZXRDb25zdHJ1Y3RvcjtcblxuLyoqIENyZWF0ZXMgYSBob29rIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBob29rLlxuICogQHBhcmFtIGNhbGxiYWNrcyAtIFRoZSBsaXN0IG9mIGhvb2sgY2FsbGJhY2tzLCBzdWNoIGFzIG1vdW50ZWQsXG4gKiAgIHVwZGF0ZWQsIGRlc3Ryb3llZCwgZXRjLlxuICpcbiAqICpOb3RlKjogYGNyZWF0ZUhvb2tgIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGBjb25uZWN0ZWRDYWxsYmFja2AgbGlmZWN5Y2xlXG4gKiB3aGljaCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTS4gSWYgeW91IHRyeVxuICogdG8gY2FsbCBgY3JlYXRlSG9va2AgZnJvbSB0aGUgY29uc3RydWN0b3IsIGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gKiAgIGNvbm5lY3RlZENhbGxiYWNrKCl7XG4gKiAgICAgbGV0IG9uTGl2ZVZpZXdNb3VudGVkID0gKCkgPT4gdGhpcy5ob29rLnB1c2hFdmVudCguLi4pKVxuICogICAgIHRoaXMuaG9vayA9IGNyZWF0ZUhvb2sodGhpcywge21vdW50ZWQ6IG9uTGl2ZVZpZXdNb3VudGVkfSlcbiAqICAgfVxuICogfVxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIEhvb2sgaW5zdGFuY2UgZm9yIHRoZSBjdXN0b20gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSG9vayhlbDogSFRNTEVsZW1lbnQsIGNhbGxiYWNrczogSG9vayk6IFZpZXdIb29rIHtcbiAgbGV0IGV4aXN0aW5nSG9vayA9IERPTS5nZXRDdXN0b21FbEhvb2soZWwpO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSG9vaztcbiAgfVxuXG4gIGxldCBob29rID0gbmV3IFZpZXdIb29rKFZpZXcuY2xvc2VzdFZpZXcoZWwpLCBlbCwgY2FsbGJhY2tzKTtcbiAgRE9NLnB1dEN1c3RvbUVsSG9vayhlbCwgaG9vayk7XG4gIHJldHVybiBob29rO1xufVxuXG5leHBvcnQgeyBMaXZlU29ja2V0LCBpc1VzZWRJbnB1dCwgY3JlYXRlSG9vaywgVmlld0hvb2ssIEhvb2ssIEhvb2tzT3B0aW9ucyB9O1xuIiwgImltcG9ydCBcInBob2VuaXhfaHRtbFwiO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcbmltcG9ydCB7IExpdmVTb2NrZXQgfSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIjtcbmltcG9ydCBDbGlwYm9hcmRKUyBmcm9tIFwiY2xpcGJvYXJkXCI7XG5pbXBvcnQgVG9hc3RpZnkgZnJvbSBcInRvYXN0aWZ5LWpzXCI7XG5pbXBvcnQgdG9wYmFyIGZyb20gXCJ0b3BiYXJcIjtcblxudG9wYmFyLmNvbmZpZyh7XG4gIGJhckNvbG9yczogeyAwOiBcInJnYig2NywgNTYsIDIwMilcIiB9LFxuICBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsIDAsIDAsIC4zKVwiLFxuICBjbGFzc05hbWU6IFwidG9wYmFyXCIsXG59KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCAoaW5mbykgPT4gdG9wYmFyLnNob3coKSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RvcFwiLCAoKSA9PiB0b3BiYXIuaGlkZSgpKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnN1Y2Nlc3NcIiwgKGUpID0+IHtcbiAgVG9hc3RpZnkoe1xuICAgIHRleHQ6IGUuZGV0YWlsLm1zZyxcbiAgICBjbGFzc05hbWU6IFwidG9hc3RfX2NvbnRhaW5lci0tc3VjY2Vzc1wiLFxuICB9KS5zaG93VG9hc3QoKTtcbn0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6ZXJyb3JcIiwgKGUpID0+IHtcbiAgVG9hc3RpZnkoe1xuICAgIHRleHQ6IGUuZGV0YWlsLm1zZyxcbiAgICBjbGFzc05hbWU6IFwidG9hc3RfX2NvbnRhaW5lci0tZXJyb3JcIixcbiAgfSkuc2hvd1RvYXN0KCk7XG59KTtcblxubGV0IEhvb2tzID0ge307XG5cbkhvb2tzLkVtYmVkQ29tcG9uZW50ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImxpdmVfYWRtaW46bW92ZV9lbWJlZFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZW1iZWRFbCA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCBpbmRleEVsID0gZW1iZWRFbC5xdWVyeVNlbGVjdG9yKFwiLmVtYmVkX19pbmRleFwiKTtcbiAgICAgIGNvbnN0IGZpZWxkRWwgPSBlbWJlZEVsLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gK2luZGV4RWwudmFsdWUgKyArZS50YXJnZXQuZGF0YXNldC5kaXI7XG4gICAgICBpbmRleEVsLnZhbHVlID0gbmV3SW5kZXg7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVsID0gZmllbGRFbC5xdWVyeVNlbGVjdG9yQWxsKFwiLmVtYmVkX19pbmRleFwiKVtuZXdJbmRleF07XG4gICAgICB0YXJnZXRFbC52YWx1ZSA9ICt0YXJnZXRFbC52YWx1ZSArICtlLnRhcmdldC5kYXRhc2V0LmRpciAqIC0xO1xuXG4gICAgICBpbmRleEVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOmVtYmVkX2FkZFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3Qgc29ydElucHV0ID0gZS50YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIHNvcnRJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHNvcnRJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjplbWJlZF9kcm9wXCIsIChlKSA9PiB7XG4gICAgICBlLnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgICBjb25zdCBkZWxldGVJbnB1dCA9IGUudGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICBkZWxldGVJbnB1dC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIGRlbGV0ZUlucHV0LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOmVtYmVkX2RlbGV0ZVwiLCAoZSkgPT4ge1xuICAgICAgZS50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuXG4gICAgICBjb25zdCBkZWxldGVJbnB1dCA9IGUudGFyZ2V0XG4gICAgICAgIC5jbG9zZXN0KFwiLmVtYmVkX19ncm91cFwiKVxuICAgICAgICAucXVlcnlTZWxlY3RvcignaW5wdXRbdmFsdWU9XCJcIl0nKTtcbiAgICAgIGRlbGV0ZUlucHV0LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBkZWxldGVJbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSksXG4gICAgICApO1xuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuU2VhcmNoU2VsZWN0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaGFuZGxlRXZlbnQoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5lbFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcImlucHV0XCIpXG4gICAgICAgIC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5Ib29rcy5BcnJheUlucHV0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaGFuZGxlRXZlbnQoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5lbFxuICAgICAgICAucXVlcnlTZWxlY3RvcihcImlucHV0XCIpXG4gICAgICAgIC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5Ib29rcy5NYXBJbnB1dCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLmhhbmRsZUV2ZW50KFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuZWxcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKVxuICAgICAgICAuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuVmlld1BhZ2UgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjphY3Rpb25cIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSBcIkZPUk1cIikge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbLi4ubmV3IEZvcm1EYXRhKGUudGFyZ2V0KV0ucmVkdWNlKFxuICAgICAgICAgIChwYXJhbXMsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYXJnc1tdXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBhcmdzOiBbLi4ucGFyYW1zLmFyZ3MsIHZhbF0gfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgW2tleV06IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBhcmdzOiBbXSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGUudGFyZ2V0LnJlc2V0KCk7XG5cbiAgICAgICAgdGhpcy5wdXNoRXZlbnRUbyh0aGlzLmVsLCBcImFjdGlvblwiLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wdXNoRXZlbnRUbyh0aGlzLmVsLCBcImFjdGlvblwiLCB7IG5hbWU6IGUudGFyZ2V0LmRhdGFzZXQuYWN0aW9uIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTtcblxuSG9va3MuSW5kZXhQYWdlID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBbXTtcblxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImxpdmVfYWRtaW46YWN0aW9uXCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gXCJGT1JNXCIpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gWy4uLm5ldyBGb3JtRGF0YShlLnRhcmdldCldLnJlZHVjZShcbiAgICAgICAgICAocGFyYW1zLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImFyZ3NbXVwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgYXJnczogWy4uLnBhcmFtcy5hcmdzLCB2YWxdIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5wYXJhbXMsIFtrZXldOiB2YWwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgYXJnczogW10gfSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnB1c2hFdmVudFRvKHRoaXMuZWwsIFwiYWN0aW9uXCIsIHsgLi4ucGFyYW1zLCBpZHM6IHRoaXMuc2VsZWN0ZWQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnB1c2hFdmVudFRvKHRoaXMuZWwsIFwiYWN0aW9uXCIsIHtcbiAgICAgICAgICBuYW1lOiBlLnRhcmdldC5kYXRhc2V0LmFjdGlvbixcbiAgICAgICAgICBpZHM6IHRoaXMuc2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjp0b2dnbGVfc2VsZWN0XCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQuaWQgPT09IFwic2VsZWN0LWFsbFwiKSB7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5yZXNvdXJjZV9fc2VsZWN0XCIpXG4gICAgICAgICAgLmZvckVhY2goKGJveCkgPT4gKGJveC5jaGVja2VkID0gZS50YXJnZXQuY2hlY2tlZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKFwiI3NlbGVjdC1hbGxcIikuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGVkID0gQXJyYXkuZnJvbShcbiAgICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbZGF0YS1yZWNvcmQta2V5XTpjaGVja2VkXCIpLFxuICAgICAgICAoZSkgPT4gZS5kYXRhc2V0LnJlY29yZEtleSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItc2VsZWN0XCIpLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiZGlzcGxheVwiKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItbmF2XCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLW5hdlwiKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcImRpc3BsYXlcIik7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLXNlbGVjdFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IFtdO1xuXG4gICAgdmFyIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmRKUyh0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuY2VsbF9fY29weVwiKSwge1xuICAgICAgdGFyZ2V0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICByZXR1cm4gdHJpZ2dlci5jbG9zZXN0KFwiLnJlc291cmNlX19jZWxsXCIpLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNsaXBib2FyZC5vbihcInN1Y2Nlc3NcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIFRvYXN0aWZ5KHtcbiAgICAgICAgdGV4dDogZS50cmlnZ2VyLmRhdGFzZXQubWVzc2FnZSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInRvYXN0X19jb250YWluZXJcIixcbiAgICAgIH0pLnNob3dUb2FzdCgpO1xuICAgIH0pO1xuICB9LFxufTtcblxubGV0IGNzcmZUb2tlbiA9IGRvY3VtZW50XG4gIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcbiAgLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIik7XG5sZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7XG4gIGhvb2tzOiBIb29rcyxcbiAgcGFyYW1zOiB7IF9jc3JmX3Rva2VuOiBjc3JmVG9rZW4gfSxcbn0pO1xuXG4vLyBDb25uZWN0IGlmIHRoZXJlIGFyZSBhbnkgTGl2ZVZpZXdzIG9uIHRoZSBwYWdlXG5saXZlU29ja2V0LmNvbm5lY3QoKTtcblxuaWYgKEVOViA9PSBcImRldlwiKSB7XG4gIGxpdmVTb2NrZXQuZW5hYmxlRGVidWcoKTtcbiAgbGl2ZVNvY2tldC5lbmFibGVMYXRlbmN5U2ltKDIwMCArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE1MDApKTtcbn1cblxud2luZG93LmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBTUEsTUFBQywyQ0FBMEMsTUFBTSxTQUFTO0FBQ3pELFlBQUcs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
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9jbGlwYm9hcmQvZGlzdC9jbGlwYm9hcmQuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy90b3BiYXIvdG9wYmFyLm1pbi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfaHRtbC9wcml2L3N0YXRpYy9waG9lbml4X2h0bWwuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYXJpYS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9lbGVtZW50X3JlZi5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcG9zdF9tb3JwaF9yZXN0b3Jlci5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L25vZGVfbW9kdWxlcy9tb3JwaGRvbS9kaXN0L21vcnBoZG9tLWVzbS5qcyIsICIuLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcGF0Y2guanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvcmVuZGVyZWQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanMuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvanNfY29tbWFuZHMudHMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlld19ob29rLnRzIiwgIi4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3ZpZXcuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvbGl2ZV9zb2NrZXQuanMiLCAiLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaW5kZXgudHMiLCAiLi4vLi4vYXNzZXRzL2pzL2FwcC5qcyIsICIuLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXgtY29sb2NhdGVkL2xpdmVfYWRtaW4vTGl2ZUFkbWluLkNvbXBvbmVudHMuQWxlcnRCYXIvMjBfNmZqbnVhNWNyaHduaWluaXMzYjRxbHRkNDQuanMiLCAiLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4LWNvbG9jYXRlZC9saXZlX2FkbWluL2luZGV4LmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiFcbiAqIGNsaXBib2FyZC5qcyB2Mi4wLjEwXG4gKiBodHRwczovL2NsaXBib2FyZGpzLmNvbS9cbiAqXG4gKiBMaWNlbnNlZCBNSVQgXHUwMEE5IFplbm8gUm9jaGFcbiAqL1xuKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQ2xpcGJvYXJkSlNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQ2xpcGJvYXJkSlNcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA2ODY6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIEVYUE9SVFNcbl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4gIFwiZGVmYXVsdFwiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gY2xpcGJvYXJkOyB9XG59KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy90aW55LWVtaXR0ZXIvaW5kZXguanNcbnZhciB0aW55X2VtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3OSk7XG52YXIgdGlueV9lbWl0dGVyX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHRpbnlfZW1pdHRlcik7XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2dvb2QtbGlzdGVuZXIvc3JjL2xpc3Rlbi5qc1xudmFyIGxpc3RlbiA9IF9fd2VicGFja19yZXF1aXJlX18oMzcwKTtcbnZhciBsaXN0ZW5fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obGlzdGVuKTtcbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvc2VsZWN0L3NyYy9zZWxlY3QuanNcbnZhciBzcmNfc2VsZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTcpO1xudmFyIHNlbGVjdF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzcmNfc2VsZWN0KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vY29tbWFuZC5qc1xuLyoqXG4gKiBFeGVjdXRlcyBhIGdpdmVuIG9wZXJhdGlvbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmQodHlwZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZCh0eXBlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYWN0aW9ucy9jdXQuanNcblxuXG4vKipcbiAqIEN1dCBhY3Rpb24gd3JhcHBlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG52YXIgQ2xpcGJvYXJkQWN0aW9uQ3V0ID0gZnVuY3Rpb24gQ2xpcGJvYXJkQWN0aW9uQ3V0KHRhcmdldCkge1xuICB2YXIgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKSh0YXJnZXQpO1xuICBjb21tYW5kKCdjdXQnKTtcbiAgcmV0dXJuIHNlbGVjdGVkVGV4dDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGFjdGlvbnNfY3V0ID0gKENsaXBib2FyZEFjdGlvbkN1dCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2NyZWF0ZS1mYWtlLWVsZW1lbnQuanNcbi8qKlxuICogQ3JlYXRlcyBhIGZha2UgdGV4dGFyZWEgZWxlbWVudCB3aXRoIGEgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVGYWtlRWxlbWVudCh2YWx1ZSkge1xuICB2YXIgaXNSVEwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKSA9PT0gJ3J0bCc7XG4gIHZhciBmYWtlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7IC8vIFByZXZlbnQgem9vbWluZyBvbiBpT1NcblxuICBmYWtlRWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxMnB0JzsgLy8gUmVzZXQgYm94IG1vZGVsXG5cbiAgZmFrZUVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzAnO1xuICBmYWtlRWxlbWVudC5zdHlsZS5wYWRkaW5nID0gJzAnO1xuICBmYWtlRWxlbWVudC5zdHlsZS5tYXJnaW4gPSAnMCc7IC8vIE1vdmUgZWxlbWVudCBvdXQgb2Ygc2NyZWVuIGhvcml6b250YWxseVxuXG4gIGZha2VFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgZmFrZUVsZW1lbnQuc3R5bGVbaXNSVEwgPyAncmlnaHQnIDogJ2xlZnQnXSA9ICctOTk5OXB4JzsgLy8gTW92ZSBlbGVtZW50IHRvIHRoZSBzYW1lIHBvc2l0aW9uIHZlcnRpY2FsbHlcblxuICB2YXIgeVBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gIGZha2VFbGVtZW50LnN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KHlQb3NpdGlvbiwgXCJweFwiKTtcbiAgZmFrZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTtcbiAgZmFrZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIGZha2VFbGVtZW50O1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2FjdGlvbnMvY29weS5qc1xuXG5cblxuLyoqXG4gKiBDb3B5IGFjdGlvbiB3cmFwcGVyLlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG52YXIgQ2xpcGJvYXJkQWN0aW9uQ29weSA9IGZ1bmN0aW9uIENsaXBib2FyZEFjdGlvbkNvcHkodGFyZ2V0KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgY29udGFpbmVyOiBkb2N1bWVudC5ib2R5XG4gIH07XG4gIHZhciBzZWxlY3RlZFRleHQgPSAnJztcblxuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgZmFrZUVsZW1lbnQgPSBjcmVhdGVGYWtlRWxlbWVudCh0YXJnZXQpO1xuICAgIG9wdGlvbnMuY29udGFpbmVyLmFwcGVuZENoaWxkKGZha2VFbGVtZW50KTtcbiAgICBzZWxlY3RlZFRleHQgPSBzZWxlY3RfZGVmYXVsdCgpKGZha2VFbGVtZW50KTtcbiAgICBjb21tYW5kKCdjb3B5Jyk7XG4gICAgZmFrZUVsZW1lbnQucmVtb3ZlKCk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0X2RlZmF1bHQoKSh0YXJnZXQpO1xuICAgIGNvbW1hbmQoJ2NvcHknKTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RlZFRleHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2NvcHkgPSAoQ2xpcGJvYXJkQWN0aW9uQ29weSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYWN0aW9ucy9kZWZhdWx0LmpzXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG4vKipcbiAqIElubmVyIGZ1bmN0aW9uIHdoaWNoIHBlcmZvcm1zIHNlbGVjdGlvbiBmcm9tIGVpdGhlciBgdGV4dGAgb3IgYHRhcmdldGBcbiAqIHByb3BlcnRpZXMgYW5kIHRoZW4gZXhlY3V0ZXMgY29weSBvciBjdXQgb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cblxudmFyIENsaXBib2FyZEFjdGlvbkRlZmF1bHQgPSBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb25EZWZhdWx0KCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gIC8vIERlZmluZXMgYmFzZSBwcm9wZXJ0aWVzIHBhc3NlZCBmcm9tIGNvbnN0cnVjdG9yLlxuICB2YXIgX29wdGlvbnMkYWN0aW9uID0gb3B0aW9ucy5hY3Rpb24sXG4gICAgICBhY3Rpb24gPSBfb3B0aW9ucyRhY3Rpb24gPT09IHZvaWQgMCA/ICdjb3B5JyA6IF9vcHRpb25zJGFjdGlvbixcbiAgICAgIGNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyLFxuICAgICAgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQsXG4gICAgICB0ZXh0ID0gb3B0aW9ucy50ZXh0OyAvLyBTZXRzIHRoZSBgYWN0aW9uYCB0byBiZSBwZXJmb3JtZWQgd2hpY2ggY2FuIGJlIGVpdGhlciAnY29weScgb3IgJ2N1dCcuXG5cbiAgaWYgKGFjdGlvbiAhPT0gJ2NvcHknICYmIGFjdGlvbiAhPT0gJ2N1dCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJhY3Rpb25cIiB2YWx1ZSwgdXNlIGVpdGhlciBcImNvcHlcIiBvciBcImN1dFwiJyk7XG4gIH0gLy8gU2V0cyB0aGUgYHRhcmdldGAgcHJvcGVydHkgdXNpbmcgYW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgaGF2ZSBpdHMgY29udGVudCBjb3BpZWQuXG5cblxuICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGFyZ2V0ICYmIF90eXBlb2YodGFyZ2V0KSA9PT0gJ29iamVjdCcgJiYgdGFyZ2V0Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBpZiAoYWN0aW9uID09PSAnY29weScgJiYgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFBsZWFzZSB1c2UgXCJyZWFkb25seVwiIGluc3RlYWQgb2YgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aW9uID09PSAnY3V0JyAmJiAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSB8fCB0YXJnZXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJ0YXJnZXRcIiBhdHRyaWJ1dGUuIFlvdSBjYW5cXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCBcInJlYWRvbmx5XCIgb3IgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZXMnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFwidGFyZ2V0XCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtcbiAgICB9XG4gIH0gLy8gRGVmaW5lIHNlbGVjdGlvbiBzdHJhdGVneSBiYXNlZCBvbiBgdGV4dGAgcHJvcGVydHkuXG5cblxuICBpZiAodGV4dCkge1xuICAgIHJldHVybiBhY3Rpb25zX2NvcHkodGV4dCwge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9KTtcbiAgfSAvLyBEZWZpbmVzIHdoaWNoIHNlbGVjdGlvbiBzdHJhdGVneSBiYXNlZCBvbiBgdGFyZ2V0YCBwcm9wZXJ0eS5cblxuXG4gIGlmICh0YXJnZXQpIHtcbiAgICByZXR1cm4gYWN0aW9uID09PSAnY3V0JyA/IGFjdGlvbnNfY3V0KHRhcmdldCkgOiBhY3Rpb25zX2NvcHkodGFyZ2V0LCB7XG4gICAgICBjb250YWluZXI6IGNvbnRhaW5lclxuICAgIH0pO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBhY3Rpb25zX2RlZmF1bHQgPSAoQ2xpcGJvYXJkQWN0aW9uRGVmYXVsdCk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY2xpcGJvYXJkLmpzXG5mdW5jdGlvbiBjbGlwYm9hcmRfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBjbGlwYm9hcmRfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IGNsaXBib2FyZF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gY2xpcGJvYXJkX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoY2xpcGJvYXJkX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cblxuXG5cblxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3VmZml4XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShzdWZmaXgsIGVsZW1lbnQpIHtcbiAgdmFyIGF0dHJpYnV0ZSA9IFwiZGF0YS1jbGlwYm9hcmQtXCIuY29uY2F0KHN1ZmZpeCk7XG5cbiAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3Mgd2hpY2ggdGFrZXMgb25lIG9yIG1vcmUgZWxlbWVudHMsIGFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZW0sXG4gKiBhbmQgaW5zdGFudGlhdGVzIGEgbmV3IGBDbGlwYm9hcmRBY3Rpb25gIG9uIGVhY2ggY2xpY2suXG4gKi9cblxuXG52YXIgQ2xpcGJvYXJkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRW1pdHRlcikge1xuICBfaW5oZXJpdHMoQ2xpcGJvYXJkLCBfRW1pdHRlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDbGlwYm9hcmQpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gQ2xpcGJvYXJkKHRyaWdnZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xpcGJvYXJkKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBfdGhpcy5yZXNvbHZlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIF90aGlzLmxpc3RlbkNsaWNrKHRyaWdnZXIpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBEZWZpbmVzIGlmIGF0dHJpYnV0ZXMgd291bGQgYmUgcmVzb2x2ZWQgdXNpbmcgaW50ZXJuYWwgc2V0dGVyIGZ1bmN0aW9uc1xuICAgKiBvciBjdXN0b20gZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhDbGlwYm9hcmQsIFt7XG4gICAga2V5OiBcInJlc29sdmVPcHRpb25zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29sdmVPcHRpb25zKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdGhpcy5hY3Rpb24gPSB0eXBlb2Ygb3B0aW9ucy5hY3Rpb24gPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmFjdGlvbiA6IHRoaXMuZGVmYXVsdEFjdGlvbjtcbiAgICAgIHRoaXMudGFyZ2V0ID0gdHlwZW9mIG9wdGlvbnMudGFyZ2V0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50YXJnZXQgOiB0aGlzLmRlZmF1bHRUYXJnZXQ7XG4gICAgICB0aGlzLnRleHQgPSB0eXBlb2Ygb3B0aW9ucy50ZXh0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50ZXh0IDogdGhpcy5kZWZhdWx0VGV4dDtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gY2xpcGJvYXJkX3R5cGVvZihvcHRpb25zLmNvbnRhaW5lcikgPT09ICdvYmplY3QnID8gb3B0aW9ucy5jb250YWluZXIgOiBkb2N1bWVudC5ib2R5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHBhc3NlZCB0cmlnZ2VyLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0cmlnZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsaXN0ZW5DbGlja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0ZW5DbGljayh0cmlnZ2VyKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3Rlbl9kZWZhdWx0KCkodHJpZ2dlciwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5vbkNsaWNrKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYSBuZXcgYENsaXBib2FyZEFjdGlvbmAgb24gZWFjaCBjbGljayBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvbkNsaWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBlLmRlbGVnYXRlVGFyZ2V0IHx8IGUuY3VycmVudFRhcmdldDtcbiAgICAgIHZhciBhY3Rpb24gPSB0aGlzLmFjdGlvbih0cmlnZ2VyKSB8fCAnY29weSc7XG4gICAgICB2YXIgdGV4dCA9IGFjdGlvbnNfZGVmYXVsdCh7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxuICAgICAgICB0YXJnZXQ6IHRoaXMudGFyZ2V0KHRyaWdnZXIpLFxuICAgICAgICB0ZXh0OiB0aGlzLnRleHQodHJpZ2dlcilcbiAgICAgIH0pOyAvLyBGaXJlcyBhbiBldmVudCBiYXNlZCBvbiB0aGUgY29weSBvcGVyYXRpb24gcmVzdWx0LlxuXG4gICAgICB0aGlzLmVtaXQodGV4dCA/ICdzdWNjZXNzJyA6ICdlcnJvcicsIHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgIGNsZWFyU2VsZWN0aW9uOiBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlcikge1xuICAgICAgICAgICAgdHJpZ2dlci5mb2N1cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYGFjdGlvbmAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdEFjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0QWN0aW9uKHRyaWdnZXIpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgnYWN0aW9uJywgdHJpZ2dlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYHRhcmdldGAgbG9va3VwIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdHJpZ2dlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFRhcmdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGFyZ2V0KHRyaWdnZXIpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGdldEF0dHJpYnV0ZVZhbHVlKCd0YXJnZXQnLCB0cmlnZ2VyKTtcblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3cgZmlyZSBwcm9ncmFtbWF0aWNhbGx5IGEgY29weSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyBUZXh0IGNvcGllZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUZXh0XCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGB0ZXh0YCBsb29rdXAgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0cmlnZ2VyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRUZXh0KHRyaWdnZXIpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgndGV4dCcsIHRyaWdnZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGxpZmVjeWNsZS5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSh0YXJnZXQpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keVxuICAgICAgfTtcbiAgICAgIHJldHVybiBhY3Rpb25zX2NvcHkodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3cgZmlyZSBwcm9ncmFtbWF0aWNhbGx5IGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0YXJnZXRcbiAgICAgKiBAcmV0dXJucyBUZXh0IGN1dHRlZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImN1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjdXQodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gYWN0aW9uc19jdXQodGFyZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3VwcG9ydCBvZiB0aGUgZ2l2ZW4gYWN0aW9uLCBvciBhbGwgYWN0aW9ucyBpZiBubyBhY3Rpb24gaXNcbiAgICAgKiBnaXZlbi5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2FjdGlvbl1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzU3VwcG9ydGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkge1xuICAgICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWydjb3B5JywgJ2N1dCddO1xuICAgICAgdmFyIGFjdGlvbnMgPSB0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJyA/IFthY3Rpb25dIDogYWN0aW9uO1xuICAgICAgdmFyIHN1cHBvcnQgPSAhIWRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZDtcbiAgICAgIGFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ICYmICEhZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKGFjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdXBwb3J0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDbGlwYm9hcmQ7XG59KCh0aW55X2VtaXR0ZXJfZGVmYXVsdCgpKSk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGNsaXBib2FyZCA9IChDbGlwYm9hcmQpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODI4OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG52YXIgRE9DVU1FTlRfTk9ERV9UWVBFID0gOTtcblxuLyoqXG4gKiBBIHBvbHlmaWxsIGZvciBFbGVtZW50Lm1hdGNoZXMoKVxuICovXG5pZiAodHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmICFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgdmFyIHByb3RvID0gRWxlbWVudC5wcm90b3R5cGU7XG5cbiAgICBwcm90by5tYXRjaGVzID0gcHJvdG8ubWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3RvLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBwcm90by5vTWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgY2xvc2VzdCBwYXJlbnQgdGhhdCBtYXRjaGVzIGEgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3JcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjbG9zZXN0IChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IERPQ1VNRU5UX05PREVfVFlQRSkge1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb3Nlc3Q7XG5cblxuLyoqKi8gfSksXG5cbi8qKiovIDQzODpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgY2xvc2VzdCA9IF9fd2VicGFja19yZXF1aXJlX18oODI4KTtcblxuLyoqXG4gKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2RlbGVnYXRlKGVsZW1lbnQsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIHZhciBsaXN0ZW5lckZuID0gbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERlbGVnYXRlcyBldmVudCB0byBhIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd8QXJyYXl9IFtlbGVtZW50c11cbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmVcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVsZWdhdGUoZWxlbWVudHMsIHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkge1xuICAgIC8vIEhhbmRsZSB0aGUgcmVndWxhciBFbGVtZW50IHVzYWdlXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50cy5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBfZGVsZWdhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgRWxlbWVudC1sZXNzIHVzYWdlLCBpdCBkZWZhdWx0cyB0byBnbG9iYWwgZGVsZWdhdGlvblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgYGRvY3VtZW50YCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCB0aGVuIGFwcGx5IGFyZ3VtZW50c1xuICAgICAgICAvLyBUaGlzIGlzIGEgc2hvcnQgd2F5IHRvIC51bnNoaWZ0IGBhcmd1bWVudHNgIHdpdGhvdXQgcnVubmluZyBpbnRvIGRlb3B0aW1pemF0aW9uc1xuICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmJpbmQobnVsbCwgZG9jdW1lbnQpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIFNlbGVjdG9yLWJhc2VkIHVzYWdlXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgQXJyYXktbGlrZSBiYXNlZCB1c2FnZVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfZGVsZWdhdGUoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBGaW5kcyBjbG9zZXN0IG1hdGNoIGFuZCBpbnZva2VzIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBsaXN0ZW5lcihlbGVtZW50LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZSkge1xuICAgICAgICBlLmRlbGVnYXRlVGFyZ2V0ID0gY2xvc2VzdChlLnRhcmdldCwgc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmIChlLmRlbGVnYXRlVGFyZ2V0KSB7XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKGVsZW1lbnQsIGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbGVnYXRlO1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyA4Nzk6XG4vKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIEhUTUwgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMubm9kZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICAgICAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBsaXN0IG9mIEhUTUwgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnRzLm5vZGVMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiAodHlwZSA9PT0gJ1tvYmplY3QgTm9kZUxpc3RdJyB8fCB0eXBlID09PSAnW29iamVjdCBIVE1MQ29sbGVjdGlvbl0nKVxuICAgICAgICAmJiAoJ2xlbmd0aCcgaW4gdmFsdWUpXG4gICAgICAgICYmICh2YWx1ZS5sZW5ndGggPT09IDAgfHwgZXhwb3J0cy5ub2RlKHZhbHVlWzBdKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5zdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0cy5mbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAzNzA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxudmFyIGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzkpO1xudmFyIGRlbGVnYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MzgpO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhbGwgcGFyYW1zIGFuZCBjYWxscyB0aGUgcmlnaHRcbiAqIGxpc3RlbmVyIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyB0YXJnZXQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbGlzdGVuKHRhcmdldCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRhcmdldCAmJiAhdHlwZSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGlmICghaXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpcy5mbihjYWxsYmFjaykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhpcmQgYXJndW1lbnQgbXVzdCBiZSBhIEZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzLm5vZGUodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuTm9kZSh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXMubm9kZUxpc3QodGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gbGlzdGVuTm9kZUxpc3QodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzLnN0cmluZyh0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5TZWxlY3Rvcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhIEhUTUwgZWxlbWVudFxuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3Rlbk5vZGUobm9kZSwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50c1xuICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbn0gbm9kZUxpc3RcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBsaXN0ZW5Ob2RlTGlzdChub2RlTGlzdCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZUxpc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgc2VsZWN0b3JcbiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGxpc3RlblNlbGVjdG9yKHNlbGVjdG9yLCB0eXBlLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBkZWxlZ2F0ZShkb2N1bWVudC5ib2R5LCBzZWxlY3RvciwgdHlwZSwgY2FsbGJhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RlbjtcblxuXG4vKioqLyB9KSxcblxuLyoqKi8gODE3OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBzZWxlY3QoZWxlbWVudCkge1xuICAgIHZhciBzZWxlY3RlZFRleHQ7XG5cbiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC5ub2RlTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICB2YXIgaXNSZWFkT25seSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpO1xuXG4gICAgICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBlbGVtZW50LnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKCFpc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpKSB7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuXG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAgIHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RlZFRleHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2VsZWN0O1xuXG5cbi8qKiovIH0pLFxuXG4vKioqLyAyNzk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbmZ1bmN0aW9uIEUgKCkge1xuICAvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tXG4gIC8vICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2xpcHNtYWNrIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9pc3N1ZXMvMylcbn1cblxuRS5wcm90b3R5cGUgPSB7XG4gIG9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG5cbiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7XG4gICAgICBmbjogY2FsbGJhY2ssXG4gICAgICBjdHg6IGN0eFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgb25jZTogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgc2VsZi5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2tcbiAgICByZXR1cm4gdGhpcy5vbihuYW1lLCBsaXN0ZW5lciwgY3R4KTtcbiAgfSxcblxuICBlbWl0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBkYXRhID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGxlbiA9IGV2dEFyci5sZW5ndGg7XG5cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgZXZ0QXJyW2ldLmZuLmFwcGx5KGV2dEFycltpXS5jdHgsIGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9mZjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTtcbiAgICB2YXIgZXZ0cyA9IGVbbmFtZV07XG4gICAgdmFyIGxpdmVFdmVudHMgPSBbXTtcblxuICAgIGlmIChldnRzICYmIGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXZ0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaylcbiAgICAgICAgICBsaXZlRXZlbnRzLnB1c2goZXZ0c1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGV2ZW50IGZyb20gcXVldWUgdG8gcHJldmVudCBtZW1vcnkgbGVha1xuICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZFxuICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9jb21taXQvYzZlYmZhYTliYzk3M2IzM2QxMTBhODRhMzA3NzQyYjdjZjk0Yzk1MyNjb21taXRjb21tZW50LTUwMjQ5MTBcblxuICAgIChsaXZlRXZlbnRzLmxlbmd0aClcbiAgICAgID8gZVtuYW1lXSA9IGxpdmVFdmVudHNcbiAgICAgIDogZGVsZXRlIGVbbmFtZV07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFO1xubW9kdWxlLmV4cG9ydHMuVGlueUVtaXR0ZXIgPSBFO1xuXG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqL1xuLyoqKioqKi8gXHQhZnVuY3Rpb24oKSB7XG4vKioqKioqLyBcdFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0oKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQgKi9cbi8qKioqKiovIFx0IWZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH1cbi8qKioqKiovIFx0fSgpO1xuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkXG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4Nik7XG4vKioqKioqLyB9KSgpXG4uZGVmYXVsdDtcbn0pOyIsICIvKipcbiAqIEBsaWNlbnNlIE1JVFxuICogdG9wYmFyIDEuMC4wLCAyMDIxLTAxLTA2XG4gKiBodHRwOi8vYnV1bmd1eWVuLmdpdGh1Yi5pby90b3BiYXJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBCdXUgTmd1eWVuXG4gKi9cbihmdW5jdGlvbih3aW5kb3csZG9jdW1lbnQpe1widXNlIHN0cmljdFwiOyFmdW5jdGlvbigpe2Zvcih2YXIgbGFzdFRpbWU9MCx2ZW5kb3JzPVtcIm1zXCIsXCJtb3pcIixcIndlYmtpdFwiLFwib1wiXSx4PTA7eDx2ZW5kb3JzLmxlbmd0aCYmIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7Kyt4KXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9d2luZG93W3ZlbmRvcnNbeF0rXCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIl0sd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPXdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl18fHdpbmRvd1t2ZW5kb3JzW3hdK1wiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGNhbGxiYWNrLGVsZW1lbnQpe3ZhciBjdXJyVGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aW1lVG9DYWxsPU1hdGgubWF4KDAsMTYtKGN1cnJUaW1lLWxhc3RUaW1lKSksaWQ9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtjYWxsYmFjayhjdXJyVGltZSt0aW1lVG9DYWxsKX0sdGltZVRvQ2FsbCk7cmV0dXJuIGxhc3RUaW1lPWN1cnJUaW1lK3RpbWVUb0NhbGwsaWR9KSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oaWQpe2NsZWFyVGltZW91dChpZCl9KX0oKTtmdW5jdGlvbiByZXBhaW50KCl7Y2FudmFzLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoLGNhbnZhcy5oZWlnaHQ9NSpvcHRpb25zLmJhclRoaWNrbmVzczt2YXIgY3R4PWNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7Y3R4LnNoYWRvd0JsdXI9b3B0aW9ucy5zaGFkb3dCbHVyLGN0eC5zaGFkb3dDb2xvcj1vcHRpb25zLnNoYWRvd0NvbG9yO3ZhciBzdG9wLGxpbmVHcmFkaWVudD1jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwwLGNhbnZhcy53aWR0aCwwKTtmb3Ioc3RvcCBpbiBvcHRpb25zLmJhckNvbG9ycylsaW5lR3JhZGllbnQuYWRkQ29sb3JTdG9wKHN0b3Asb3B0aW9ucy5iYXJDb2xvcnNbc3RvcF0pO2N0eC5saW5lV2lkdGg9b3B0aW9ucy5iYXJUaGlja25lc3MsY3R4LmJlZ2luUGF0aCgpLGN0eC5tb3ZlVG8oMCxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHgubGluZVRvKE1hdGguY2VpbChjdXJyZW50UHJvZ3Jlc3MqY2FudmFzLndpZHRoKSxvcHRpb25zLmJhclRoaWNrbmVzcy8yKSxjdHguc3Ryb2tlU3R5bGU9bGluZUdyYWRpZW50LGN0eC5zdHJva2UoKX12YXIgY2FudmFzLHByb2dyZXNzVGltZXJJZCxmYWRlVGltZXJJZCxjdXJyZW50UHJvZ3Jlc3Msc2hvd2luZyxvcHRpb25zPXthdXRvUnVuOiEwLGJhclRoaWNrbmVzczozLGJhckNvbG9yczp7MDpcInJnYmEoMjYsICAxODgsIDE1NiwgLjkpXCIsXCIuMjVcIjpcInJnYmEoNTIsICAxNTIsIDIxOSwgLjkpXCIsXCIuNTBcIjpcInJnYmEoMjQxLCAxOTYsIDE1LCAgLjkpXCIsXCIuNzVcIjpcInJnYmEoMjMwLCAxMjYsIDM0LCAgLjkpXCIsXCIxLjBcIjpcInJnYmEoMjExLCA4NCwgIDAsICAgLjkpXCJ9LHNoYWRvd0JsdXI6MTAsc2hhZG93Q29sb3I6XCJyZ2JhKDAsICAgMCwgICAwLCAgIC42KVwiLGNsYXNzTmFtZTpudWxsfSx0b3BiYXI9e2NvbmZpZzpmdW5jdGlvbihvcHRzKXtmb3IodmFyIGtleSBpbiBvcHRzKW9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSYmKG9wdGlvbnNba2V5XT1vcHRzW2tleV0pfSxzaG93OmZ1bmN0aW9uKCl7dmFyIHR5cGUsaGFuZGxlcixlbGVtO3Nob3dpbmd8fChzaG93aW5nPSEwLG51bGwhPT1mYWRlVGltZXJJZCYmd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZhZGVUaW1lcklkKSxjYW52YXN8fCgoZWxlbT0oY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLnN0eWxlKS5wb3NpdGlvbj1cImZpeGVkXCIsZWxlbS50b3A9ZWxlbS5sZWZ0PWVsZW0ucmlnaHQ9ZWxlbS5tYXJnaW49ZWxlbS5wYWRkaW5nPTAsZWxlbS56SW5kZXg9MTAwMDAxLGVsZW0uZGlzcGxheT1cIm5vbmVcIixvcHRpb25zLmNsYXNzTmFtZSYmY2FudmFzLmNsYXNzTGlzdC5hZGQob3B0aW9ucy5jbGFzc05hbWUpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKSx0eXBlPVwicmVzaXplXCIsaGFuZGxlcj1yZXBhaW50LChlbGVtPXdpbmRvdykuYWRkRXZlbnRMaXN0ZW5lcj9lbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSxoYW5kbGVyLCExKTplbGVtLmF0dGFjaEV2ZW50P2VsZW0uYXR0YWNoRXZlbnQoXCJvblwiK3R5cGUsaGFuZGxlcik6ZWxlbVtcIm9uXCIrdHlwZV09aGFuZGxlciksY2FudmFzLnN0eWxlLm9wYWNpdHk9MSxjYW52YXMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdG9wYmFyLnByb2dyZXNzKDApLG9wdGlvbnMuYXV0b1J1biYmZnVuY3Rpb24gbG9vcCgpe3Byb2dyZXNzVGltZXJJZD13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApLHRvcGJhci5wcm9ncmVzcyhcIitcIisuMDUqTWF0aC5wb3coMS1NYXRoLnNxcnQoY3VycmVudFByb2dyZXNzKSwyKSl9KCkpfSxwcm9ncmVzczpmdW5jdGlvbih0byl7cmV0dXJuIHZvaWQgMD09PXRvfHwoXCJzdHJpbmdcIj09dHlwZW9mIHRvJiYodG89KDA8PXRvLmluZGV4T2YoXCIrXCIpfHwwPD10by5pbmRleE9mKFwiLVwiKT9jdXJyZW50UHJvZ3Jlc3M6MCkrcGFyc2VGbG9hdCh0bykpLGN1cnJlbnRQcm9ncmVzcz0xPHRvPzE6dG8scmVwYWludCgpKSxjdXJyZW50UHJvZ3Jlc3N9LGhpZGU6ZnVuY3Rpb24oKXtzaG93aW5nJiYoc2hvd2luZz0hMSxudWxsIT1wcm9ncmVzc1RpbWVySWQmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NUaW1lcklkKSxwcm9ncmVzc1RpbWVySWQ9bnVsbCksZnVuY3Rpb24gbG9vcCgpe3JldHVybiAxPD10b3BiYXIucHJvZ3Jlc3MoXCIrLjFcIikmJihjYW52YXMuc3R5bGUub3BhY2l0eS09LjA1LGNhbnZhcy5zdHlsZS5vcGFjaXR5PD0uMDUpPyhjYW52YXMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix2b2lkKGZhZGVUaW1lcklkPW51bGwpKTp2b2lkKGZhZGVUaW1lcklkPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCkpfSgpKX19O1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10b3BiYXI6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiB0b3BiYXJ9KTp0aGlzLnRvcGJhcj10b3BiYXJ9KS5jYWxsKHRoaXMsd2luZG93LGRvY3VtZW50KTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbigpIHtcbiAgdmFyIFBvbHlmaWxsRXZlbnQgPSBldmVudENvbnN0cnVjdG9yKCk7XG5cbiAgZnVuY3Rpb24gZXZlbnRDb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gd2luZG93LkN1c3RvbUV2ZW50O1xuICAgIC8vIElFPD05IFN1cHBvcnRcbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2J1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWR9O1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBldnQ7XG4gICAgfVxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRIaWRkZW5JbnB1dChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICBpbnB1dC5uYW1lID0gbmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGVsZW1lbnQsIHRhcmdldE1vZGlmaWVyS2V5KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgc3VibWl0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLFxuICAgICAgICB0YXJnZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcblxuICAgIGZvcm0ubWV0aG9kID0gKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikgPT09IFwiZ2V0XCIpID8gXCJnZXRcIiA6IFwicG9zdFwiO1xuICAgIGZvcm0uYWN0aW9uID0gdG87XG4gICAgZm9ybS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcbiAgICBlbHNlIGlmICh0YXJnZXRNb2RpZmllcktleSkgZm9ybS50YXJnZXQgPSBcIl9ibGFua1wiO1xuXG4gICAgZm9ybS5hcHBlbmRDaGlsZChjc3JmKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKG1ldGhvZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcblxuICAgIC8vIEluc2VydCBhIGJ1dHRvbiBhbmQgY2xpY2sgaXQgaW5zdGVhZCBvZiB1c2luZyBgZm9ybS5zdWJtaXRgXG4gICAgLy8gYmVjYXVzZSB0aGUgYHN1Ym1pdGAgZnVuY3Rpb24gZG9lcyBub3QgZW1pdCBhIGBzdWJtaXRgIGV2ZW50LlxuICAgIHN1Ym1pdC50eXBlID0gXCJzdWJtaXRcIjtcbiAgICBmb3JtLmFwcGVuZENoaWxkKHN1Ym1pdCk7XG4gICAgc3VibWl0LmNsaWNrKCk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICB2YXIgcGhvZW5peExpbmtFdmVudCA9IG5ldyBQb2x5ZmlsbEV2ZW50KCdwaG9lbml4LmxpbmsuY2xpY2snLCB7XG4gICAgICAgIFwiYnViYmxlc1wiOiB0cnVlLCBcImNhbmNlbGFibGVcIjogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghZWxlbWVudC5kaXNwYXRjaEV2ZW50KHBob2VuaXhMaW5rRXZlbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1ldGhvZFwiKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdG9cIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCwgZS5tZXRhS2V5IHx8IGUuc2hpZnRLZXkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9LCBmYWxzZSk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bob2VuaXgubGluay5jbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbmZpcm1cIik7XG4gICAgaWYobWVzc2FnZSAmJiAhd2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbn0pKCk7XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCBnbG9iYWxUaGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cblxuZXhwb3J0IGNvbnN0IFRSQU5TUE9SVFMgPSB7XG4gIGxvbmdwb2xsOiBcImxvbmdwb2xsXCIsXG4gIHdlYnNvY2tldDogXCJ3ZWJzb2NrZXRcIlxufVxuZXhwb3J0IGNvbnN0IFhIUl9TVEFURVMgPSB7XG4gIGNvbXBsZXRlOiA0XG59XG5leHBvcnQgY29uc3QgQVVUSF9UT0tFTl9QUkVGSVggPSBcImJhc2U2NHVybC5iZWFyZXIucGh4LlwiXG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfU1RBVEVTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgUHVzaCBmcm9tIFwiLi9wdXNoXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gcGFyYW1zXG4gKiBAcGFyYW0ge1NvY2tldH0gc29ja2V0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5uZWwge1xuICBjb25zdHJ1Y3Rvcih0b3BpYywgcGFyYW1zLCBzb2NrZXQpe1xuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLnRvcGljID0gdG9waWNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5iaW5kaW5ncyA9IFtdXG4gICAgdGhpcy5iaW5kaW5nUmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXRcbiAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZVxuICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KVxuICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMgPSBbXVxuXG4gICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSwgdGhpcy5zb2NrZXQucmVqb2luQWZ0ZXJNcylcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uRXJyb3IoKCkgPT4gdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpKSlcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuaXNFcnJvcmVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9KVxuICAgIClcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkXG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKHB1c2hFdmVudCA9PiBwdXNoRXZlbnQuc2VuZCgpKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuam9pblJlZigpfWApXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgICB0aGlzLnNvY2tldC5yZW1vdmUodGhpcylcbiAgICB9KVxuICAgIHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pXG4gICAgICBpZih0aGlzLmlzSm9pbmluZygpKXsgdGhpcy5qb2luUHVzaC5yZXNldCgpIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGB0aW1lb3V0ICR7dGhpcy50b3BpY30gKCR7dGhpcy5qb2luUmVmKCl9KWAsIHRoaXMuam9pblB1c2gudGltZW91dClcbiAgICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRoaXMudGltZW91dClcbiAgICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICB0aGlzLmpvaW5QdXNoLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLnJlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlXG4gICAgICB0aGlzLnJlam9pbigpXG4gICAgICByZXR1cm4gdGhpcy5qb2luUHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBjbG9zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjayl7XG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgZXJyb3JzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkVycm9yKGNhbGxiYWNrKXtcbiAgICByZXR1cm4gdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwgcmVhc29uID0+IGNhbGxiYWNrKHJlYXNvbikpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBvbiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBTdWJzY3JpcHRpb24gcmV0dXJucyBhIHJlZiBjb3VudGVyLCB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0b1xuICAgKiB1bnN1YnNjcmliZSB0aGUgZXhhY3QgZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY29uc3QgcmVmMiA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19vdGhlcl9zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKiAvLyBTaW5jZSB1bnN1YnNjcmlwdGlvbiwgZG9fc3R1ZmYgd29uJ3QgZmlyZSxcbiAgICogLy8gd2hpbGUgZG9fb3RoZXJfc3R1ZmYgd2lsbCBrZWVwIGZpcmluZyBvbiB0aGUgXCJldmVudFwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvbihldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLmJpbmRpbmdSZWYrK1xuICAgIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQsIHJlZiwgY2FsbGJhY2t9KVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgb2ZmIG9mIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFVzZSB0aGUgcmVmIHJldHVybmVkIGZyb20gYSBjaGFubmVsLm9uKCkgdG8gdW5zdWJzY3JpYmUgb25lXG4gICAqIGhhbmRsZXIsIG9yIHBhc3Mgbm90aGluZyBmb3IgdGhlIHJlZiB0byB1bnN1YnNjcmliZSBhbGxcbiAgICogaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5zdWJzY3JpYmUgdGhlIGRvX3N0dWZmIGhhbmRsZXJcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKlxuICAgKiAvLyBVbnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgZnJvbSBldmVudFxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb2ZmKGV2ZW50LCByZWYpe1xuICAgIHRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgcmV0dXJuICEoYmluZC5ldmVudCA9PT0gZXZlbnQgJiYgKHR5cGVvZiByZWYgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVmID09PSBiaW5kLnJlZikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuUHVzaCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLmlzSm9pbmVkKCkgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgYGV2ZW50YCB0byBwaG9lbml4IHdpdGggdGhlIHBheWxvYWQgYHBheWxvYWRgLlxuICAgKiBQaG9lbml4IHJlY2VpdmVzIHRoaXMgaW4gdGhlIGBoYW5kbGVfaW4oZXZlbnQsIHBheWxvYWQsIHNvY2tldClgXG4gICAqIGZ1bmN0aW9uLiBpZiBwaG9lbml4IHJlcGxpZXMgb3IgaXQgdGltZXMgb3V0IChkZWZhdWx0IDEwMDAwbXMpLFxuICAgKiB0aGVuIG9wdGlvbmFsbHkgdGhlIHJlcGx5IGNhbiBiZSByZWNlaXZlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5wdXNoKFwiZXZlbnRcIilcbiAgICogICAucmVjZWl2ZShcIm9rXCIsIHBheWxvYWQgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IHJlcGxpZWQ6XCIsIHBheWxvYWQpKVxuICAgKiAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgZXJyID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCBlcnJvcmVkXCIsIGVycikpXG4gICAqICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IGNvbnNvbGUubG9nKFwidGltZWQgb3V0IHB1c2hpbmdcIikpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge31cbiAgICBpZighdGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuam9pbigpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2ApXG4gICAgfVxuICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgZnVuY3Rpb24gKCl7IHJldHVybiBwYXlsb2FkIH0sIHRpbWVvdXQpXG4gICAgaWYodGhpcy5jYW5QdXNoKCkpe1xuICAgICAgcHVzaEV2ZW50LnNlbmQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcHVzaEV2ZW50XG4gIH1cblxuICAvKiogTGVhdmVzIHRoZSBjaGFubmVsXG4gICAqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZFxuICAgKiBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyXG4gICAqXG4gICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rc1xuICAgKlxuICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYHJlY2VpdmVgXG4gICAqIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAqXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGxlYXZlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgIHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpXG5cbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZ1xuICAgIGxldCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGxlYXZlICR7dGhpcy50b3BpY31gKVxuICAgICAgdGhpcy50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBcImxlYXZlXCIpXG4gICAgfVxuICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRpbWVvdXQpXG4gICAgbGVhdmVQdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICBpZighdGhpcy5jYW5QdXNoKCkpeyBsZWF2ZVB1c2gudHJpZ2dlcihcIm9rXCIsIHt9KSB9XG5cbiAgICByZXR1cm4gbGVhdmVQdXNoXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAqXG4gICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICogYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICpcbiAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBvbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKXsgcmV0dXJuIHBheWxvYWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmKXtcbiAgICBpZih0aGlzLnRvcGljICE9PSB0b3BpYyl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZihqb2luUmVmICYmIGpvaW5SZWYgIT09IHRoaXMuam9pblJlZigpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgWEhSX1NUQVRFU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcblxuICBzdGF0aWMgcmVxdWVzdChtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBpZihnbG9iYWwuWERvbWFpblJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWERvbWFpblJlcXVlc3QoKSAvLyBJRTgsIElFOVxuICAgICAgcmV0dXJuIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuWE1MSHR0cFJlcXVlc3Qpe1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKSAvLyBJRTcrLCBGaXJlZm94LCBDaHJvbWUsIE9wZXJhLCBTYWZhcmlcbiAgICAgIHJldHVybiB0aGlzLnhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSBpZihnbG9iYWwuZmV0Y2ggJiYgZ2xvYmFsLkFib3J0Q29udHJvbGxlcil7XG4gICAgICAvLyBGZXRjaCB3aXRoIEFib3J0Q29udHJvbGxlciBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICByZXR1cm4gdGhpcy5mZXRjaFJlcXVlc3QobWV0aG9kLCBlbmRQb2ludCwgaGVhZGVycywgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3VpdGFibGUgWE1MSHR0cFJlcXVlc3QgaW1wbGVtZW50YXRpb24gZm91bmRcIilcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZmV0Y2hSZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGhlYWRlcnMsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgfVxuICAgIGxldCBjb250cm9sbGVyID0gbnVsbFxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuICAgICAgb3B0aW9ucy5zaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbFxuICAgIH1cbiAgICBnbG9iYWwuZmV0Y2goZW5kUG9pbnQsIG9wdGlvbnMpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAudGhlbihkYXRhID0+IHRoaXMucGFyc2VKU09OKGRhdGEpKVxuICAgICAgLnRoZW4oZGF0YSA9PiBjYWxsYmFjayAmJiBjYWxsYmFjayhkYXRhKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZihlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIgJiYgb250aW1lb3V0KXtcbiAgICAgICAgICBvbnRpbWVvdXQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgcmV0dXJuIGNvbnRyb2xsZXJcbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gICAgcmV0dXJuIHJlcVxuICB9XG5cbiAgc3RhdGljIHhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBoZWFkZXJzLCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50LCB0cnVlKVxuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIGZvcihsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKXtcbiAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJlcS5vbmVycm9yID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbClcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IFhIUl9TVEFURVMuY29tcGxldGUgJiYgY2FsbGJhY2spe1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgICBjYWxsYmFjayhyZXNwb25zZSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICAgIHJldHVybiByZXFcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgQVVUSF9UT0tFTl9QUkVGSVhcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEFqYXggZnJvbSBcIi4vYWpheFwiXG5cbmxldCBhcnJheUJ1ZmZlclRvQmFzZTY0ID0gKGJ1ZmZlcikgPT4ge1xuICBsZXQgYmluYXJ5ID0gXCJcIlxuICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpXG4gIGxldCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoXG4gIGZvcihsZXQgaSA9IDA7IGkgPCBsZW47IGkrKyl7IGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKSB9XG4gIHJldHVybiBidG9hKGJpbmFyeSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBwcm90b2NvbHMpe1xuICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBzdWJwcm90b2NvbHMgZm9yIGF1dGhUb2tlblxuICAgIC8vIFtcInBob2VuaXhcIiwgXCJiYXNlNjR1cmwuYmVhcmVyLnBoeC5CQVNFNjRfRU5DT0RFRF9UT0tFTlwiXVxuICAgIGlmKHByb3RvY29scyAmJiBwcm90b2NvbHMubGVuZ3RoID09PSAyICYmIHByb3RvY29sc1sxXS5zdGFydHNXaXRoKEFVVEhfVE9LRU5fUFJFRklYKSl7XG4gICAgICB0aGlzLmF1dGhUb2tlbiA9IGF0b2IocHJvdG9jb2xzWzFdLnNsaWNlKEFVVEhfVE9LRU5fUFJFRklYLmxlbmd0aCkpXG4gICAgfVxuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsXG4gICAgdGhpcy50b2tlbiA9IG51bGxcbiAgICB0aGlzLnNraXBIZWFydGJlYXQgPSB0cnVlXG4gICAgdGhpcy5yZXFzID0gbmV3IFNldCgpXG4gICAgdGhpcy5hd2FpdGluZ0JhdGNoQWNrID0gZmFsc2VcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IG51bGxcbiAgICB0aGlzLmN1cnJlbnRCYXRjaFRpbWVyID0gbnVsbFxuICAgIHRoaXMuYmF0Y2hCdWZmZXIgPSBbXVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxlciB0byBmaW5pc2ggc2V0dGluZyB1cCBvdXIgY2FsbGJhY2tzIGFuZCB0aW1lb3V0IHByb3BlcnRpZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucG9sbCgpLCAwKVxuICB9XG5cbiAgbm9ybWFsaXplRW5kcG9pbnQoZW5kUG9pbnQpe1xuICAgIHJldHVybiAoZW5kUG9pbnRcbiAgICAgIC5yZXBsYWNlKFwid3M6Ly9cIiwgXCJodHRwOi8vXCIpXG4gICAgICAucmVwbGFjZShcIndzczovL1wiLCBcImh0dHBzOi8vXCIpXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKFwiKC4qKVxcL1wiICsgVFJBTlNQT1JUUy53ZWJzb2NrZXQpLCBcIiQxL1wiICsgVFJBTlNQT1JUUy5sb25ncG9sbCkpXG4gIH1cblxuICBlbmRwb2ludFVSTCgpe1xuICAgIHJldHVybiBBamF4LmFwcGVuZFBhcmFtcyh0aGlzLnBvbGxFbmRwb2ludCwge3Rva2VuOiB0aGlzLnRva2VufSlcbiAgfVxuXG4gIGNsb3NlQW5kUmV0cnkoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgdGhpcy5jbG9zZShjb2RlLCByZWFzb24sIHdhc0NsZWFuKVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuICB9XG5cbiAgb250aW1lb3V0KCl7XG4gICAgdGhpcy5vbmVycm9yKFwidGltZW91dFwiKVxuICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDA1LCBcInRpbWVvdXRcIiwgZmFsc2UpXG4gIH1cblxuICBpc0FjdGl2ZSgpeyByZXR1cm4gdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHwgdGhpcy5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcgfVxuXG4gIHBvbGwoKXtcbiAgICBjb25zdCBoZWFkZXJzID0ge1wiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwifVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIGhlYWRlcnNbXCJYLVBob2VuaXgtQXV0aFRva2VuXCJdID0gdGhpcy5hdXRoVG9rZW5cbiAgICB9XG4gICAgdGhpcy5hamF4KFwiR0VUXCIsIGhlYWRlcnMsIG51bGwsICgpID0+IHRoaXMub250aW1lb3V0KCksIHJlc3AgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdHMgb3duIG1hY3JvdGFzay5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pLCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKHt9KVxuICAgICAgICAgIHRoaXMucG9sbCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDQwMylcbiAgICAgICAgICB0aGlzLmNsb3NlKDEwMDgsIFwiZm9yYmlkZGVuXCIsIGZhbHNlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSA1MDA6XG4gICAgICAgICAgdGhpcy5vbmVycm9yKDUwMClcbiAgICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoMTAxMSwgXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgNTAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHBvbGwgc3RhdHVzICR7c3RhdHVzfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHdlIGNvbGxlY3QgYWxsIHB1c2hlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZXZlbnQgbG9vcCBieVxuICAvLyBzZXRUaW1lb3V0IDAsIHdoaWNoIG9wdGltaXplcyBiYWNrLXRvLWJhY2sgcHJvY2VkdXJhbFxuICAvLyBwdXNoZXMgYWdhaW5zdCBhbiBlbXB0eSBidWZmZXJcblxuICBzZW5kKGJvZHkpe1xuICAgIGlmKHR5cGVvZihib2R5KSAhPT0gXCJzdHJpbmdcIil7IGJvZHkgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KGJvZHkpIH1cbiAgICBpZih0aGlzLmN1cnJlbnRCYXRjaCl7XG4gICAgICB0aGlzLmN1cnJlbnRCYXRjaC5wdXNoKGJvZHkpXG4gICAgfSBlbHNlIGlmKHRoaXMuYXdhaXRpbmdCYXRjaEFjayl7XG4gICAgICB0aGlzLmJhdGNoQnVmZmVyLnB1c2goYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50QmF0Y2ggPSBbYm9keV1cbiAgICAgIHRoaXMuY3VycmVudEJhdGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5iYXRjaFNlbmQodGhpcy5jdXJyZW50QmF0Y2gpXG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gbnVsbFxuICAgICAgfSwgMClcbiAgICB9XG4gIH1cblxuICBiYXRjaFNlbmQobWVzc2FnZXMpe1xuICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IHRydWVcbiAgICB0aGlzLmFqYXgoXCJQT1NUXCIsIHtcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtbmRqc29uXCJ9LCBtZXNzYWdlcy5qb2luKFwiXFxuXCIpLCAoKSA9PiB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpLCByZXNwID0+IHtcbiAgICAgIHRoaXMuYXdhaXRpbmdCYXRjaEFjayA9IGZhbHNlXG4gICAgICBpZighcmVzcCB8fCByZXNwLnN0YXR1cyAhPT0gMjAwKXtcbiAgICAgICAgdGhpcy5vbmVycm9yKHJlc3AgJiYgcmVzcC5zdGF0dXMpXG4gICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgxMDExLCBcImludGVybmFsIHNlcnZlciBlcnJvclwiLCBmYWxzZSlcbiAgICAgIH0gZWxzZSBpZih0aGlzLmJhdGNoQnVmZmVyLmxlbmd0aCA+IDApe1xuICAgICAgICB0aGlzLmJhdGNoU2VuZCh0aGlzLmJhdGNoQnVmZmVyKVxuICAgICAgICB0aGlzLmJhdGNoQnVmZmVyID0gW11cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY2xvc2UoY29kZSwgcmVhc29uLCB3YXNDbGVhbil7XG4gICAgZm9yKGxldCByZXEgb2YgdGhpcy5yZXFzKXsgcmVxLmFib3J0KCkgfVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY2xvc2VkXG4gICAgbGV0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtjb2RlOiAxMDAwLCByZWFzb246IHVuZGVmaW5lZCwgd2FzQ2xlYW46IHRydWV9LCB7Y29kZSwgcmVhc29uLCB3YXNDbGVhbn0pXG4gICAgdGhpcy5iYXRjaEJ1ZmZlciA9IFtdXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudEJhdGNoVGltZXIpXG4gICAgdGhpcy5jdXJyZW50QmF0Y2hUaW1lciA9IG51bGxcbiAgICBpZih0eXBlb2YoQ2xvc2VFdmVudCkgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgdGhpcy5vbmNsb3NlKG5ldyBDbG9zZUV2ZW50KFwiY2xvc2VcIiwgb3B0cykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jbG9zZShvcHRzKVxuICAgIH1cbiAgfVxuXG4gIGFqYXgobWV0aG9kLCBoZWFkZXJzLCBib2R5LCBvbkNhbGxlclRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgcmVxXG4gICAgbGV0IG9udGltZW91dCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVxcy5kZWxldGUocmVxKVxuICAgICAgb25DYWxsZXJUaW1lb3V0KClcbiAgICB9XG4gICAgcmVxID0gQWpheC5yZXF1ZXN0KG1ldGhvZCwgdGhpcy5lbmRwb2ludFVSTCgpLCBoZWFkZXJzLCBib2R5LCB0aGlzLnRpbWVvdXQsIG9udGltZW91dCwgcmVzcCA9PiB7XG4gICAgICB0aGlzLnJlcXMuZGVsZXRlKHJlcSlcbiAgICAgIGlmKHRoaXMuaXNBY3RpdmUoKSl7IGNhbGxiYWNrKHJlc3ApIH1cbiAgICB9KVxuICAgIHRoaXMucmVxcy5hZGQocmVxKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBwaHhXaW5kb3csXG4gIENIQU5ORUxfRVZFTlRTLFxuICBERUZBVUxUX1RJTUVPVVQsXG4gIERFRkFVTFRfVlNOLFxuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTLFxuICBXU19DTE9TRV9OT1JNQUwsXG4gIEFVVEhfVE9LRU5fUFJFRklYXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjayBpZiBXZWJTb2NrZXQgaXMgbm90IGRlZmluZWQuXG4gKiBUbyBmYWxsYmFjayB0byBMb25nUG9sbCB3aGVuIFdlYlNvY2tldCBhdHRlbXB0cyBmYWlsLCB1c2UgYGxvbmdQb2xsRmFsbGJhY2tNczogMjUwMGAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc10gLSBUaGUgbWlsbGlzZWNvbmQgdGltZSB0byBhdHRlbXB0IHRoZSBwcmltYXJ5IHRyYW5zcG9ydFxuICogYmVmb3JlIGZhbGxpbmcgYmFjayB0byB0aGUgTG9uZ1BvbGwgdHJhbnNwb3J0LiBEaXNhYmxlZCBieSBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGVidWddIC0gV2hlbiB0cnVlLCBlbmFibGVzIGRlYnVnIGxvZ2dpbmcuIERlZmF1bHQgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZW5jb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTiBlbmNvZGVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmRlY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZGVjb2RlIGluY29taW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT046XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogKHBheWxvYWQsIGNhbGxiYWNrKSA9PiBjYWxsYmFjayhKU09OLnBhcnNlKHBheWxvYWQpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXRdIC0gVGhlIGRlZmF1bHQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBwdXNoIHRpbWVvdXRzLlxuICpcbiAqIERlZmF1bHRzIGBERUZBVUxUX1RJTUVPVVRgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNc10gLSBUaGUgbWlsbGlzZWMgaW50ZXJ2YWwgdG8gc2VuZCBhIGhlYXJ0YmVhdCBtZXNzYWdlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWNvbm5lY3RBZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gKiBzb2NrZXQgcmVjb25uZWN0IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuXG4gKlxuICogRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5yZWpvaW5BZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxpc2VjXG4gKiByZWpvaW4gaW50ZXJ2YWwgZm9yIGluZGl2aWR1YWwgY2hhbm5lbHMuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqIH1cbiAqIGBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5sb2dnZXJdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLCBpZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbihraW5kLCBtc2csIGRhdGEpIHtcbiAqICAgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubG9uZ3BvbGxlclRpbWVvdXRdIC0gVGhlIG1heGltdW0gdGltZW91dCBvZiBhIGxvbmcgcG9sbCBBSkFYIHJlcXVlc3QuXG4gKlxuICogRGVmYXVsdHMgdG8gMjBzIChkb3VibGUgdGhlIHNlcnZlciBsb25nIHBvbGwgdGltZXIpLlxuICpcbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbil9IFtvcHRzLnBhcmFtc10gLSBUaGUgb3B0aW9uYWwgcGFyYW1zIHRvIHBhc3Mgd2hlbiBjb25uZWN0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYXV0aFRva2VuXSAtIHRoZSBvcHRpb25hbCBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byBiZSBleHBvc2VkIG9uIHRoZSBzZXJ2ZXJcbiAqIHVuZGVyIHRoZSBgOmF1dGhfdG9rZW5gIGNvbm5lY3RfaW5mbyBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluYXJ5VHlwZV0gLSBUaGUgYmluYXJ5IHR5cGUgdG8gdXNlIGZvciBiaW5hcnkgV2ViU29ja2V0IGZyYW1lcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBcImFycmF5YnVmZmVyXCJcbiAqXG4gKiBAcGFyYW0ge3Zzbn0gW29wdHMudnNuXSAtIFRoZSBzZXJpYWxpemVyJ3MgcHJvdG9jb2wgdmVyc2lvbiB0byBzZW5kIG9uIGNvbm5lY3QuXG4gKlxuICogRGVmYXVsdHMgdG8gREVGQVVMVF9WU04uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFBob2VuaXggdXNlcyBzZXNzaW9uU3RvcmFnZSBmb3IgbG9uZ3BvbGwgZmFsbGJhY2sgaGlzdG9yeS4gT3ZlcnJpZGluZyB0aGUgc3RvcmUgaXNcbiAqIHVzZWZ1bCB3aGVuIFBob2VuaXggd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYHNlc3Npb25TdG9yYWdlYC4gRm9yIGV4YW1wbGUsIFRoaXMgY291bGRcbiAqIGhhcHBlbiBpZiBhIHNpdGUgbG9hZHMgYSBjcm9zcy1kb21haW4gY2hhbm5lbCBpbiBhbiBpZnJhbWUuIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gKiAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhpcy5zdG9yYWdlID0ge30gfVxuICogICAgICAgZ2V0SXRlbShrZXlOYW1lKSB7IHJldHVybiB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfHwgbnVsbCB9XG4gKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gKiAgICAgICBzZXRJdGVtKGtleU5hbWUsIGtleVZhbHVlKSB7IHRoaXMuc3RvcmFnZVtrZXlOYW1lXSA9IGtleVZhbHVlIH1cbiAqICAgICB9XG4gKlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRzID0ge30pe1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7b3BlbjogW10sIGNsb3NlOiBbXSwgZXJyb3I6IFtdLCBtZXNzYWdlOiBbXX1cbiAgICB0aGlzLmNoYW5uZWxzID0gW11cbiAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIHRoaXMucmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVRcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG9wdHMudHJhbnNwb3J0IHx8IGdsb2JhbC5XZWJTb2NrZXQgfHwgTG9uZ1BvbGxcbiAgICB0aGlzLnByaW1hcnlQYXNzZWRIZWFsdGhDaGVjayA9IGZhbHNlXG4gICAgdGhpcy5sb25nUG9sbEZhbGxiYWNrTXMgPSBvcHRzLmxvbmdQb2xsRmFsbGJhY2tNc1xuICAgIHRoaXMuZmFsbGJhY2tUaW1lciA9IG51bGxcbiAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgKGdsb2JhbCAmJiBnbG9iYWwuc2Vzc2lvblN0b3JhZ2UpXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zID0gMFxuICAgIHRoaXMuZGVmYXVsdEVuY29kZXIgPSBTZXJpYWxpemVyLmVuY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5kZWZhdWx0RGVjb2RlciA9IFNlcmlhbGl6ZXIuZGVjb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgaWYoIXRoaXMubG9nZ2VyICYmIG9wdHMuZGVidWcpe1xuICAgICAgdGhpcy5sb2dnZXIgPSAoa2luZCwgbXNnLCBkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKSB9XG4gICAgfVxuICAgIHRoaXMubG9uZ3BvbGxlclRpbWVvdXQgPSBvcHRzLmxvbmdwb2xsZXJUaW1lb3V0IHx8IDIwMDAwXG4gICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKG9wdHMucGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuZW5kUG9pbnQgPSBgJHtlbmRQb2ludH0vJHtUUkFOU1BPUlRTLndlYnNvY2tldH1gXG4gICAgdGhpcy52c24gPSBvcHRzLnZzbiB8fCBERUZBVUxUX1ZTTlxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gbnVsbFxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLmNvbm5lY3QoKSlcbiAgICB9LCB0aGlzLnJlY29ubmVjdEFmdGVyTXMpXG4gICAgdGhpcy5hdXRoVG9rZW4gPSBvcHRzLmF1dGhUb2tlblxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIExvbmdQb2xsIHRyYW5zcG9ydCByZWZlcmVuY2VcbiAgICovXG4gIGdldExvbmdQb2xsVHJhbnNwb3J0KCl7IHJldHVybiBMb25nUG9sbCB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSB0cnVlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgdGhpcy5jb25uLmNsb3NlKClcbiAgICAgIHRoaXMuY29ubiA9IG51bGxcbiAgICB9XG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBzb2NrZXQgdXJsXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlbmRQb2ludFVSTCgpe1xuICAgIGxldCB1cmkgPSBBamF4LmFwcGVuZFBhcmFtcyhcbiAgICAgIEFqYXguYXBwZW5kUGFyYW1zKHRoaXMuZW5kUG9pbnQsIHRoaXMucGFyYW1zKCkpLCB7dnNuOiB0aGlzLnZzbn0pXG4gICAgaWYodXJpLmNoYXJBdCgwKSAhPT0gXCIvXCIpeyByZXR1cm4gdXJpIH1cbiAgICBpZih1cmkuY2hhckF0KDEpID09PSBcIi9cIil7IHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9OiR7dXJpfWAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06Ly8ke2xvY2F0aW9uLmhvc3R9JHt1cml9YFxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXRcbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50I1N0YXR1c19jb2RlcyBmb3IgdmFsaWQgc3RhdHVzIGNvZGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBzb2NrZXQgaXMgZGlzY29ubmVjdGVkLlxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGNvZGUgLSBBIHN0YXR1cyBjb2RlIGZvciBkaXNjb25uZWN0aW9uIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBBIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB0byBkaXNjb25uZWN0LiAoT3B0aW9uYWwpXG4gICAqL1xuICBkaXNjb25uZWN0KGNhbGxiYWNrLCBjb2RlLCByZWFzb24pe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSB0cnVlXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gdHJ1ZVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy50ZWFyZG93bigoKSA9PiB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH0sIGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtcyB0byBzZW5kIHdoZW4gY29ubmVjdGluZywgZm9yIGV4YW1wbGUgYHt1c2VyX2lkOiB1c2VyVG9rZW59YFxuICAgKlxuICAgKiBQYXNzaW5nIHBhcmFtcyB0byBjb25uZWN0IGlzIGRlcHJlY2F0ZWQ7IHBhc3MgdGhlbSBpbiB0aGUgU29ja2V0IGNvbnN0cnVjdG9yIGluc3RlYWQ6XG4gICAqIGBuZXcgU29ja2V0KFwiL3NvY2tldFwiLCB7cGFyYW1zOiB7dXNlcl9pZDogdXNlclRva2VufX0pYC5cbiAgICovXG4gIGNvbm5lY3QocGFyYW1zKXtcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uICYmICF0aGlzLmRpc2Nvbm5lY3RpbmcpeyByZXR1cm4gfVxuICAgIGlmKHRoaXMubG9uZ1BvbGxGYWxsYmFja01zICYmIHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmNvbm5lY3RXaXRoRmFsbGJhY2soTG9uZ1BvbGwsIHRoaXMubG9uZ1BvbGxGYWxsYmFja01zKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zcG9ydENvbm5lY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlciAmJiB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFBpbmdzIHRoZSBzZXJ2ZXIgYW5kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGggdGhlIFJUVCBpbiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwaW5nIHdhcyBwdXNoZWQgb3IgZmFsc2UgaWYgdW5hYmxlIHRvIGJlIHB1c2hlZC5cbiAgICovXG4gIHBpbmcoY2FsbGJhY2spe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gZmFsc2UgfVxuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiByZWZ9KVxuICAgIGxldCBvbk1zZ1JlZiA9IHRoaXMub25NZXNzYWdlKG1zZyA9PiB7XG4gICAgICBpZihtc2cucmVmID09PSByZWYpe1xuICAgICAgICB0aGlzLm9mZihbb25Nc2dSZWZdKVxuICAgICAgICBjYWxsYmFjayhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB0cmFuc3BvcnRDb25uZWN0KCl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgbGV0IHByb3RvY29scyA9IHVuZGVmaW5lZFxuICAgIC8vIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgYmFzZWQgdG9rZW5cbiAgICAvLyAobG9uZ3BvbGwgdXNlcyBBdXRob3JpemF0aW9uIGhlYWRlciBpbnN0ZWFkKVxuICAgIGlmKHRoaXMuYXV0aFRva2VuKXtcbiAgICAgIHByb3RvY29scyA9IFtcInBob2VuaXhcIiwgYCR7QVVUSF9UT0tFTl9QUkVGSVh9JHtidG9hKHRoaXMuYXV0aFRva2VuKS5yZXBsYWNlKC89L2csIFwiXCIpfWBdXG4gICAgfVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCksIHByb3RvY29scylcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIGdldFNlc3Npb24oa2V5KXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JlICYmIHRoaXMuc2Vzc2lvblN0b3JlLmdldEl0ZW0oa2V5KSB9XG5cbiAgc3RvcmVTZXNzaW9uKGtleSwgdmFsKXsgdGhpcy5zZXNzaW9uU3RvcmUgJiYgdGhpcy5zZXNzaW9uU3RvcmUuc2V0SXRlbShrZXksIHZhbCkgfVxuXG4gIGNvbm5lY3RXaXRoRmFsbGJhY2soZmFsbGJhY2tUcmFuc3BvcnQsIGZhbGxiYWNrVGhyZXNob2xkID0gMjUwMCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICBsZXQgZXN0YWJsaXNoZWQgPSBmYWxzZVxuICAgIGxldCBwcmltYXJ5VHJhbnNwb3J0ID0gdHJ1ZVxuICAgIGxldCBvcGVuUmVmLCBlcnJvclJlZlxuICAgIGxldCBmYWxsYmFjayA9IChyZWFzb24pID0+IHtcbiAgICAgIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBmYWxsaW5nIGJhY2sgdG8gJHtmYWxsYmFja1RyYW5zcG9ydC5uYW1lfS4uLmAsIHJlYXNvbilcbiAgICAgIHRoaXMub2ZmKFtvcGVuUmVmLCBlcnJvclJlZl0pXG4gICAgICBwcmltYXJ5VHJhbnNwb3J0ID0gZmFsc2VcbiAgICAgIHRoaXMucmVwbGFjZVRyYW5zcG9ydChmYWxsYmFja1RyYW5zcG9ydClcbiAgICAgIHRoaXMudHJhbnNwb3J0Q29ubmVjdCgpXG4gICAgfVxuICAgIGlmKHRoaXMuZ2V0U2Vzc2lvbihgcGh4OmZhbGxiYWNrOiR7ZmFsbGJhY2tUcmFuc3BvcnQubmFtZX1gKSl7IHJldHVybiBmYWxsYmFjayhcIm1lbW9yaXplZFwiKSB9XG5cbiAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcblxuICAgIGVycm9yUmVmID0gdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImVycm9yXCIsIHJlYXNvbilcbiAgICAgIGlmKHByaW1hcnlUcmFuc3BvcnQgJiYgIWVzdGFibGlzaGVkKXtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmFsbGJhY2tUaW1lcilcbiAgICAgICAgZmFsbGJhY2socmVhc29uKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5vbk9wZW4oKCkgPT4ge1xuICAgICAgZXN0YWJsaXNoZWQgPSB0cnVlXG4gICAgICBpZighcHJpbWFyeVRyYW5zcG9ydCl7XG4gICAgICAgIC8vIG9ubHkgbWVtb3JpemUgTFAgaWYgd2UgbmV2ZXIgY29ubmVjdGVkIHRvIHByaW1hcnlcbiAgICAgICAgaWYoIXRoaXMucHJpbWFyeVBhc3NlZEhlYWx0aENoZWNrKXsgdGhpcy5zdG9yZVNlc3Npb24oYHBoeDpmYWxsYmFjazoke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9YCwgXCJ0cnVlXCIpIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBlc3RhYmxpc2hlZCAke2ZhbGxiYWNrVHJhbnNwb3J0Lm5hbWV9IGZhbGxiYWNrYClcbiAgICAgIH1cbiAgICAgIC8vIGlmIHdlJ3ZlIGVzdGFibGlzaGVkIHByaW1hcnksIGdpdmUgdGhlIGZhbGxiYWNrIGEgbmV3IHBlcmlvZCB0byBhdHRlbXB0IHBpbmdcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB0aGlzLmZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KGZhbGxiYWNrLCBmYWxsYmFja1RocmVzaG9sZClcbiAgICAgIHRoaXMucGluZyhydHQgPT4ge1xuICAgICAgICB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNvbm5lY3RlZCB0byBwcmltYXJ5IGFmdGVyXCIsIHJ0dClcbiAgICAgICAgdGhpcy5wcmltYXJ5UGFzc2VkSGVhbHRoQ2hlY2sgPSB0cnVlXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZhbGxiYWNrVGltZXIpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy50cmFuc3BvcnRDb25uZWN0KClcbiAgfVxuXG4gIGNsZWFySGVhcnRiZWF0cygpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVyKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0YmVhdFRpbWVvdXRUaW1lcilcbiAgfVxuXG4gIG9uQ29ubk9wZW4oKXtcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgJHt0aGlzLnRyYW5zcG9ydC5uYW1lfSBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZFBvaW50VVJMKCl9YClcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgICAgdGhpcy50ZWFyZG93bigoKSA9PiB0aGlzLnJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpLCBXU19DTE9TRV9OT1JNQUwsIFwiaGVhcnRiZWF0IHRpbWVvdXRcIilcbiAgICB9XG4gIH1cblxuICByZXNldEhlYXJ0YmVhdCgpe1xuICAgIGlmKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4uc2tpcEhlYXJ0YmVhdCl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgIHRoaXMuY2xlYXJIZWFydGJlYXRzKClcbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgdGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgaWYoIXRoaXMuY29ubil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cbiAgICBsZXQgY29ubmVjdENsb2NrID0gdGhpcy5jb25uZWN0Q2xvY2tcblxuICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoKCkgPT4ge1xuICAgICAgaWYoY29ubmVjdENsb2NrICE9PSB0aGlzLmNvbm5lY3RDbG9jayl7IHJldHVybiB9XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKGNvbm5lY3RDbG9jayAhPT0gdGhpcy5jb25uZWN0Q2xvY2speyByZXR1cm4gfVxuICAgICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICAgIHRoaXMuY29ubi5vbm9wZW4gPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICAgICAgICB0aGlzLmNvbm4gPSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB3YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8ICF0aGlzLmNvbm4uYnVmZmVyZWRBbW91bnQpe1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhaXRGb3JCdWZmZXJEb25lKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICB3YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyA9IDEpe1xuICAgIGlmKHRyaWVzID09PSA1IHx8ICF0aGlzLmNvbm4gfHwgdGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMuY2xvc2VkKXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yU29ja2V0Q2xvc2VkKGNhbGxiYWNrLCB0cmllcyArIDEpXG4gICAgfSwgMTUwICogdHJpZXMpXG4gIH1cblxuICBvbkNvbm5DbG9zZShldmVudCl7XG4gICAgbGV0IGNsb3NlQ29kZSA9IGV2ZW50ICYmIGV2ZW50LmNvZGVcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImNsb3NlXCIsIGV2ZW50KVxuICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdHMoKVxuICAgIGlmKCF0aGlzLmNsb3NlV2FzQ2xlYW4gJiYgY2xvc2VDb2RlICE9PSAxMDAwKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMgIT09IGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3JlZnN9IC0gbGlzdCBvZiByZWZzIHJldHVybmVkIGJ5IGNhbGxzIHRvXG4gICAqICAgICAgICAgICAgICAgICBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYFxuICAgKi9cbiAgb2ZmKHJlZnMpe1xuICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mpe1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldLmZpbHRlcigoW3JlZl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnMuaW5kZXhPZihyZWYpID09PSAtMVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGEgbmV3IGNoYW5uZWwgZm9yIHRoZSBnaXZlbiB0b3BpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5QYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Q2hhbm5lbH1cbiAgICovXG4gIGNoYW5uZWwodG9waWMsIGNoYW5QYXJhbXMgPSB7fSl7XG4gICAgbGV0IGNoYW4gPSBuZXcgQ2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbilcbiAgICByZXR1cm4gY2hhblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBwdXNoKGRhdGEpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpe1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gZGF0YVxuICAgICAgdGhpcy5sb2coXCJwdXNoXCIsIGAke3RvcGljfSAke2V2ZW50fSAoJHtqb2luX3JlZn0sICR7cmVmfSlgLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goKCkgPT4gdGhpcy5lbmNvZGUoZGF0YSwgcmVzdWx0ID0+IHRoaXMuY29ubi5zZW5kKHJlc3VsdCkpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbWFrZVJlZigpe1xuICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDFcbiAgICBpZihuZXdSZWYgPT09IHRoaXMucmVmKXsgdGhpcy5yZWYgPSAwIH0gZWxzZSB7IHRoaXMucmVmID0gbmV3UmVmIH1cblxuICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpXG4gIH1cblxuICBzZW5kSGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmICYmICF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWZ9KVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmhlYXJ0YmVhdFRpbWVvdXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0cygpXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgICAgIH1cblxuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJyZWNlaXZlXCIsIGAke3BheWxvYWQuc3RhdHVzIHx8IFwiXCJ9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmICYmIFwiKFwiICsgcmVmICsgXCIpXCIgfHwgXCJcIn1gLCBwYXlsb2FkKVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzW2ldXG4gICAgICAgIGlmKCFjaGFubmVsLmlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pbl9yZWYpKXsgY29udGludWUgfVxuICAgICAgICBjaGFubmVsLnRyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWYpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UubGVuZ3RoOyBpKyspe1xuICAgICAgICBsZXQgWywgY2FsbGJhY2tdID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlW2ldXG4gICAgICAgIGNhbGxiYWNrKG1zZylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbGVhdmVPcGVuVG9waWModG9waWMpe1xuICAgIGxldCBkdXBDaGFubmVsID0gdGhpcy5jaGFubmVscy5maW5kKGMgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuaXNKb2luZWQoKSB8fCBjLmlzSm9pbmluZygpKSlcbiAgICBpZihkdXBDaGFubmVsKXtcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIiR7dG9waWN9XCJgKVxuICAgICAgZHVwQ2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIjtcbmV4cG9ydCBjb25zdCBNQVhfUkVMT0FEUyA9IDEwO1xuZXhwb3J0IGNvbnN0IFJFTE9BRF9KSVRURVJfTUlOID0gNTAwMDtcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSX01BWCA9IDEwMDAwO1xuZXhwb3J0IGNvbnN0IEZBSUxTQUZFX0pJVFRFUiA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IFBIWF9FVkVOVF9DTEFTU0VTID0gW1xuICBcInBoeC1jbGljay1sb2FkaW5nXCIsXG4gIFwicGh4LWNoYW5nZS1sb2FkaW5nXCIsXG4gIFwicGh4LXN1Ym1pdC1sb2FkaW5nXCIsXG4gIFwicGh4LWtleWRvd24tbG9hZGluZ1wiLFxuICBcInBoeC1rZXl1cC1sb2FkaW5nXCIsXG4gIFwicGh4LWJsdXItbG9hZGluZ1wiLFxuICBcInBoeC1mb2N1cy1sb2FkaW5nXCIsXG4gIFwicGh4LWhvb2stbG9hZGluZ1wiLFxuXTtcbmV4cG9ydCBjb25zdCBQSFhfQ09NUE9ORU5UID0gXCJkYXRhLXBoeC1jb21wb25lbnRcIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19SRUYgPSBcImRhdGEtcGh4LXZpZXdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSQUNLX1NUQVRJQyA9IFwidHJhY2stc3RhdGljXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJTktfU1RBVEUgPSBcImRhdGEtcGh4LWxpbmstc3RhdGVcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQURJTkcgPSBcImRhdGEtcGh4LXJlZi1sb2FkaW5nXCI7XG5leHBvcnQgY29uc3QgUEhYX1JFRl9TUkMgPSBcImRhdGEtcGh4LXJlZi1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVGX0xPQ0sgPSBcImRhdGEtcGh4LXJlZi1sb2NrXCI7XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfUkVGUyA9IFwicGh4LXBlbmRpbmctcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQTE9BRF9SRUYgPSBcImRhdGEtcGh4LXVwbG9hZC1yZWZcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJFRkxJR0hURURfUkVGUyA9IFwiZGF0YS1waHgtcHJlZmxpZ2h0ZWQtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9EUk9QX1RBUkdFVCA9IFwiZHJvcC10YXJnZXRcIjtcbmV4cG9ydCBjb25zdCBQSFhfQUNUSVZFX0VOVFJZX1JFRlMgPSBcImRhdGEtcGh4LWFjdGl2ZS1yZWZzXCI7XG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfU0tJUCA9IFwiZGF0YS1waHgtc2tpcFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9NQUdJQ19JRCA9IFwiZGF0YS1waHgtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJVTkUgPSBcImRhdGEtcGh4LXBydW5lXCI7XG5leHBvcnQgY29uc3QgUEhYX0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWNvbm5lY3RlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MT0FESU5HX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCI7XG5leHBvcnQgY29uc3QgUEhYX0NMSUVOVF9FUlJPUl9DTEFTUyA9IFwicGh4LWNsaWVudC1lcnJvclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9TRVJWRVJfRVJST1JfQ0xBU1MgPSBcInBoeC1zZXJ2ZXItZXJyb3JcIjtcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfTUFJTiA9IFwiZGF0YS1waHgtbWFpblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ST09UX0lEID0gXCJkYXRhLXBoeC1yb290LWlkXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX1RPUCA9IFwidmlld3BvcnQtdG9wXCI7XG5leHBvcnQgY29uc3QgUEhYX1ZJRVdQT1JUX0JPVFRPTSA9IFwidmlld3BvcnQtYm90dG9tXCI7XG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiO1xuZXhwb3J0IGNvbnN0IFBIWF9IQVNfRk9DVVNFRCA9IFwicGh4LWhhcy1mb2N1c2VkXCI7XG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcbiAgXCJ0ZXh0XCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJudW1iZXJcIixcbiAgXCJlbWFpbFwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwidGVsXCIsXG4gIFwidXJsXCIsXG4gIFwiZGF0ZVwiLFxuICBcInRpbWVcIixcbiAgXCJkYXRldGltZS1sb2NhbFwiLFxuICBcImNvbG9yXCIsXG4gIFwicmFuZ2VcIixcbl07XG5leHBvcnQgY29uc3QgQ0hFQ0tBQkxFX0lOUFVUUyA9IFtcImNoZWNrYm94XCIsIFwicmFkaW9cIl07XG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCI7XG5leHBvcnQgY29uc3QgUEhYX1NFU1NJT04gPSBcImRhdGEtcGh4LXNlc3Npb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfVklFV19TRUxFQ1RPUiA9IGBbJHtQSFhfU0VTU0lPTn1dYDtcbmV4cG9ydCBjb25zdCBQSFhfU1RJQ0tZID0gXCJkYXRhLXBoeC1zdGlja3lcIjtcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVBRE9OTFkgPSBcImRhdGEtcGh4LXJlYWRvbmx5XCI7XG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVEID0gXCJkYXRhLXBoeC1kaXNhYmxlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSA9IFwiZGF0YS1waHgtZGlzYWJsZS13aXRoLXJlc3RvcmVcIjtcbmV4cG9ydCBjb25zdCBQSFhfSE9PSyA9IFwiaG9va1wiO1xuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIjtcbmV4cG9ydCBjb25zdCBQSFhfVEhST1RUTEUgPSBcInRocm90dGxlXCI7XG5leHBvcnQgY29uc3QgUEhYX1VQREFURSA9IFwidXBkYXRlXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTSA9IFwic3RyZWFtXCI7XG5leHBvcnQgY29uc3QgUEhYX1NUUkVBTV9SRUYgPSBcImRhdGEtcGh4LXN0cmVhbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9QT1JUQUwgPSBcImRhdGEtcGh4LXBvcnRhbFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1JFRiA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZFwiO1xuZXhwb3J0IGNvbnN0IFBIWF9URUxFUE9SVEVEX1NSQyA9IFwiZGF0YS1waHgtdGVsZXBvcnRlZC1zcmNcIjtcbmV4cG9ydCBjb25zdCBQSFhfUlVOVElNRV9IT09LID0gXCJkYXRhLXBoeC1ydW50aW1lLWhvb2tcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfUElEID0gXCJkYXRhLXBoeC1waWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJJVkFURSA9IFwicGh4UHJpdmF0ZVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9BVVRPX1JFQ09WRVIgPSBcImF1dG8tcmVjb3ZlclwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCI7XG5leHBvcnQgY29uc3QgUEhYX0xWX1BST0ZJTEUgPSBcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIjtcbmV4cG9ydCBjb25zdCBQSFhfTFZfTEFURU5DWV9TSU0gPSBcInBoeDpsaXZlLXNvY2tldDpsYXRlbmN5LXNpbVwiO1xuZXhwb3J0IGNvbnN0IFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OID0gXCJwaHg6bmF2LWhpc3RvcnktcG9zaXRpb25cIjtcbmV4cG9ydCBjb25zdCBQSFhfUFJPR1JFU1MgPSBcInByb2dyZXNzXCI7XG5leHBvcnQgY29uc3QgUEhYX01PVU5URUQgPSBcIm1vdW50ZWRcIjtcbmV4cG9ydCBjb25zdCBQSFhfUkVMT0FEX1NUQVRVUyA9IFwiX19waG9lbml4X3JlbG9hZF9zdGF0dXNfX1wiO1xuZXhwb3J0IGNvbnN0IExPQURFUl9USU1FT1VUID0gMTtcbmV4cG9ydCBjb25zdCBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUyA9IDM7XG5leHBvcnQgY29uc3QgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCA9IDIwMDtcbmV4cG9ydCBjb25zdCBESVNDT05ORUNURURfVElNRU9VVCA9IDUwMDtcbmV4cG9ydCBjb25zdCBCSU5ESU5HX1BSRUZJWCA9IFwicGh4LVwiO1xuZXhwb3J0IGNvbnN0IFBVU0hfVElNRU9VVCA9IDMwMDAwO1xuZXhwb3J0IGNvbnN0IExJTktfSEVBREVSID0gXCJ4LXJlcXVlc3RlZC13aXRoXCI7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVVJMX0hFQURFUiA9IFwieC1yZXNwb25zZS11cmxcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9UUklHR0VSID0gXCJkZWJvdW5jZS10cmlnZ2VyXCI7XG5leHBvcnQgY29uc3QgVEhST1RUTEVEID0gXCJ0aHJvdHRsZWRcIjtcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9QUkVWX0tFWSA9IFwiZGVib3VuY2UtcHJldi1rZXlcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgZGVib3VuY2U6IDMwMCxcbiAgdGhyb3R0bGU6IDMwMCxcbn07XG5leHBvcnQgY29uc3QgUEhYX1BFTkRJTkdfQVRUUlMgPSBbUEhYX1JFRl9MT0FESU5HLCBQSFhfUkVGX1NSQywgUEhYX1JFRl9MT0NLXTtcbi8vIFJlbmRlcmVkXG5leHBvcnQgY29uc3QgU1RBVElDID0gXCJzXCI7XG5leHBvcnQgY29uc3QgUk9PVCA9IFwiclwiO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIjtcbmV4cG9ydCBjb25zdCBLRVlFRCA9IFwia1wiO1xuZXhwb3J0IGNvbnN0IEtFWUVEX0NPVU5UID0gXCJrY1wiO1xuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiO1xuZXhwb3J0IGNvbnN0IFJFUExZID0gXCJyXCI7XG5leHBvcnQgY29uc3QgVElUTEUgPSBcInRcIjtcbmV4cG9ydCBjb25zdCBURU1QTEFURVMgPSBcInBcIjtcbmV4cG9ydCBjb25zdCBTVFJFQU0gPSBcInN0cmVhbVwiO1xuIiwgImltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW50cnlVcGxvYWRlciB7XG4gIGNvbnN0cnVjdG9yKGVudHJ5LCBjb25maWcsIGxpdmVTb2NrZXQpIHtcbiAgICBjb25zdCB7IGNodW5rX3NpemUsIGNodW5rX3RpbWVvdXQgfSA9IGNvbmZpZztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0O1xuICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua19zaXplO1xuICAgIHRoaXMuY2h1bmtUaW1lb3V0ID0gY2h1bmtfdGltZW91dDtcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsO1xuICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbCA9IGxpdmVTb2NrZXQuY2hhbm5lbChgbHZ1OiR7ZW50cnkucmVmfWAsIHtcbiAgICAgIHRva2VuOiBlbnRyeS5tZXRhZGF0YSgpLFxuICAgIH0pO1xuICB9XG5cbiAgZXJyb3IocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKTtcbiAgICB0aGlzLmVycm9yZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpO1xuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKTtcbiAgfVxuXG4gIHVwbG9hZCgpIHtcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwub25FcnJvcigocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbFxuICAgICAgLmpvaW4oKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoX2RhdGEpID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCAocmVhc29uKSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG5cbiAgaXNEb25lKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZTtcbiAgfVxuXG4gIHJlYWROZXh0Q2h1bmsoKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKCk7XG4gICAgY29uc3QgYmxvYiA9IHRoaXMuZW50cnkuZmlsZS5zbGljZShcbiAgICAgIHRoaXMub2Zmc2V0LFxuICAgICAgdGhpcy5jaHVua1NpemUgKyB0aGlzLm9mZnNldCxcbiAgICApO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmVycm9yID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpLmJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMucHVzaENodW5rKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChlLnRhcmdldC5yZXN1bHQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcihcIlJlYWQgZXJyb3I6IFwiICsgZS50YXJnZXQuZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9XG5cbiAgcHVzaENodW5rKGNodW5rKSB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZENoYW5uZWwuaXNKb2luZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWxcbiAgICAgIC5wdXNoKFwiY2h1bmtcIiwgY2h1bmssIHRoaXMuY2h1bmtUaW1lb3V0KVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVhZE5leHRDaHVuaygpLFxuICAgICAgICAgICAgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsICh7IHJlYXNvbiB9KSA9PiB0aGlzLmVycm9yKHJlYXNvbikpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUEhYX1ZJRVdfU0VMRUNUT1IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIjtcblxuZXhwb3J0IGNvbnN0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopO1xuXG5leHBvcnQgY29uc3QgaXNDaWQgPSAoY2lkKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgY2lkO1xuICByZXR1cm4gdHlwZSA9PT0gXCJudW1iZXJcIiB8fCAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAvXigwfFsxLTldXFxkKikkLy50ZXN0KGNpZCkpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdER1cGxpY2F0ZUlkcygpIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKTtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGlkcy5oYXMoZWxlbXNbaV0uaWQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTXVsdGlwbGUgSURzIGRldGVjdGVkOiAke2VsZW1zW2ldLmlkfS4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzLmFkZChlbGVtc1tpXS5pZCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyhpbnNlcnRzKSB7XG4gIGNvbnN0IGVycm9ycyA9IG5ldyBTZXQoKTtcbiAgT2JqZWN0LmtleXMoaW5zZXJ0cykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICBjb25zdCBzdHJlYW1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoXG4gICAgICBzdHJlYW1FbCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudCAmJlxuICAgICAgc3RyZWFtRWwucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJwaHgtdXBkYXRlXCIpICE9PSBcInN0cmVhbVwiXG4gICAgKSB7XG4gICAgICBlcnJvcnMuYWRkKFxuICAgICAgICBgVGhlIHN0cmVhbSBjb250YWluZXIgd2l0aCBpZCBcIiR7c3RyZWFtRWwucGFyZW50RWxlbWVudC5pZH1cIiBpcyBtaXNzaW5nIHRoZSBwaHgtdXBkYXRlPVwic3RyZWFtXCIgYXR0cmlidXRlLiBFbnN1cmUgaXQgaXMgc2V0IGZvciBzdHJlYW1zIHRvIHdvcmsgcHJvcGVybHkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbiAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWJ1ZyA9ICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4ge1xuICBpZiAodmlldy5saXZlU29ja2V0LmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopO1xuICB9XG59O1xuXG4vLyB3cmFwcyB2YWx1ZSBpbiBjbG9zdXJlIG9yIHJldHVybnMgY2xvc3VyZVxuZXhwb3J0IGNvbnN0IGNsb3N1cmUgPSAodmFsKSA9PlxuICB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IHZhbFxuICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfTtcblxuZXhwb3J0IGNvbnN0IGNsb25lID0gKG9iaikgPT4ge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbG9zZXN0UGh4QmluZGluZyA9IChlbCwgYmluZGluZywgYm9yZGVyRWwpID0+IHtcbiAgZG8ge1xuICAgIGlmIChlbC5tYXRjaGVzKGBbJHtiaW5kaW5nfV1gKSAmJiAhZWwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGU7XG4gIH0gd2hpbGUgKFxuICAgIGVsICE9PSBudWxsICYmXG4gICAgZWwubm9kZVR5cGUgPT09IDEgJiZcbiAgICAhKChib3JkZXJFbCAmJiBib3JkZXJFbC5pc1NhbWVOb2RlKGVsKSkgfHwgZWwubWF0Y2hlcyhQSFhfVklFV19TRUxFQ1RPUikpXG4gICk7XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgIShvYmogaW5zdGFuY2VvZiBBcnJheSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PlxuICBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMik7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IgKGNvbnN0IHggaW4gb2JqKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlID0gKGVsLCBjYWxsYmFjaykgPT4gZWwgJiYgY2FsbGJhY2soZWwpO1xuXG5leHBvcnQgY29uc3QgY2hhbm5lbFVwbG9hZGVyID0gZnVuY3Rpb24gKGVudHJpZXMsIG9uRXJyb3IsIHJlc3AsIGxpdmVTb2NrZXQpIHtcbiAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGVudHJ5VXBsb2FkZXIgPSBuZXcgRW50cnlVcGxvYWRlcihlbnRyeSwgcmVzcC5jb25maWcsIGxpdmVTb2NrZXQpO1xuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKCk7XG4gIH0pO1xufTtcbiIsICJjb25zdCBCcm93c2VyID0ge1xuICBjYW5QdXNoU3RhdGUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBoaXN0b3J5LnB1c2hTdGF0ZSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgfSxcblxuICBkcm9wTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSk7XG4gIH0sXG5cbiAgdXBkYXRlTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSwgaW5pdGlhbCwgZnVuYykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpO1xuICAgIGNvbnN0IG5ld1ZhbCA9IGN1cnJlbnQgPT09IG51bGwgPyBpbml0aWFsIDogZnVuYyhjdXJyZW50KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG5ld1ZhbCkpO1xuICAgIHJldHVybiBuZXdWYWw7XG4gIH0sXG5cbiAgZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpKSk7XG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmNhblB1c2hTdGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgICAgY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksXG4gICAgICBcIlwiLFxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgKTtcbiAgfSxcblxuICBwdXNoU3RhdGUoa2luZCwgbWV0YSwgdG8pIHtcbiAgICBpZiAodGhpcy5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgaWYgKHRvICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xuICAgICAgICBpZiAobWV0YS50eXBlID09IFwicmVkaXJlY3RcIiAmJiBtZXRhLnNjcm9sbCkge1xuICAgICAgICAgIC8vIElmIHdlJ3JlIHJlZGlyZWN0aW5nIHN0b3JlIHRoZSBjdXJyZW50IHNjcm9sbFkgZm9yIHRoZSBjdXJyZW50IGhpc3Rvcnkgc3RhdGUuXG4gICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZSB8fCB7fTtcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2Nyb2xsID0gbWV0YS5zY3JvbGw7XG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgbWV0YS5zY3JvbGw7IC8vIE9ubHkgc3RvcmUgdGhlIHNjcm9sbCBpbiB0aGUgcmVkaXJlY3QgY2FzZS5cbiAgICAgICAgaGlzdG9yeVtraW5kICsgXCJTdGF0ZVwiXShtZXRhLCBcIlwiLCB0byB8fCBudWxsKTsgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuXG4gICAgICAgIC8vIHdoZW4gdXNpbmcgbmF2aWdhdGUsIHdlJ2QgY2FsbCBwdXNoU3RhdGUgaW1tZWRpYXRlbHkgYmVmb3JlIHBhdGNoaW5nIHRoZSBET00sXG4gICAgICAgIC8vIGp1bXBpbmcgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBwYWdlLCBlZmZlY3RpdmVseSBpZ25vcmluZyB0aGUgc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSAoYWZ0ZXIgdGhlIERPTSBwYXRjaCkgYW5kIG9ubHkgdGhlbiB0cnlcbiAgICAgICAgLy8gdG8gc2Nyb2xsIHRvIHRoZSBoYXNoRWxcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzaEVsID0gdGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuXG4gICAgICAgICAgaWYgKGhhc2hFbCkge1xuICAgICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXRhLnR5cGUgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZGlyZWN0KHRvKTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlLCBtYXhBZ2VTZWNvbmRzKSB7XG4gICAgY29uc3QgZXhwaXJlcyA9XG4gICAgICB0eXBlb2YgbWF4QWdlU2Vjb25kcyA9PT0gXCJudW1iZXJcIiA/IGAgbWF4LWFnZT0ke21heEFnZVNlY29uZHN9O2AgOiBcIlwiO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7dmFsdWV9OyR7ZXhwaXJlc30gcGF0aD0vYDtcbiAgfSxcblxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYCg/Oig/Ol58Lio7XFxzKikke25hbWV9XFxzKlxcPVxccyooW147XSopLiokKXxeLiokYCksXG4gICAgICBcIiQxXCIsXG4gICAgKTtcbiAgfSxcblxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PTsgbWF4LWFnZT0tMTsgcGF0aD0vYDtcbiAgfSxcblxuICByZWRpcmVjdChcbiAgICB0b1VSTCxcbiAgICBmbGFzaCxcbiAgICBuYXZpZ2F0ZSA9ICh1cmwpID0+IHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgIH0sXG4gICkge1xuICAgIGlmIChmbGFzaCkge1xuICAgICAgdGhpcy5zZXRDb29raWUoXCJfX3Bob2VuaXhfZmxhc2hfX1wiLCBmbGFzaCwgNjApO1xuICAgIH1cbiAgICBuYXZpZ2F0ZSh0b1VSTCk7XG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpIHtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gO1xuICB9LFxuXG4gIGdldEhhc2hUYXJnZXRFbChtYXliZUhhc2gpIHtcbiAgICBjb25zdCBoYXNoID0gbWF5YmVIYXNoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO1xuICAgIGlmIChoYXNoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gICAgKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXI7XG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9WSUVXX1JFRixcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BSSVZBVEUsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVGX0xPQ0ssXG4gIFBIWF9QRU5ESU5HX0FUVFJTLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9VUExPQURfUkVGLFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1NUSUNLWSxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFRIUk9UVExFRCxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1NUUkVBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgRE9NID0ge1xuICBieUlkKGlkKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCk7XG4gIH0sXG5cbiAgcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICBpZiAoZWwuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgYXJyYXkuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfSxcblxuICBjaGlsZE5vZGVMZW5ndGgoaHRtbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnQ7XG4gIH0sXG5cbiAgaXNVcGxvYWRJbnB1dChlbCkge1xuICAgIHJldHVybiBlbC50eXBlID09PSBcImZpbGVcIiAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQXV0b1VwbG9hZChpbnB1dEVsKSB7XG4gICAgcmV0dXJuIGlucHV0RWwuaGFzQXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIik7XG4gIH0sXG5cbiAgZmluZFVwbG9hZElucHV0cyhub2RlKSB7XG4gICAgY29uc3QgZm9ybUlkID0gbm9kZS5pZDtcbiAgICBjb25zdCBpbnB1dHNPdXRzaWRlRm9ybSA9IHRoaXMuYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgaW5wdXRbdHlwZT1cImZpbGVcIl1bJHtQSFhfVVBMT0FEX1JFRn1dW2Zvcm09XCIke2Zvcm1JZH1cIl1gLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWxsKG5vZGUsIGBpbnB1dFt0eXBlPVwiZmlsZVwiXVske1BIWF9VUExPQURfUkVGfV1gKS5jb25jYXQoXG4gICAgICBpbnB1dHNPdXRzaWRlRm9ybSxcbiAgICApO1xuICB9LFxuXG4gIGZpbmRDb21wb25lbnROb2RlTGlzdCh2aWV3SWQsIGNpZCwgZG9jID0gZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoXG4gICAgICBkb2MsXG4gICAgICBgWyR7UEhYX1ZJRVdfUkVGfT1cIiR7dmlld0lkfVwiXVske1BIWF9DT01QT05FTlR9PVwiJHtjaWR9XCJdYCxcbiAgICApO1xuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5pZCAmJiBET00ucHJpdmF0ZShub2RlLCBcImRlc3Ryb3llZFwiKSA/IHRydWUgOiBmYWxzZTtcbiAgfSxcblxuICB3YW50c05ld1RhYihlKSB7XG4gICAgY29uc3Qgd2FudHNOZXdUYWIgPVxuICAgICAgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IChlLmJ1dHRvbiAmJiBlLmJ1dHRvbiA9PT0gMSk7XG4gICAgY29uc3QgaXNEb3dubG9hZCA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmXG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkb3dubG9hZFwiKTtcbiAgICBjb25zdCBpc1RhcmdldEJsYW5rID1cbiAgICAgIGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcInRhcmdldFwiKSAmJlxuICAgICAgZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpLnRvTG93ZXJDYXNlKCkgPT09IFwiX2JsYW5rXCI7XG4gICAgY29uc3QgaXNUYXJnZXROYW1lZFRhYiA9XG4gICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0YXJnZXRcIikgJiZcbiAgICAgICFlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIikuc3RhcnRzV2l0aChcIl9cIik7XG4gICAgcmV0dXJuIHdhbnRzTmV3VGFiIHx8IGlzVGFyZ2V0QmxhbmsgfHwgaXNEb3dubG9hZCB8fCBpc1RhcmdldE5hbWVkVGFiO1xuICB9LFxuXG4gIGlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkge1xuICAgIC8vIElnbm9yZSBmb3JtIHN1Ym1pc3Npb25zIGludGVuZGVkIHRvIGNsb3NlIGEgbmF0aXZlIDxkaWFsb2c+IGVsZW1lbnRcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvZGlhbG9nI3VzYWdlX25vdGVzXG4gICAgY29uc3QgaXNEaWFsb2dTdWJtaXQgPVxuICAgICAgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcIm1ldGhvZFwiKSA9PT0gXCJkaWFsb2dcIikgfHxcbiAgICAgIChlLnN1Ym1pdHRlciAmJiBlLnN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtbWV0aG9kXCIpID09PSBcImRpYWxvZ1wiKTtcblxuICAgIGlmIChpc0RpYWxvZ1N1Ym1pdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy53YW50c05ld1RhYihlKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNOZXdQYWdlQ2xpY2soZSwgY3VycmVudExvY2F0aW9uKSB7XG4gICAgY29uc3QgaHJlZiA9XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50XG4gICAgICAgID8gZS50YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IHVybDtcblxuICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQgfHwgaHJlZiA9PT0gbnVsbCB8fCB0aGlzLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJtYWlsdG86XCIpIHx8IGhyZWYuc3RhcnRzV2l0aChcInRlbDpcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGUudGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGhyZWYsIGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYmFkIFVSTCwgZmFsbGJhY2sgdG8gbGV0IGJyb3dzZXIgdHJ5IGl0IGFzIGV4dGVybmFsXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHVybC5ob3N0ID09PSBjdXJyZW50TG9jYXRpb24uaG9zdCAmJlxuICAgICAgdXJsLnByb3RvY29sID09PSBjdXJyZW50TG9jYXRpb24ucHJvdG9jb2xcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdXJsLnBhdGhuYW1lID09PSBjdXJyZW50TG9jYXRpb24ucGF0aG5hbWUgJiZcbiAgICAgICAgdXJsLnNlYXJjaCA9PT0gY3VycmVudExvY2F0aW9uLnNlYXJjaFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB1cmwuaGFzaCA9PT0gXCJcIiAmJiAhdXJsLmhyZWYuZW5kc1dpdGgoXCIjXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsLnByb3RvY29sLnN0YXJ0c1dpdGgoXCJodHRwXCIpO1xuICB9LFxuXG4gIG1hcmtQaHhDaGlsZERlc3Ryb3llZChlbCkge1xuICAgIGlmICh0aGlzLmlzUGh4Q2hpbGQoZWwpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiZGVzdHJveWVkXCIsIHRydWUpO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0aGlzLmZpbmRQaHhDaGlsZHJlbih0ZW1wbGF0ZS5jb250ZW50LCBwYXJlbnRJZCk7XG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpIHx8IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LXVwZGF0ZVwiKSkgPT09XG4gICAgICBcImlnbm9yZVwiXG4gICAgKTtcbiAgfSxcblxuICBpc1BoeFVwZGF0ZShlbCwgcGh4VXBkYXRlLCB1cGRhdGVUeXBlcykge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUgJiYgdXBkYXRlVHlwZXMuaW5kZXhPZihlbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkgPj0gMFxuICAgICk7XG4gIH0sXG5cbiAgZmluZFBoeFN0aWNreShlbCkge1xuICAgIHJldHVybiB0aGlzLmFsbChlbCwgYFske1BIWF9TVElDS1l9XWApO1xuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbihlbCwgcGFyZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKTtcbiAgfSxcblxuICBmaW5kRXhpc3RpbmdQYXJlbnRDSURzKHZpZXdJZCwgY2lkcykge1xuICAgIC8vIHdlIG9ubHkgd2FudCB0byBmaW5kIHBhcmVudHMgdGhhdCBleGlzdCBvbiB0aGUgcGFnZVxuICAgIC8vIGlmIGEgY2lkIGlzIG5vdCBvbiB0aGUgcGFnZSwgdGhlIG9ubHkgd2F5IGl0IGNhbiBiZSBhZGRlZCBiYWNrIHRvIHRoZSBwYWdlXG4gICAgLy8gaXMgaWYgYSBwYXJlbnQgYWRkcyBpdCBiYWNrLCB0aGVyZWZvcmUgaWYgYSBjaWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHBhZ2UsXG4gICAgLy8gd2Ugc2hvdWxkIG5vdCB0cnkgdG8gcmVuZGVyIGl0IGJ5IGl0c2VsZiAoYmVjYXVzZSBpdCB3b3VsZCBiZSByZW5kZXJlZCB0d2ljZSxcbiAgICAvLyBvbmUgYnkgdGhlIHBhcmVudCwgYW5kIGEgc2Vjb25kIHRpbWUgYnkgaXRzZWxmKVxuICAgIGNvbnN0IHBhcmVudENpZHMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgY2hpbGRyZW5DaWRzID0gbmV3IFNldCgpO1xuXG4gICAgY2lkcy5mb3JFYWNoKChjaWQpID0+IHtcbiAgICAgIHRoaXMuYWxsKFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3ZpZXdJZH1cIl1bJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWAsXG4gICAgICApLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgICBwYXJlbnRDaWRzLmFkZChjaWQpO1xuICAgICAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHtQSFhfVklFV19SRUZ9PVwiJHt2aWV3SWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYClcbiAgICAgICAgICAubWFwKChlbCkgPT4gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpKSlcbiAgICAgICAgICAuZm9yRWFjaCgoY2hpbGRDSUQpID0+IGNoaWxkcmVuQ2lkcy5hZGQoY2hpbGRDSUQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGRyZW5DaWRzLmZvckVhY2goKGNoaWxkQ2lkKSA9PiBwYXJlbnRDaWRzLmRlbGV0ZShjaGlsZENpZCkpO1xuXG4gICAgcmV0dXJuIHBhcmVudENpZHM7XG4gIH0sXG5cbiAgcHJpdmF0ZShlbCwga2V5KSB7XG4gICAgcmV0dXJuIGVsW1BIWF9QUklWQVRFXSAmJiBlbFtQSFhfUFJJVkFURV1ba2V5XTtcbiAgfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpIHtcbiAgICBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIGVsW1BIWF9QUklWQVRFXVtrZXldO1xuICB9LFxuXG4gIHB1dFByaXZhdGUoZWwsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsW1BIWF9QUklWQVRFXSkge1xuICAgICAgZWxbUEhYX1BSSVZBVEVdID0ge307XG4gICAgfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWU7XG4gIH0sXG5cbiAgdXBkYXRlUHJpdmF0ZShlbCwga2V5LCBkZWZhdWx0VmFsLCB1cGRhdGVGdW5jKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGRlZmF1bHRWYWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZXhpc3RpbmcpKTtcbiAgICB9XG4gIH0sXG5cbiAgc3luY1BlbmRpbmdBdHRycyhmcm9tRWwsIHRvRWwpIHtcbiAgICBpZiAoIWZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgZnJvbUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICYmIHRvRWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0pO1xuICAgIFBIWF9QRU5ESU5HX0FUVFJTLmZpbHRlcigoYXR0cikgPT4gZnJvbUVsLmhhc0F0dHJpYnV0ZShhdHRyKSkuZm9yRWFjaChcbiAgICAgIChhdHRyKSA9PiB7XG4gICAgICAgIHRvRWwuc2V0QXR0cmlidXRlKGF0dHIsIGZyb21FbC5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgfSxcbiAgICApO1xuICB9LFxuXG4gIGNvcHlQcml2YXRlcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmIChzb3VyY2VbUEhYX1BSSVZBVEVdKSB7XG4gICAgICB0YXJnZXRbUEhYX1BSSVZBVEVdID0gc291cmNlW1BIWF9QUklWQVRFXTtcbiAgICB9XG4gIH0sXG5cbiAgcHV0VGl0bGUoc3RyKSB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICBpZiAodGl0bGVFbCkge1xuICAgICAgY29uc3QgeyBwcmVmaXgsIHN1ZmZpeCwgZGVmYXVsdDogZGVmYXVsdFRpdGxlIH0gPSB0aXRsZUVsLmRhdGFzZXQ7XG4gICAgICBjb25zdCBpc0VtcHR5ID0gdHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiB8fCBzdHIudHJpbSgpID09PSBcIlwiO1xuICAgICAgaWYgKGlzRW1wdHkgJiYgdHlwZW9mIGRlZmF1bHRUaXRsZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlubmVyID0gaXNFbXB0eSA/IGRlZmF1bHRUaXRsZSA6IHN0cjtcbiAgICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtpbm5lciB8fCBcIlwifSR7c3VmZml4IHx8IFwiXCJ9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQudGl0bGUgPSBzdHI7XG4gICAgfVxuICB9LFxuXG4gIGRlYm91bmNlKFxuICAgIGVsLFxuICAgIGV2ZW50LFxuICAgIHBoeERlYm91bmNlLFxuICAgIGRlZmF1bHREZWJvdW5jZSxcbiAgICBwaHhUaHJvdHRsZSxcbiAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgYXN5bmNGaWx0ZXIsXG4gICAgY2FsbGJhY2ssXG4gICkge1xuICAgIGxldCBkZWJvdW5jZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhEZWJvdW5jZSk7XG4gICAgbGV0IHRocm90dGxlID0gZWwuZ2V0QXR0cmlidXRlKHBoeFRocm90dGxlKTtcblxuICAgIGlmIChkZWJvdW5jZSA9PT0gXCJcIikge1xuICAgICAgZGVib3VuY2UgPSBkZWZhdWx0RGVib3VuY2U7XG4gICAgfVxuICAgIGlmICh0aHJvdHRsZSA9PT0gXCJcIikge1xuICAgICAgdGhyb3R0bGUgPSBkZWZhdWx0VGhyb3R0bGU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gZGVib3VuY2UgfHwgdGhyb3R0bGU7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgY2FzZSBudWxsOlxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcblxuICAgICAgY2FzZSBcImJsdXJcIjpcbiAgICAgICAgdGhpcy5pbmNDeWNsZShlbCwgXCJkZWJvdW5jZS1ibHVyLWN5Y2xlXCIsICgpID0+IHtcbiAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImRlYm91bmNlLWJsdXJcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PlxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIFwiZGVib3VuY2UtYmx1ci1jeWNsZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9ICgpID0+XG4gICAgICAgICAgdGhyb3R0bGUgPyB0aGlzLmRlbGV0ZVByaXZhdGUoZWwsIFRIUk9UVExFRCkgOiBjYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBjdXJyZW50Q3ljbGUgPSB0aGlzLmluY0N5Y2xlKGVsLCBERUJPVU5DRV9UUklHR0VSLCB0cmlnZ2VyKTtcbiAgICAgICAgaWYgKGlzTmFOKHRpbWVvdXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKGBpbnZhbGlkIHRocm90dGxlL2RlYm91bmNlIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aHJvdHRsZSkge1xuICAgICAgICAgIGxldCBuZXdLZXlEb3duID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSk7XG4gICAgICAgICAgICB0aGlzLnB1dFByaXZhdGUoZWwsIERFQk9VTkNFX1BSRVZfS0VZLCBldmVudC5rZXkpO1xuICAgICAgICAgICAgbmV3S2V5RG93biA9IHByZXZLZXkgIT09IGV2ZW50LmtleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5ld0tleURvd24gJiYgdGhpcy5wcml2YXRlKGVsLCBUSFJPVFRMRUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChhc3luY0ZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXN5bmNGaWx0ZXIoKSkge1xuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgY3VycmVudEN5Y2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm0gPSBlbC5mb3JtO1xuICAgICAgICBpZiAoZm9ybSAmJiB0aGlzLm9uY2UoZm9ybSwgXCJiaW5kLWRlYm91bmNlXCIpKSB7XG4gICAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsICgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20obmV3IEZvcm1EYXRhKGZvcm0pLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke25hbWV9XCJdYCk7XG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpO1xuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVByaXZhdGUoaW5wdXQsIFRIUk9UVExFRCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbmNlKGVsLCBcImJpbmQtZGVib3VuY2VcIikpIHtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBiZWNhdXNlIHdlIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGhlcmUsXG4gICAgICAgICAgICAvLyB3ZSBhbHNvIGNsZWFyIHRoZSB0aHJvdHRsZSB0aW1lb3V0IHRvIHByZXZlbnQgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAvLyBmcm9tIGJlaW5nIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgdGltZW91dCBmaXJlc1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJpdmF0ZShlbCwgVEhST1RUTEVEKSk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSkge1xuICAgIGNvbnN0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSk7XG4gICAgaWYgKCFjdXJyZW50Q3ljbGUpIHtcbiAgICAgIGN1cnJlbnRDeWNsZSA9IGN5Y2xlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEN5Y2xlID09PSBjeWNsZSkge1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KTtcbiAgICAgIHRyaWdnZXIoKTtcbiAgICB9XG4gIH0sXG5cbiAgb25jZShlbCwga2V5KSB7XG4gICAgaWYgKHRoaXMucHJpdmF0ZShlbCwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgaW5jQ3ljbGUoZWwsIGtleSwgdHJpZ2dlciA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXTtcbiAgICBjdXJyZW50Q3ljbGUrKztcbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgW2N1cnJlbnRDeWNsZSwgdHJpZ2dlcl0pO1xuICAgIHJldHVybiBjdXJyZW50Q3ljbGU7XG4gIH0sXG5cbiAgLy8gbWFpbnRhaW5zIG9yIGFkZHMgcHJpdmF0ZWx5IHVzZWQgaG9vayBpbmZvcm1hdGlvblxuICAvLyBmcm9tRWwgYW5kIHRvRWwgY2FuIGJlIHRoZSBzYW1lIGVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBuZXdseSBhZGRlZCBub2RlXG4gIC8vIGZyb21FbCBhbmQgdG9FbCBjYW4gYmUgYW55IEhUTUwgbm9kZSB0eXBlLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgYW4gZWxlbWVudCBub2RlXG4gIG1haW50YWluUHJpdmF0ZUhvb2tzKGZyb21FbCwgdG9FbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKSB7XG4gICAgLy8gbWFpbnRhaW4gdGhlIGhvb2tzIGNyZWF0ZWQgd2l0aCBjcmVhdGVIb29rXG4gICAgaWYgKFxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgZnJvbUVsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIikgJiZcbiAgICAgICF0b0VsLmhhc0F0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIilcbiAgICApIHtcbiAgICAgIHRvRWwuc2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiLCBmcm9tRWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtaG9va1wiKSk7XG4gICAgfVxuICAgIC8vIGFkZCBob29rcyB0byBlbGVtZW50cyB3aXRoIHZpZXdwb3J0IGF0dHJpYnV0ZXNcbiAgICBpZiAoXG4gICAgICB0b0VsLmhhc0F0dHJpYnV0ZSAmJlxuICAgICAgKHRvRWwuaGFzQXR0cmlidXRlKHBoeFZpZXdwb3J0VG9wKSB8fFxuICAgICAgICB0b0VsLmhhc0F0dHJpYnV0ZShwaHhWaWV3cG9ydEJvdHRvbSkpXG4gICAgKSB7XG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJQaG9lbml4LkluZmluaXRlU2Nyb2xsXCIpO1xuICAgIH1cbiAgfSxcblxuICBwdXRDdXN0b21FbEhvb2soZWwsIGhvb2spIHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRhdGEtcGh4LWhvb2tcIiwgXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxuICAgICAgICBob29rIGF0dGFjaGVkIHRvIG5vbi1jb25uZWN0ZWQgRE9NIGVsZW1lbnRcbiAgICAgICAgZW5zdXJlIHlvdSBhcmUgY2FsbGluZyBjcmVhdGVIb29rIHdpdGhpbiB5b3VyIGNvbm5lY3RlZENhbGxiYWNrLiAke2VsLm91dGVySFRNTH1cbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIFwiY3VzdG9tLWVsLWhvb2tcIiwgaG9vayk7XG4gIH0sXG5cbiAgZ2V0Q3VzdG9tRWxIb29rKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJpdmF0ZShlbCwgXCJjdXN0b20tZWwtaG9va1wiKTtcbiAgfSxcblxuICBpc1VzZWRJbnB1dChlbCkge1xuICAgIHJldHVybiAoXG4gICAgICBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICh0aGlzLnByaXZhdGUoZWwsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGVsLCBQSFhfSEFTX1NVQk1JVFRFRCkpXG4gICAgKTtcbiAgfSxcblxuICByZXNldEZvcm0oZm9ybSkge1xuICAgIEFycmF5LmZyb20oZm9ybS5lbGVtZW50cykuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19GT0NVU0VEKTtcbiAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgUEhYX0hBU19TVUJNSVRURUQpO1xuICAgIH0pO1xuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSkge1xuICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKTtcbiAgfSxcblxuICBpc1BoeFN0aWNreShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TVElDS1kpICE9PSBudWxsO1xuICB9LFxuXG4gIGlzQ2hpbGRPZkFueShlbCwgcGFyZW50cykge1xuICAgIHJldHVybiAhIXBhcmVudHMuZmluZCgocGFyZW50KSA9PiBwYXJlbnQuY29udGFpbnMoZWwpKTtcbiAgfSxcblxuICBmaXJzdFBoeENoaWxkKGVsKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQaHhDaGlsZChlbCkgPyBlbCA6IHRoaXMuYWxsKGVsLCBgWyR7UEhYX1BBUkVOVF9JRH1dYClbMF07XG4gIH0sXG5cbiAgaXNQb3J0YWxUZW1wbGF0ZShlbCkge1xuICAgIHJldHVybiBlbC50YWdOYW1lID09PSBcIlRFTVBMQVRFXCIgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICB9LFxuXG4gIGNsb3Nlc3RWaWV3RWwoZWwpIHtcbiAgICAvLyBmaW5kIHRoZSBjbG9zZXN0IHBvcnRhbCBvciB2aWV3IGVsZW1lbnQsIHdoaWNoZXZlciBjb21lcyBmaXJzdFxuICAgIGNvbnN0IHBvcnRhbE9yVmlld0VsID0gZWwuY2xvc2VzdChcbiAgICAgIGBbJHtQSFhfVEVMRVBPUlRFRF9SRUZ9XSwke1BIWF9WSUVXX1NFTEVDVE9SfWAsXG4gICAgKTtcbiAgICBpZiAoIXBvcnRhbE9yVmlld0VsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAvLyBQSFhfVEVMRVBPUlRFRF9SRUYgaXMgc2V0IHRvIHRoZSBpZCBvZiB0aGUgdmlldyB0aGF0IG93bnMgdGhlIHBvcnRhbCBlbGVtZW50XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKHBvcnRhbE9yVmlld0VsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKTtcbiAgICB9IGVsc2UgaWYgKHBvcnRhbE9yVmlld0VsLmhhc0F0dHJpYnV0ZShQSFhfU0VTU0lPTikpIHtcbiAgICAgIHJldHVybiBwb3J0YWxPclZpZXdFbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudCh0YXJnZXQsIG5hbWUsIG9wdHMgPSB7fSkge1xuICAgIGxldCBkZWZhdWx0QnViYmxlID0gdHJ1ZTtcbiAgICBjb25zdCBpc1VwbG9hZFRhcmdldCA9XG4gICAgICB0YXJnZXQubm9kZU5hbWUgPT09IFwiSU5QVVRcIiAmJiB0YXJnZXQudHlwZSA9PT0gXCJmaWxlXCI7XG4gICAgaWYgKGlzVXBsb2FkVGFyZ2V0ICYmIG5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgZGVmYXVsdEJ1YmJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBidWJibGVzID0gb3B0cy5idWJibGVzID09PSB1bmRlZmluZWQgPyBkZWZhdWx0QnViYmxlIDogISFvcHRzLmJ1YmJsZXM7XG4gICAgY29uc3QgZXZlbnRPcHRzID0ge1xuICAgICAgYnViYmxlczogYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICBkZXRhaWw6IG9wdHMuZGV0YWlsIHx8IHt9LFxuICAgIH07XG4gICAgY29uc3QgZXZlbnQgPVxuICAgICAgbmFtZSA9PT0gXCJjbGlja1wiXG4gICAgICAgID8gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLCBldmVudE9wdHMpXG4gICAgICAgIDogbmV3IEN1c3RvbUV2ZW50KG5hbWUsIGV2ZW50T3B0cyk7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKSB7XG4gICAgaWYgKHR5cGVvZiBodG1sID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNsb25lZCA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgIGNsb25lZC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG4gIH0sXG5cbiAgLy8gbWVyZ2UgYXR0cmlidXRlcyBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbiAgLy8gaWYgYW4gZWxlbWVudCBpcyBpZ25vcmVkLCB3ZSBvbmx5IG1lcmdlIGRhdGEgYXR0cmlidXRlc1xuICAvLyBpbmNsdWRpbmcgcmVtb3ZpbmcgZGF0YSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgc291cmNlXG4gIG1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBuZXcgU2V0KG9wdHMuZXhjbHVkZSB8fCBbXSk7XG4gICAgY29uc3QgaXNJZ25vcmVkID0gb3B0cy5pc0lnbm9yZWQ7XG4gICAgY29uc3Qgc291cmNlQXR0cnMgPSBzb3VyY2UuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gc291cmNlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzb3VyY2VBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKCFleGNsdWRlLmhhcyhuYW1lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQuZ2V0QXR0cmlidXRlKG5hbWUpICE9PSBzb3VyY2VWYWx1ZSAmJlxuICAgICAgICAgICghaXNJZ25vcmVkIHx8IChpc0lnbm9yZWQgJiYgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UgZXhjbHVkZSB0aGUgdmFsdWUgZnJvbSBiZWluZyBtZXJnZWQgb24gZm9jdXNlZCBpbnB1dHMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIHVzZXIncyBpbnB1dCBzaG91bGQgYWx3YXlzIHdpbi5cbiAgICAgICAgLy8gV2UgY2FuIHN0aWxsIGFzc2lnbiBpdCBhcyBsb25nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc2FtZSwgdGhvdWdoLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSB1cGRhdGVkIGhvb2sgaXMgbm90IGJlaW5nIHRyaWdnZXJlZFxuICAgICAgICAvLyB3aGVuIGFuIGlucHV0IGlzIGJhY2sgaW4gaXRzIFwib3JpZ2luYWwgc3RhdGVcIiwgYmVjYXVzZSB0aGUgYXR0cmlidXRlXG4gICAgICAgIC8vIHdhcyBuZXZlciBjaGFuZ2VkLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8yMTYzXG4gICAgICAgIGlmIChuYW1lID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZS52YWx1ZSA/PyBzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgIGlmICh0YXJnZXQudmFsdWUgPT09IHNvdXJjZVZhbHVlKSB7XG4gICAgICAgICAgICAvLyBhY3R1YWxseSBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byBzeW5jIGl0IHdpdGggdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlcztcbiAgICBmb3IgKGxldCBpID0gdGFyZ2V0QXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXRBdHRyc1tpXS5uYW1lO1xuICAgICAgaWYgKGlzSWdub3JlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiZcbiAgICAgICAgICAhc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSAmJlxuICAgICAgICAgICFQSFhfUEVORElOR19BVFRSUy5pbmNsdWRlcyhuYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1lcmdlRm9jdXNlZElucHV0KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gc2tpcCBzZWxlY3RzIGJlY2F1c2UgRkYgd2lsbCByZXNldCBoaWdobGlnaHRlZCBpbmRleCBmb3IgYW55IHNldEF0dHJpYnV0ZVxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgRE9NLm1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIHsgZXhjbHVkZTogW1widmFsdWVcIl0gfSk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZS5yZWFkT25seSkge1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIik7XG4gICAgfVxuICB9LFxuXG4gIGhhc1NlbGVjdGlvblJhbmdlKGVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlICYmIChlbC50eXBlID09PSBcInRleHRcIiB8fCBlbC50eXBlID09PSBcInRleHRhcmVhXCIpXG4gICAgKTtcbiAgfSxcblxuICByZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkge1xuICAgIGlmIChmb2N1c2VkIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcbiAgICAgIGZvY3VzZWQuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKCFET00uaXNUZXh0dWFsSW5wdXQoZm9jdXNlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpO1xuICAgIGlmICghd2FzRm9jdXNlZCkge1xuICAgICAgZm9jdXNlZC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSkge1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNGb3JtSW5wdXQoZWwpIHtcbiAgICBpZiAoZWwubG9jYWxOYW1lICYmIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpKSB7XG4gICAgICAvLyBDdXN0b20gRWxlbWVudHMgbWF5IGJlIGZvcm0gYXNzb2NpYXRlZC4gVGhpcyBhbGxvd3MgdGhlbVxuICAgICAgLy8gdG8gcGFydGljaXBhdGUgd2l0aGluIGEgZm9ybSdzIGxpZmVjeWNsZSwgaW5jbHVkaW5nIGZvcm1cbiAgICAgIC8vIHZhbGlkaXR5IGFuZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgICAgLy8gVGhlIHNwZWMgZm9yIEZvcm0gQXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgcmVxdWlyZXMgdGhlXG4gICAgICAvLyBjdXN0b20gZWxlbWVudCdzIGNsYXNzIHRvIGNvbnRhaW4gYSBzdGF0aWMgYm9vbGVhbiB2YWx1ZSBvZiBgZm9ybUFzc29jaWF0ZWRgXG4gICAgICAvLyB3aGljaCBpZGVudGlmaWVzIHRoaXMgY2xhc3MgYXMgYWxsb3dlZCB0byBhc3NvY2lhdGUgdG8gYSBmb3JtLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvZGV2L2N1c3RvbS1lbGVtZW50cy5odG1sI2N1c3RvbS1lbGVtZW50cy1mYWNlLWV4YW1wbGVcbiAgICAgIC8vIGZvciBkZXRhaWxzLlxuICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLmdldChlbC5sb2NhbE5hbWUpW2Bmb3JtQXNzb2NpYXRlZGBdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiXG4gICAgKTtcbiAgfSxcblxuICBzeW5jQXR0cnNUb1Byb3BzKGVsKSB7XG4gICAgaWYgKFxuICAgICAgZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBDSEVDS0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA+PSAwXG4gICAgKSB7XG4gICAgICBlbC5jaGVja2VkID0gZWwuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSAhPT0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgaXNUZXh0dWFsSW5wdXQoZWwpIHtcbiAgICByZXR1cm4gRk9DVVNBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDA7XG4gIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWwuZ2V0QXR0cmlidXRlICYmXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUocGh4VHJpZ2dlckV4dGVybmFsKSAhPT0gbnVsbCAmJlxuICAgICAgZG9jdW1lbnQuYm9keS5jb250YWlucyhlbClcbiAgICApO1xuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSkge1xuICAgIGlmIChcbiAgICAgIERPTS5pc1BoeFVwZGF0ZShjb250YWluZXIsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiLCBQSFhfU1RSRUFNXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgICBjb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFjaGlsZE5vZGUuaWQpIHtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5VGV4dE5vZGUgPVxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJlxuICAgICAgICAgICAgY2hpbGROb2RlLm5vZGVWYWx1ZS50cmltKCkgPT09IFwiXCI7XG4gICAgICAgICAgaWYgKCFpc0VtcHR5VGV4dE5vZGUgJiYgY2hpbGROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgICAgIFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIiArXG4gICAgICAgICAgICAgICAgYHJlbW92aW5nIGlsbGVnYWwgbm9kZTogXCIkeyhjaGlsZE5vZGUub3V0ZXJIVE1MIHx8IGNoaWxkTm9kZS5ub2RlVmFsdWUpLnRyaW0oKX1cIlxcblxcbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdG9SZW1vdmUuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiBjaGlsZE5vZGUucmVtb3ZlKCkpO1xuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhZ05hbWUsIGF0dHJzKSB7XG4gICAgY29uc3QgcmV0YWluZWRBdHRycyA9IG5ldyBTZXQoW1xuICAgICAgXCJpZFwiLFxuICAgICAgUEhYX1NFU1NJT04sXG4gICAgICBQSFhfU1RBVElDLFxuICAgICAgUEhYX01BSU4sXG4gICAgICBQSFhfUk9PVF9JRCxcbiAgICBdKTtcbiAgICBpZiAoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBBcnJheS5mcm9tKGNvbnRhaW5lci5hdHRyaWJ1dGVzKVxuICAgICAgICAuZmlsdGVyKChhdHRyKSA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpKTtcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFyZXRhaW5lZEF0dHJzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaCgoYXR0cikgPT4gY29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSkpO1xuXG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKGF0dHIpID0+XG4gICAgICAgIG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pLFxuICAgICAgKTtcbiAgICAgIHJldGFpbmVkQXR0cnMuZm9yRWFjaCgoYXR0cikgPT5cbiAgICAgICAgbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSxcbiAgICAgICk7XG4gICAgICBuZXdDb250YWluZXIuaW5uZXJIVE1MID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChuZXdDb250YWluZXIpO1xuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0U3RpY2t5KGVsLCBuYW1lLCBkZWZhdWx0VmFsKSB7XG4gICAgY29uc3Qgb3AgPSAoRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpIHx8IFtdKS5maW5kKFxuICAgICAgKFtleGlzdGluZ05hbWVdKSA9PiBuYW1lID09PSBleGlzdGluZ05hbWUsXG4gICAgKTtcbiAgICBpZiAob3ApIHtcbiAgICAgIGNvbnN0IFtfbmFtZSwgX29wLCBzdGFzaGVkUmVzdWx0XSA9IG9wO1xuICAgICAgcmV0dXJuIHN0YXNoZWRSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbCA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdFZhbCgpIDogZGVmYXVsdFZhbDtcbiAgICB9XG4gIH0sXG5cbiAgZGVsZXRlU3RpY2t5KGVsLCBuYW1lKSB7XG4gICAgdGhpcy51cGRhdGVQcml2YXRlKGVsLCBcInN0aWNreVwiLCBbXSwgKG9wcykgPT4ge1xuICAgICAgcmV0dXJuIG9wcy5maWx0ZXIoKFtleGlzdGluZ05hbWUsIF9dKSA9PiBleGlzdGluZ05hbWUgIT09IG5hbWUpO1xuICAgIH0pO1xuICB9LFxuXG4gIHB1dFN0aWNreShlbCwgbmFtZSwgb3ApIHtcbiAgICBjb25zdCBzdGFzaGVkUmVzdWx0ID0gb3AoZWwpO1xuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIChvcHMpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBvcHMuZmluZEluZGV4KFxuICAgICAgICAoW2V4aXN0aW5nTmFtZV0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAgIG9wc1tleGlzdGluZ0luZGV4XSA9IFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChbbmFtZSwgb3AsIHN0YXNoZWRSZXN1bHRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHM7XG4gICAgfSk7XG4gIH0sXG5cbiAgYXBwbHlTdGlja3lPcGVyYXRpb25zKGVsKSB7XG4gICAgY29uc3Qgb3BzID0gRE9NLnByaXZhdGUoZWwsIFwic3RpY2t5XCIpO1xuICAgIGlmICghb3BzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3BzLmZvckVhY2goKFtuYW1lLCBvcCwgX3N0YXNoZWRdKSA9PiB0aGlzLnB1dFN0aWNreShlbCwgbmFtZSwgb3ApKTtcbiAgfSxcblxuICBpc0xvY2tlZChlbCkge1xuICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBET007XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgY2hhbm5lbFVwbG9hZGVyLCBsb2dFcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRFbnRyeSB7XG4gIHN0YXRpYyBpc0FjdGl2ZShmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBpc05ldyA9IGZpbGUuX3BoeFJlZiA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGl2ZVJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwO1xuICAgIHJldHVybiBmaWxlLnNpemUgPiAwICYmIChpc05ldyB8fCBpc0FjdGl2ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpIHtcbiAgICBjb25zdCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWxcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1BSRUZMSUdIVEVEX1JFRlMpXG4gICAgICAuc3BsaXQoXCIsXCIpO1xuICAgIGNvbnN0IGlzUHJlZmxpZ2h0ZWQgPVxuICAgICAgcHJlZmxpZ2h0ZWRSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDA7XG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpO1xuICB9XG5cbiAgc3RhdGljIGlzUHJlZmxpZ2h0SW5Qcm9ncmVzcyhmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPT09IHRydWU7XG4gIH1cblxuICBzdGF0aWMgbWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZmlsZSkge1xuICAgIGZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZmlsZUVsLCBmaWxlLCB2aWV3LCBhdXRvVXBsb2FkKSB7XG4gICAgdGhpcy5yZWYgPSBMaXZlVXBsb2FkZXIuZ2VuRmlsZVJlZihmaWxlKTtcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbDtcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgdGhpcy5tZXRhID0gbnVsbDtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzRG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Byb2dyZXNzID0gMDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gLTE7XG4gICAgdGhpcy5fb25Eb25lID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5maWxlRWwuYWRkRXZlbnRMaXN0ZW5lcihQSFhfTElWRV9GSUxFX1VQREFURUQsIHRoaXMuX29uRWxVcGRhdGVkKTtcbiAgICB0aGlzLmF1dG9VcGxvYWQgPSBhdXRvVXBsb2FkO1xuICB9XG5cbiAgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgfVxuXG4gIHByb2dyZXNzKHByb2dyZXNzKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKTtcbiAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPiB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50KSB7XG4gICAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPj0gMTAwKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzID0gMTAwO1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwO1xuICAgICAgICB0aGlzLl9pc0RvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcucHVzaEZpbGVQcm9ncmVzcyh0aGlzLmZpbGVFbCwgdGhpcy5yZWYsIDEwMCwgKCkgPT4ge1xuICAgICAgICAgIExpdmVVcGxvYWRlci51bnRyYWNrRmlsZSh0aGlzLmZpbGVFbCwgdGhpcy5maWxlKTtcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQ2FuY2VsbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmZpbGUuX3ByZWZsaWdodEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9vbkRvbmUoKTtcbiAgfVxuXG4gIGlzRG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEb25lO1xuICB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIikge1xuICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZCk7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7IGVycm9yOiByZWFzb24gfSk7XG4gICAgaWYgKCF0aGlzLmlzQXV0b1VwbG9hZCgpKSB7XG4gICAgICBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyh0aGlzLmZpbGVFbCk7XG4gICAgfVxuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkRvbmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmZpbGVFbC5yZW1vdmVFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG5cbiAgb25FbFVwZGF0ZWQoKSB7XG4gICAgY29uc3QgYWN0aXZlUmVmcyA9IHRoaXMuZmlsZUVsXG4gICAgICAuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUylcbiAgICAgIC5zcGxpdChcIixcIik7XG4gICAgaWYgKGFjdGl2ZVJlZnMuaW5kZXhPZih0aGlzLnJlZikgPT09IC0xKSB7XG4gICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFzdF9tb2RpZmllZDogdGhpcy5maWxlLmxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWU6IHRoaXMuZmlsZS5uYW1lLFxuICAgICAgcmVsYXRpdmVfcGF0aDogdGhpcy5maWxlLndlYmtpdFJlbGF0aXZlUGF0aCxcbiAgICAgIHNpemU6IHRoaXMuZmlsZS5zaXplLFxuICAgICAgdHlwZTogdGhpcy5maWxlLnR5cGUsXG4gICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgbWV0YTogdHlwZW9mIHRoaXMuZmlsZS5tZXRhID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmZpbGUubWV0YSgpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICB1cGxvYWRlcih1cGxvYWRlcnMpIHtcbiAgICBpZiAodGhpcy5tZXRhLnVwbG9hZGVyKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9XG4gICAgICAgIHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IHRoaXMubWV0YS51cGxvYWRlciwgY2FsbGJhY2s6IGNhbGxiYWNrIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IG5hbWU6IFwiY2hhbm5lbFwiLCBjYWxsYmFjazogY2hhbm5lbFVwbG9hZGVyIH07XG4gICAgfVxuICB9XG5cbiAgemlwUG9zdEZsaWdodChyZXNwKSB7XG4gICAgdGhpcy5tZXRhID0gcmVzcC5lbnRyaWVzW3RoaXMucmVmXTtcbiAgICBpZiAoIXRoaXMubWV0YSkge1xuICAgICAgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7XG4gICAgICAgIGlucHV0OiB0aGlzLmZpbGVFbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3AsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfRE9ORV9SRUZTLFxuICBQSFhfUFJFRkxJR0hURURfUkVGUyxcbiAgUEhYX1VQTE9BRF9SRUYsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQge30gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIjtcblxubGV0IGxpdmVVcGxvYWRlckZpbGVSZWYgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlVXBsb2FkZXIge1xuICBzdGF0aWMgZ2VuRmlsZVJlZihmaWxlKSB7XG4gICAgY29uc3QgcmVmID0gZmlsZS5fcGh4UmVmO1xuICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBmaWxlLl9waHhSZWY7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldEVudHJ5RGF0YVVSTChpbnB1dEVsLCByZWYsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuYWN0aXZlRmlsZXMoaW5wdXRFbCkuZmluZChcbiAgICAgIChmaWxlKSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZixcbiAgICApO1xuICAgIGNhbGxiYWNrKFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpO1xuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkge1xuICAgIGxldCBhY3RpdmUgPSAwO1xuICAgIERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbCkuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT1cbiAgICAgICAgaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpXG4gICAgICApIHtcbiAgICAgICAgYWN0aXZlKys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGl2ZSA+IDA7XG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpO1xuICAgIGNvbnN0IGZpbGVEYXRhID0ge307XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSB7IHBhdGg6IGlucHV0RWwubmFtZSB9O1xuICAgICAgY29uc3QgdXBsb2FkUmVmID0gaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpO1xuICAgICAgZmlsZURhdGFbdXBsb2FkUmVmXSA9IGZpbGVEYXRhW3VwbG9hZFJlZl0gfHwgW107XG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSk7XG4gICAgICBlbnRyeS5sYXN0X21vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQ7XG4gICAgICBlbnRyeS5uYW1lID0gZmlsZS5uYW1lIHx8IGVudHJ5LnJlZjtcbiAgICAgIGVudHJ5LnJlbGF0aXZlX3BhdGggPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aDtcbiAgICAgIGVudHJ5LnR5cGUgPSBmaWxlLnR5cGU7XG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplO1xuICAgICAgaWYgKHR5cGVvZiBmaWxlLm1ldGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbnRyeS5tZXRhID0gZmlsZS5tZXRhKCk7XG4gICAgICB9XG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWxlRGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpIHtcbiAgICBpbnB1dEVsLnZhbHVlID0gbnVsbDtcbiAgICBpbnB1dEVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRik7XG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSk7XG4gIH1cblxuICBzdGF0aWMgdW50cmFja0ZpbGUoaW5wdXRFbCwgZmlsZSkge1xuICAgIERPTS5wdXRQcml2YXRlKFxuICAgICAgaW5wdXRFbCxcbiAgICAgIFwiZmlsZXNcIixcbiAgICAgIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKChmKSA9PiAhT2JqZWN0LmlzKGYsIGZpbGUpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXRFbFxuICAgKiBAcGFyYW0ge0FycmF5PEZpbGV8QmxvYj59IGZpbGVzXG4gICAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBbZGF0YVRyYW5zZmVyXVxuICAgKi9cbiAgc3RhdGljIHRyYWNrRmlsZXMoaW5wdXRFbCwgZmlsZXMsIGRhdGFUcmFuc2Zlcikge1xuICAgIGlmIChpbnB1dEVsLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcihcbiAgICAgICAgKGZpbGUpID0+ICF0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoKGYpID0+IE9iamVjdC5pcyhmLCBmaWxlKSksXG4gICAgICApO1xuICAgICAgRE9NLnVwZGF0ZVByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSwgKGV4aXN0aW5nKSA9PlxuICAgICAgICBleGlzdGluZy5jb25jYXQobmV3RmlsZXMpLFxuICAgICAgKTtcbiAgICAgIGlucHV0RWwudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBpbnB1dEVsIGZpbGVzIHRvIGFsaWduIG91dHB1dCB3aXRoIHByb2dyYW1tYXRpYyBjaGFuZ2VzIChpLmUuIGRyYWcgYW5kIGRyb3ApXG4gICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlucHV0RWwuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9XG4gICAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIGZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpIHtcbiAgICBjb25zdCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoXG4gICAgICAoZWwpID0+IGVsLmZpbGVzICYmIHRoaXMuYWN0aXZlRmlsZXMoZWwpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhY3RpdmVGaWxlcyhpbnB1dCkge1xuICAgIHJldHVybiAoRE9NLnByaXZhdGUoaW5wdXQsIFwiZmlsZXNcIikgfHwgW10pLmZpbHRlcigoZikgPT5cbiAgICAgIFVwbG9hZEVudHJ5LmlzQWN0aXZlKGlucHV0LCBmKSxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGlucHV0c0F3YWl0aW5nUHJlZmxpZ2h0KGZvcm1FbCkge1xuICAgIGNvbnN0IGZpbGVJbnB1dHMgPSBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihcbiAgICAgIChpbnB1dCkgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwLFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoXG4gICAgICAoZikgPT5cbiAgICAgICAgIVVwbG9hZEVudHJ5LmlzUHJlZmxpZ2h0ZWQoaW5wdXQsIGYpICYmXG4gICAgICAgICFVcGxvYWRFbnRyeS5pc1ByZWZsaWdodEluUHJvZ3Jlc3MoZiksXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBtYXJrUHJlZmxpZ2h0SW5Qcm9ncmVzcyhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gVXBsb2FkRW50cnkubWFya1ByZWZsaWdodEluUHJvZ3Jlc3MoZW50cnkuZmlsZSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoaW5wdXRFbCwgdmlldywgb25Db21wbGV0ZSkge1xuICAgIHRoaXMuYXV0b1VwbG9hZCA9IERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCk7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlO1xuICAgIHRoaXMuX2VudHJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgTGl2ZVVwbG9hZGVyLmZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXRFbCkgfHwgW10sXG4gICAgKS5tYXAoKGZpbGUpID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3LCB0aGlzLmF1dG9VcGxvYWQpKTtcblxuICAgIC8vIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGUgcHJlZmxpZ2h0IHJlcXVlc3RzXG4gICAgTGl2ZVVwbG9hZGVyLm1hcmtQcmVmbGlnaHRJblByb2dyZXNzKHRoaXMuX2VudHJpZXMpO1xuXG4gICAgdGhpcy5udW1FbnRyaWVzSW5Qcm9ncmVzcyA9IHRoaXMuX2VudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgaXNBdXRvVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9VcGxvYWQ7XG4gIH1cblxuICBlbnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzO1xuICB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCkge1xuICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS5pc0NhbmNlbGxlZCgpKSB7XG4gICAgICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICB0aGlzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuemlwUG9zdEZsaWdodChyZXNwKTtcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS07XG4gICAgICAgICAgaWYgKHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBncm91cGVkRW50cmllcyA9IHRoaXMuX2VudHJpZXMucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgICBpZiAoIWVudHJ5Lm1ldGEpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbmFtZSwgY2FsbGJhY2sgfSA9IGVudHJ5LnVwbG9hZGVyKGxpdmVTb2NrZXQudXBsb2FkZXJzKTtcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7IGNhbGxiYWNrOiBjYWxsYmFjaywgZW50cmllczogW10gfTtcbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIGVudHJpZXMgfSA9IGdyb3VwZWRFbnRyaWVzW25hbWVdO1xuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldCk7XG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgQVJJQSA9IHtcbiAgYW55T2YoaW5zdGFuY2UsIGNsYXNzZXMpIHtcbiAgICByZXR1cm4gY2xhc3Nlcy5maW5kKChuYW1lKSA9PiBpbnN0YW5jZSBpbnN0YW5jZW9mIG5hbWUpO1xuICB9LFxuXG4gIGlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWwucmVsICE9PSBcImlnbm9yZVwiKSB8fFxuICAgICAgKGVsIGluc3RhbmNlb2YgSFRNTEFyZWFFbGVtZW50ICYmIGVsLmhyZWYgIT09IHVuZGVmaW5lZCkgfHxcbiAgICAgICghZWwuZGlzYWJsZWQgJiZcbiAgICAgICAgdGhpcy5hbnlPZihlbCwgW1xuICAgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQsXG4gICAgICAgICAgSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgICAgICAgICBIVE1MQnV0dG9uRWxlbWVudCxcbiAgICAgICAgXSkpIHx8XG4gICAgICBlbCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50IHx8XG4gICAgICAoZWwudGFiSW5kZXggPj0gMCAmJiBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpIHx8XG4gICAgICAoIWludGVyYWN0aXZlT25seSAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAhPT0gbnVsbCAmJlxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAhPT0gXCJ0cnVlXCIpXG4gICAgKTtcbiAgfSxcblxuICBhdHRlbXB0Rm9jdXMoZWwsIGludGVyYWN0aXZlT25seSkge1xuICAgIGlmICh0aGlzLmlzRm9jdXNhYmxlKGVsLCBpbnRlcmFjdGl2ZU9ubHkpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIHRoYXQncyBmaW5lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5pc1NhbWVOb2RlKGVsKTtcbiAgfSxcblxuICBmb2N1c0ZpcnN0SW50ZXJhY3RpdmUoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCwgdHJ1ZSkgfHwgdGhpcy5mb2N1c0ZpcnN0SW50ZXJhY3RpdmUoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxuXG4gIGZvY3VzRmlyc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLmF0dGVtcHRGb2N1cyhjaGlsZCkgfHwgdGhpcy5mb2N1c0ZpcnN0KGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgfSxcblxuICBmb2N1c0xhc3QoZWwpIHtcbiAgICBsZXQgY2hpbGQgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgaWYgKHRoaXMuYXR0ZW1wdEZvY3VzKGNoaWxkKSB8fCB0aGlzLmZvY3VzTGFzdChjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEFSSUE7XG4iLCAiaW1wb3J0IHtcbiAgUEhYX0FDVElWRV9FTlRSWV9SRUZTLFxuICBQSFhfTElWRV9GSUxFX1VQREFURUQsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiO1xuaW1wb3J0IEFSSUEgZnJvbSBcIi4vYXJpYVwiO1xuXG5jb25zdCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUyk7XG4gICAgfSxcblxuICAgIHByZWZsaWdodGVkUmVmcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfUFJFRkxJR0hURURfUkVGUyk7XG4gICAgfSxcblxuICAgIG1vdW50ZWQoKSB7XG4gICAgICB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlZCgpIHtcbiAgICAgIGNvbnN0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpO1xuICAgICAgaWYgKHRoaXMucHJlZmxpZ2h0ZWRXYXMgIT09IG5ld1ByZWZsaWdodHMpIHtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHM7XG4gICAgICAgIGlmIChuZXdQcmVmbGlnaHRzID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcoKS5jYW5jZWxTdWJtaXQodGhpcy5lbC5mb3JtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3RpdmVSZWZzKCkgPT09IFwiXCIpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCkpO1xuICAgIH0sXG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCkge1xuICAgICAgdGhpcy5yZWYgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcImRhdGEtcGh4LWVudHJ5LXJlZlwiKTtcbiAgICAgIHRoaXMuaW5wdXRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLmdldEVudHJ5RGF0YVVSTCh0aGlzLmlucHV0RWwsIHRoaXMucmVmLCAodXJsKSA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVzdHJveWVkKCkge1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnVybCk7XG4gICAgfSxcbiAgfSxcbiAgRm9jdXNXcmFwOiB7XG4gICAgbW91bnRlZCgpIHtcbiAgICAgIHRoaXMuZm9jdXNTdGFydCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICB0aGlzLmZvY3VzRW5kID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgdGhpcy5mb2N1c1N0YXJ0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgQVJJQS5hdHRlbXB0Rm9jdXMobmV4dEZvY3VzKSB8fCBBUklBLmZvY3VzRmlyc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzTGFzdCh0aGlzLmVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvY3VzRW5kLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoZSkgPT4ge1xuICAgICAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGZvY3VzIGVudGVyaW5nIGZyb20gb3V0c2lkZSAoZS5nLiBTaGlmdCtUYWIgd2hlbiBib2R5IGlzIGZvY3VzZWQpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM2MzZcbiAgICAgICAgICBjb25zdCBuZXh0Rm9jdXMgPSBlLnRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIEFSSUEuYXR0ZW1wdEZvY3VzKG5leHRGb2N1cykgfHwgQVJJQS5mb2N1c0xhc3QobmV4dEZvY3VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBUklBLmZvY3VzRmlyc3QodGhpcy5lbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gb25seSB0cnkgdG8gY2hhbmdlIHRoZSBmb2N1cyBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnNpZGVcbiAgICAgIGlmICghdGhpcy5lbC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6c2hvdy1lbmRcIiwgKCkgPT4gdGhpcy5lbC5mb2N1cygpKTtcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpLmRpc3BsYXkgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgQVJJQS5mb2N1c0ZpcnN0KHRoaXMuZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IGZpbmRTY3JvbGxDb250YWluZXIgPSAoZWwpID0+IHtcbiAgLy8gdGhlIHNjcm9sbCBldmVudCB3b24ndCBiZSBmaXJlZCBvbiB0aGUgaHRtbC9ib2R5IGVsZW1lbnQgZXZlbiBpZiBvdmVyZmxvdyBpcyBzZXRcbiAgLy8gdGhlcmVmb3JlIHdlIHJldHVybiBudWxsIHRvIGluc3RlYWQgbGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzIG9uIGRvY3VtZW50XG4gIGlmIChbXCJIVE1MXCIsIFwiQk9EWVwiXS5pbmRleE9mKGVsLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpID49IDApIHJldHVybiBudWxsO1xuICBpZiAoW1wic2Nyb2xsXCIsIFwiYXV0b1wiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWwpLm92ZXJmbG93WSkgPj0gMClcbiAgICByZXR1cm4gZWw7XG4gIHJldHVybiBmaW5kU2Nyb2xsQ29udGFpbmVyKGVsLnBhcmVudEVsZW1lbnQpO1xufTtcblxuY29uc3Qgc2Nyb2xsVG9wID0gKHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgcmV0dXJuIHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG4gIH1cbn07XG5cbmNvbnN0IGJvdHRvbSA9IChzY3JvbGxDb250YWluZXIpID0+IHtcbiAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xuICAgIHJldHVybiBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xuICB9IGVsc2Uge1xuICAgIC8vIHdoZW4gd2UgaGF2ZSBubyBjb250YWluZXIsIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSBib3R0b20gY29vcmRpbmF0ZSBpcyB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICB9XG59O1xuXG5jb25zdCB0b3AgPSAoc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGlmIChzY3JvbGxDb250YWluZXIpIHtcbiAgICByZXR1cm4gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aGVuIHdlIGhhdmUgbm8gY29udGFpbmVyIHRoZSB3aG9sZSBwYWdlIHNjcm9sbHMsXG4gICAgLy8gdGhlcmVmb3JlIHRoZSB0b3AgY29vcmRpbmF0ZSBpcyAwXG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbmNvbnN0IGlzQXRWaWV3cG9ydFRvcCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5jb25zdCBpc0F0Vmlld3BvcnRCb3R0b20gPSAoZWwsIHNjcm9sbENvbnRhaW5lcikgPT4ge1xuICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiAoXG4gICAgTWF0aC5jZWlsKHJlY3QuYm90dG9tKSA+PSB0b3Aoc2Nyb2xsQ29udGFpbmVyKSAmJlxuICAgIE1hdGguY2VpbChyZWN0LmxlZnQpID49IDAgJiZcbiAgICBNYXRoLmZsb29yKHJlY3QuYm90dG9tKSA8PSBib3R0b20oc2Nyb2xsQ29udGFpbmVyKVxuICApO1xufTtcblxuY29uc3QgaXNXaXRoaW5WaWV3cG9ydCA9IChlbCwgc2Nyb2xsQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIChcbiAgICBNYXRoLmNlaWwocmVjdC50b3ApID49IHRvcChzY3JvbGxDb250YWluZXIpICYmXG4gICAgTWF0aC5jZWlsKHJlY3QubGVmdCkgPj0gMCAmJlxuICAgIE1hdGguZmxvb3IocmVjdC50b3ApIDw9IGJvdHRvbShzY3JvbGxDb250YWluZXIpXG4gICk7XG59O1xuXG5Ib29rcy5JbmZpbml0ZVNjcm9sbCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGZpbmRTY3JvbGxDb250YWluZXIodGhpcy5lbCk7XG4gICAgbGV0IHNjcm9sbEJlZm9yZSA9IHNjcm9sbFRvcCh0aGlzLnNjcm9sbENvbnRhaW5lcik7XG4gICAgbGV0IHRvcE92ZXJyYW4gPSBmYWxzZTtcbiAgICBjb25zdCB0aHJvdHRsZUludGVydmFsID0gNTAwO1xuICAgIGxldCBwZW5kaW5nT3AgPSBudWxsO1xuXG4gICAgY29uc3Qgb25Ub3BPdmVycnVuID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAodG9wRXZlbnQsIGZpcnN0Q2hpbGQpID0+IHtcbiAgICAgICAgcGVuZGluZ09wID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkLCBfb3ZlcnJhbjogdHJ1ZSB9LFxuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nT3AgPSBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25GaXJzdENoaWxkQXRUb3AgPSB0aGlzLnRocm90dGxlKFxuICAgICAgdGhyb3R0bGVJbnRlcnZhbCxcbiAgICAgICh0b3BFdmVudCwgZmlyc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCB0b3BFdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBmaXJzdENoaWxkLmlkIH0sXG4gICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBlbmRpbmdPcCA9IG51bGw7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIHBhdGNoZWQgYnkgd2FpdGluZyBmb3IgdGhlIG5leHQgdGlja1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNXaXRoaW5WaWV3cG9ydChmaXJzdENoaWxkLCB0aGlzLnNjcm9sbENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgICBmaXJzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwic3RhcnRcIiB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBvbkxhc3RDaGlsZEF0Qm90dG9tID0gdGhpcy50aHJvdHRsZShcbiAgICAgIHRocm90dGxlSW50ZXJ2YWwsXG4gICAgICAoYm90dG9tRXZlbnQsIGxhc3RDaGlsZCkgPT4ge1xuICAgICAgICBwZW5kaW5nT3AgPSAoKSA9PiBsYXN0Q2hpbGQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogXCJlbmRcIiB9KTtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmpzKCkucHVzaCh0aGlzLmVsLCBib3R0b21FdmVudCwge1xuICAgICAgICAgIHZhbHVlOiB7IGlkOiBsYXN0Q2hpbGQuaWQgfSxcbiAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgcGVuZGluZ09wID0gbnVsbDtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgcGF0Y2hlZCBieSB3YWl0aW5nIGZvciB0aGUgbmV4dCB0aWNrXG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1dpdGhpblZpZXdwb3J0KGxhc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpKSB7XG4gICAgICAgICAgICAgICAgbGFzdENoaWxkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiZW5kXCIgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5vblNjcm9sbCA9IChfZSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsTm93ID0gc2Nyb2xsVG9wKHRoaXMuc2Nyb2xsQ29udGFpbmVyKTtcblxuICAgICAgaWYgKHBlbmRpbmdPcCkge1xuICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgICAgIHJldHVybiBwZW5kaW5nT3AoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9wRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC10b3BcIiksXG4gICAgICApO1xuICAgICAgY29uc3QgYm90dG9tRXZlbnQgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LmJpbmRpbmcoXCJ2aWV3cG9ydC1ib3R0b21cIiksXG4gICAgICApO1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gdGhpcy5lbC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHRoaXMuZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsTm93IDwgc2Nyb2xsQmVmb3JlO1xuICAgICAgY29uc3QgaXNTY3JvbGxpbmdEb3duID0gc2Nyb2xsTm93ID4gc2Nyb2xsQmVmb3JlO1xuXG4gICAgICAvLyBlbCBvdmVycmFuIHdoaWxlIHNjcm9sbGluZyB1cFxuICAgICAgaWYgKGlzU2Nyb2xsaW5nVXAgJiYgdG9wRXZlbnQgJiYgIXRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPj0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gdHJ1ZTtcbiAgICAgICAgb25Ub3BPdmVycnVuKHRvcEV2ZW50LCBmaXJzdENoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTY3JvbGxpbmdEb3duICYmIHRvcE92ZXJyYW4gJiYgcmVjdC50b3AgPD0gMCkge1xuICAgICAgICB0b3BPdmVycmFuID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdG9wRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdVcCAmJlxuICAgICAgICBpc0F0Vmlld3BvcnRUb3AoZmlyc3RDaGlsZCwgdGhpcy5zY3JvbGxDb250YWluZXIpXG4gICAgICApIHtcbiAgICAgICAgb25GaXJzdENoaWxkQXRUb3AodG9wRXZlbnQsIGZpcnN0Q2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgYm90dG9tRXZlbnQgJiZcbiAgICAgICAgaXNTY3JvbGxpbmdEb3duICYmXG4gICAgICAgIGlzQXRWaWV3cG9ydEJvdHRvbShsYXN0Q2hpbGQsIHRoaXMuc2Nyb2xsQ29udGFpbmVyKVxuICAgICAgKSB7XG4gICAgICAgIG9uTGFzdENoaWxkQXRCb3R0b20oYm90dG9tRXZlbnQsIGxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxOb3c7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfVxuICB9LFxuXG4gIGRlc3Ryb3llZCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgIH1cbiAgfSxcblxuICB0aHJvdHRsZShpbnRlcnZhbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgbGFzdENhbGxBdCA9IDA7XG4gICAgbGV0IHRpbWVyO1xuXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVtYWluaW5nVGltZSA9IGludGVydmFsIC0gKG5vdyAtIGxhc3RDYWxsQXQpO1xuXG4gICAgICBpZiAocmVtYWluaW5nVGltZSA8PSAwIHx8IHJlbWFpbmluZ1RpbWUgPiBpbnRlcnZhbCkge1xuICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsYXN0Q2FsbEF0ID0gbm93O1xuICAgICAgICBjYWxsYmFjayguLi5hcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbGFzdENhbGxBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGNhbGxiYWNrKC4uLmFyZ3MpO1xuICAgICAgICB9LCByZW1haW5pbmdUaW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxufTtcbmV4cG9ydCBkZWZhdWx0IEhvb2tzO1xuIiwgImltcG9ydCB7XG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1BFTkRJTkdfUkVGUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX1JFQURPTkxZLFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbGVtZW50UmVmIHtcbiAgc3RhdGljIG9uVW5sb2NrKGVsLCBjYWxsYmFjaykge1xuICAgIGlmICghRE9NLmlzTG9ja2VkKGVsKSAmJiAhZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RMb2NrID0gZWwuY2xvc2VzdChgWyR7UEhYX1JFRl9MT0NLfV1gKTtcbiAgICBjb25zdCByZWYgPSBjbG9zZXN0TG9ja1xuICAgICAgLmNsb3Nlc3QoYFske1BIWF9SRUZfTE9DS31dYClcbiAgICAgIC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLKTtcbiAgICBjbG9zZXN0TG9jay5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDp1bmRvLWxvY2s6JHtyZWZ9YCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sXG4gICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5sb2FkaW5nUmVmID0gZWwuaGFzQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORylcbiAgICAgID8gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyksIDEwKVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMubG9ja1JlZiA9IGVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spXG4gICAgICA/IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spLCAxMClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIG1heWJlVW5kbyhyZWYsIHBoeEV2ZW50LCBlYWNoQ2xvbmVDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5pc1dpdGhpbihyZWYpKSB7XG4gICAgICAvLyB3ZSBjYW5ub3QgdW5kbyB0aGUgbG9jayAvIGxvYWRpbmcgbm93LCBhcyB0aGVyZSBpcyBhIG5ld2VyIG9uZSBhbHJlYWR5IHNldDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHJlZiB3ZSB0cmllZCB0byBzZW5kIHRoZSB1bmRvIGV2ZW50IGxhdGVyXG4gICAgICBET00udXBkYXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUEVORElOR19SRUZTLCBbXSwgKHBlbmRpbmdSZWZzKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdW5kbyBsb2NrcyBhbmQgYXBwbHkgY2xvbmVzXG4gICAgdGhpcy51bmRvTG9ja3MocmVmLCBwaHhFdmVudCwgZWFjaENsb25lQ2FsbGJhY2spO1xuXG4gICAgLy8gdW5kbyBsb2FkaW5nIHN0YXRlc1xuICAgIHRoaXMudW5kb0xvYWRpbmcocmVmLCBwaHhFdmVudCk7XG5cbiAgICAvLyBlbnN1cmUgdW5kbyBldmVudHMgYXJlIGZpcmVkIGZvciBwZW5kaW5nIHJlZnMgdGhhdFxuICAgIC8vIGFyZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCByZWYsIG90aGVyd2lzZSB3ZSdkIGxlYWsgZXZlbnQgbGlzdGVuZXJzXG4gICAgRE9NLnVwZGF0ZVByaXZhdGUodGhpcy5lbCwgUEhYX1BFTkRJTkdfUkVGUywgW10sIChwZW5kaW5nUmVmcykgPT4ge1xuICAgICAgcmV0dXJuIHBlbmRpbmdSZWZzLmZpbHRlcigocGVuZGluZ1JlZikgPT4ge1xuICAgICAgICBsZXQgb3B0cyA9IHtcbiAgICAgICAgICBkZXRhaWw6IHsgcmVmOiBwZW5kaW5nUmVmLCBldmVudDogcGh4RXZlbnQgfSxcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nUmVmICYmIHRoaXMubG9hZGluZ1JlZiA+IHBlbmRpbmdSZWYpIHtcbiAgICAgICAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvYWRpbmc6JHtwZW5kaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9ja1JlZiAmJiB0aGlzLmxvY2tSZWYgPiBwZW5kaW5nUmVmKSB7XG4gICAgICAgICAgdGhpcy5lbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2NrOiR7cGVuZGluZ1JlZn1gLCBvcHRzKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVmID4gcmVmO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBjbGVhbiB1cCBpZiBmdWxseSByZXNvbHZlZFxuICAgIGlmICh0aGlzLmlzRnVsbHlSZXNvbHZlZEJ5KHJlZikpIHtcbiAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfU1JDKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG5cbiAgaXNXaXRoaW4ocmVmKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICB0aGlzLmxvYWRpbmdSZWYgIT09IG51bGwgJiZcbiAgICAgIHRoaXMubG9hZGluZ1JlZiA+IHJlZiAmJlxuICAgICAgdGhpcy5sb2NrUmVmICE9PSBudWxsICYmXG4gICAgICB0aGlzLmxvY2tSZWYgPiByZWZcbiAgICApO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGNsb25lZCBQSFhfUkVGX0xPQ0sgZWxlbWVudCB0aGF0IGhhcyBiZWVuIG1vcnBoZWQgYmVoaW5kXG4gIC8vIHRoZSBzY2VuZXMgd2hpbGUgdGhpcyBlbGVtZW50IHdhcyBsb2NrZWQgaW4gdGhlIERPTS5cbiAgLy8gV2hlbiB3ZSBhcHBseSB0aGUgY2xvbmVkIHRyZWUgdG8gdGhlIGFjdGl2ZSBET00gZWxlbWVudCwgd2UgbXVzdFxuICAvL1xuICAvLyAgIDEuIGV4ZWN1dGUgcGVuZGluZyBtb3VudGVkIGhvb2tzIGZvciBub2RlcyBub3cgaW4gdGhlIERPTVxuICAvLyAgIDIuIHVuZG8gYW55IHJlZiBpbnNpZGUgdGhlIGNsb25lZCB0cmVlIHRoYXQgaGFzIHNpbmNlIGJlZW4gYWNrJ2RcbiAgdW5kb0xvY2tzKHJlZiwgcGh4RXZlbnQsIGVhY2hDbG9uZUNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9ja1VuZG9uZUJ5KHJlZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9uZWRUcmVlID0gRE9NLnByaXZhdGUodGhpcy5lbCwgUEhYX1JFRl9MT0NLKTtcbiAgICBpZiAoY2xvbmVkVHJlZSkge1xuICAgICAgZWFjaENsb25lQ2FsbGJhY2soY2xvbmVkVHJlZSk7XG4gICAgICBET00uZGVsZXRlUHJpdmF0ZSh0aGlzLmVsLCBQSFhfUkVGX0xPQ0spO1xuICAgIH1cbiAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuXG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoYHBoeDp1bmRvLWxvY2s6JHt0aGlzLmxvY2tSZWZ9YCwgb3B0cyksXG4gICAgKTtcbiAgfVxuXG4gIHVuZG9Mb2FkaW5nKHJlZiwgcGh4RXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nVW5kb25lQnkocmVmKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNhblVuZG9Mb2FkaW5nKHJlZikgJiZcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJwaHgtY2hhbmdlLWxvYWRpbmdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9MT0FESU5HKTtcbiAgICAgIGNvbnN0IGRpc2FibGVkVmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVEKTtcbiAgICAgIGNvbnN0IHJlYWRPbmx5VmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIC8vIHJlc3RvcmUgaW5wdXRzXG4gICAgICBpZiAocmVhZE9ubHlWYWwgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbC5yZWFkT25seSA9IHJlYWRPbmx5VmFsID09PSBcInRydWVcIiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZFZhbCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZWRWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRUQpO1xuICAgICAgfVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgY29uc3QgZGlzYWJsZVJlc3RvcmUgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpO1xuICAgICAgaWYgKGRpc2FibGVSZXN0b3JlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVJlc3RvcmU7XG4gICAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGRldGFpbDogeyByZWY6IHJlZiwgZXZlbnQ6IHBoeEV2ZW50IH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6dW5kby1sb2FkaW5nOiR7dGhpcy5sb2FkaW5nUmVmfWAsIG9wdHMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgIGlmIChuYW1lICE9PSBcInBoeC1zdWJtaXQtbG9hZGluZ1wiIHx8IHRoaXMuY2FuVW5kb0xvYWRpbmcocmVmKSkge1xuICAgICAgICBET00ucmVtb3ZlQ2xhc3ModGhpcy5lbCwgbmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpc0xvYWRpbmdVbmRvbmVCeShyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nUmVmID09PSBudWxsID8gZmFsc2UgOiB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmO1xuICB9XG4gIGlzTG9ja1VuZG9uZUJ5KHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgPyBmYWxzZSA6IHRoaXMubG9ja1JlZiA8PSByZWY7XG4gIH1cblxuICBpc0Z1bGx5UmVzb2x2ZWRCeShyZWYpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMubG9hZGluZ1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvYWRpbmdSZWYgPD0gcmVmKSAmJlxuICAgICAgKHRoaXMubG9ja1JlZiA9PT0gbnVsbCB8fCB0aGlzLmxvY2tSZWYgPD0gcmVmKVxuICAgICk7XG4gIH1cblxuICAvLyBvbmx5IHJlbW92ZSB0aGUgcGh4LXN1Ym1pdC1sb2FkaW5nIGNsYXNzIGlmIHdlIGFyZSBub3QgbG9ja2VkXG4gIGNhblVuZG9Mb2FkaW5nKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxvY2tSZWYgPT09IG51bGwgfHwgdGhpcy5sb2NrUmVmIDw9IHJlZjtcbiAgfVxufVxuIiwgImltcG9ydCB7IG1heWJlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NUG9zdE1vcnBoUmVzdG9yZXIge1xuICBjb25zdHJ1Y3Rvcihjb250YWluZXJCZWZvcmUsIGNvbnRhaW5lckFmdGVyLCB1cGRhdGVUeXBlKSB7XG4gICAgY29uc3QgaWRzQmVmb3JlID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGlkc0FmdGVyID0gbmV3IFNldChcbiAgICAgIFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKChjaGlsZCkgPT4gY2hpbGQuaWQpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50c1RvTW9kaWZ5ID0gW107XG5cbiAgICBBcnJheS5mcm9tKGNvbnRhaW5lckJlZm9yZS5jaGlsZHJlbikuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgICAvLyBhbGwgb2Ygb3VyIGNoaWxkcmVuIHNob3VsZCBiZSBlbGVtZW50cyB3aXRoIGlkc1xuICAgICAgICBpZHNCZWZvcmUuYWRkKGNoaWxkLmlkKTtcbiAgICAgICAgaWYgKGlkc0FmdGVyLmhhcyhjaGlsZC5pZCkpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnRJZCA9XG4gICAgICAgICAgICBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmIGNoaWxkLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQ7XG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtcbiAgICAgICAgICAgIGVsZW1lbnRJZDogY2hpbGQuaWQsXG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZDtcbiAgICB0aGlzLnVwZGF0ZVR5cGUgPSB1cGRhdGVUeXBlO1xuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeSA9IGVsZW1lbnRzVG9Nb2RpZnk7XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcigoaWQpID0+ICFpZHNCZWZvcmUuaGFzKGlkKSk7XG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkuZm9yRWFjaCgoZWxlbWVudFRvTW9kaWZ5KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudFRvTW9kaWZ5LnByZXZpb3VzRWxlbWVudElkKSB7XG4gICAgICAgIG1heWJlKFxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5wcmV2aW91c0VsZW1lbnRJZCksXG4gICAgICAgICAgKHByZXZpb3VzRWxlbSkgPT4ge1xuICAgICAgICAgICAgbWF5YmUoXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLFxuICAgICAgICAgICAgICAoZWxlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID1cbiAgICAgICAgICAgICAgICAgIGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkID09IHByZXZpb3VzRWxlbS5pZDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzSW5SaWdodFBsYWNlKSB7XG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCAoZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzSW5SaWdodFBsYWNlID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID09IG51bGw7XG4gICAgICAgICAgaWYgKCFpc0luUmlnaHRQbGFjZSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVwZGF0ZVR5cGUgPT0gXCJwcmVwZW5kXCIpIHtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKChlbGVtSWQpID0+IHtcbiAgICAgICAgbWF5YmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbUlkKSwgKGVsZW0pID0+XG4gICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJ2YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG5mdW5jdGlvbiBtb3JwaEF0dHJzKGZyb21Ob2RlLCB0b05vZGUpIHtcbiAgICB2YXIgdG9Ob2RlQXR0cnMgPSB0b05vZGUuYXR0cmlidXRlcztcbiAgICB2YXIgYXR0cjtcbiAgICB2YXIgYXR0ck5hbWU7XG4gICAgdmFyIGF0dHJOYW1lc3BhY2VVUkk7XG4gICAgdmFyIGF0dHJWYWx1ZTtcbiAgICB2YXIgZnJvbVZhbHVlO1xuXG4gICAgLy8gZG9jdW1lbnQtZnJhZ21lbnRzIGRvbnQgaGF2ZSBhdHRyaWJ1dGVzIHNvIGxldHMgbm90IGRvIGFueXRoaW5nXG4gICAgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBmcm9tTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50XG4gICAgZm9yICh2YXIgaSA9IHRvTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGF0dHIgPSB0b05vZGVBdHRyc1tpXTtcbiAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7XG4gICAgICAgIGF0dHJOYW1lc3BhY2VVUkkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLmxvY2FsTmFtZSB8fCBhdHRyTmFtZTtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIucHJlZml4ID09PSAneG1sbnMnKXtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRyLm5hbWU7IC8vIEl0J3Mgbm90IGFsbG93ZWQgdG8gc2V0IGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBYTUxOUyBuYW1lc3BhY2Ugd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBgeG1sbnNgIHByZWZpeFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21WYWx1ZSA9IGZyb21Ob2RlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IGF0dHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgYXR0cmlidXRlcyBmb3VuZCBvbiB0aGUgb3JpZ2luYWwgRE9NIGVsZW1lbnQgdGhhdFxuICAgIC8vIHdlcmVuJ3QgZm91bmQgb24gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgIHZhciBmcm9tTm9kZUF0dHJzID0gZnJvbU5vZGUuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIGQgPSBmcm9tTm9kZUF0dHJzLmxlbmd0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGF0dHIgPSBmcm9tTm9kZUF0dHJzW2RdO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuXG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGVOUyhhdHRyTmFtZXNwYWNlVVJJLCBhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRvTm9kZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHJhbmdlOyAvLyBDcmVhdGUgYSByYW5nZSBvYmplY3QgZm9yIGVmZmljZW50bHkgcmVuZGVyaW5nIHN0cmluZ3MgdG8gZWxlbWVudHMuXG52YXIgTlNfWEhUTUwgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG5cbnZhciBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZG9jdW1lbnQ7XG52YXIgSEFTX1RFTVBMQVRFX1NVUFBPUlQgPSAhIWRvYyAmJiAnY29udGVudCcgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG52YXIgSEFTX1JBTkdFX1NVUFBPUlQgPSAhIWRvYyAmJiBkb2MuY3JlYXRlUmFuZ2UgJiYgJ2NyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCcgaW4gZG9jLmNyZWF0ZVJhbmdlKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cikge1xuICAgIHZhciB0ZW1wbGF0ZSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHN0cjtcbiAgICByZXR1cm4gdGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21SYW5nZShzdHIpIHtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jLmJvZHkpO1xuICAgIH1cblxuICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHIpO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudEZyb21XcmFwKHN0cikge1xuICAgIHZhciBmcmFnbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgZnJhZ21lbnQuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiBmcmFnbWVudC5jaGlsZE5vZGVzWzBdO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYWJvdXQgdGhlIHNhbWVcbiAqIHZhciBodG1sID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzdHIsICd0ZXh0L2h0bWwnKTtcbiAqIHJldHVybiBodG1sLmJvZHkuZmlyc3RDaGlsZDtcbiAqXG4gKiBAbWV0aG9kIHRvRWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiB0b0VsZW1lbnQoc3RyKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBpZiAoSEFTX1RFTVBMQVRFX1NVUFBPUlQpIHtcbiAgICAgIC8vIGF2b2lkIHJlc3RyaWN0aW9ucyBvbiBjb250ZW50IGZvciB0aGluZ3MgbGlrZSBgPHRyPjx0aD5IaTwvdGg+PC90cj5gIHdoaWNoXG4gICAgICAvLyBjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQgZG9lc24ndCBzdXBwb3J0XG4gICAgICAvLyA8dGVtcGxhdGU+IHN1cHBvcnQgbm90IGF2YWlsYWJsZSBpbiBJRVxuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVRlbXBsYXRlKHN0cik7XG4gICAgfSBlbHNlIGlmIChIQVNfUkFOR0VfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdHdvIG5vZGUncyBuYW1lcyBhcmUgdGhlIHNhbWUuXG4gKlxuICogTk9URTogV2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGBuYW1lc3BhY2VVUklgIGJlY2F1c2UgeW91IHdpbGwgbmV2ZXIgZmluZCB0d28gSFRNTCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lXG4gKiAgICAgICBub2RlTmFtZSBhbmQgZGlmZmVyZW50IG5hbWVzcGFjZSBVUklzLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiIFRoZSB0YXJnZXQgZWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU5vZGVOYW1lcyhmcm9tRWwsIHRvRWwpIHtcbiAgICB2YXIgZnJvbU5vZGVOYW1lID0gZnJvbUVsLm5vZGVOYW1lO1xuICAgIHZhciB0b05vZGVOYW1lID0gdG9FbC5ub2RlTmFtZTtcbiAgICB2YXIgZnJvbUNvZGVTdGFydCwgdG9Db2RlU3RhcnQ7XG5cbiAgICBpZiAoZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZyb21Db2RlU3RhcnQgPSBmcm9tTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcbiAgICB0b0NvZGVTdGFydCA9IHRvTm9kZU5hbWUuY2hhckNvZGVBdCgwKTtcblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIHZpcnR1YWwgRE9NIG5vZGUgb3IgU1ZHIG5vZGUgdGhlbiB3ZSBtYXlcbiAgICAvLyBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgdGFnIG5hbWUgYmVmb3JlIGNvbXBhcmluZy4gTm9ybWFsIEhUTUwgZWxlbWVudHMgdGhhdCBhcmVcbiAgICAvLyBpbiB0aGUgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJcbiAgICAvLyBhcmUgY29udmVydGVkIHRvIHVwcGVyIGNhc2VcbiAgICBpZiAoZnJvbUNvZGVTdGFydCA8PSA5MCAmJiB0b0NvZGVTdGFydCA+PSA5NykgeyAvLyBmcm9tIGlzIHVwcGVyIGFuZCB0byBpcyBsb3dlclxuICAgICAgICByZXR1cm4gZnJvbU5vZGVOYW1lID09PSB0b05vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0b0NvZGVTdGFydCA8PSA5MCAmJiBmcm9tQ29kZVN0YXJ0ID49IDk3KSB7IC8vIHRvIGlzIHVwcGVyIGFuZCBmcm9tIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiB0b05vZGVOYW1lID09PSBmcm9tTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50LCBvcHRpb25hbGx5IHdpdGggYSBrbm93biBuYW1lc3BhY2UgVVJJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBlbGVtZW50IG5hbWUsIGUuZy4gJ2Rpdicgb3IgJ3N2ZydcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlVVJJXSB0aGUgZWxlbWVudCdzIG5hbWVzcGFjZSBVUkksIGkuZS4gdGhlIHZhbHVlIG9mXG4gKiBpdHMgYHhtbG5zYCBhdHRyaWJ1dGUgb3IgaXRzIGluZmVycmVkIG5hbWVzcGFjZS5cbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSwgbmFtZXNwYWNlVVJJKSB7XG4gICAgcmV0dXJuICFuYW1lc3BhY2VVUkkgfHwgbmFtZXNwYWNlVVJJID09PSBOU19YSFRNTCA/XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpIDpcbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIG5hbWUpO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgY2hpbGRyZW4gb2Ygb25lIERPTSBlbGVtZW50IHRvIGFub3RoZXIgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gbW92ZUNoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIHRvRWwuYXBwZW5kQ2hpbGQoY3VyQ2hpbGQpO1xuICAgICAgICBjdXJDaGlsZCA9IG5leHRDaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvRWw7XG59XG5cbmZ1bmN0aW9uIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCBuYW1lKSB7XG4gICAgaWYgKGZyb21FbFtuYW1lXSAhPT0gdG9FbFtuYW1lXSkge1xuICAgICAgICBmcm9tRWxbbmFtZV0gPSB0b0VsW25hbWVdO1xuICAgICAgICBpZiAoZnJvbUVsW25hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnZhciBzcGVjaWFsRWxIYW5kbGVycyA9IHtcbiAgICBPUFRJT046IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGZyb21FbC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgPT09ICdTRUxFQ1QnICYmICFwYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tRWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpICYmICF0b0VsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIE1TIEVkZ2UgYnVnIHdoZXJlIHRoZSAnc2VsZWN0ZWQnIGF0dHJpYnV0ZSBjYW4gb25seSBiZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkIGlmIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIwODc2NzkvXG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVzZXQgc2VsZWN0IGVsZW1lbnQncyBzZWxlY3RlZEluZGV4IHRvIC0xLCBvdGhlcndpc2Ugc2V0dGluZ1xuICAgICAgICAgICAgICAgIC8vIGZyb21FbC5zZWxlY3RlZCB1c2luZyB0aGUgc3luY0Jvb2xlYW5BdHRyUHJvcCBiZWxvdyBoYXMgbm8gZWZmZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0IHNlbGVjdGVkSW5kZXggd2lsbCBiZSBzZXQgaW4gdGhlIFNFTEVDVCBzcGVjaWFsIGhhbmRsZXIgYmVsb3cuXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdzZWxlY3RlZCcpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgaXMgc3BlY2lhbCBmb3IgdGhlIDxpbnB1dD4gZWxlbWVudCBzaW5jZSBpdCBzZXRzXG4gICAgICogdGhlIGluaXRpYWwgdmFsdWUuIENoYW5naW5nIHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICogXCJ2YWx1ZVwiIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3Qgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIHRoZSBzZXQgdGhlXG4gICAgICogaW5pdGlhbCB2YWx1ZS4gIFNpbWlsYXIgZm9yIHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUsIGFuZCBcImRpc2FibGVkXCIuXG4gICAgICovXG4gICAgSU5QVVQ6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2NoZWNrZWQnKTtcbiAgICAgICAgc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsICdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmcm9tRWwudmFsdWUgIT09IHRvRWwudmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IHRvRWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRvRWwuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICAgICAgICBmcm9tRWwucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIFRFWFRBUkVBOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGZyb21FbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIE5lZWRlZCBmb3IgSUUuIEFwcGFyZW50bHkgSUUgc2V0cyB0aGUgcGxhY2Vob2xkZXIgYXMgdGhlXG4gICAgICAgICAgICAvLyBub2RlIHZhbHVlIGFuZCB2aXNlIHZlcnNhLiBUaGlzIGlnbm9yZXMgYW4gZW1wdHkgdXBkYXRlLlxuICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAoIW5ld1ZhbHVlICYmIG9sZFZhbHVlID09IGZyb21FbC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFTEVDVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ211bHRpcGxlJykpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGxvb3AgdGhyb3VnaCBjaGlsZHJlbiBvZiBmcm9tRWwsIG5vdCB0b0VsIHNpbmNlIG5vZGVzIGNhbiBiZSBtb3ZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0b0VsIHRvIGZyb21FbCBkaXJlY3RseSB3aGVuIG1vcnBoaW5nLlxuICAgICAgICAgICAgLy8gQXQgdGhlIHRpbWUgdGhpcyBzcGVjaWFsIGhhbmRsZXIgaXMgaW52b2tlZCwgYWxsIGNoaWxkcmVuIGhhdmUgYWxyZWFkeSBiZWVuIG1vcnBoZWRcbiAgICAgICAgICAgIC8vIGFuZCBhcHBlbmRlZCB0byAvIHJlbW92ZWQgZnJvbSBmcm9tRWwsIHNvIHVzaW5nIGZyb21FbCBoZXJlIGlzIHNhZmUgYW5kIGNvcnJlY3QuXG4gICAgICAgICAgICB2YXIgY3VyQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBvcHRncm91cDtcbiAgICAgICAgICAgIHZhciBub2RlTmFtZTtcbiAgICAgICAgICAgIHdoaWxlKGN1ckNoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjdXJDaGlsZC5ub2RlTmFtZSAmJiBjdXJDaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVEdST1VQJykge1xuICAgICAgICAgICAgICAgICAgICBvcHRncm91cCA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBlbXB0eSBvcHRncm91cHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ09QVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGlsZC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1ckNoaWxkICYmIG9wdGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IG9wdGdyb3VwLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcm9tRWwuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFJDEgPSAxMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBkZWZhdWx0R2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gIHJldHVybiBmdW5jdGlvbiBtb3JwaGRvbShmcm9tTm9kZSwgdG9Ob2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0b05vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoZnJvbU5vZGUubm9kZU5hbWUgPT09ICcjZG9jdW1lbnQnIHx8IGZyb21Ob2RlLm5vZGVOYW1lID09PSAnSFRNTCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdCT0RZJykge1xuICAgICAgICB2YXIgdG9Ob2RlSHRtbCA9IHRvTm9kZTtcbiAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgdG9Ob2RlLmlubmVySFRNTCA9IHRvTm9kZUh0bWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b05vZGUgPSB0b0VsZW1lbnQodG9Ob2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRvTm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICB0b05vZGUgPSB0b05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgfVxuXG4gICAgdmFyIGdldE5vZGVLZXkgPSBvcHRpb25zLmdldE5vZGVLZXkgfHwgZGVmYXVsdEdldE5vZGVLZXk7XG4gICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVBZGRlZCA9IG9wdGlvbnMub25Ob2RlQWRkZWQgfHwgbm9vcDtcbiAgICB2YXIgb25CZWZvcmVFbFVwZGF0ZWQgPSBvcHRpb25zLm9uQmVmb3JlRWxVcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZU5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uQmVmb3JlTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbk5vZGVEaXNjYXJkZWQgPSBvcHRpb25zLm9uTm9kZURpc2NhcmRlZCB8fCBub29wO1xuICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgdmFyIHNraXBGcm9tQ2hpbGRyZW4gPSBvcHRpb25zLnNraXBGcm9tQ2hpbGRyZW4gfHwgbm9vcDtcbiAgICB2YXIgYWRkQ2hpbGQgPSBvcHRpb25zLmFkZENoaWxkIHx8IGZ1bmN0aW9uKHBhcmVudCwgY2hpbGQpeyByZXR1cm4gcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsgfTtcbiAgICB2YXIgY2hpbGRyZW5Pbmx5ID0gb3B0aW9ucy5jaGlsZHJlbk9ubHkgPT09IHRydWU7XG5cbiAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgIHZhciBmcm9tTm9kZXNMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciBrZXllZFJlbW92YWxMaXN0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB2YXIgY3VyQ2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgdmFyIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChza2lwS2V5ZWROb2RlcyAmJiAoa2V5ID0gZ2V0Tm9kZUtleShjdXJDaGlsZCkpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcga2V5ZWQgbm9kZXMgdGhlbiB3ZSBhZGQgdGhlIGtleVxuICAgICAgICAgICAgLy8gdG8gYSBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIGhhbmRsZWQgYXQgdGhlIHZlcnkgZW5kLlxuICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2RlcyhjdXJDaGlsZCwgc2tpcEtleWVkTm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYSBET00gbm9kZSBvdXQgb2YgdGhlIG9yaWdpbmFsIERPTVxuICAgICpcbiAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gICAgKiBAcGFyYW0gIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBub2RlcyBwYXJlbnRcbiAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlLCBwYXJlbnROb2RlLCBza2lwS2V5ZWROb2Rlcykge1xuICAgICAgaWYgKG9uQmVmb3JlTm9kZURpc2NhcmRlZChub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gLy8gVHJlZVdhbGtlciBpbXBsZW1lbnRhdGlvbiBpcyBubyBmYXN0ZXIsIGJ1dCBrZWVwaW5nIHRoaXMgYXJvdW5kIGluIGNhc2UgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgIC8vICAgICB2YXIgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgLy8gICAgICAgICByb290LFxuICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgIC8vXG4gICAgLy8gICAgIHZhciBlbDtcbiAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgIC8vICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoZWwpO1xuICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyAvLyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgbm8gZmFzdGVyLCBidXQga2VlcGluZyB0aGlzIGFyb3VuZCBpbiBjYXNlIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgIC8vICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICAvLyAgICAgdmFyIGVsO1xuICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAvLyAgICAgICAgIGlmIChrZXkpIHtcbiAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgZnVuY3Rpb24gaW5kZXhUcmVlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxKSB7XG4gICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgIGluZGV4VHJlZShjdXJDaGlsZCk7XG5cbiAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgIGZ1bmN0aW9uIGhhbmRsZU5vZGVBZGRlZChlbCkge1xuICAgICAgb25Ob2RlQWRkZWQoZWwpO1xuXG4gICAgICB2YXIgY3VyQ2hpbGQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHZhciB1bm1hdGNoZWRGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBba2V5XTtcbiAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgIC8vIGFuZCBtb3JwaCBpdCB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICBpZiAodW5tYXRjaGVkRnJvbUVsICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyQ2hpbGQsIHVubWF0Y2hlZEZyb21FbCkpIHtcbiAgICAgICAgICAgIGN1ckNoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgbW9ycGhFbCh1bm1hdGNoZWRGcm9tRWwsIGN1ckNoaWxkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgLy8gZnJvbU5vZGVzTG9va3VwXG4gICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1ckNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1ckNoaWxkID0gbmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cEZyb21FbChmcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQsIGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgb2YgdGhlIFwidG8gbm9kZXNcIi4gSWYgY3VyRnJvbU5vZGVDaGlsZCBpc1xuICAgICAgLy8gbm9uLW51bGwgdGhlbiB3ZSBzdGlsbCBoYXZlIHNvbWUgZnJvbSBub2RlcyBsZWZ0IG92ZXIgdGhhdCBuZWVkXG4gICAgICAvLyB0byBiZSByZW1vdmVkXG4gICAgICB3aGlsZSAoY3VyRnJvbU5vZGVDaGlsZCkge1xuICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKChjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCkpKSB7XG4gICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vcnBoRWwoZnJvbUVsLCB0b0VsLCBjaGlsZHJlbk9ubHkpIHtcbiAgICAgIHZhciB0b0VsS2V5ID0gZ2V0Tm9kZUtleSh0b0VsKTtcblxuICAgICAgaWYgKHRvRWxLZXkpIHtcbiAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAvLyBET00gc28gY2xlYXIgaXQgb3V0IG9mIHRoZSBzYXZlZCBlbGVtZW50cyBjb2xsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBmcm9tTm9kZXNMb29rdXBbdG9FbEtleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgIHZhciBiZWZvcmVVcGRhdGVSZXN1bHQgPSBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpO1xuICAgICAgICBpZiAoYmVmb3JlVXBkYXRlUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVVcGRhdGVSZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgIGZyb21FbCA9IGJlZm9yZVVwZGF0ZVJlc3VsdDtcbiAgICAgICAgICAvLyByZWluZGV4IHRoZSBuZXcgZnJvbUVsIGluIGNhc2UgaXQncyBub3QgaW4gdGhlIHNhbWVcbiAgICAgICAgICAvLyB0cmVlIGFzIHRoZSBvcmlnaW5hbCBmcm9tRWxcbiAgICAgICAgICAvLyAoUGhvZW5peCBMaXZlVmlldyBzb21ldGltZXMgcmV0dXJucyBhIGNsb25lZCB0cmVlLFxuICAgICAgICAgIC8vICBidXQga2V5ZWQgbG9va3VwcyB3b3VsZCBzdGlsbCBwb2ludCB0byB0aGUgb3JpZ2luYWwgdHJlZSlcbiAgICAgICAgICBpbmRleFRyZWUoZnJvbUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIG9uIG9yaWdpbmFsIERPTSBlbGVtZW50IGZpcnN0XG4gICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgLy8gb3B0aW9uYWxcbiAgICAgICAgb25FbFVwZGF0ZWQoZnJvbUVsKTtcblxuICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9ycGhDaGlsZHJlbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgIHZhciBza2lwRnJvbSA9IHNraXBGcm9tQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgIHZhciBjdXJUb05vZGVDaGlsZCA9IHRvRWwuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgICB2YXIgY3VyVG9Ob2RlS2V5O1xuICAgICAgdmFyIGN1ckZyb21Ob2RlS2V5O1xuXG4gICAgICB2YXIgZnJvbU5leHRTaWJsaW5nO1xuICAgICAgdmFyIHRvTmV4dFNpYmxpbmc7XG4gICAgICB2YXIgbWF0Y2hpbmdGcm9tRWw7XG5cbiAgICAgIC8vIHdhbGsgdGhlIGNoaWxkcmVuXG4gICAgICBvdXRlcjogd2hpbGUgKGN1clRvTm9kZUNoaWxkKSB7XG4gICAgICAgIHRvTmV4dFNpYmxpbmcgPSBjdXJUb05vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgLy8gd2FsayB0aGUgZnJvbU5vZGUgY2hpbGRyZW4gYWxsIHRoZSB3YXkgdGhyb3VnaFxuICAgICAgICB3aGlsZSAoIXNraXBGcm9tICYmIGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICBmcm9tTmV4dFNpYmxpbmcgPSBjdXJGcm9tTm9kZUNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgaWYgKGN1clRvTm9kZUNoaWxkLmlzU2FtZU5vZGUgJiYgY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZShjdXJGcm9tTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgIHZhciBjdXJGcm9tTm9kZVR5cGUgPSBjdXJGcm9tTm9kZUNoaWxkLm5vZGVUeXBlO1xuXG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgdmFyIGlzQ29tcGF0aWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IGN1clRvTm9kZUNoaWxkLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgRWxlbWVudCBub2Rlc1xuXG4gICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG5vZGUgaGFzIGEga2V5IHNvIHdlIHdhbnQgdG8gbWF0Y2ggaXQgdXAgd2l0aCB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tTmV4dFNpYmxpbmcgPT09IG1hdGNoaW5nRnJvbUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRE9NIG5vZGUgb3V0IG9mIHRoZSB0cmVlIChzaW5jZSB0aGF0IGNhbiBicmVhayBDU1MgdHJhbnNpdGlvbnMsIGV0Yy4pLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaW5zdGVhZCBkaXNjYXJkIHRoZSBjdXJyZW50IG5vZGUgYW5kIHdhaXQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcga2V5ZWQgZWxlbWVudCBzb21ld2hlcmUgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSB1c2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgcmVwbGFjZUNoaWxkIGJlY2F1c2Ugd2Ugd2FudCB0byBnbyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBob29rcyBhcmUgY29ycmVjdGx5IGludm9rZWRcbiAgICAgICAgICAgICAgICAgICAgICBmcm9tRWwuaW5zZXJ0QmVmb3JlKG1hdGNoaW5nRnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBub2RlIGlzIGtleWVkIGl0IG1pZ2h0IGJlIG1hdGNoZWQgdXAgbGF0ZXIgc28gd2UgZGVmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVtb3ZhbCB0byBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IG1hdGNoaW5nRnJvbUVsO1xuICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGVzIGFyZSBub3QgY29tcGF0aWJsZSBzaW5jZSB0aGUgXCJ0b1wiIG5vZGUgaGFzIGEga2V5IGFuZCB0aGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpc0NvbXBhdGlibGUgPSBpc0NvbXBhdGlibGUgIT09IGZhbHNlICYmIGNvbXBhcmVOb2RlTmFtZXMoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgY29tcGF0aWJsZSBET00gZWxlbWVudHMgc28gdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHRhcmdldCBET00gbm9kZS5cbiAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyRnJvbU5vZGVUeXBlID09PSBURVhUX05PREUgfHwgY3VyRnJvbU5vZGVUeXBlID09IENPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGJlaW5nIGNvbXBhcmVkIGFyZSBUZXh0IG9yIENvbW1lbnQgbm9kZXNcbiAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gU2ltcGx5IHVwZGF0ZSBub2RlVmFsdWUgb24gdGhlIG9yaWdpbmFsIG5vZGUgdG9cbiAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZC5ub2RlVmFsdWUgPSBjdXJUb05vZGVDaGlsZC5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgYm90aCB0aGUgXCJ0b1wiIGNoaWxkIGFuZCB0aGUgXCJmcm9tXCIgY2hpbGQgc2luY2Ugd2UgZm91bmQgYSBtYXRjaFxuICAgICAgICAgICAgLy8gTm90aGluZyBlbHNlIHRvIGRvIGFzIHdlIGFscmVhZHkgcmVjdXJzaXZlbHkgY2FsbGVkIG1vcnBoQ2hpbGRyZW4gYWJvdmVcbiAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBObyBjb21wYXRpYmxlIG1hdGNoIHNvIHJlbW92ZSB0aGUgb2xkIG5vZGUgZnJvbSB0aGUgRE9NIGFuZCBjb250aW51ZSB0cnlpbmcgdG8gZmluZCBhXG4gICAgICAgICAgLy8gbWF0Y2ggaW4gdGhlIG9yaWdpbmFsIERPTS4gSG93ZXZlciwgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSBmcm9tIG5vZGUgaXMgbm90IGtleWVkXG4gICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgLy8gdGFyZ2V0IHRyZWUgYW5kIHdlIGRvbid0IHdhbnQgdG8gZGlzY2FyZCBpdCBqdXN0IHlldCBzaW5jZSBpdCBzdGlsbCBtaWdodCBmaW5kIGFcbiAgICAgICAgICAvLyBob21lIGluIHRoZSBmaW5hbCBET00gdHJlZS4gQWZ0ZXIgZXZlcnl0aGluZyBpcyBkb25lIHdlIHdpbGwgcmVtb3ZlIGFueSBrZXllZCBub2Rlc1xuICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHdlIHNraXAgbmVzdGVkIGtleWVkIG5vZGVzIGZyb20gYmVpbmcgcmVtb3ZlZCBzaW5jZSB0aGVyZSBpc1xuICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUoY3VyRnJvbU5vZGVDaGlsZCwgZnJvbUVsLCB0cnVlIC8qIHNraXAga2V5ZWQgbm9kZXMgKi8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgIC8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIHdlIGRpZCBub3QgZmluZCBhIGNhbmRpZGF0ZSBtYXRjaCBmb3JcbiAgICAgICAgLy8gb3VyIFwidG8gbm9kZVwiIGFuZCB3ZSBleGhhdXN0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBcImZyb21cIlxuICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgIC8vIHRvIHRoZSBlbmRcbiAgICAgICAgaWYgKGN1clRvTm9kZUtleSAmJiAobWF0Y2hpbmdGcm9tRWwgPSBmcm9tTm9kZXNMb29rdXBbY3VyVG9Ob2RlS2V5XSkgJiYgY29tcGFyZU5vZGVOYW1lcyhtYXRjaGluZ0Zyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgLy8gTU9SUEhcbiAgICAgICAgICBpZighc2tpcEZyb20peyBhZGRDaGlsZChmcm9tRWwsIG1hdGNoaW5nRnJvbUVsKTsgfVxuICAgICAgICAgIG1vcnBoRWwobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgPSBvbkJlZm9yZU5vZGVBZGRlZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgIGN1clRvTm9kZUNoaWxkID0gb25CZWZvcmVOb2RlQWRkZWRSZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUpIHtcbiAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZENoaWxkKGZyb21FbCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgaGFuZGxlTm9kZUFkZGVkKGN1clRvTm9kZUNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgIHNwZWNpYWxFbEhhbmRsZXIoZnJvbUVsLCB0b0VsKTtcbiAgICAgIH1cbiAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICB2YXIgbW9ycGhlZE5vZGUgPSBmcm9tTm9kZTtcbiAgICB2YXIgbW9ycGhlZE5vZGVUeXBlID0gbW9ycGhlZE5vZGUubm9kZVR5cGU7XG4gICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBnaXZlbiB0d28gRE9NIG5vZGVzIHRoYXQgYXJlIG5vdFxuICAgICAgLy8gY29tcGF0aWJsZSAoZS5nLiA8ZGl2PiAtLT4gPHNwYW4+IG9yIDxkaXY+IC0tPiBURVhUKVxuICAgICAgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVOb2RlTmFtZXMoZnJvbU5vZGUsIHRvTm9kZSkpIHtcbiAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChmcm9tTm9kZSk7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZSA9IG1vdmVDaGlsZHJlbihmcm9tTm9kZSwgY3JlYXRlRWxlbWVudE5TKHRvTm9kZS5ub2RlTmFtZSwgdG9Ob2RlLm5hbWVzcGFjZVVSSSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHb2luZyBmcm9tIGFuIGVsZW1lbnQgbm9kZSB0byBhIHRleHQgbm9kZVxuICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vcnBoZWROb2RlVHlwZSA9PT0gVEVYVF9OT0RFIHx8IG1vcnBoZWROb2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7IC8vIFRleHQgb3IgY29tbWVudCBub2RlXG4gICAgICAgIGlmICh0b05vZGVUeXBlID09PSBtb3JwaGVkTm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAobW9ycGhlZE5vZGUubm9kZVZhbHVlICE9PSB0b05vZGUubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICBtb3JwaGVkTm9kZS5ub2RlVmFsdWUgPSB0b05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZXh0IG5vZGUgdG8gc29tZXRoaW5nIGVsc2VcbiAgICAgICAgICBtb3JwaGVkTm9kZSA9IHRvTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRvTm9kZS5pc1NhbWVOb2RlICYmIHRvTm9kZS5pc1NhbWVOb2RlKG1vcnBoZWROb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaT0wLCBsZW49a2V5ZWRSZW1vdmFsTGlzdC5sZW5ndGg7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICBpZiAoZWxUb1JlbW92ZSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShlbFRvUmVtb3ZlLCBlbFRvUmVtb3ZlLnBhcmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICBtb3JwaGVkTm9kZSA9IG1vcnBoZWROb2RlLmFjdHVhbGl6ZShmcm9tTm9kZS5vd25lckRvY3VtZW50IHx8IGRvYyk7XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBoYWQgdG8gc3dhcCBvdXQgdGhlIGZyb20gbm9kZSB3aXRoIGEgbmV3IG5vZGUgYmVjYXVzZSB0aGUgb2xkXG4gICAgICAvLyBub2RlIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgbm9kZSB0aGVuIHdlIG5lZWQgdG9cbiAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBET00gbm9kZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuIFRoaXMgaXMgb25seVxuICAgICAgLy8gcG9zc2libGUgaWYgdGhlIG9yaWdpbmFsIERPTSBub2RlIHdhcyBwYXJ0IG9mIGEgRE9NIHRyZWUgd2hpY2hcbiAgICAgIC8vIHdlIGtub3cgaXMgdGhlIGNhc2UgaWYgaXQgaGFzIGEgcGFyZW50IG5vZGUuXG4gICAgICBmcm9tTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChtb3JwaGVkTm9kZSwgZnJvbU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtb3JwaGVkTm9kZTtcbiAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9NQUdJQ19JRCxcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1RSSUdHRVJfQUNUSU9OLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfUkVGX1NSQyxcbiAgUEhYX1JFRl9MT0NLLFxuICBQSFhfU1RSRUFNLFxuICBQSFhfU1RSRUFNX1JFRixcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgUEhYX1BPUlRBTCxcbiAgUEhYX1RFTEVQT1JURURfUkVGLFxuICBQSFhfVEVMRVBPUlRFRF9TUkMsXG4gIFBIWF9SVU5USU1FX0hPT0ssXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBkZXRlY3REdXBsaWNhdGVJZHMsIGRldGVjdEludmFsaWRTdHJlYW1JbnNlcnRzLCBpc0NpZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgRWxlbWVudFJlZiBmcm9tIFwiLi9lbGVtZW50X3JlZlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBET01Qb3N0TW9ycGhSZXN0b3JlciBmcm9tIFwiLi9kb21fcG9zdF9tb3JwaF9yZXN0b3JlclwiO1xuaW1wb3J0IG1vcnBoZG9tIGZyb20gXCJtb3JwaGRvbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHZpZXcsIGNvbnRhaW5lciwgaWQsIGh0bWwsIHN0cmVhbXMsIHRhcmdldENJRCwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXQ7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkO1xuICAgIHRoaXMuaHRtbCA9IGh0bWw7XG4gICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtcztcbiAgICB0aGlzLnN0cmVhbUluc2VydHMgPSB7fTtcbiAgICB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmUgPSB7fTtcbiAgICB0aGlzLnRhcmdldENJRCA9IHRhcmdldENJRDtcbiAgICB0aGlzLmNpZFBhdGNoID0gaXNDaWQodGhpcy50YXJnZXRDSUQpO1xuICAgIHRoaXMucGVuZGluZ1JlbW92ZXMgPSBbXTtcbiAgICB0aGlzLnBoeFJlbW92ZSA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFwicmVtb3ZlXCIpO1xuICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyID0gdGhpcy5pc0NJRFBhdGNoKClcbiAgICAgID8gdGhpcy50YXJnZXRDSURDb250YWluZXIoaHRtbClcbiAgICAgIDogY29udGFpbmVyO1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge1xuICAgICAgYmVmb3JlYWRkZWQ6IFtdLFxuICAgICAgYmVmb3JldXBkYXRlZDogW10sXG4gICAgICBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLFxuICAgICAgYWZ0ZXJ1cGRhdGVkOiBbXSxcbiAgICAgIGFmdGVyZGlzY2FyZGVkOiBbXSxcbiAgICAgIGFmdGVycGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcnRyYW5zaXRpb25zRGlzY2FyZGVkOiBbXSxcbiAgICB9O1xuICAgIHRoaXMud2l0aENoaWxkcmVuID0gb3B0cy53aXRoQ2hpbGRyZW4gfHwgb3B0cy51bmRvUmVmIHx8IGZhbHNlO1xuICAgIHRoaXMudW5kb1JlZiA9IG9wdHMudW5kb1JlZjtcbiAgfVxuXG4gIGJlZm9yZShraW5kLCBjYWxsYmFjaykge1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICB0cmFja0JlZm9yZShraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGJlZm9yZSR7a2luZH1gXS5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICB9XG5cbiAgdHJhY2tBZnRlcihraW5kLCAuLi5hcmdzKSB7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayguLi5hcmdzKSk7XG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpIHtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKTtcbiAgICBET00uYWxsKFxuICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICBgWyR7cGh4VXBkYXRlfT1hcHBlbmRdID4gKiwgWyR7cGh4VXBkYXRlfT1wcmVwZW5kXSA+ICpgLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUFJVTkUsIFwiXCIpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcGVyZm9ybShpc0pvaW5QYXRjaCkge1xuICAgIGNvbnN0IHsgdmlldywgbGl2ZVNvY2tldCwgaHRtbCwgY29udGFpbmVyIH0gPSB0aGlzO1xuICAgIGxldCB0YXJnZXRDb250YWluZXIgPSB0aGlzLnRhcmdldENvbnRhaW5lcjtcblxuICAgIGlmICh0aGlzLmlzQ0lEUGF0Y2goKSAmJiAhdGhpcy50YXJnZXRDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NJRFBhdGNoKCkpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L3B1bGwvMzk0MlxuICAgICAgLy8gd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBubyBwYXJlbnQgaXMgbG9ja2VkXG4gICAgICBjb25zdCBjbG9zZXN0TG9jayA9IHRhcmdldENvbnRhaW5lci5jbG9zZXN0KGBbJHtQSFhfUkVGX0xPQ0t9XWApO1xuICAgICAgaWYgKGNsb3Nlc3RMb2NrKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZFRyZWUgPSBET00ucHJpdmF0ZShjbG9zZXN0TG9jaywgUEhYX1JFRl9MT0NLKTtcbiAgICAgICAgaWYgKGNsb25lZFRyZWUpIHtcbiAgICAgICAgICAvLyBpZiBhIHBhcmVudCBpcyBsb2NrZWQgd2l0aCBhIGNsb25lZCB0cmVlLCB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBjbG9uZWQgdHJlZSBpbnN0ZWFkXG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyID0gY2xvbmVkVHJlZS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYFtkYXRhLXBoeC1jb21wb25lbnQ9XCIke3RoaXMudGFyZ2V0Q0lEfVwiXWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzZWQgPSBsaXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9XG4gICAgICBmb2N1c2VkICYmIERPTS5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSA/IGZvY3VzZWQgOiB7fTtcbiAgICBjb25zdCBwaHhVcGRhdGUgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1VQREFURSk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgY29uc3QgcGh4Vmlld3BvcnRCb3R0b20gPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1ZJRVdQT1JUX0JPVFRPTSk7XG4gICAgY29uc3QgcGh4VHJpZ2dlckV4dGVybmFsID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9UUklHR0VSX0FDVElPTik7XG4gICAgY29uc3QgYWRkZWQgPSBbXTtcbiAgICBjb25zdCB1cGRhdGVzID0gW107XG4gICAgY29uc3QgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXTtcblxuICAgIC8vIGFzIHRoZSBwb3J0YWwgdGFyZ2V0IGl0c2VsZiBjb3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBET00sXG4gICAgLy8gaXQgbWF5IG5vdCBiZSBwcmVzZW50IHdoaWxlIG1vcnBoaW5nIHByZXZpb3VzIHBhcnRzO1xuICAgIC8vIHRoZXJlZm9yZSB3ZSBhcHBseSBhbGwgdGVsZXBvcnRzIGFmdGVyIHRoZSBtb3JwaGluZyBpcyBkb25lK1xuICAgIGNvbnN0IHBvcnRhbENhbGxiYWNrcyA9IFtdO1xuXG4gICAgbGV0IGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IG51bGw7XG5cbiAgICBjb25zdCBtb3JwaCA9IChcbiAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgIHNvdXJjZSxcbiAgICAgIHdpdGhDaGlsZHJlbiA9IHRoaXMud2l0aENoaWxkcmVuLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgbW9ycGhDYWxsYmFja3MgPSB7XG4gICAgICAgIC8vIG5vcm1hbGx5LCB3ZSBhcmUgcnVubmluZyB3aXRoIGNoaWxkcmVuT25seSwgYXMgdGhlIHBhdGNoIEhUTUwgZm9yIGEgTFZcbiAgICAgICAgLy8gZG9lcyBub3QgaW5jbHVkZSB0aGUgTFYgYXR0cnMgKGRhdGEtcGh4LXNlc3Npb24sIGV0Yy4pXG4gICAgICAgIC8vIHdoZW4gd2UgYXJlIHBhdGNoaW5nIGEgbGl2ZSBjb21wb25lbnQsIHdlIGRvIHdhbnQgdG8gcGF0Y2ggdGhlIHJvb3QgZWxlbWVudCBhcyB3ZWxsO1xuICAgICAgICAvLyBhbm90aGVyIGNhc2UgaXMgdGhlIHJlY3Vyc2l2ZSBwYXRjaCBvZiBhIHN0cmVhbSBpdGVtIHRoYXQgd2FzIGtlcHQgb24gcmVzZXQgKC0+IG9uQmVmb3JlTm9kZUFkZGVkKVxuICAgICAgICBjaGlsZHJlbk9ubHk6XG4gICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gbnVsbCAmJiAhd2l0aENoaWxkcmVuLFxuICAgICAgICBnZXROb2RlS2V5OiAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChET00uaXNQaHhEZXN0cm95ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgam9pbiBwYXRjaCwgdGhlbiBieSBkZWZpbml0aW9uIHRoZXJlIHdhcyBubyBQSFhfTUFHSUNfSUQuXG4gICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZWxlbWVudHMgbW9ycGhkb20gZGlzY2FyZHMuXG4gICAgICAgICAgaWYgKGlzSm9pblBhdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5vZGUuaWQgfHwgKG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9NQUdJQ19JRCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2tpcCBpbmRleGluZyBmcm9tIGNoaWxkcmVuIHdoZW4gY29udGFpbmVyIGlzIHN0cmVhbVxuICAgICAgICBza2lwRnJvbUNoaWxkcmVuOiAoZnJvbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpID09PSBQSFhfU1RSRUFNO1xuICAgICAgICB9LFxuICAgICAgICAvLyB0ZWxsIG1vcnBoZG9tIGhvdyB0byBhZGQgYSBjaGlsZFxuICAgICAgICBhZGRDaGlsZDogKHBhcmVudCwgY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHJlZiwgc3RyZWFtQXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGNoaWxkKTtcbiAgICAgICAgICBpZiAocmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2V0U3RyZWFtUmVmKGNoaWxkLCByZWYpO1xuXG4gICAgICAgICAgLy8gc3RyZWFtaW5nXG4gICAgICAgICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBjaGlsZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1BdCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IHBhcmVudC5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAmJiAhbGFzdENoaWxkLmhhc0F0dHJpYnV0ZShQSFhfU1RSRUFNX1JFRikpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9uU3RyZWFtQ2hpbGQgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZHJlbikuZmluZChcbiAgICAgICAgICAgICAgICAoYykgPT4gIWMuaGFzQXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9uU3RyZWFtQ2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUF0ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKVtzdHJlYW1BdF07XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBzaWJsaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZUFkZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBkb24ndCBhZGQgdXBkYXRlX29ubHkgbm9kZXMgaWYgdGhleSBkaWQgbm90IGFscmVhZHkgZXhpc3RcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmdldFN0cmVhbUluc2VydChlbCk/LnVwZGF0ZU9ubHkgJiZcbiAgICAgICAgICAgICF0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKGVsLCBlbCwgcGh4Vmlld3BvcnRUb3AsIHBoeFZpZXdwb3J0Qm90dG9tKTtcbiAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwiYWRkZWRcIiwgZWwpO1xuXG4gICAgICAgICAgbGV0IG1vcnBoZWRFbCA9IGVsO1xuICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJlYW0gaXRlbSB0aGF0IHdhcyBrZXB0IG9uIHJlc2V0LCByZWN1cnNpdmVseSBtb3JwaCBpdFxuICAgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdKSB7XG4gICAgICAgICAgICBtb3JwaGVkRWwgPSB0aGlzLnN0cmVhbUNvbXBvbmVudFJlc3RvcmVbZWwuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtlbC5pZF07XG4gICAgICAgICAgICBtb3JwaChtb3JwaGVkRWwsIGVsLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbW9ycGhlZEVsO1xuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXliZVJlT3JkZXJTdHJlYW0oZWwsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgcG9ydGFsQ2FsbGJhY2tzLnB1c2goKCkgPT4gdGhpcy50ZWxlcG9ydChlbCwgbW9ycGgpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoYWNrIHRvIGZpeCBTYWZhcmkgaGFuZGxpbmcgb2YgaW1nIHNyY3NldCBhbmQgdmlkZW8gdGFnc1xuICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCAmJiBlbC5hdXRvcGxheSkge1xuICAgICAgICAgICAgZWwucGxheSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSkge1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoRE9NLmlzUGh4Q2hpbGQoZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwpKSB8fFxuICAgICAgICAgICAgKERPTS5pc1BoeFN0aWNreShlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbC5wYXJlbnROb2RlKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tBZnRlcihcInBoeENoaWxkQWRkZWRcIiwgZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRhdGEtcGh4LXJ1bnRpbWUtaG9va1xuICAgICAgICAgIGlmIChlbC5ub2RlTmFtZSA9PT0gXCJTQ1JJUFRcIiAmJiBlbC5oYXNBdHRyaWJ1dGUoUEhYX1JVTlRJTUVfSE9PSykpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkZWQucHVzaChlbCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTm9kZURpc2NhcmRlZDogKGVsKSA9PiB0aGlzLm9uTm9kZURpc2NhcmRlZChlbCksXG4gICAgICAgIG9uQmVmb3JlTm9kZURpc2NhcmRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BSVU5FKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLmlkICYmXG4gICAgICAgICAgICBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50RWxlbWVudCwgcGh4VXBkYXRlLCBbXG4gICAgICAgICAgICAgIFBIWF9TVFJFQU0sXG4gICAgICAgICAgICAgIFwiYXBwZW5kXCIsXG4gICAgICAgICAgICAgIFwicHJlcGVuZFwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZG9uJ3QgcmVtb3ZlIHRlbGVwb3J0ZWQgZWxlbWVudHNcbiAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKGVsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHBvcnRhbCB0ZW1wbGF0ZSBpdHNlbGYgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoZSB0ZWxlcG9ydGVkIGVsZW1lbnQgYXMgd2VsbDtcbiAgICAgICAgICAgIC8vIHdlIGFsc28gcGVyZm9ybSBhIGNoZWNrIGFmdGVyIG1vcnBoZG9tIGlzIGZpbmlzaGVkIHRvIGNhdGNoIHBhcmVudCByZW1vdmFsc1xuICAgICAgICAgICAgY29uc3QgdGVsZXBvcnRlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICAgIGVsLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQuaWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRlbGVwb3J0ZWRFbCkge1xuICAgICAgICAgICAgICB0ZWxlcG9ydGVkRWwucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIG1vcnBoQ2FsbGJhY2tzLm9uTm9kZURpc2NhcmRlZCh0ZWxlcG9ydGVkRWwpO1xuICAgICAgICAgICAgICB0aGlzLnZpZXcuZHJvcFBvcnRhbEVsZW1lbnRJZCh0ZWxlcG9ydGVkRWwuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpIHtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpO1xuICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGVsLCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgLy8gaWYgd2UgYXJlIHBhdGNoaW5nIHRoZSByb290IHRhcmdldCBjb250YWluZXIgYW5kIHRoZSBpZCBoYXMgY2hhbmdlZCwgdHJlYXQgaXQgYXMgYSBuZXcgbm9kZVxuICAgICAgICAgIC8vIGJ5IHJlcGxhY2luZyB0aGUgZnJvbUVsIHdpdGggdGhlIHRvRWwsIHdoaWNoIGVuc3VyZXMgaG9va3MgYXJlIHRvcm4gZG93biBhbmQgcmUtY3JlYXRlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZyb21FbC5pZCAmJlxuICAgICAgICAgICAgZnJvbUVsLmlzU2FtZU5vZGUodGFyZ2V0Q29udGFpbmVyKSAmJlxuICAgICAgICAgICAgZnJvbUVsLmlkICE9PSB0b0VsLmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtb3JwaENhbGxiYWNrcy5vbk5vZGVEaXNjYXJkZWQoZnJvbUVsKTtcbiAgICAgICAgICAgIGZyb21FbC5yZXBsYWNlV2l0aCh0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiBtb3JwaENhbGxiYWNrcy5vbk5vZGVBZGRlZCh0b0VsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NLnN5bmNQZW5kaW5nQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICBET00ubWFpbnRhaW5Qcml2YXRlSG9va3MoXG4gICAgICAgICAgICBmcm9tRWwsXG4gICAgICAgICAgICB0b0VsLFxuICAgICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgICBwaHhWaWV3cG9ydEJvdHRvbSxcbiAgICAgICAgICApO1xuICAgICAgICAgIERPTS5jbGVhbkNoaWxkTm9kZXModG9FbCwgcGh4VXBkYXRlKTtcbiAgICAgICAgICBpZiAodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxpdmUgY29tcG9uZW50IHVzZWQgaW4gYSBzdHJlYW0sIHdlIG1heSBuZWVkIHRvIHJlb3JkZXIgaXRcbiAgICAgICAgICAgIHRoaXMubWF5YmVSZU9yZGVyU3RyZWFtKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChET00uaXNQaHhTdGlja3koZnJvbUVsKSkge1xuICAgICAgICAgICAgW1BIWF9TRVNTSU9OLCBQSFhfU1RBVElDLCBQSFhfUk9PVF9JRF1cbiAgICAgICAgICAgICAgLm1hcCgoYXR0cikgPT4gW1xuICAgICAgICAgICAgICAgIGF0dHIsXG4gICAgICAgICAgICAgICAgZnJvbUVsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShhdHRyKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmZvckVhY2goKFthdHRyLCBmcm9tVmFsLCB0b1ZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG9WYWwgJiYgZnJvbVZhbCAhPT0gdG9WYWwpIHtcbiAgICAgICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoYXR0ciwgdG9WYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSkgfHxcbiAgICAgICAgICAgIChmcm9tRWwuZm9ybSAmJiBmcm9tRWwuZm9ybS5pc1NhbWVOb2RlKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7XG4gICAgICAgICAgICAgIGlzSWdub3JlZDogRE9NLmlzSWdub3JlZChmcm9tRWwsIHBoeFVwZGF0ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZnJvbUVsLnZhbGlkaXR5ICYmXG4gICAgICAgICAgICBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIFBIWF9SRUZfU1JDLCBpdCBpcyBsb2FkaW5nIG9yIGxvY2tlZCBhbmQgYXdhaXRpbmcgYW4gYWNrLlxuICAgICAgICAgIC8vIElmIGl0J3MgbG9ja2VkLCB3ZSBjbG9uZSB0aGUgZnJvbUVsIHRyZWUgYW5kIGluc3RydWN0IG1vcnBoZG9tIHRvIHVzZVxuICAgICAgICAgIC8vIHRoZSBjbG9uZWQgdHJlZSBhcyB0aGUgc291cmNlIG9mIHRoZSBtb3JwaCBmb3IgdGhpcyBicmFuY2ggZnJvbSBoZXJlIG9uIG91dC5cbiAgICAgICAgICAvLyBXZSBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgdHJlZSBpbiB0aGUgZWxlbWVudCdzIHByaXZhdGUgZGF0YSwgYW5kXG4gICAgICAgICAgLy8gb24gYWNrICh2aWV3LnVuZG9SZWZzKSwgd2UgbW9ycGggdGhlIGNsb25lZCB0cmVlIHdpdGggdGhlIHRydWUgZnJvbUVsIGluIHRoZSBET00gdG9cbiAgICAgICAgICAvLyBhcHBseSBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHdoaWxlIHRoZSBlbGVtZW50IHdhcyBsb2NrZWQuXG4gICAgICAgICAgY29uc3QgaXNGb2N1c2VkRm9ybUVsID1cbiAgICAgICAgICAgIGZvY3VzZWQgJiYgZnJvbUVsLmlzU2FtZU5vZGUoZm9jdXNlZCkgJiYgRE9NLmlzRm9ybUlucHV0KGZyb21FbCk7XG4gICAgICAgICAgY29uc3QgZm9jdXNlZFNlbGVjdENoYW5nZWQgPVxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmIHRoaXMuaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpKSB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBuZXcgRWxlbWVudFJlZihmcm9tRWwpO1xuICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIHRoZSBjbG9uZSBzdGVwIGlmIHRoaXMgaXMgbm90IGEgcGF0Y2ggdGhhdCB1bmxvY2tzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJlZi5sb2NrUmVmICYmXG4gICAgICAgICAgICAgICghdGhpcy51bmRvUmVmIHx8ICFyZWYuaXNMb2NrVW5kb25lQnkodGhpcy51bmRvUmVmKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSkge1xuICAgICAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwgeyBpc0lnbm9yZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICAgIGNvbnN0IGlzTG9ja2VkID0gZnJvbUVsLmhhc0F0dHJpYnV0ZShQSFhfUkVGX0xPQ0spO1xuICAgICAgICAgICAgICBjb25zdCBjbG9uZSA9IGlzTG9ja2VkXG4gICAgICAgICAgICAgICAgPyBET00ucHJpdmF0ZShmcm9tRWwsIFBIWF9SRUZfTE9DSykgfHwgZnJvbUVsLmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGX0xPQ0ssIGNsb25lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZEZvcm1FbCkge1xuICAgICAgICAgICAgICAgICAgZnJvbUVsID0gY2xvbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRE9NLmlzUGh4Q2hpbGQodG9FbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHsgZXhjbHVkZTogW1BIWF9TVEFUSUNdIH0pO1xuICAgICAgICAgICAgaWYgKHByZXZTZXNzaW9uICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdElEKTtcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgdW5kb2luZyBhIGxvY2ssIGNvcHkgcG90ZW50aWFsbHkgbmVzdGVkIGNsb25lcyBvdmVyXG4gICAgICAgICAgaWYgKHRoaXMudW5kb1JlZiAmJiBET00ucHJpdmF0ZSh0b0VsLCBQSFhfUkVGX0xPQ0spKSB7XG4gICAgICAgICAgICBET00ucHV0UHJpdmF0ZShcbiAgICAgICAgICAgICAgZnJvbUVsLFxuICAgICAgICAgICAgICBQSFhfUkVGX0xPQ0ssXG4gICAgICAgICAgICAgIERPTS5wcml2YXRlKHRvRWwsIFBIWF9SRUZfTE9DSyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBub3cgY29weSByZWd1bGFyIERPTS5wcml2YXRlIGRhdGFcbiAgICAgICAgICBET00uY29weVByaXZhdGVzKHRvRWwsIGZyb21FbCk7XG5cbiAgICAgICAgICAvLyBwaHgtcG9ydGFsIGhhbmRsaW5nXG4gICAgICAgICAgaWYgKERPTS5pc1BvcnRhbFRlbXBsYXRlKHRvRWwpKSB7XG4gICAgICAgICAgICBwb3J0YWxDYWxsYmFja3MucHVzaCgoKSA9PiB0aGlzLnRlbGVwb3J0KHRvRWwsIG1vcnBoKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2tpcCBwYXRjaGluZyBmb2N1c2VkIGlucHV0cyB1bmxlc3MgZm9jdXMgaXMgYSBzZWxlY3QgdGhhdCBoYXMgY2hhbmdlZCBvcHRpb25zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGb2N1c2VkRm9ybUVsICYmXG4gICAgICAgICAgICBmcm9tRWwudHlwZSAhPT0gXCJoaWRkZW5cIiAmJlxuICAgICAgICAgICAgIWZvY3VzZWRTZWxlY3RDaGFuZ2VkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyhmcm9tRWwpO1xuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbCk7XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJsdXIgZm9jdXNlZCBzZWxlY3QgaWYgaXQgY2hhbmdlZCBzbyBuYXRpdmUgVUkgaXMgdXBkYXRlZCAoaWUgc2FmYXJpIHdvbid0IHVwZGF0ZSB2aXNpYmxlIG9wdGlvbnMpXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFNlbGVjdENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgZnJvbUVsLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChET00uaXNQaHhVcGRhdGUodG9FbCwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSkge1xuICAgICAgICAgICAgICBhcHBlbmRQcmVwZW5kVXBkYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBET01Qb3N0TW9ycGhSZXN0b3JlcihcbiAgICAgICAgICAgICAgICAgIGZyb21FbCxcbiAgICAgICAgICAgICAgICAgIHRvRWwsXG4gICAgICAgICAgICAgICAgICB0b0VsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERPTS5zeW5jQXR0cnNUb1Byb3BzKHRvRWwpO1xuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyh0b0VsKTtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICByZXR1cm4gZnJvbUVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIG1vcnBoZG9tKHRhcmdldENvbnRhaW5lciwgc291cmNlLCBtb3JwaENhbGxiYWNrcyk7XG4gICAgfTtcblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpO1xuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGNvbnRhaW5lciwgY29udGFpbmVyKTtcblxuICAgIGxpdmVTb2NrZXQudGltZShcIm1vcnBoZG9tXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RyZWFtcy5mb3JFYWNoKChbcmVmLCBpbnNlcnRzLCBkZWxldGVJZHMsIHJlc2V0XSkgPT4ge1xuICAgICAgICBpbnNlcnRzLmZvckVhY2goKFtrZXksIHN0cmVhbUF0LCBsaW1pdCwgdXBkYXRlT25seV0pID0+IHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUluc2VydHNba2V5XSA9IHsgcmVmLCBzdHJlYW1BdCwgbGltaXQsIHJlc2V0LCB1cGRhdGVPbmx5IH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIERPTS5hbGwoY29udGFpbmVyLCBgWyR7UEhYX1NUUkVBTV9SRUZ9PVwiJHtyZWZ9XCJdYCwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlSWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2lkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RyZWFtQ2hpbGRFbGVtZW50KGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGNsZWFyIHN0cmVhbSBpdGVtcyBmcm9tIHRoZSBkZWFkIHJlbmRlciBpZiB0aGV5IGFyZSBub3QgaW5zZXJ0ZWQgYWdhaW5cbiAgICAgIGlmIChpc0pvaW5QYXRjaCkge1xuICAgICAgICBET00uYWxsKHRoaXMuY29udGFpbmVyLCBgWyR7cGh4VXBkYXRlfT0ke1BIWF9TVFJFQU19XWApXG4gICAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIGZpbHRlciB0aGUgZWxlbWVudCBiZWZvcmUgcmVtb3ZpbmcgdGhlbSwgYXNcbiAgICAgICAgICAvLyBpdCBtYXkgaGFwcGVuIHRoYXQgc3RyZWFtcyBhcmUgbmVzdGVkIGFuZCB0aGUgb3duZXIgY2hlY2sgZmFpbHMgaWZcbiAgICAgICAgICAvLyBhIHBhcmVudCBpcyByZW1vdmVkIGJlZm9yZSBhIGNoaWxkXG4gICAgICAgICAgLmZpbHRlcigoZWwpID0+IHRoaXMudmlldy5vd25zRWxlbWVudChlbCkpXG4gICAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IHBlcmZvcm1lZCB0aGUgb3duZXIgY2hlY2ssIGVhY2ggY2hpbGQgaXMgZ3VhcmFudGVlZCB0byBiZSBvd25lZFxuICAgICAgICAgICAgICAvLyBieSB0aGUgdmlldy4gVG8gcHJldmVudCB0aGUgbmVzdGVkIG93bmVyIGNoZWNrIGZyb20gZmFpbGluZyBpbiBjYXNlIG9mIG5lc3RlZFxuICAgICAgICAgICAgICAvLyBzdHJlYW1zIHdoZXJlIHRoZSBwYXJlbnQgaXMgcmVtb3ZlZCBiZWZvcmUgdGhlIGNoaWxkLCB3ZSBmb3JjZSB0aGUgcmVtb3ZhbFxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbW9ycGgodGFyZ2V0Q29udGFpbmVyLCBodG1sKTtcbiAgICAgIC8vIG5vcm1hbCBwYXRjaCBjb21wbGV0ZSwgdGVsZXBvcnQgZWxlbWVudHMgbm93XG4gICAgICBwb3J0YWxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKCkpO1xuICAgICAgLy8gY2hlY2sgZm9yIGFueSB0ZWxlcG9ydGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgdmlldyBhbnkgbW9yZVxuICAgICAgLy8gYW5kIHJlbW92ZSB0aGVtXG4gICAgICB0aGlzLnZpZXcucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGVsKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kcm9wUG9ydGFsRWxlbWVudElkKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSkge1xuICAgICAgZGV0ZWN0RHVwbGljYXRlSWRzKCk7XG4gICAgICBkZXRlY3RJbnZhbGlkU3RyZWFtSW5zZXJ0cyh0aGlzLnN0cmVhbUluc2VydHMpO1xuICAgICAgLy8gd2FybiBpZiB0aGVyZSBhcmUgYW55IGlucHV0cyBuYW1lZCBcImlkXCJcbiAgICAgIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImlucHV0W25hbWU9aWRdXCIpKS5mb3JFYWNoKFxuICAgICAgICAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBub2RlLmZvcm0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdEZXRlY3RlZCBhbiBpbnB1dCB3aXRoIG5hbWU9XCJpZFwiIGluc2lkZSBhIGZvcm0hIFRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyB3aGVuIHBhdGNoaW5nIHRoZSBET00uXFxuJyxcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXBwZW5kUHJlcGVuZFVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGl2ZVNvY2tldC50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4gdXBkYXRlLnBlcmZvcm0oKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXZlU29ja2V0LnNpbGVuY2VFdmVudHMoKCkgPT5cbiAgICAgIERPTS5yZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCksXG4gICAgKTtcbiAgICBET00uZGlzcGF0Y2hFdmVudChkb2N1bWVudCwgXCJwaHg6dXBkYXRlXCIpO1xuICAgIGFkZGVkLmZvckVhY2goKGVsKSA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJhZGRlZFwiLCBlbCkpO1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgoZWwpID0+IHRoaXMudHJhY2tBZnRlcihcInVwZGF0ZWRcIiwgZWwpKTtcblxuICAgIHRoaXMudHJhbnNpdGlvblBlbmRpbmdSZW1vdmVzKCk7XG5cbiAgICBpZiAoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKSB7XG4gICAgICBsaXZlU29ja2V0LnVubG9hZCgpO1xuICAgICAgLy8gY2hlY2sgZm9yIHN1Ym1pdHRlciBhbmQgaW5qZWN0IGl0IGFzIGhpZGRlbiBpbnB1dCBmb3IgZXh0ZXJuYWwgc3VibWl0O1xuICAgICAgLy8gSW4gdGhlb3J5LCBpdCBjb3VsZCBoYXBwZW4gdGhhdCB0aGUgc3RvcmVkIHN1Ym1pdHRlciBpcyBvdXRkYXRlZCBhbmQgZG9lc24ndFxuICAgICAgLy8gZXhpc3QgaW4gdGhlIERPTSBhbnkgbW9yZSwgYnV0IHRoaXMgaXMgdW5saWtlbHksIHNvIHdlIGp1c3QgYWNjZXB0IGl0IGZvciBub3cuXG4gICAgICBjb25zdCBzdWJtaXR0ZXIgPSBET00ucHJpdmF0ZShleHRlcm5hbEZvcm1UcmlnZ2VyZWQsIFwic3VibWl0dGVyXCIpO1xuICAgICAgaWYgKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIubmFtZSAmJiB0YXJnZXRDb250YWluZXIuY29udGFpbnMoc3VibWl0dGVyKSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIGNvbnN0IGZvcm1JZCA9IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJmb3JtXCIpO1xuICAgICAgICBpZiAoZm9ybUlkKSB7XG4gICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwiZm9ybVwiLCBmb3JtSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICAgICAgaW5wdXQudmFsdWUgPSBzdWJtaXR0ZXIudmFsdWU7XG4gICAgICAgIHN1Ym1pdHRlci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShpbnB1dCwgc3VibWl0dGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIHVzZSBwcm90b3R5cGUncyBzdWJtaXQgaW4gY2FzZSB0aGVyZSdzIGEgZm9ybSBjb250cm9sIHdpdGggbmFtZSBvciBpZCBvZiBcInN1Ym1pdFwiXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEZvcm1FbGVtZW50L3N1Ym1pdFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV4dGVybmFsRm9ybVRyaWdnZXJlZCkuc3VibWl0LmNhbGwoXG4gICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25Ob2RlRGlzY2FyZGVkKGVsKSB7XG4gICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICBpZiAoRE9NLmlzUGh4Q2hpbGQoZWwpIHx8IERPTS5pc1BoeFN0aWNreShlbCkpIHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoZWwpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIiwgZWwpO1xuICB9XG5cbiAgbWF5YmVQZW5kaW5nUmVtb3ZlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUodGhpcy5waHhSZW1vdmUpICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBlbmRpbmdSZW1vdmVzLnB1c2gobm9kZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCwgZm9yY2UgPSBmYWxzZSkge1xuICAgIC8vIG1ha2Ugc3VyZSB0byBvbmx5IHJlbW92ZSBlbGVtZW50cyBvd25lZCBieSB0aGUgY3VycmVudCB2aWV3XG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zMDQ3XG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXhfbGl2ZV92aWV3L2lzc3Vlcy8zNjgxXG4gICAgaWYgKCFmb3JjZSAmJiAhdGhpcy52aWV3Lm93bnNFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIG5vZGUgaWYgaXQgaXMgYWN0dWFsbHkgcmUtYWRkZWQgaW4gdGhlIHNhbWUgcGF0Y2hcbiAgICAvLyB3ZSBkbyBOT1Qgd2FudCB0byBleGVjdXRlIHBoeC1yZW1vdmUsIHdlIGRvIE5PVCB3YW50IHRvIGNhbGwgb25Ob2RlRGlzY2FyZGVkXG4gICAgaWYgKHRoaXMuc3RyZWFtSW5zZXJ0c1tjaGlsZC5pZF0pIHtcbiAgICAgIHRoaXMuc3RyZWFtQ29tcG9uZW50UmVzdG9yZVtjaGlsZC5pZF0gPSBjaGlsZDtcbiAgICAgIGNoaWxkLnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IHJlbW92ZSB0aGUgZWxlbWVudCBub3cgaWYgaXQgaGFzIG5vIHBoeC1yZW1vdmUgYmluZGluZ1xuICAgICAgaWYgKCF0aGlzLm1heWJlUGVuZGluZ1JlbW92ZShjaGlsZCkpIHtcbiAgICAgICAgY2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub25Ob2RlRGlzY2FyZGVkKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRTdHJlYW1JbnNlcnQoZWwpIHtcbiAgICBjb25zdCBpbnNlcnQgPSBlbC5pZCA/IHRoaXMuc3RyZWFtSW5zZXJ0c1tlbC5pZF0gOiB7fTtcbiAgICByZXR1cm4gaW5zZXJ0IHx8IHt9O1xuICB9XG5cbiAgc2V0U3RyZWFtUmVmKGVsLCByZWYpIHtcbiAgICBET00ucHV0U3RpY2t5KGVsLCBQSFhfU1RSRUFNX1JFRiwgKGVsKSA9PlxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9TVFJFQU1fUkVGLCByZWYpLFxuICAgICk7XG4gIH1cblxuICBtYXliZVJlT3JkZXJTdHJlYW0oZWwsIGlzTmV3KSB7XG4gICAgY29uc3QgeyByZWYsIHN0cmVhbUF0LCByZXNldCB9ID0gdGhpcy5nZXRTdHJlYW1JbnNlcnQoZWwpO1xuICAgIGlmIChzdHJlYW1BdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBzZXQgdGhlIFBIWF9TVFJFQU1fUkVGIGhlcmUgYXMgd2VsbCBhcyBhZGRDaGlsZCBpcyBpbnZva2VkIG9ubHkgZm9yIHBhcmVudHNcbiAgICB0aGlzLnNldFN0cmVhbVJlZihlbCwgcmVmKTtcblxuICAgIGlmICghcmVzZXQgJiYgIWlzTmV3KSB7XG4gICAgICAvLyB3ZSBvbmx5IHJlb3JkZXIgaWYgdGhlIGVsZW1lbnQgaXMgbmV3IG9yIGl0J3MgYSBzdHJlYW0gcmVzZXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSBwYXJlbnQgZWxlbWVudDtcbiAgICAvLyBpdCBkb2Vzbid0IGlmIHdlIGFyZSBjdXJyZW50bHkgcmVjdXJzaXZlbHkgbW9ycGhpbmcgKHJlc3RvcmluZyBhIHNhdmVkIHN0cmVhbSBjaGlsZClcbiAgICAvLyBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgYWRkZWQgdG8gdGhlIHJlYWwgZG9tO1xuICAgIC8vIHJlb3JkZXJpbmcgZG9lcyBub3QgbWFrZSBzZW5zZSBpbiB0aGF0IGNhc2UgYW55d2F5XG4gICAgaWYgKCFlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbUF0ID09PSAwKSB7XG4gICAgICBlbC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShlbCwgZWwucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1BdCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IG9sZEluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbCk7XG4gICAgICBpZiAoc3RyZWFtQXQgPj0gY2hpbGRyZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBlbC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjaGlsZHJlbltzdHJlYW1BdF07XG4gICAgICAgIGlmIChvbGRJbmRleCA+IHN0cmVhbUF0KSB7XG4gICAgICAgICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZWwsIHNpYmxpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsLCBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1heWJlTGltaXRTdHJlYW0oZWwpO1xuICB9XG5cbiAgbWF5YmVMaW1pdFN0cmVhbShlbCkge1xuICAgIGNvbnN0IHsgbGltaXQgfSA9IHRoaXMuZ2V0U3RyZWFtSW5zZXJ0KGVsKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGxpbWl0ICE9PSBudWxsICYmIEFycmF5LmZyb20oZWwucGFyZW50RWxlbWVudC5jaGlsZHJlbik7XG4gICAgaWYgKGxpbWl0ICYmIGxpbWl0IDwgMCAmJiBjaGlsZHJlbi5sZW5ndGggPiBsaW1pdCAqIC0xKSB7XG4gICAgICBjaGlsZHJlblxuICAgICAgICAuc2xpY2UoMCwgY2hpbGRyZW4ubGVuZ3RoICsgbGltaXQpXG4gICAgICAgIC5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5yZW1vdmVTdHJlYW1DaGlsZEVsZW1lbnQoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKGxpbWl0ICYmIGxpbWl0ID49IDAgJiYgY2hpbGRyZW4ubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIGNoaWxkcmVuXG4gICAgICAgIC5zbGljZShsaW1pdClcbiAgICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLnJlbW92ZVN0cmVhbUNoaWxkRWxlbWVudChjaGlsZCkpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb25QZW5kaW5nUmVtb3ZlcygpIHtcbiAgICBjb25zdCB7IHBlbmRpbmdSZW1vdmVzLCBsaXZlU29ja2V0IH0gPSB0aGlzO1xuICAgIGlmIChwZW5kaW5nUmVtb3Zlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaXZlU29ja2V0LnRyYW5zaXRpb25SZW1vdmVzKHBlbmRpbmdSZW1vdmVzLCAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBET00uZmlyc3RQaHhDaGlsZChlbCk7XG4gICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICBsaXZlU29ja2V0LmRlc3Ryb3lWaWV3QnlFbChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50cmFja0FmdGVyKFwidHJhbnNpdGlvbnNEaXNjYXJkZWRcIiwgcGVuZGluZ1JlbW92ZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNDaGFuZ2VkU2VsZWN0KGZyb21FbCwgdG9FbCkge1xuICAgIGlmICghKGZyb21FbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB8fCBmcm9tRWwubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZyb21FbC5vcHRpb25zLmxlbmd0aCAhPT0gdG9FbC5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8ga2VlcCB0aGUgY3VycmVudCB2YWx1ZVxuICAgIHRvRWwudmFsdWUgPSBmcm9tRWwudmFsdWU7XG5cbiAgICAvLyBpbiBnZW5lcmFsIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHdpdGggdXNpbmcgaXNFcXVhbE5vZGUgYXMgaXQgZG9lcyBub3QgYSByZWxpYWJsZVxuICAgIC8vIERPTSB0cmVlIGVxdWFsaXR5IGNoZWNrLCBidXQgZm9yIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIGFuZCBvcHRpb25zIGl0IHdvcmtzIGZpbmVcbiAgICByZXR1cm4gIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKTtcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuY2lkUGF0Y2g7XG4gIH1cblxuICBza2lwQ0lEU2libGluZyhlbCkge1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuaGFzQXR0cmlidXRlKFBIWF9TS0lQKTtcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKSB7XG4gICAgaWYgKCF0aGlzLmlzQ0lEUGF0Y2goKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdChcbiAgICAgIHRoaXMudmlldy5pZCxcbiAgICAgIHRoaXMudGFyZ2V0Q0lELFxuICAgICk7XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwICYmIERPTS5jaGlsZE5vZGVMZW5ndGgoaHRtbCkgPT09IDEpIHtcbiAgICAgIHJldHVybiBmaXJzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgaW5kZXhPZihwYXJlbnQsIGNoaWxkKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5pbmRleE9mKGNoaWxkKTtcbiAgfVxuXG4gIHRlbGVwb3J0KGVsLCBtb3JwaCkge1xuICAgIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9QT1JUQUwpO1xuICAgIGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuICAgIGlmICghcG9ydGFsQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwicG9ydGFsIHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiICsgdGFyZ2V0U2VsZWN0b3IgKyBcIiBub3QgZm91bmRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIHBoeC1wb3J0YWwgdGVtcGxhdGVzIG11c3QgaGF2ZSBhIHNpbmdsZSByb290IGVsZW1lbnQsIHNvIHdlIGFzc3VtZSB0aGlzIHRvIGJlXG4gICAgLy8gdGhlIGNhc2UgaGVyZVxuICAgIGNvbnN0IHRvVGVsZXBvcnQgPSBlbC5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgIC8vIHRoZSBQSFhfU0tJUCBvcHRpbWl6YXRpb24gY2FuIGFsc28gYXBwbHkgaW5zaWRlIG9mIHRoZSA8dGVtcGxhdGU+IGVsZW1lbnRzXG4gICAgaWYgKHRoaXMuc2tpcENJRFNpYmxpbmcodG9UZWxlcG9ydCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0b1RlbGVwb3J0Py5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInBoeC1wb3J0YWwgdGVtcGxhdGUgbXVzdCBoYXZlIGEgc2luZ2xlIHJvb3QgZWxlbWVudCB3aXRoIElEIVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0b1RlbGVwb3J0LmlkKTtcbiAgICBsZXQgcG9ydGFsVGFyZ2V0O1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYW5vdGhlciB0YXJnZXRcbiAgICAgIGlmICghcG9ydGFsQ29udGFpbmVyLmNvbnRhaW5zKGV4aXN0aW5nKSkge1xuICAgICAgICBwb3J0YWxDb250YWluZXIuYXBwZW5kQ2hpbGQoZXhpc3RpbmcpO1xuICAgICAgfVxuICAgICAgLy8gd2UgYWxyZWFkeSB0ZWxlcG9ydGVkIGluIGEgcHJldmlvdXMgcGF0Y2hcbiAgICAgIHBvcnRhbFRhcmdldCA9IGV4aXN0aW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjcmVhdGUgZW1wdHkgdGFyZ2V0IGFuZCBtb3JwaCBpdCByZWN1cnNpdmVseVxuICAgICAgcG9ydGFsVGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b1RlbGVwb3J0LnRhZ05hbWUpO1xuICAgICAgcG9ydGFsQ29udGFpbmVyLmFwcGVuZENoaWxkKHBvcnRhbFRhcmdldCk7XG4gICAgfVxuICAgIC8vIG1hcmsgdGhlIHRhcmdldCBhcyB0ZWxlcG9ydGVkO1xuICAgIC8vIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgYXR0cmlidXRlIG1vZGlmaWNhdGlvbnMsIHdlIHNldCB0aGUgYXR0cmlidXRlXG4gICAgLy8gb24gdGhlIHNvdXJjZSBhbmQgcmVtb3ZlIGl0IGFmdGVyIG1vcnBoaW5nICh3ZSBjb3VsZCBhbHNvIGp1c3Qga2VlcCBpdClcbiAgICAvLyBvdGhlcndpc2UgbW9ycGhkb20gd291bGQgcmVtb3ZlIGl0LCBhcyB0aGUgcmVmIGlzIG5vdCBwcmVzZW50IGluIHRoZSBzb3VyY2VcbiAgICAvLyBhbmQgd2UnZCBuZWVkIHRvIHNldCBpdCBiYWNrIGFmdGVyIGVhY2ggbW9ycGhcbiAgICB0b1RlbGVwb3J0LnNldEF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYsIHRoaXMudmlldy5pZCk7XG4gICAgdG9UZWxlcG9ydC5zZXRBdHRyaWJ1dGUoUEhYX1RFTEVQT1JURURfU1JDLCBlbC5pZCk7XG4gICAgbW9ycGgocG9ydGFsVGFyZ2V0LCB0b1RlbGVwb3J0LCB0cnVlKTtcbiAgICB0b1RlbGVwb3J0LnJlbW92ZUF0dHJpYnV0ZShQSFhfVEVMRVBPUlRFRF9SRUYpO1xuICAgIHRvVGVsZXBvcnQucmVtb3ZlQXR0cmlidXRlKFBIWF9URUxFUE9SVEVEX1NSQyk7XG4gICAgLy8gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRlbGVwb3J0ZWQgZWxlbWVudCBpbiB0aGUgdmlld1xuICAgIC8vIHRvIGNsZWFudXAgd2hlbiB0aGUgdmlldyBpcyBkZXN0cm95ZWQsIGluIGNhc2UgdGhlIHBvcnRhbCB0YXJnZXRcbiAgICAvLyBpcyBvdXRzaWRlIHRoZSB2aWV3IGl0c2VsZlxuICAgIHRoaXMudmlldy5wdXNoUG9ydGFsRWxlbWVudElkKHRvVGVsZXBvcnQuaWQpO1xuICB9XG5cbiAgaGFuZGxlUnVudGltZUhvb2soZWwsIHNvdXJjZSkge1xuICAgIC8vIHVzdWFsbHksIHNjcmlwdHMgYXJlIG5vdCBleGVjdXRlZCB3aGVuIG1vcnBoZG9tIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIHJ1bnRpbWUgY29sb2NhdGVkIGhvb2tzXG4gICAgY29uc3QgbmFtZSA9IGVsLmdldEF0dHJpYnV0ZShQSFhfUlVOVElNRV9IT09LKTtcbiAgICBsZXQgbm9uY2UgPSBlbC5oYXNBdHRyaWJ1dGUoXCJub25jZVwiKSA/IGVsLmdldEF0dHJpYnV0ZShcIm5vbmNlXCIpIDogbnVsbDtcbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKFwibm9uY2VcIikpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc291cmNlO1xuICAgICAgbm9uY2UgPSB0ZW1wbGF0ZS5jb250ZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gKVxuICAgICAgICAuZ2V0QXR0cmlidXRlKFwibm9uY2VcIik7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgc2NyaXB0LnRleHRDb250ZW50ID0gZWwudGV4dENvbnRlbnQ7XG4gICAgRE9NLm1lcmdlQXR0cnMoc2NyaXB0LCBlbCwgeyBpc0lnbm9yZWQ6IGZhbHNlIH0pO1xuICAgIGlmIChub25jZSkge1xuICAgICAgc2NyaXB0Lm5vbmNlID0gbm9uY2U7XG4gICAgfVxuICAgIGVsLnJlcGxhY2VXaXRoKHNjcmlwdCk7XG4gICAgZWwgPSBzY3JpcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBDT01QT05FTlRTLFxuICBURU1QTEFURVMsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1ZJRVdfUkVGLFxuICBQSFhfU0tJUCxcbiAgUEhYX01BR0lDX0lELFxuICBSRVBMWSxcbiAgU1RBVElDLFxuICBUSVRMRSxcbiAgU1RSRUFNLFxuICBST09ULFxuICBLRVlFRCxcbiAgS0VZRURfQ09VTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBpc09iamVjdCwgbG9nRXJyb3IsIGlzQ2lkIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgVk9JRF9UQUdTID0gbmV3IFNldChbXG4gIFwiYXJlYVwiLFxuICBcImJhc2VcIixcbiAgXCJiclwiLFxuICBcImNvbFwiLFxuICBcImNvbW1hbmRcIixcbiAgXCJlbWJlZFwiLFxuICBcImhyXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJrZXlnZW5cIixcbiAgXCJsaW5rXCIsXG4gIFwibWV0YVwiLFxuICBcInBhcmFtXCIsXG4gIFwic291cmNlXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ3YnJcIixcbl0pO1xuY29uc3QgcXVvdGVDaGFycyA9IG5ldyBTZXQoW1wiJ1wiLCAnXCInXSk7XG5cbmV4cG9ydCBjb25zdCBtb2RpZnlSb290ID0gKGh0bWwsIGF0dHJzLCBjbGVhcklubmVySFRNTCkgPT4ge1xuICBsZXQgaSA9IDA7XG4gIGxldCBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIGxldCBiZWZvcmVUYWcsIGFmdGVyVGFnLCB0YWcsIHRhZ05hbWVFbmRzQXQsIGlkLCBuZXdIVE1MO1xuXG4gIGNvbnN0IGxvb2thaGVhZCA9IGh0bWwubWF0Y2goL14oXFxzKig/OjwhLS0uKj8tLT5cXHMqKSopPChbXlxcc1xcLz5dKykvKTtcbiAgaWYgKGxvb2thaGVhZCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbWFsZm9ybWVkIGh0bWwgJHtodG1sfWApO1xuICB9XG5cbiAgaSA9IGxvb2thaGVhZFswXS5sZW5ndGg7XG4gIGJlZm9yZVRhZyA9IGxvb2thaGVhZFsxXTtcbiAgdGFnID0gbG9va2FoZWFkWzJdO1xuICB0YWdOYW1lRW5kc0F0ID0gaTtcblxuICAvLyBTY2FuIHRoZSBvcGVuaW5nIHRhZyBmb3IgaWQsIGlmIHRoZXJlIGlzIGFueVxuICBmb3IgKGk7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGh0bWwuY2hhckF0KGkpID09PSBcIj5cIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChodG1sLmNoYXJBdChpKSA9PT0gXCI9XCIpIHtcbiAgICAgIGNvbnN0IGlzSWQgPSBodG1sLnNsaWNlKGkgLSAzLCBpKSA9PT0gXCIgaWRcIjtcbiAgICAgIGkrKztcbiAgICAgIGNvbnN0IGNoYXIgPSBodG1sLmNoYXJBdChpKTtcbiAgICAgIGlmIChxdW90ZUNoYXJzLmhhcyhjaGFyKSkge1xuICAgICAgICBjb25zdCBhdHRyU3RhcnRzQXQgPSBpO1xuICAgICAgICBpKys7XG4gICAgICAgIGZvciAoaTsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaHRtbC5jaGFyQXQoaSkgPT09IGNoYXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJZCkge1xuICAgICAgICAgIGlkID0gaHRtbC5zbGljZShhdHRyU3RhcnRzQXQgKyAxLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBjbG9zZUF0ID0gaHRtbC5sZW5ndGggLSAxO1xuICBpbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gIHdoaWxlIChjbG9zZUF0ID49IGJlZm9yZVRhZy5sZW5ndGggKyB0YWcubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGh0bWwuY2hhckF0KGNsb3NlQXQpO1xuICAgIGlmIChpbnNpZGVDb21tZW50KSB7XG4gICAgICBpZiAoY2hhciA9PT0gXCItXCIgJiYgaHRtbC5zbGljZShjbG9zZUF0IC0gMywgY2xvc2VBdCkgPT09IFwiPCEtXCIpIHtcbiAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICBjbG9zZUF0IC09IDQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZUF0IC09IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSBcIj5cIiAmJiBodG1sLnNsaWNlKGNsb3NlQXQgLSAyLCBjbG9zZUF0KSA9PT0gXCItLVwiKSB7XG4gICAgICBpbnNpZGVDb21tZW50ID0gdHJ1ZTtcbiAgICAgIGNsb3NlQXQgLT0gMztcbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiPlwiKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvc2VBdCAtPSAxO1xuICAgIH1cbiAgfVxuICBhZnRlclRhZyA9IGh0bWwuc2xpY2UoY2xvc2VBdCArIDEsIGh0bWwubGVuZ3RoKTtcblxuICBjb25zdCBhdHRyc1N0ciA9IE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoKGF0dHIpID0+IChhdHRyc1thdHRyXSA9PT0gdHJ1ZSA/IGF0dHIgOiBgJHthdHRyfT1cIiR7YXR0cnNbYXR0cl19XCJgKSlcbiAgICAuam9pbihcIiBcIik7XG5cbiAgaWYgKGNsZWFySW5uZXJIVE1MKSB7XG4gICAgLy8gS2VlcCB0aGUgaWQgaWYgYW55XG4gICAgY29uc3QgaWRBdHRyU3RyID0gaWQgPyBgIGlkPVwiJHtpZH1cImAgOiBcIlwiO1xuICAgIGlmIChWT0lEX1RBR1MuaGFzKHRhZykpIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0vPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7aWRBdHRyU3RyfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0+PC8ke3RhZ30+YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzdCA9IGh0bWwuc2xpY2UodGFnTmFtZUVuZHNBdCwgY2xvc2VBdCArIDEpO1xuICAgIG5ld0hUTUwgPSBgPCR7dGFnfSR7YXR0cnNTdHIgPT09IFwiXCIgPyBcIlwiIDogXCIgXCJ9JHthdHRyc1N0cn0ke3Jlc3R9YDtcbiAgfVxuXG4gIHJldHVybiBbbmV3SFRNTCwgYmVmb3JlVGFnLCBhZnRlclRhZ107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlZCB7XG4gIHN0YXRpYyBleHRyYWN0KGRpZmYpIHtcbiAgICBjb25zdCB7IFtSRVBMWV06IHJlcGx5LCBbRVZFTlRTXTogZXZlbnRzLCBbVElUTEVdOiB0aXRsZSB9ID0gZGlmZjtcbiAgICBkZWxldGUgZGlmZltSRVBMWV07XG4gICAgZGVsZXRlIGRpZmZbRVZFTlRTXTtcbiAgICBkZWxldGUgZGlmZltUSVRMRV07XG4gICAgcmV0dXJuIHsgZGlmZiwgdGl0bGUsIHJlcGx5OiByZXBseSB8fCBudWxsLCBldmVudHM6IGV2ZW50cyB8fCBbXSB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Iodmlld0lkLCByZW5kZXJlZCkge1xuICAgIHRoaXMudmlld0lkID0gdmlld0lkO1xuICAgIHRoaXMucmVuZGVyZWQgPSB7fTtcbiAgICB0aGlzLm1hZ2ljSWQgPSAwO1xuICAgIHRoaXMubWVyZ2VEaWZmKHJlbmRlcmVkKTtcbiAgfVxuXG4gIHBhcmVudFZpZXdJZCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SWQ7XG4gIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcykge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkLFxuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICAgIG9ubHlDaWRzLFxuICAgICAgdHJ1ZSxcbiAgICAgIHt9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBzdHIsIHN0cmVhbXM6IHN0cmVhbXMgfTtcbiAgfVxuXG4gIHJlY3Vyc2l2ZVRvU3RyaW5nKFxuICAgIHJlbmRlcmVkLFxuICAgIGNvbXBvbmVudHMgPSByZW5kZXJlZFtDT01QT05FTlRTXSxcbiAgICBvbmx5Q2lkcyxcbiAgICBjaGFuZ2VUcmFja2luZyxcbiAgICByb290QXR0cnMsXG4gICkge1xuICAgIG9ubHlDaWRzID0gb25seUNpZHMgPyBuZXcgU2V0KG9ubHlDaWRzKSA6IG51bGw7XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgYnVmZmVyOiBcIlwiLFxuICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgIG9ubHlDaWRzOiBvbmx5Q2lkcyxcbiAgICAgIHN0cmVhbXM6IG5ldyBTZXQoKSxcbiAgICB9O1xuICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIG51bGwsIG91dHB1dCwgY2hhbmdlVHJhY2tpbmcsIHJvb3RBdHRycyk7XG4gICAgcmV0dXJuIHsgYnVmZmVyOiBvdXRwdXQuYnVmZmVyLCBzdHJlYW1zOiBvdXRwdXQuc3RyZWFtcyB9O1xuICB9XG5cbiAgY29tcG9uZW50Q0lEcyhkaWZmKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmZbQ09NUE9ORU5UU10gfHwge30pLm1hcCgoaSkgPT4gcGFyc2VJbnQoaSkpO1xuICB9XG5cbiAgaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKSB7XG4gICAgaWYgKCFkaWZmW0NPTVBPTkVOVFNdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhkaWZmKS5sZW5ndGggPT09IDE7XG4gIH1cblxuICBnZXRDb21wb25lbnQoZGlmZiwgY2lkKSB7XG4gICAgcmV0dXJuIGRpZmZbQ09NUE9ORU5UU11bY2lkXTtcbiAgfVxuXG4gIHJlc2V0UmVuZGVyKGNpZCkge1xuICAgIC8vIHdlIGFyZSByYWNpbmcgYSBjb21wb25lbnQgZGVzdHJveSwgaXQgY291bGQgbm90IGV4aXN0LCBzb1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyeSB0byBzZXQgcmVzZXQgb24gdW5kZWZpbmVkXG4gICAgaWYgKHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdLnJlc2V0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBtZXJnZURpZmYoZGlmZikge1xuICAgIGNvbnN0IG5ld2MgPSBkaWZmW0NPTVBPTkVOVFNdO1xuICAgIGNvbnN0IGNhY2hlID0ge307XG4gICAgZGVsZXRlIGRpZmZbQ09NUE9ORU5UU107XG4gICAgdGhpcy5yZW5kZXJlZCA9IHRoaXMubXV0YWJsZU1lcmdlKHRoaXMucmVuZGVyZWQsIGRpZmYpO1xuICAgIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdIHx8IHt9O1xuXG4gICAgaWYgKG5ld2MpIHtcbiAgICAgIGNvbnN0IG9sZGMgPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG5ld2NbY2lkXSA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChjaWQsIG5ld2NbY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBpbiBuZXdjKSB7XG4gICAgICAgIG9sZGNbY2lkXSA9IG5ld2NbY2lkXTtcbiAgICAgIH1cbiAgICAgIGRpZmZbQ09NUE9ORU5UU10gPSBuZXdjO1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBjZGlmZiwgb2xkYywgbmV3YywgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGVbY2lkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlW2NpZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZGlmZixcbiAgICAgICAgc3RhdCxcbiAgICAgICAgc2NpZCA9IGNkaWZmW1NUQVRJQ107XG5cbiAgICAgIGlmIChpc0NpZChzY2lkKSkge1xuICAgICAgICBsZXQgdGRpZmY7XG5cbiAgICAgICAgaWYgKHNjaWQgPiAwKSB7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRkaWZmID0gb2xkY1stc2NpZF07XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ID0gdGRpZmZbU1RBVElDXTtcbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmLCB0cnVlKTtcbiAgICAgICAgbmRpZmZbU1RBVElDXSA9IHN0YXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZGlmZiA9XG4gICAgICAgICAgY2RpZmZbU1RBVElDXSAhPT0gdW5kZWZpbmVkIHx8IG9sZGNbY2lkXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGNkaWZmXG4gICAgICAgICAgICA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0sIGNkaWZmLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGNhY2hlW2NpZF0gPSBuZGlmZjtcbiAgICAgIHJldHVybiBuZGlmZjtcbiAgICB9XG4gIH1cblxuICBtdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIGRvTXV0YWJsZU1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZVtLRVlFRF0pIHtcbiAgICAgIHRoaXMubWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsID0gdGFyZ2V0W2tleV07XG4gICAgICAgIGNvbnN0IGlzT2JqVmFsID0gaXNPYmplY3QodmFsKTtcbiAgICAgICAgaWYgKGlzT2JqVmFsICYmIHZhbFtTVEFUSUNdID09PSB1bmRlZmluZWQgJiYgaXNPYmplY3QodGFyZ2V0VmFsKSkge1xuICAgICAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0VmFsLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXRbUk9PVF0pIHtcbiAgICAgIHRhcmdldC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKGRpZmYpIHtcbiAgICBpZiAoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiBpbiB3aW5kb3cpIHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoZGlmZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbGxiYWNrIGZvciBqZXN0XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkaWZmKSk7XG4gICAgfVxuICB9XG5cbiAgLy8ga2V5ZWQgY29tcHJlaGVuc2lvbnNcbiAgbWVyZ2VLZXllZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgIC8vIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHRhcmdldCBzaW5jZSBlbGVtZW50cyBjYW4gbW92ZSBhbmQgb3RoZXJ3aXNlXG4gICAgLy8gaXQgY291bGQgaGFwcGVuIHRoYXQgd2UgbW9kaWZ5IGFuIGVsZW1lbnQgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlZmVyIHRvXG4gICAgLy8gbGF0ZXJcbiAgICBjb25zdCBjbG9uZWRUYXJnZXQgPSB0aGlzLmNsb25lKHRhcmdldCk7XG4gICAgT2JqZWN0LmVudHJpZXMoc291cmNlW0tFWUVEXSkuZm9yRWFjaCgoW2ksIGVudHJ5XSkgPT4ge1xuICAgICAgaWYgKGkgPT09IEtFWUVEX0NPVU5UKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAvLyBbb2xkX2lkeCwgZGlmZl1cbiAgICAgICAgLy8gbW92ZWQgd2l0aCBkaWZmXG4gICAgICAgIGNvbnN0IFtvbGRfaWR4LCBkaWZmXSA9IGVudHJ5O1xuICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0gY2xvbmVkVGFyZ2V0W0tFWUVEXVtvbGRfaWR4XTtcbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBkaWZmKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8vIG1vdmVkIHdpdGhvdXQgZGlmZlxuICAgICAgICBjb25zdCBvbGRfaWR4ID0gZW50cnk7XG4gICAgICAgIHRhcmdldFtLRVlFRF1baV0gPSBjbG9uZWRUYXJnZXRbS0VZRURdW29sZF9pZHhdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW50cnkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgLy8gZGlmZiwgc2FtZSBwb3NpdGlvblxuICAgICAgICBpZiAoIXRhcmdldFtLRVlFRF1baV0pIHtcbiAgICAgICAgICB0YXJnZXRbS0VZRURdW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb011dGFibGVNZXJnZSh0YXJnZXRbS0VZRURdW2ldLCBlbnRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZHJvcCBleHRyYSBlbnRyaWVzXG4gICAgaWYgKHNvdXJjZVtLRVlFRF1bS0VZRURfQ09VTlRdIDwgdGFyZ2V0W0tFWUVEXVtLRVlFRF9DT1VOVF0pIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgICAgIGkgPCB0YXJnZXRbS0VZRURdW0tFWUVEX0NPVU5UXTtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIHRhcmdldFtLRVlFRF1baV07XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldFtLRVlFRF1bS0VZRURfQ09VTlRdID0gc291cmNlW0tFWUVEXVtLRVlFRF9DT1VOVF07XG4gICAgaWYgKHNvdXJjZVtTVFJFQU1dKSB7XG4gICAgICB0YXJnZXRbU1RSRUFNXSA9IHNvdXJjZVtTVFJFQU1dO1xuICAgIH1cbiAgICBpZiAoc291cmNlW1RFTVBMQVRFU10pIHtcbiAgICAgIHRhcmdldFtURU1QTEFURVNdID0gc291cmNlW1RFTVBMQVRFU107XG4gICAgfVxuICB9XG5cbiAgLy8gTWVyZ2VzIGNpZCB0cmVlcyB0b2dldGhlciwgY29weWluZyBzdGF0aWNzIGZyb20gc291cmNlIHRyZWUuXG4gIC8vXG4gIC8vIFRoZSBgcHJ1bmVNYWdpY0lkYCBpcyBwYXNzZWQgdG8gY29udHJvbCBwcnVuaW5nIHRoZSBtYWdpY0lkIG9mIHRoZVxuICAvLyB0YXJnZXQuIFdlIG11c3QgYWx3YXlzIHBydW5lIHRoZSBtYWdpY0lkIHdoZW4gd2UgYXJlIHNoYXJpbmcgc3RhdGljc1xuICAvLyBmcm9tIGFub3RoZXIgY29tcG9uZW50LiBJZiBub3QgcHJ1bmluZywgd2UgcmVwbGljYXRlIHRoZSBsb2dpYyBmcm9tXG4gIC8vIG11dGFibGVNZXJnZSwgd2hlcmUgd2Ugc2V0IG5ld1JlbmRlciB0byB0cnVlIGlmIHRoZXJlIGlzIGEgcm9vdFxuICAvLyAoZWZmZWN0aXZlbHkgZm9yY2luZyB0aGUgbmV3IHZlcnNpb24gdG8gYmUgcmVuZGVyZWQgaW5zdGVhZCBvZiBza2lwcGVkKVxuICAvL1xuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlLCBwcnVuZU1hZ2ljSWQpIHtcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCwgLi4uc291cmNlIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VkKSB7XG4gICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbCA9IHRhcmdldFtrZXldO1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbCkgJiYgdmFsW1NUQVRJQ10gPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwgdmFsLCBwcnVuZU1hZ2ljSWQpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCAmJiBpc09iamVjdCh0YXJnZXRWYWwpKSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gdGhpcy5jbG9uZU1lcmdlKHRhcmdldFZhbCwge30sIHBydW5lTWFnaWNJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcnVuZU1hZ2ljSWQpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubWFnaWNJZDtcbiAgICAgIGRlbGV0ZSBtZXJnZWQubmV3UmVuZGVyO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0W1JPT1RdKSB7XG4gICAgICBtZXJnZWQubmV3UmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIGNvbXBvbmVudFRvU3RyaW5nKGNpZCkge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBzdHIsIHN0cmVhbXMgfSA9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcoXG4gICAgICB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdLFxuICAgICAgY2lkLFxuICAgICAgbnVsbCxcbiAgICApO1xuICAgIGNvbnN0IFtzdHJpcHBlZEhUTUwsIF9iZWZvcmUsIF9hZnRlcl0gPSBtb2RpZnlSb290KHN0ciwge30pO1xuICAgIHJldHVybiB7IGJ1ZmZlcjogc3RyaXBwZWRIVE1MLCBzdHJlYW1zOiBzdHJlYW1zIH07XG4gIH1cblxuICBwcnVuZUNJRHMoY2lkcykge1xuICAgIGNpZHMuZm9yRWFjaCgoY2lkKSA9PiBkZWxldGUgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXVtjaWRdKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWQ7XG4gIH1cblxuICBpc05ld0ZpbmdlcnByaW50KGRpZmYgPSB7fSkge1xuICAgIHJldHVybiAhIWRpZmZbU1RBVElDXTtcbiAgfVxuXG4gIHRlbXBsYXRlU3RhdGljKHBhcnQsIHRlbXBsYXRlcykge1xuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlc1twYXJ0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfVxuICB9XG5cbiAgbmV4dE1hZ2ljSUQoKSB7XG4gICAgdGhpcy5tYWdpY0lkKys7XG4gICAgcmV0dXJuIGBtJHt0aGlzLm1hZ2ljSWR9LSR7dGhpcy5wYXJlbnRWaWV3SWQoKX1gO1xuICB9XG5cbiAgLy8gQ29udmVydHMgcmVuZGVyZWQgdHJlZSB0byBvdXRwdXQgYnVmZmVyLlxuICAvL1xuICAvLyBjaGFuZ2VUcmFja2luZyBjb250cm9scyBpZiB3ZSBjYW4gYXBwbHkgdGhlIFBIWF9TS0lQIG9wdGltaXphdGlvbi5cbiAgdG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywgcm9vdEF0dHJzID0ge30pIHtcbiAgICBpZiAocmVuZGVyZWRbS0VZRURdKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIoXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICB0ZW1wbGF0ZXMsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgY2hhbmdlVHJhY2tpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlcyBhcmUgYSB3YXkgb2Ygc2hhcmluZyBzdGF0aWNzIGJldHdlZW4gbXVsdGlwbGUgcmVuZGVyZWQgc3RydWN0cy5cbiAgICAvLyBTaW5jZSBMaXZlVmlldyAxLjEsIHRob3NlIGNhbiBhbHNvIGFwcGVhciBhdCB0aGUgcm9vdCAtIGZvciBleGFtcGxlIGlmIG9uZSByZW5kZXJzXG4gICAgLy8gdHdvIGNvbXByZWhlbnNpb25zIHRoYXQgY2FuIHNoYXJlIHN0YXRpY3MuXG4gICAgLy8gV2hlbmV2ZXIgd2UgZmluZCB0ZW1wbGF0ZXMsIHdlIG5lZWQgdG8gdXNlIHRoZW0gcmVjdXJzaXZlbHkuIEFsc28sIHRlbXBsYXRlcyBjYW5cbiAgICAvLyBiZSBzZW50IGZvciBlYWNoIGRpZmYsIG5vdCBvbmx5IGZvciB0aGUgaW5pdGlhbCBvbmUuIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhlbVxuICAgIC8vIHRob3VnaCwgc28gd2UgYWx3YXlzIHJlc29sdmUgdGhlbSBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcmVuZGVyZWQgb2JqZWN0LlxuICAgIGlmIChyZW5kZXJlZFtURU1QTEFURVNdKSB7XG4gICAgICB0ZW1wbGF0ZXMgPSByZW5kZXJlZFtURU1QTEFURVNdO1xuICAgICAgZGVsZXRlIHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgfVxuXG4gICAgbGV0IHsgW1NUQVRJQ106IHN0YXRpY3MgfSA9IHJlbmRlcmVkO1xuICAgIHN0YXRpY3MgPSB0aGlzLnRlbXBsYXRlU3RhdGljKHN0YXRpY3MsIHRlbXBsYXRlcyk7XG4gICAgcmVuZGVyZWRbU1RBVElDXSA9IHN0YXRpY3M7XG4gICAgY29uc3QgaXNSb290ID0gcmVuZGVyZWRbUk9PVF07XG4gICAgY29uc3QgcHJldkJ1ZmZlciA9IG91dHB1dC5idWZmZXI7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IFwiXCI7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25kaXRpb24gaXMgY2FsbGVkIHdoZW4gZmlyc3QgcmVuZGVyaW5nIGFuIG9wdGltaXphYmxlIGZ1bmN0aW9uIGNvbXBvbmVudC5cbiAgICAvLyBMQyBoYXZlIHRoZWlyIG1hZ2ljSWQgcHJldmlvdXNseSBzZXRcbiAgICBpZiAoY2hhbmdlVHJhY2tpbmcgJiYgaXNSb290ICYmICFyZW5kZXJlZC5tYWdpY0lkKSB7XG4gICAgICByZW5kZXJlZC5uZXdSZW5kZXIgPSB0cnVlO1xuICAgICAgcmVuZGVyZWQubWFnaWNJZCA9IHRoaXMubmV4dE1hZ2ljSUQoKTtcbiAgICB9XG5cbiAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZFtpIC0gMV0sIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZyk7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbaV07XG4gICAgfVxuXG4gICAgLy8gQXBwbGllcyB0aGUgcm9vdCB0YWcgXCJza2lwXCIgb3B0aW1pemF0aW9uIGlmIHN1cHBvcnRlZCwgd2hpY2ggY2xlYXJzXG4gICAgLy8gdGhlIHJvb3QgdGFnIGF0dHJpYnV0ZXMgYW5kIGlubmVySFRNTCwgYW5kIG9ubHkgbWFpbnRhaW5zIHRoZSBtYWdpY0lkLlxuICAgIC8vIFdlIGNhbiBvbmx5IHNraXAgd2hlbiBjaGFuZ2VUcmFja2luZyBpcyBzdXBwb3J0ZWQsXG4gICAgLy8gYW5kIHdoZW4gdGhlIHJvb3QgZWxlbWVudCBoYXNuJ3QgZXhwZXJpZW5jZWQgYW4gdW5yZW5kZXJlZCBtZXJnZSAobmV3UmVuZGVyIHRydWUpLlxuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGxldCBza2lwID0gZmFsc2U7XG4gICAgICBsZXQgYXR0cnM7XG4gICAgICAvLyBXaGVuIGEgTEMgaXMgcmUtYWRkZWQgdG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gcmUtcmVuZGVyIHRoZSBlbnRpcmUgTEMgdHJlZSxcbiAgICAgIC8vIHRoZXJlZm9yZSBjaGFuZ2VUcmFja2luZyBpcyBmYWxzZTsgaG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIGFsbCB0aGUgbWFnaWNJZHNcbiAgICAgIC8vIGZyb20gYW55IGZ1bmN0aW9uIGNvbXBvbmVudCBzbyB0aGUgbmV4dCB0aW1lIHRoZSBMQyBpcyB1cGRhdGVkLCB3ZSBjYW4gYXBwbHlcbiAgICAgIC8vIHRoZSBza2lwIG9wdGltaXphdGlvblxuICAgICAgaWYgKGNoYW5nZVRyYWNraW5nIHx8IHJlbmRlcmVkLm1hZ2ljSWQpIHtcbiAgICAgICAgc2tpcCA9IGNoYW5nZVRyYWNraW5nICYmICFyZW5kZXJlZC5uZXdSZW5kZXI7XG4gICAgICAgIGF0dHJzID0geyBbUEhYX01BR0lDX0lEXTogcmVuZGVyZWQubWFnaWNJZCwgLi4ucm9vdEF0dHJzIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRycyA9IHJvb3RBdHRycztcbiAgICAgIH1cbiAgICAgIGlmIChza2lwKSB7XG4gICAgICAgIGF0dHJzW1BIWF9TS0lQXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBbbmV3Um9vdCwgY29tbWVudEJlZm9yZSwgY29tbWVudEFmdGVyXSA9IG1vZGlmeVJvb3QoXG4gICAgICAgIG91dHB1dC5idWZmZXIsXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBza2lwLFxuICAgICAgKTtcbiAgICAgIHJlbmRlcmVkLm5ld1JlbmRlciA9IGZhbHNlO1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IHByZXZCdWZmZXIgKyBjb21tZW50QmVmb3JlICsgbmV3Um9vdCArIGNvbW1lbnRBZnRlcjtcbiAgICB9XG4gIH1cblxuICBjb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZykge1xuICAgIGNvbnN0IGtleWVkVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU107XG4gICAgY29uc3Qgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMocmVuZGVyZWRbU1RBVElDXSwgdGVtcGxhdGVzKTtcbiAgICByZW5kZXJlZFtTVEFUSUNdID0gc3RhdGljcztcbiAgICBkZWxldGUgcmVuZGVyZWRbVEVNUExBVEVTXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmVkW0tFWUVEXVtLRVlFRF9DT1VOVF07IGkrKykge1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdO1xuICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBzdGF0aWNzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKFxuICAgICAgICAgIHJlbmRlcmVkW0tFWUVEXVtpXVtqIC0gMV0sXG4gICAgICAgICAga2V5ZWRUZW1wbGF0ZXMsXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgICApO1xuICAgICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3Nbal07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgdGhlIHJlbmRlcmVkIHRyZWUgZm9yIHN0cmVhbXNcbiAgICBpZiAocmVuZGVyZWRbU1RSRUFNXSkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgIGNvbnN0IFtfcmVmLCBfaW5zZXJ0cywgZGVsZXRlSWRzLCByZXNldF0gPSBzdHJlYW0gfHwgW251bGwsIHt9LCBbXSwgbnVsbF07XG4gICAgICBpZiAoXG4gICAgICAgIHN0cmVhbSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChyZW5kZXJlZFtLRVlFRF1bS0VZRURfQ09VTlRdID4gMCB8fCBkZWxldGVJZHMubGVuZ3RoID4gMCB8fCByZXNldClcbiAgICAgICkge1xuICAgICAgICBkZWxldGUgcmVuZGVyZWRbU1RSRUFNXTtcbiAgICAgICAgcmVuZGVyZWRbS0VZRURdID0ge1xuICAgICAgICAgIFtLRVlFRF9DT1VOVF06IDAsXG4gICAgICAgIH07XG4gICAgICAgIG91dHB1dC5zdHJlYW1zLmFkZChzdHJlYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQsIGNoYW5nZVRyYWNraW5nKSB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXJlZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgY29uc3QgeyBidWZmZXI6IHN0ciwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVDSURUb1N0cmluZyhcbiAgICAgICAgb3V0cHV0LmNvbXBvbmVudHMsXG4gICAgICAgIHJlbmRlcmVkLFxuICAgICAgICBvdXRwdXQub25seUNpZHMsXG4gICAgICApO1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdHI7XG4gICAgICBvdXRwdXQuc3RyZWFtcyA9IG5ldyBTZXQoWy4uLm91dHB1dC5zdHJlYW1zLCAuLi5zdHJlYW1zXSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChyZW5kZXJlZCkpIHtcbiAgICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIHRlbXBsYXRlcywgb3V0cHV0LCBjaGFuZ2VUcmFja2luZywge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHJlbmRlcmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2l2ZUNJRFRvU3RyaW5nKGNvbXBvbmVudHMsIGNpZCwgb25seUNpZHMpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPVxuICAgICAgY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKTtcbiAgICBjb25zdCBhdHRycyA9IHsgW1BIWF9DT01QT05FTlRdOiBjaWQsIFtQSFhfVklFV19SRUZdOiB0aGlzLnZpZXdJZCB9O1xuICAgIGNvbnN0IHNraXAgPSBvbmx5Q2lkcyAmJiAhb25seUNpZHMuaGFzKGNpZCk7XG4gICAgLy8gVHdvIG9wdGltaXphdGlvbiBwYXRocyBhcHBseSBoZXJlOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgb25seUNpZHMgb3B0aW1pemF0aW9uIHdvcmtzIGJ5IHRoZSBzZXJ2ZXIgZGlmZiB0ZWxsaW5nIHVzIG9ubHkgc3BlY2lmaWNcbiAgICAvLyAgICAgY2lkJ3MgaGF2ZSBjaGFuZ2VkLiBUaGlzIGFsbG93cyB1cyB0byBza2lwIHJlbmRlcmluZyBhbnkgY29tcG9uZW50IHRoYXQgaGFzbid0IGNoYW5nZWQsXG4gICAgLy8gICAgIHdoaWNoIHVsdGltYXRlbHkgc2V0cyBQSFhfU0tJUCByb290IGF0dHJpYnV0ZSBhbmQgYXZvaWRzIHJlbmRlcmluZyB0aGUgaW5uZXJIVE1MLlxuICAgIC8vXG4gICAgLy8gICAyLiBUaGUgcm9vdCBQSFhfU0tJUCBvcHRpbWl6YXRpb24gZ2VuZXJhbGl6ZXMgdG8gYWxsIEhFRXggZnVuY3Rpb24gY29tcG9uZW50cywgYW5kXG4gICAgLy8gICAgIHdvcmtzIGluIHRoZSBzYW1lIFBIWF9TS0lQIGF0dHJpYnV0ZSBmYXNoaW9uIGFzIDEsIGJ1dCB0aGUgbmV3UmVuZGVyIHRyYWNraW5nIGlzIGRvbmVcbiAgICAvLyAgICAgYXQgdGhlIGdlbmVyYWwgZGlmZiBtZXJnZSBsZXZlbC4gSWYgd2UgbWVyZ2UgYSBkaWZmIHdpdGggbmV3IGR5bmFtaWNzLCB3ZSBuZWNlc3NhcmlseSBoYXZlXG4gICAgLy8gICAgIGV4cGVyaWVuY2VkIGEgY2hhbmdlIHdoaWNoIG11c3QgYmUgYSBuZXdSZW5kZXIsIGFuZCB0aHVzIHdlIGNhbid0IHNraXAgdGhlIHJlbmRlci5cbiAgICAvL1xuICAgIC8vIEJvdGggb3B0aW1pemF0aW9uIGZsb3dzIGFwcGx5IGhlcmUuIG5ld1JlbmRlciBpcyBzZXQgYmFzZWQgb24gdGhlIG9ubHlDaWRzIG9wdGltaXphdGlvbiwgYW5kXG4gICAgLy8gd2UgdHJhY2sgYSBkZXRlcm1pbmlzdGljIG1hZ2ljSWQgYmFzZWQgb24gdGhlIGNpZC5cbiAgICAvL1xuICAgIC8vIGNoYW5nZVRyYWNraW5nIGlzIGFib3V0IHRoZSBlbnRpcmUgdHJlZVxuICAgIC8vIG5ld1JlbmRlciBpcyBhYm91dCB0aGUgY3VycmVudCByb290IGluIHRoZSB0cmVlXG4gICAgLy9cbiAgICAvLyBCeSBkZWZhdWx0IGNoYW5nZVRyYWNraW5nIGlzIGVuYWJsZWQsIGJ1dCB3ZSBzcGVjaWFsIGNhc2UgdGhlIGZsb3cgd2hlcmUgdGhlIGNsaWVudCBpcyBwcnVuaW5nXG4gICAgLy8gY2lkcyBhbmQgdGhlIHNlcnZlciBhZGRzIHRoZSBjb21wb25lbnQgYmFjay4gSW4gc3VjaCBjYXNlcywgd2UgZXhwbGljaXRseSBkaXNhYmxlIGNoYW5nZVRyYWNraW5nXG4gICAgLy8gd2l0aCByZXNldFJlbmRlciBmb3IgdGhpcyBjaWQsIHRoZW4gcmUtZW5hYmxlIGl0IGFmdGVyIHRoZSByZWN1cnNpdmUgY2FsbCB0byBza2lwIHRoZSBvcHRpbWl6YXRpb25cbiAgICAvLyBmb3IgdGhlIGVudGlyZSBjb21wb25lbnQgdHJlZS5cbiAgICBjb21wb25lbnQubmV3UmVuZGVyID0gIXNraXA7XG4gICAgY29tcG9uZW50Lm1hZ2ljSWQgPSBgYyR7Y2lkfS0ke3RoaXMucGFyZW50Vmlld0lkKCl9YDtcbiAgICAvLyBlbmFibGUgY2hhbmdlIHRyYWNraW5nIGFzIGxvbmcgYXMgdGhlIGNvbXBvbmVudCBoYXNuJ3QgYmVlbiByZXNldFxuICAgIGNvbnN0IGNoYW5nZVRyYWNraW5nID0gIWNvbXBvbmVudC5yZXNldDtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZWN1cnNpdmVUb1N0cmluZyhcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudHMsXG4gICAgICBvbmx5Q2lkcyxcbiAgICAgIGNoYW5nZVRyYWNraW5nLFxuICAgICAgYXR0cnMsXG4gICAgKTtcbiAgICAvLyBkaXNhYmxlIHJlc2V0IGFmdGVyIHdlJ3ZlIHJlbmRlcmVkXG4gICAgZGVsZXRlIGNvbXBvbmVudC5yZXNldDtcblxuICAgIHJldHVybiB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtczogc3RyZWFtcyB9O1xuICB9XG59XG4iLCAiaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBBUklBIGZyb20gXCIuL2FyaWFcIjtcblxuY29uc3QgZm9jdXNTdGFjayA9IFtdO1xuY29uc3QgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWUgPSAyMDA7XG5cbmNvbnN0IEpTID0ge1xuICAvLyBwcml2YXRlXG4gIGV4ZWMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGRlZmF1bHRzKSB7XG4gICAgY29uc3QgW2RlZmF1bHRLaW5kLCBkZWZhdWx0QXJnc10gPSBkZWZhdWx0cyB8fCBbXG4gICAgICBudWxsLFxuICAgICAgeyBjYWxsYmFjazogZGVmYXVsdHMgJiYgZGVmYXVsdHMuY2FsbGJhY2sgfSxcbiAgICBdO1xuICAgIGNvbnN0IGNvbW1hbmRzID1cbiAgICAgIHBoeEV2ZW50LmNoYXJBdCgwKSA9PT0gXCJbXCJcbiAgICAgICAgPyBKU09OLnBhcnNlKHBoeEV2ZW50KVxuICAgICAgICA6IFtbZGVmYXVsdEtpbmQsIGRlZmF1bHRBcmdzXV07XG5cbiAgICBjb21tYW5kcy5mb3JFYWNoKChba2luZCwgYXJnc10pID0+IHtcbiAgICAgIGlmIChraW5kID09PSBkZWZhdWx0S2luZCkge1xuICAgICAgICAvLyBhbHdheXMgcHJlZmVyIHRoZSBhcmdzLCBidXQga2VlcCBleGlzdGluZyBrZXlzIGZyb20gdGhlIGRlZmF1bHRBcmdzXG4gICAgICAgIGFyZ3MgPSB7IC4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzIH07XG4gICAgICAgIGFyZ3MuY2FsbGJhY2sgPSBhcmdzLmNhbGxiYWNrIHx8IGRlZmF1bHRBcmdzLmNhbGxiYWNrO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJUb0Vscyh2aWV3LmxpdmVTb2NrZXQsIHNvdXJjZUVsLCBhcmdzKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICB0aGlzW2BleGVjXyR7a2luZH1gXShlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgaXNWaXNpYmxlKGVsKSB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZWwub2Zmc2V0V2lkdGggfHxcbiAgICAgIGVsLm9mZnNldEhlaWdodCB8fFxuICAgICAgZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfSxcblxuICAvLyByZXR1cm5zIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSB2aWV3cG9ydFxuICBpc0luVmlld3BvcnQoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID1cbiAgICAgIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHdpbmRvd1dpZHRoID1cbiAgICAgIHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblxuICAgIHJldHVybiAoXG4gICAgICByZWN0LnJpZ2h0ID4gMCAmJlxuICAgICAgcmVjdC5ib3R0b20gPiAwICYmXG4gICAgICByZWN0LmxlZnQgPCB3aW5kb3dXaWR0aCAmJlxuICAgICAgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHRcbiAgICApO1xuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICAvLyBjb21tYW5kc1xuXG4gIGV4ZWNfZXhlYyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0ciwgdG8gfSkge1xuICAgIGNvbnN0IGVuY29kZWRKUyA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICBpZiAoIWVuY29kZWRKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke2F0dHJ9IHRvIGNvbnRhaW4gSlMgY29tbWFuZCBvbiBcIiR7dG99XCJgKTtcbiAgICB9XG4gICAgdmlldy5saXZlU29ja2V0LmV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUpO1xuICB9LFxuXG4gIGV4ZWNfZGlzcGF0Y2goXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGV2ZW50LCBkZXRhaWwsIGJ1YmJsZXMsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIGRldGFpbCA9IGRldGFpbCB8fCB7fTtcbiAgICBkZXRhaWwuZGlzcGF0Y2hlciA9IHNvdXJjZUVsO1xuICAgIGlmIChibG9ja2luZykge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICAgIGRldGFpbC5kb25lID0gcmVzb2x2ZTtcbiAgICAgIH0pO1xuICAgICAgdmlldy5saXZlU29ja2V0LmFzeW5jVHJhbnNpdGlvbihwcm9taXNlKTtcbiAgICB9XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZWwsIGV2ZW50LCB7IGRldGFpbCwgYnViYmxlcyB9KTtcbiAgfSxcblxuICBleGVjX3B1c2goZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCBhcmdzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgZGlzcGF0Y2hlcixcbiAgICAgIGNhbGxiYWNrLFxuICAgIH0gPSBhcmdzO1xuICAgIGNvbnN0IHB1c2hPcHRzID0ge1xuICAgICAgbG9hZGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgfTtcbiAgICBjb25zdCB0YXJnZXRTcmMgPVxuICAgICAgZXZlbnRUeXBlID09PSBcImNoYW5nZVwiICYmIGRpc3BhdGNoZXIgPyBkaXNwYXRjaGVyIDogc291cmNlRWw7XG4gICAgY29uc3QgcGh4VGFyZ2V0ID1cbiAgICAgIHRhcmdldCB8fCB0YXJnZXRTcmMuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhcInRhcmdldFwiKSkgfHwgdGFyZ2V0U3JjO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBpZiAoIXRhcmdldFZpZXcuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGxldCB7IG5ld0NpZCwgX3RhcmdldCB9ID0gYXJncztcbiAgICAgICAgX3RhcmdldCA9XG4gICAgICAgICAgX3RhcmdldCB8fCAoRE9NLmlzRm9ybUlucHV0KHNvdXJjZUVsKSA/IHNvdXJjZUVsLm5hbWUgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoX3RhcmdldCkge1xuICAgICAgICAgIHB1c2hPcHRzLl90YXJnZXQgPSBfdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFZpZXcucHVzaElucHV0KFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBuZXdDaWQsXG4gICAgICAgICAgZXZlbnQgfHwgcGh4RXZlbnQsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gXCJzdWJtaXRcIikge1xuICAgICAgICBjb25zdCB7IHN1Ym1pdHRlciB9ID0gYXJncztcbiAgICAgICAgdGFyZ2V0Vmlldy5zdWJtaXRGb3JtKFxuICAgICAgICAgIHNvdXJjZUVsLFxuICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICBldmVudCB8fCBwaHhFdmVudCxcbiAgICAgICAgICBzdWJtaXR0ZXIsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRWaWV3LnB1c2hFdmVudChcbiAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgc291cmNlRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIGV2ZW50IHx8IHBoeEV2ZW50LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgcHVzaE9wdHMsXG4gICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBpbiBjYXNlIG9mIGZvcm1SZWNvdmVyeSwgdGFyZ2V0VmlldyBhbmQgdGFyZ2V0Q3R4IGFyZSBwYXNzZWQgYXMgYXJndW1lbnRcbiAgICAvLyBhcyB0aGV5IGFyZSBsb29rZWQgdXAgaW4gYSB0ZW1wbGF0ZSBlbGVtZW50LCBub3QgdGhlIHJlYWwgRE9NXG4gICAgaWYgKGFyZ3MudGFyZ2V0VmlldyAmJiBhcmdzLnRhcmdldEN0eCkge1xuICAgICAgaGFuZGxlcihhcmdzLnRhcmdldFZpZXcsIGFyZ3MudGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgaGFuZGxlcik7XG4gICAgfVxuICB9LFxuXG4gIGV4ZWNfbmF2aWdhdGUoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGhyZWYsIHJlcGxhY2UgfSkge1xuICAgIHZpZXcubGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgbnVsbCxcbiAgICAgIHNvdXJjZUVsLFxuICAgICk7XG4gIH0sXG5cbiAgZXhlY19wYXRjaChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgaHJlZiwgcmVwbGFjZSB9KSB7XG4gICAgdmlldy5saXZlU29ja2V0LnB1c2hIaXN0b3J5UGF0Y2goXG4gICAgICBlLFxuICAgICAgaHJlZixcbiAgICAgIHJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgc291cmNlRWwsXG4gICAgKTtcbiAgfSxcblxuICBleGVjX2ZvY3VzKGUsIGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCkge1xuICAgIEFSSUEuYXR0ZW1wdEZvY3VzKGVsKTtcbiAgICAvLyBpbiBjYXNlIHRoZSBKUy5mb2N1cyBjb21tYW5kIGlzIGluIGEgSlMuc2hvdy9oaWRlL3RvZ2dsZSBjaGFpbiwgZm9yIHNob3cgd2UgbmVlZFxuICAgIC8vIHRvIHdhaXQgZm9yIEpTLnNob3cgdG8gaGF2ZSB1cGRhdGVkIHRoZSBlbGVtZW50J3MgZGlzcGxheSBwcm9wZXJ0eSAoc2VlIGV4ZWNfdG9nZ2xlKVxuICAgIC8vIGJ1dCB0aGF0IHJ1biBpbiBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgdGhlcmVmb3JlIHdlIG5lZWQgdG8gdXNlIHRoZW0gaGVyZSBhcyB3ZWxsXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IEFSSUEuYXR0ZW1wdEZvY3VzKGVsKSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgZXhlY19mb2N1c19maXJzdChlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwpIHtcbiAgICBBUklBLmZvY3VzRmlyc3RJbnRlcmFjdGl2ZShlbCkgfHwgQVJJQS5mb2N1c0ZpcnN0KGVsKTtcbiAgICAvLyBpZiB5b3Ugd29uZGVyIGFib3V0IHRoZSBuZXN0ZWQgYW5pbWF0aW9uIGZyYW1lcywgc2VlIGV4ZWNfZm9jdXNcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICgpID0+IEFSSUEuZm9jdXNGaXJzdEludGVyYWN0aXZlKGVsKSB8fCBBUklBLmZvY3VzRmlyc3QoZWwpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcblxuICBleGVjX3B1c2hfZm9jdXMoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsKSB7XG4gICAgZm9jdXNTdGFjay5wdXNoKGVsIHx8IHNvdXJjZUVsKTtcbiAgfSxcblxuICBleGVjX3BvcF9mb2N1cyhfZSwgX2V2ZW50VHlwZSwgX3BoeEV2ZW50LCBfdmlldywgX3NvdXJjZUVsLCBfZWwpIHtcbiAgICBjb25zdCBlbCA9IGZvY3VzU3RhY2sucG9wKCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5mb2N1cygpO1xuICAgICAgLy8gaWYgeW91IHdvbmRlciBhYm91dCB0aGUgbmVzdGVkIGFuaW1hdGlvbiBmcmFtZXMsIHNlZSBleGVjX2ZvY3VzXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBlbC5mb2N1cygpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBleGVjX2FkZF9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBuYW1lcywgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3JlbW92ZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9jbGFzcyhcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMudG9nZ2xlQ2xhc3NlcyhlbCwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZV9hdHRyKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBhdHRyOiBbYXR0ciwgdmFsMSwgdmFsMl0gfSxcbiAgKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgfSxcblxuICBleGVjX2lnbm9yZV9hdHRycyhlLCBldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHsgYXR0cnMgfSkge1xuICAgIHRoaXMuaWdub3JlQXR0cnMoZWwsIGF0dHJzKTtcbiAgfSxcblxuICBleGVjX3RyYW5zaXRpb24oXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IHRpbWUsIHRyYW5zaXRpb24sIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgW10sIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3RvZ2dsZShcbiAgICBlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBwaHhFdmVudCxcbiAgICB2aWV3LFxuICAgIHNvdXJjZUVsLFxuICAgIGVsLFxuICAgIHsgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUsIGJsb2NraW5nKTtcbiAgfSxcblxuICBleGVjX3Nob3coXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nIH0sXG4gICkge1xuICAgIHRoaXMuc2hvdyhldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyk7XG4gIH0sXG5cbiAgZXhlY19oaWRlKFxuICAgIGUsXG4gICAgZXZlbnRUeXBlLFxuICAgIHBoeEV2ZW50LFxuICAgIHZpZXcsXG4gICAgc291cmNlRWwsXG4gICAgZWwsXG4gICAgeyBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lLCBibG9ja2luZyB9LFxuICApIHtcbiAgICB0aGlzLmhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpO1xuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoXG4gICAgZSxcbiAgICBldmVudFR5cGUsXG4gICAgcGh4RXZlbnQsXG4gICAgdmlldyxcbiAgICBzb3VyY2VFbCxcbiAgICBlbCxcbiAgICB7IGF0dHI6IFthdHRyLCB2YWxdIH0sXG4gICkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWxdXSwgW10pO1xuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZSwgZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7IGF0dHIgfSkge1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSk7XG4gIH0sXG5cbiAgaWdub3JlQXR0cnMoZWwsIGF0dHJzKSB7XG4gICAgRE9NLnB1dFByaXZhdGUoZWwsIFwiSlM6aWdub3JlX2F0dHJzXCIsIHtcbiAgICAgIGFwcGx5OiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgIEFycmF5LmZyb20oZnJvbUVsLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhdHRycy5zb21lKFxuICAgICAgICAgICAgICAodG9JZ25vcmUpID0+XG4gICAgICAgICAgICAgICAgYXR0ci5uYW1lID09IHRvSWdub3JlIHx8XG4gICAgICAgICAgICAgICAgdG9JZ25vcmUgPT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgKHRvSWdub3JlLmluY2x1ZGVzKFwiKlwiKSAmJiBhdHRyLm5hbWUubWF0Y2godG9JZ25vcmUpICE9IG51bGwpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcblxuICBvbkJlZm9yZUVsVXBkYXRlZChmcm9tRWwsIHRvRWwpIHtcbiAgICBjb25zdCBpZ25vcmVBdHRycyA9IERPTS5wcml2YXRlKGZyb21FbCwgXCJKUzppZ25vcmVfYXR0cnNcIik7XG4gICAgaWYgKGlnbm9yZUF0dHJzKSB7XG4gICAgICBpZ25vcmVBdHRycy5hcHBseShmcm9tRWwsIHRvRWwpO1xuICAgIH1cbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUsIGJsb2NraW5nKSB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgIHRoaXMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIHZpZXcsXG4gICAgICAgIGVsLFxuICAgICAgICBkaXNwbGF5LFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aW1lLFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIGhpZGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSwgYmxvY2tpbmcpIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUoZWwpKSB7XG4gICAgICB0aGlzLnRvZ2dsZShcbiAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICB2aWV3LFxuICAgICAgICBlbCxcbiAgICAgICAgZGlzcGxheSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbixcbiAgICAgICAgdGltZSxcbiAgICAgICAgYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICB0b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgaW5zLCBvdXRzLCB0aW1lLCBibG9ja2luZykge1xuICAgIHRpbWUgPSB0aW1lIHx8IGRlZmF1bHRfdHJhbnNpdGlvbl90aW1lO1xuICAgIGNvbnN0IFtpbkNsYXNzZXMsIGluU3RhcnRDbGFzc2VzLCBpbkVuZENsYXNzZXNdID0gaW5zIHx8IFtbXSwgW10sIFtdXTtcbiAgICBjb25zdCBbb3V0Q2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzLCBvdXRFbmRDbGFzc2VzXSA9IG91dHMgfHwgW1tdLCBbXSwgW11dO1xuICAgIGlmIChpbkNsYXNzZXMubGVuZ3RoID4gMCB8fCBvdXRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgY29uc3Qgb25TdGFydCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgb3V0U3RhcnRDbGFzc2VzLFxuICAgICAgICAgICAgaW5DbGFzc2VzLmNvbmNhdChpblN0YXJ0Q2xhc3NlcykuY29uY2F0KGluRW5kQ2xhc3NlcyksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRDbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRFbmRDbGFzc2VzLCBvdXRTdGFydENsYXNzZXMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfTtcbiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgIGlmIChibG9ja2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgICAgc2V0VGltZW91dChvbkVuZCwgdGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gXCJyZW1vdmVcIikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBpblN0YXJ0Q2xhc3NlcyxcbiAgICAgICAgICAgIG91dENsYXNzZXMuY29uY2F0KG91dFN0YXJ0Q2xhc3NlcykuY29uY2F0KG91dEVuZENsYXNzZXMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RpY2t5RGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5kZWZhdWx0RGlzcGxheShlbCk7XG4gICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBmaXJzdCBhZGQgdGhlIHN0YXJ0aW5nICsgYWN0aXZlIGNsYXNzLCBUSEVOIG1ha2UgdGhlIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGlmIHdlIHRvZ2dsZWQgdGhlIHZpc2liaWxpdHkgZWFybGllciBjc3MgYW5pbWF0aW9uc1xuICAgICAgICAgICAgLy8gd291bGQgZmxpY2tlciwgYXMgdGhlIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlIGJlZm9yZSB0aGUgYWN0aXZlIGFuaW1hdGlvblxuICAgICAgICAgICAgLy8gY2xhc3MgaXMgc2V0IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzM0NTYpXG4gICAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5DbGFzc2VzLCBbXSk7XG4gICAgICAgICAgICAvLyBhZGRPclJlbW92ZUNsYXNzZXMgdXNlcyBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpdHNlbGYsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIG1vdmUgdGhlIHB1dFN0aWNreVxuICAgICAgICAgICAgLy8gaW50byB0aGUgbmV4dCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuLi5cbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAgIFwidG9nZ2xlXCIsXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkVuZENsYXNzZXMsIGluU3RhcnRDbGFzc2VzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVuZCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgW10sIGluQ2xhc3Nlcy5jb25jYXQoaW5FbmRDbGFzc2VzKSk7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1lbmRcIikpO1xuICAgICAgICB9O1xuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIG9uU3RhcnQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KG9uRW5kLCB0aW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25FbmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6aGlkZS1zdGFydFwiKSk7XG4gICAgICAgICAgRE9NLnB1dFN0aWNreShcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJ0b2dnbGVcIixcbiAgICAgICAgICAgIChjdXJyZW50RWwpID0+IChjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKTtcbiAgICAgICAgICBjb25zdCBzdGlja3lEaXNwbGF5ID0gZGlzcGxheSB8fCB0aGlzLmRlZmF1bHREaXNwbGF5KGVsKTtcbiAgICAgICAgICBET00ucHV0U3RpY2t5KFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcInRvZ2dsZVwiLFxuICAgICAgICAgICAgKGN1cnJlbnRFbCkgPT4gKGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gc3RpY2t5RGlzcGxheSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0b2dnbGVDbGFzc2VzKGVsLCBjbGFzc2VzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3LCBibG9ja2luZykge1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3QgbmV3QWRkcyA9IGNsYXNzZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSkgPT4gcHJldkFkZHMuaW5kZXhPZihuYW1lKSA8IDAgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gY2xhc3Nlcy5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBuZXdBZGRzLFxuICAgICAgICBuZXdSZW1vdmVzLFxuICAgICAgICB0cmFuc2l0aW9uLFxuICAgICAgICB0aW1lLFxuICAgICAgICB2aWV3LFxuICAgICAgICBibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdG9nZ2xlQXR0cihlbCwgYXR0ciwgdmFsMSwgdmFsMikge1xuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cikpIHtcbiAgICAgIGlmICh2YWwyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdG9nZ2xlIGJldHdlZW4gdmFsMSBhbmQgdmFsMlxuICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGF0dHIpID09PSB2YWwxKSB7XG4gICAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDJdXSwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW1thdHRyLCB2YWwxXV0sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGF0dHJcbiAgICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbXSwgW2F0dHJdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbDFdXSwgW10pO1xuICAgIH1cbiAgfSxcblxuICBhZGRPclJlbW92ZUNsYXNzZXMoZWwsIGFkZHMsIHJlbW92ZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcsIGJsb2NraW5nKSB7XG4gICAgdGltZSA9IHRpbWUgfHwgZGVmYXVsdF90cmFuc2l0aW9uX3RpbWU7XG4gICAgY29uc3QgW3RyYW5zaXRpb25SdW4sIHRyYW5zaXRpb25TdGFydCwgdHJhbnNpdGlvbkVuZF0gPSB0cmFuc2l0aW9uIHx8IFtcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICBdO1xuICAgIGlmICh0cmFuc2l0aW9uUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHRyYW5zaXRpb25TdGFydCxcbiAgICAgICAgICBbXS5jb25jYXQodHJhbnNpdGlvblJ1bikuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICApO1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgdHJhbnNpdGlvblJ1biwgW10pO1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uRW5kLCB0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+XG4gICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGFkZHMuY29uY2F0KHRyYW5zaXRpb25FbmQpLFxuICAgICAgICAgIHJlbW92ZXMuY29uY2F0KHRyYW5zaXRpb25SdW4pLmNvbmNhdCh0cmFuc2l0aW9uU3RhcnQpLFxuICAgICAgICApO1xuICAgICAgaWYgKGJsb2NraW5nID09PSBmYWxzZSkge1xuICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgIHNldFRpbWVvdXQob25Eb25lLCB0aW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgW3ByZXZBZGRzLCBwcmV2UmVtb3Zlc10gPSBET00uZ2V0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgW1tdLCBbXV0pO1xuICAgICAgY29uc3Qga2VlcEFkZHMgPSBhZGRzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZBZGRzLmluZGV4T2YobmFtZSkgPCAwICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSksXG4gICAgICApO1xuICAgICAgY29uc3Qga2VlcFJlbW92ZXMgPSByZW1vdmVzLmZpbHRlcihcbiAgICAgICAgKG5hbWUpID0+IHByZXZSZW1vdmVzLmluZGV4T2YobmFtZSkgPCAwICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdBZGRzID0gcHJldkFkZHNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gcmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwQWRkcyk7XG4gICAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gYWRkcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgLmNvbmNhdChrZWVwUmVtb3Zlcyk7XG5cbiAgICAgIERPTS5wdXRTdGlja3koZWwsIFwiY2xhc3Nlc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm5ld1JlbW92ZXMpO1xuICAgICAgICBjdXJyZW50RWwuY2xhc3NMaXN0LmFkZCguLi5uZXdBZGRzKTtcbiAgICAgICAgcmV0dXJuIFtuZXdBZGRzLCBuZXdSZW1vdmVzXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuXG4gIHNldE9yUmVtb3ZlQXR0cnMoZWwsIHNldHMsIHJlbW92ZXMpIHtcbiAgICBjb25zdCBbcHJldlNldHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiYXR0cnNcIiwgW1tdLCBbXV0pO1xuXG4gICAgY29uc3QgYWx0ZXJlZEF0dHJzID0gc2V0cy5tYXAoKFthdHRyLCBfdmFsXSkgPT4gYXR0cikuY29uY2F0KHJlbW92ZXMpO1xuICAgIGNvbnN0IG5ld1NldHMgPSBwcmV2U2V0c1xuICAgICAgLmZpbHRlcigoW2F0dHIsIF92YWxdKSA9PiAhYWx0ZXJlZEF0dHJzLmluY2x1ZGVzKGF0dHIpKVxuICAgICAgLmNvbmNhdChzZXRzKTtcbiAgICBjb25zdCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXNcbiAgICAgIC5maWx0ZXIoKGF0dHIpID0+ICFhbHRlcmVkQXR0cnMuaW5jbHVkZXMoYXR0cikpXG4gICAgICAuY29uY2F0KHJlbW92ZXMpO1xuXG4gICAgRE9NLnB1dFN0aWNreShlbCwgXCJhdHRyc1wiLCAoY3VycmVudEVsKSA9PiB7XG4gICAgICBuZXdSZW1vdmVzLmZvckVhY2goKGF0dHIpID0+IGN1cnJlbnRFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgbmV3U2V0cy5mb3JFYWNoKChbYXR0ciwgdmFsXSkgPT4gY3VycmVudEVsLnNldEF0dHJpYnV0ZShhdHRyLCB2YWwpKTtcbiAgICAgIHJldHVybiBbbmV3U2V0cywgbmV3UmVtb3Zlc107XG4gICAgfSk7XG4gIH0sXG5cbiAgaGFzQWxsQ2xhc3NlcyhlbCwgY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzLmV2ZXJ5KChuYW1lKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpO1xuICB9LFxuXG4gIGlzVG9nZ2xlZE91dChlbCwgb3V0Q2xhc3Nlcykge1xuICAgIHJldHVybiAhdGhpcy5pc1Zpc2libGUoZWwpIHx8IHRoaXMuaGFzQWxsQ2xhc3NlcyhlbCwgb3V0Q2xhc3Nlcyk7XG4gIH0sXG5cbiAgZmlsdGVyVG9FbHMobGl2ZVNvY2tldCwgc291cmNlRWwsIHsgdG8gfSkge1xuICAgIGNvbnN0IGRlZmF1bHRRdWVyeSA9ICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodG8pO1xuICAgICAgfSBlbHNlIGlmICh0by5jbG9zZXN0KSB7XG4gICAgICAgIGNvbnN0IHRvRWwgPSBzb3VyY2VFbC5jbG9zZXN0KHRvLmNsb3Nlc3QpO1xuICAgICAgICByZXR1cm4gdG9FbCA/IFt0b0VsXSA6IFtdO1xuICAgICAgfSBlbHNlIGlmICh0by5pbm5lcikge1xuICAgICAgICByZXR1cm4gc291cmNlRWwucXVlcnlTZWxlY3RvckFsbCh0by5pbm5lcik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdG9cbiAgICAgID8gbGl2ZVNvY2tldC5qc1F1ZXJ5U2VsZWN0b3JBbGwoc291cmNlRWwsIHRvLCBkZWZhdWx0UXVlcnkpXG4gICAgICA6IFtzb3VyY2VFbF07XG4gIH0sXG5cbiAgZGVmYXVsdERpc3BsYXkoZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgeyB0cjogXCJ0YWJsZS1yb3dcIiwgdGQ6IFwidGFibGUtY2VsbFwiIH1bZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBcImJsb2NrXCJcbiAgICApO1xuICB9LFxuXG4gIHRyYW5zaXRpb25DbGFzc2VzKHZhbCkge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgW3RyYW5zLCB0U3RhcnQsIHRFbmRdID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBbdmFsLnNwbGl0KFwiIFwiKSwgW10sIFtdXTtcbiAgICB0cmFucyA9IEFycmF5LmlzQXJyYXkodHJhbnMpID8gdHJhbnMgOiB0cmFucy5zcGxpdChcIiBcIik7XG4gICAgdFN0YXJ0ID0gQXJyYXkuaXNBcnJheSh0U3RhcnQpID8gdFN0YXJ0IDogdFN0YXJ0LnNwbGl0KFwiIFwiKTtcbiAgICB0RW5kID0gQXJyYXkuaXNBcnJheSh0RW5kKSA/IHRFbmQgOiB0RW5kLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gW3RyYW5zLCB0U3RhcnQsIHRFbmRdO1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgSlM7XG4iLCAiaW1wb3J0IEpTIGZyb20gXCIuL2pzXCI7XG5pbXBvcnQgTGl2ZVNvY2tldCBmcm9tIFwiLi9saXZlX3NvY2tldFwiO1xuXG50eXBlIFRyYW5zaXRpb24gPSBzdHJpbmcgfCBzdHJpbmdbXTtcblxuLy8gQmFzZSBvcHRpb25zIGZvciBjb21tYW5kcyBpbnZvbHZpbmcgdHJhbnNpdGlvbnMgYW5kIHRpbWluZ1xudHlwZSBCYXNlT3B0cyA9IHtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIHRvIHNldC5cbiAgICogQWNjZXB0cyBhIHN0cmluZyBvZiBjbGFzc2VzIG9yIGEgMy10dXBsZSBsaWtlOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0wXCIsIFwib3BhY2l0eS0xMDBcIl1gXG4gICAqL1xuICB0cmFuc2l0aW9uPzogVHJhbnNpdGlvbjtcbiAgLyoqIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgMjAwLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG50eXBlIFNob3dPcHRzID0gQmFzZU9wdHMgJiB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRvZ2dsZU9wdHMgPSB7XG4gIC8qKiBUaGUgQ1NTIGRpc3BsYXkgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyBcImJsb2NrXCIuICovXG4gIGRpc3BsYXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ1NTIHRyYW5zaXRpb24gY2xhc3NlcyBmb3Igc2hvd2luZy5cbiAgICogQWNjZXB0cyBlaXRoZXIgdGhlIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgaW4sIG9yXG4gICAqIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSB0cmFuc2l0aW9uIGNsYXNzLCB0aGUgY2xhc3MgdG8gYXBwbHlcbiAgICogdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqIGBbXCJlYXNlLW91dCBkdXJhdGlvbi0zMDBcIiwgXCJvcGFjaXR5LTBcIiwgXCJvcGFjaXR5LTEwMFwiXWBcbiAgICovXG4gIGluPzogVHJhbnNpdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBDU1MgdHJhbnNpdGlvbiBjbGFzc2VzIGZvciBoaWRpbmcuXG4gICAqIEFjY2VwdHMgZWl0aGVyIHN0cmluZyBvZiBjbGFzc2VzIHRvIGFwcGx5IHdoZW4gdG9nZ2xpbmcgb3V0LCBvclxuICAgKiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGVuZGluZyB0cmFuc2l0aW9uIGNsYXNzLCBzdWNoIGFzOlxuICAgKiBgW1wiZWFzZS1vdXQgZHVyYXRpb24tMzAwXCIsIFwib3BhY2l0eS0xMDBcIiwgXCJvcGFjaXR5LTBcIl1gXG4gICAqL1xuICBvdXQ/OiBUcmFuc2l0aW9uO1xuICAvKiogVGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byBibG9jayBVSSBkdXJpbmcgdHJhbnNpdGlvbi4gRGVmYXVsdHMgYHRydWVgLiAqL1xuICBibG9ja2luZz86IGJvb2xlYW47XG59O1xuXG4vLyBPcHRpb25zIHNwZWNpZmljIHRvIHRoZSAndHJhbnNpdGlvbicgY29tbWFuZFxudHlwZSBUcmFuc2l0aW9uQ29tbWFuZE9wdHMgPSB7XG4gIC8qKiBUaGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuICovXG4gIHRpbWU/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGJsb2NrIFVJIGR1cmluZyB0cmFuc2l0aW9uLiBEZWZhdWx0cyBgdHJ1ZWAuICovXG4gIGJsb2NraW5nPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUHVzaE9wdHMgPSB7XG4gIC8qKiBEYXRhIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSBldmVudCBwYXlsb2FkLiAqL1xuICB2YWx1ZT86IGFueTtcbiAgLyoqIEZvciB0YXJnZXRpbmcgYSBMaXZlQ29tcG9uZW50IGJ5IGl0cyBJRCwgYSBjb21wb25lbnQgSUQgKG51bWJlciksIG9yIGEgQ1NTIHNlbGVjdG9yIHN0cmluZy4gKi9cbiAgdGFyZ2V0PzogSFRNTEVsZW1lbnQgfCBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBJbmRpY2F0ZXMgaWYgYSBwYWdlIGxvYWRpbmcgc3RhdGUgc2hvdWxkIGJlIHNob3duLiAqL1xuICBwYWdlX2xvYWRpbmc/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93IG90aGVyIHByb3BlcnRpZXMgbGlrZSAnY2lkJywgJ3JlZGlyZWN0JywgZXRjLlxufTtcblxudHlwZSBOYXZpZ2F0aW9uT3B0cyA9IHtcbiAgLyoqIFdoZXRoZXIgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGluc3RlYWQgb2YgcHVzaGluZyBhIG5ldyBvbmUuICovXG4gIHJlcGxhY2U/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFsbCBwb3NzaWJsZSBKUyBjb21tYW5kcyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQgYnkgdGhlIGZhY3RvcnkuXG4gKiBUaGlzIGlzIHVzZWQgYXMgYSBiYXNlIGZvciBMaXZlU29ja2V0SlNDb21tYW5kcyBhbmQgSG9va0pTQ29tbWFuZHMuXG4gKi9cbmludGVyZmFjZSBBbGxKU0NvbW1hbmRzIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZWxlbWVudC5cbiAgICogVGhpcyB2ZXJzaW9uIGlzIGZvciBnZW5lcmFsIHVzZSB2aWEgbGl2ZVNvY2tldC5qcygpLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCBpbiB3aG9zZSBjb250ZXh0IHRvIGV4ZWN1dGUgdGhlIEphdmFTY3JpcHQuXG4gICAqIEBwYXJhbSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbDogSFRNTEVsZW1lbnQsIGVuY29kZWRKUzogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogU2hvd3MgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gc2hvdy5cbiAgICogQHBhcmFtIHtTaG93T3B0c30gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYGRpc3BsYXlgLCBgdHJhbnNpdGlvbmAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICBzaG93KGVsOiBIVE1MRWxlbWVudCwgb3B0cz86IFNob3dPcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogSGlkZXMgYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gaGlkZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGhpZGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGBkaXNwbGF5YCwgYGluYCwgYG91dGAsIGB0aW1lYCwgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0b2dnbGUoZWw6IEhUTUxFbGVtZW50LCBvcHRzPzogVG9nZ2xlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgQ1NTIGNsYXNzZXMgdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYWRkIGNsYXNzZXMgdG8uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIGFkZC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIGFkZENsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIENTUyBjbGFzc2VzIGZyb20gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVtb3ZlIGNsYXNzZXMgZnJvbS5cbiAgICogQHBhcmFtIG5hbWVzIC0gVGhlIGNsYXNzIG5hbWUocykgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gW29wdHM9e31dIC0gT3B0aW9uYWwgc2V0dGluZ3MuXG4gICAqICAgQWNjZXB0czogYHRyYW5zaXRpb25gLCBgdGltZWAsIGFuZCBgYmxvY2tpbmdgLlxuICAgKi9cbiAgcmVtb3ZlQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBuYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdHM/OiBCYXNlT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgQ1NTIGNsYXNzZXMgb24gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gdG9nZ2xlIGNsYXNzZXMgb24uXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjbGFzcyBuYW1lKHMpIHRvIHRvZ2dsZS5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB0cmFuc2l0aW9uYCwgYHRpbWVgLCBhbmQgYGJsb2NraW5nYC5cbiAgICovXG4gIHRvZ2dsZUNsYXNzKGVsOiBIVE1MRWxlbWVudCwgbmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRzPzogQmFzZU9wdHMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgQ1NTIHRyYW5zaXRpb24gdG8gYW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHRyYW5zaXRpb24gdG8uXG4gICAqIEBwYXJhbSB0cmFuc2l0aW9uIC0gVGhlIHRyYW5zaXRpb24gY2xhc3MoZXMpIHRvIGFwcGx5LlxuICAgKiAgIEFjY2VwdHMgYSBzdHJpbmcgb2YgY2xhc3NlcyB0byBhcHBseSB3aGVuIHRyYW5zaXRpb25pbmcgb3JcbiAgICogICBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgdHJhbnNpdGlvbiBjbGFzcywgdGhlIGNsYXNzIHRvIGFwcGx5XG4gICAqICAgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZW5kaW5nIHRyYW5zaXRpb24gY2xhc3MsIHN1Y2ggYXM6XG4gICAqXG4gICAqICAgICAgIFtcImVhc2Utb3V0IGR1cmF0aW9uLTMwMFwiLCBcIm9wYWNpdHktMTAwXCIsIFwib3BhY2l0eS0wXCJdXG4gICAqXG4gICAqIEBwYXJhbSBbb3B0cz17fV0gLSBPcHRpb25hbCBzZXR0aW5ncyBmb3IgdGltaW5nIGFuZCBibG9ja2luZyBiZWhhdmlvci5cbiAgICogICBBY2NlcHRzOiBgdGltZWAgYW5kIGBibG9ja2luZ2AuXG4gICAqL1xuICB0cmFuc2l0aW9uKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICB0cmFuc2l0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRzPzogVHJhbnNpdGlvbkNvbW1hbmRPcHRzLFxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gc2V0LlxuICAgKiBAcGFyYW0gdmFsIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShlbDogSFRNTEVsZW1lbnQsIGF0dHI6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgYW4gYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgYmV0d2VlbiB0d28gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGF0dHJpYnV0ZSBvbi5cbiAgICogQHBhcmFtIGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gdG9nZ2xlLlxuICAgKiBAcGFyYW0gdmFsMSAtIFRoZSBmaXJzdCB2YWx1ZSB0byB0b2dnbGUgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHZhbDIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIHRvZ2dsZSBiZXR3ZWVuLlxuICAgKi9cbiAgdG9nZ2xlQXR0cmlidXRlKFxuICAgIGVsOiBIVE1MRWxlbWVudCxcbiAgICBhdHRyOiBzdHJpbmcsXG4gICAgdmFsMTogc3RyaW5nLFxuICAgIHZhbDI6IHN0cmluZyxcbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogUHVzaGVzIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIEFuIGVsZW1lbnQgdGhhdCBiZWxvbmdzIHRvIHRoZSB0YXJnZXQgTGl2ZVZpZXcgLyBMaXZlQ29tcG9uZW50IG9yIGEgY29tcG9uZW50IElELlxuICAgKiAgIFRvIHRhcmdldCBhIExpdmVDb21wb25lbnQgYnkgaXRzIElELCBwYXNzIGEgc2VwYXJhdGUgYHRhcmdldGAgaW4gdGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIGV2ZW50IG5hbWUgdG8gcHVzaC5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGB2YWx1ZWAsIGB0YXJnZXRgLCBgcGFnZV9sb2FkaW5nYC5cbiAgICovXG4gIHB1c2goZWw6IEhUTUxFbGVtZW50LCB0eXBlOiBzdHJpbmcsIG9wdHM/OiBQdXNoT3B0cyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbmF2aWdhdGlvbiBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIG5hdmlnYXRlKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogU2VuZHMgYSBwYXRjaCBldmVudCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGVzIHRoZSBicm93c2VyJ3MgcHVzaFN0YXRlIGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBocmVmIC0gVGhlIFVSTCB0byBwYXRjaCB0by5cbiAgICogQHBhcmFtIFtvcHRzPXt9XSAtIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgKiAgIEFjY2VwdHM6IGByZXBsYWNlYC5cbiAgICovXG4gIHBhdGNoKGhyZWY6IHN0cmluZywgb3B0cz86IE5hdmlnYXRpb25PcHRzKTogdm9pZDtcblxuICAvKipcbiAgICogTWFyayBhdHRyaWJ1dGVzIGFzIGlnbm9yZWQsIHNraXBwaW5nIHRoZW0gd2hlbiBwYXRjaGluZyB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBpZ25vcmUgYXR0cmlidXRlcyBvbi5cbiAgICogQHBhcmFtIGF0dHJzIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIG9yIG5hbWVzIHRvIGlnbm9yZS5cbiAgICovXG4gIGlnbm9yZUF0dHJpYnV0ZXMoZWw6IEhUTUxFbGVtZW50LCBhdHRyczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoXG4gIGxpdmVTb2NrZXQ6IExpdmVTb2NrZXQsXG4gIGV2ZW50VHlwZTogc3RyaW5nIHwgbnVsbCxcbik6IEFsbEpTQ29tbWFuZHMgPT4ge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZWwsIGVuY29kZWRKUykge1xuICAgICAgbGl2ZVNvY2tldC5leGVjSlMoZWwsIGVuY29kZWRKUywgZXZlbnRUeXBlKTtcbiAgICB9LFxuICAgIHNob3coZWwsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLnNob3coXG4gICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIGVsLFxuICAgICAgICBvcHRzLmRpc3BsYXksXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBoaWRlKGVsLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5oaWRlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZShlbCwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgY29uc3QgaW5UcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5pbik7XG4gICAgICBjb25zdCBvdXRUcmFuc2l0aW9uID0gSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy5vdXQpO1xuICAgICAgSlMudG9nZ2xlKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBlbCxcbiAgICAgICAgb3B0cy5kaXNwbGF5LFxuICAgICAgICBpblRyYW5zaXRpb24sXG4gICAgICAgIG91dFRyYW5zaXRpb24sXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhZGRDbGFzcyhlbCwgbmFtZXMsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IEFycmF5LmlzQXJyYXkobmFtZXMpID8gbmFtZXMgOiBuYW1lcy5zcGxpdChcIiBcIik7XG4gICAgICBjb25zdCBvd25lciA9IGxpdmVTb2NrZXQub3duZXIoZWwpO1xuICAgICAgSlMuYWRkT3JSZW1vdmVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKG9wdHMudHJhbnNpdGlvbiksXG4gICAgICAgIG9wdHMudGltZSxcbiAgICAgICAgb3duZXIsXG4gICAgICAgIG9wdHMuYmxvY2tpbmcsXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVtb3ZlQ2xhc3MoZWwsIG5hbWVzLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogbmFtZXMuc3BsaXQoXCIgXCIpO1xuICAgICAgY29uc3Qgb3duZXIgPSBsaXZlU29ja2V0Lm93bmVyKGVsKTtcbiAgICAgIEpTLmFkZE9yUmVtb3ZlQ2xhc3NlcyhcbiAgICAgICAgZWwsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGFzc05hbWVzLFxuICAgICAgICBKUy50cmFuc2l0aW9uQ2xhc3NlcyhvcHRzLnRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHRvZ2dsZUNsYXNzKGVsLCBuYW1lcywgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IG5hbWVzLnNwbGl0KFwiIFwiKTtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy50b2dnbGVDbGFzc2VzKFxuICAgICAgICBlbCxcbiAgICAgICAgY2xhc3NOYW1lcyxcbiAgICAgICAgSlMudHJhbnNpdGlvbkNsYXNzZXMob3B0cy50cmFuc2l0aW9uKSxcbiAgICAgICAgb3B0cy50aW1lLFxuICAgICAgICBvd25lcixcbiAgICAgICAgb3B0cy5ibG9ja2luZyxcbiAgICAgICk7XG4gICAgfSxcbiAgICB0cmFuc2l0aW9uKGVsLCB0cmFuc2l0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgIGNvbnN0IG93bmVyID0gbGl2ZVNvY2tldC5vd25lcihlbCk7XG4gICAgICBKUy5hZGRPclJlbW92ZUNsYXNzZXMoXG4gICAgICAgIGVsLFxuICAgICAgICBbXSxcbiAgICAgICAgW10sXG4gICAgICAgIEpTLnRyYW5zaXRpb25DbGFzc2VzKHRyYW5zaXRpb24pLFxuICAgICAgICBvcHRzLnRpbWUsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBvcHRzLmJsb2NraW5nLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgdmFsKSB7XG4gICAgICBKUy5zZXRPclJlbW92ZUF0dHJzKGVsLCBbW2F0dHIsIHZhbF1dLCBbXSk7XG4gICAgfSxcbiAgICByZW1vdmVBdHRyaWJ1dGUoZWwsIGF0dHIpIHtcbiAgICAgIEpTLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtdLCBbYXR0cl0pO1xuICAgIH0sXG4gICAgdG9nZ2xlQXR0cmlidXRlKGVsLCBhdHRyLCB2YWwxLCB2YWwyKSB7XG4gICAgICBKUy50b2dnbGVBdHRyKGVsLCBhdHRyLCB2YWwxLCB2YWwyKTtcbiAgICB9LFxuICAgIHB1c2goZWwsIHR5cGUsIG9wdHMgPSB7fSkge1xuICAgICAgbGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZWwsICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBvcHRzLnZhbHVlIHx8IHt9O1xuICAgICAgICBkZWxldGUgb3B0cy52YWx1ZTtcbiAgICAgICAgbGV0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiLCB7IGRldGFpbDogeyBzb3VyY2VFbGVtZW50OiBlbCB9IH0pO1xuICAgICAgICBKUy5leGVjKGUsIGV2ZW50VHlwZSwgdHlwZSwgdmlldywgZWwsIFtcInB1c2hcIiwgeyBkYXRhLCAuLi5vcHRzIH1dKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoaHJlZiwgb3B0cyA9IHt9KSB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIpO1xuICAgICAgbGl2ZVNvY2tldC5oaXN0b3J5UmVkaXJlY3QoXG4gICAgICAgIGN1c3RvbUV2ZW50LFxuICAgICAgICBocmVmLFxuICAgICAgICBvcHRzLnJlcGxhY2UgPyBcInJlcGxhY2VcIiA6IFwicHVzaFwiLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHBhdGNoKGhyZWYsIG9wdHMgPSB7fSkge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6ZXhlY1wiKTtcbiAgICAgIGxpdmVTb2NrZXQucHVzaEhpc3RvcnlQYXRjaChcbiAgICAgICAgY3VzdG9tRXZlbnQsXG4gICAgICAgIGhyZWYsXG4gICAgICAgIG9wdHMucmVwbGFjZSA/IFwicmVwbGFjZVwiIDogXCJwdXNoXCIsXG4gICAgICAgIG51bGwsXG4gICAgICApO1xuICAgIH0sXG4gICAgaWdub3JlQXR0cmlidXRlcyhlbCwgYXR0cnMpIHtcbiAgICAgIEpTLmlnbm9yZUF0dHJzKGVsLCBBcnJheS5pc0FycmF5KGF0dHJzKSA/IGF0dHJzIDogW2F0dHJzXSk7XG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogSlNDb21tYW5kcyBmb3IgdXNlIHdpdGggYGxpdmVTb2NrZXQuanMoKWAuXG4gKiBJbmNsdWRlcyB0aGUgZ2VuZXJhbCBgZXhlY2AgY29tbWFuZCB0aGF0IHJlcXVpcmVzIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIExpdmVTb2NrZXRKU0NvbW1hbmRzID0gQWxsSlNDb21tYW5kcztcblxuLyoqXG4gKiBKU0NvbW1hbmRzIGZvciB1c2Ugd2l0aGluIGEgSG9vay5cbiAqIFRoZSBgZXhlY2AgY29tbWFuZCBpcyB0YWlsb3JlZCBmb3IgaG9va3MsIG5vdCByZXF1aXJpbmcgYW4gZXhwbGljaXQgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb29rSlNDb21tYW5kcyBleHRlbmRzIE9taXQ8QWxsSlNDb21tYW5kcywgXCJleGVjXCI+IHtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGVuY29kZWQgSmF2YVNjcmlwdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaG9vaydzIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkSlMgLSBUaGUgZW5jb2RlZCBKYXZhU2NyaXB0IHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgZXhlYyhlbmNvZGVkSlM6IHN0cmluZyk6IHZvaWQ7XG59XG4iLCAiaW1wb3J0IGpzQ29tbWFuZHMsIHsgSG9va0pTQ29tbWFuZHMgfSBmcm9tIFwiLi9qc19jb21tYW5kc1wiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBMaXZlU29ja2V0IGZyb20gXCIuL2xpdmVfc29ja2V0XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5cbmNvbnN0IEhPT0tfSUQgPSBcImhvb2tJZFwiO1xubGV0IHZpZXdIb29rSUQgPSAxO1xuXG5leHBvcnQgdHlwZSBPblJlcGx5ID0gKHJlcGx5OiBhbnksIHJlZjogbnVtYmVyKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBDYWxsYmFja1JlZiA9IHsgZXZlbnQ6IHN0cmluZzsgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSB9O1xuXG5leHBvcnQgdHlwZSBQaHhUYXJnZXQgPSBzdHJpbmcgfCBudW1iZXIgfCBIVE1MRWxlbWVudDtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rSW50ZXJmYWNlPEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgRE9NIGVsZW1lbnQgdGhhdCB0aGUgaG9vayBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIGVsOiBFO1xuXG4gIC8qKlxuICAgKiBUaGUgTGl2ZVNvY2tldCBpbnN0YW5jZSB0aGF0IHRoZSBob29rIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICAvKipcbiAgICogVGhlIG1vdW50ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBET00gYW5kIGl0cyBzZXJ2ZXIgTGl2ZVZpZXcgaGFzIGZpbmlzaGVkIG1vdW50aW5nLlxuICAgKi9cbiAgbW91bnRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWZvcmVVcGRhdGUgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGFib3V0IHRvIGJlIHVwZGF0ZWQgaW4gdGhlIERPTS5cbiAgICogTm90ZTogYW55IGNhbGwgaGVyZSBtdXN0IGJlIHN5bmNocm9ub3VzIGFzIHRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGRlZmVycmVkIG9yIGNhbmNlbGxlZC5cbiAgICovXG4gIGJlZm9yZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0cm95ZWQgY2FsbGJhY2suXG4gICAqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSwgZWl0aGVyIGJ5IGEgcGFyZW50IHVwZGF0ZSwgb3IgYnkgdGhlIHBhcmVudCBiZWluZyByZW1vdmVkIGVudGlyZWx5XG4gICAqL1xuICBkZXN0cm95ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzY29ubmVjdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCdzIHBhcmVudCBMaXZlVmlldyBoYXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBtYW5pcGx1YXRlIHRoZSBET00gYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdC5cbiAgICogVGhlIGFwcGxpZWQgY2hhbmdlcyBpbnRlZ3JhdGUgd2l0aCBzZXJ2ZXIgRE9NIHBhdGNoaW5nLlxuICAgKi9cbiAganMoKTogSG9va0pTQ29tbWFuZHM7XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBhbiBldmVudCB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIFtwYXlsb2FkXSAtIFRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICAgKiBAcGFyYW0gW29uUmVwbHldIC0gQSBjYWxsYmFjayB0byBoYW5kbGUgdGhlIHNlcnZlcidzIHJlcGx5LlxuICAgKlxuICAgKiBXaGVuIG9uUmVwbHkgaXMgbm90IHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgYSBQcm9taXNlIHRoYXRcbiAgICogV2hlbiBvblJlcGx5IGlzIHByb3ZpZGVkLCB0aGUgbWV0aG9kIHJldHVybnMgdm9pZC5cbiAgICovXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkOiBhbnksIG9uUmVwbHk6IE9uUmVwbHkpOiB2b2lkO1xuICBwdXNoRXZlbnQoZXZlbnQ6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IFByb21pc2U8YW55PjtcblxuICAvKipcbiAgICogUHVzaGVkIGEgdGFyZ2V0ZWQgZXZlbnQgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogSXQgc2VuZHMgdGhlIGV2ZW50IHRvIHRoZSBMaXZlQ29tcG9uZW50IG9yIExpdmVWaWV3IHRoZSBgc2VsZWN0b3JPclRhcmdldGAgaXMgZGVmaW5lZCBpbixcbiAgICogd2hlcmUgaXRzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBxdWVyeSBzZWxlY3RvciwgYW4gYWN0dWFsIERPTSBlbGVtZW50LCBvciBhIENJRCAoY29tcG9uZW50IGlkKVxuICAgKiByZXR1cm5lZCBieSB0aGUgYEBteXNlbGZgIGFzc2lnbi5cbiAgICpcbiAgICogSWYgdGhlIHF1ZXJ5IHNlbGVjdG9yIHJldHVybnMgbW9yZSB0aGFuIG9uZSBlbGVtZW50IGl0IHdpbGwgc2VuZCB0aGUgZXZlbnQgdG8gYWxsIG9mIHRoZW0sXG4gICAqIGV2ZW4gaWYgYWxsIHRoZSBlbGVtZW50cyBhcmUgaW4gdGhlIHNhbWUgTGl2ZUNvbXBvbmVudCBvciBMaXZlVmlldy4gQmVjYXVzZSBvZiB0aGlzLFxuICAgKiBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWQsIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IG1hdGNoZXMgdGhlIHJldHVybiB2YWx1ZSBvZlxuICAgKiBbYFByb21pc2UuYWxsU2V0dGxlZCgpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJvbWlzZS9hbGxTZXR0bGVkI3JldHVybl92YWx1ZSkuXG4gICAqIEluZGl2aWR1YWwgZnVsZmlsbGVkIHZhbHVlcyBhcmUgb2YgdGhlIGZvcm1hdCBgeyByZXBseSwgcmVmIH1gLCB3aGVyZSBgcmVwbHlgIGlzIHRoZSBzZXJ2ZXIncyByZXBseS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdG9yT3JUYXJnZXQgLSBUaGUgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIENJRCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuICAgKiBAcGFyYW0gW3BheWxvYWRdIC0gVGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QuXG4gICAqIEBwYXJhbSBbb25SZXBseV0gLSBBIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgc2VydmVyJ3MgcmVwbHkuXG4gICAqXG4gICAqIFdoZW4gb25SZXBseSBpcyBub3QgcHJvdmlkZWQsIHRoZSBtZXRob2QgcmV0dXJucyBhIFByb21pc2UuXG4gICAqIFdoZW4gb25SZXBseSBpcyBwcm92aWRlZCwgdGhlIG1ldGhvZCByZXR1cm5zIHZvaWQuXG4gICAqL1xuICBwdXNoRXZlbnRUbyhcbiAgICBzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBvYmplY3QsXG4gICAgb25SZXBseTogT25SZXBseSxcbiAgKTogdm9pZDtcbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDx7IHJlcGx5OiBhbnk7IHJlZjogbnVtYmVyIH0+W10+O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUgYHB1c2hFdmVudGAgY2FsbHMgZnJvbSB0aGUgc2VydmVyLiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIHBheWxvYWQgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgcmVjZWl2ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsYmFjaywgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYHJlbW92ZUhhbmRsZUV2ZW50YCB0byByZW1vdmUgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChwYXlsb2FkOiBhbnkpID0+IGFueSk6IENhbGxiYWNrUmVmO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGBoYW5kbGVFdmVudGAuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1JlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gdHJpZ2dlciBhIGxpdmUgZmlsZSB1cGxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHVwbG9hZCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGBQaG9lbml4LkxpdmVWaWV3LmFsbG93X3VwbG9hZC8zYCBjYWxsLlxuICAgKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdXBsb2FkLlxuICAgKi9cbiAgdXBsb2FkKG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvKipcbiAgICogQWxsb3dzIHRvIHRyaWdnZXIgYSBsaXZlIGZpbGUgdXBsb2FkIHRvIGEgc3BlY2lmaWMgdGFyZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0b3JPclRhcmdldCAtIFRoZSB0YXJnZXQgdG8gdXBsb2FkIHRoZSBmaWxlcyB0by5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgdXBsb2FkIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgYFBob2VuaXguTGl2ZVZpZXcuYWxsb3dfdXBsb2FkLzNgIGNhbGwuXG4gICAqIEBwYXJhbSBmaWxlcyAtIFRoZSBmaWxlcyB0byB1cGxvYWQuXG4gICAqL1xuICB1cGxvYWRUbyhzZWxlY3Rvck9yVGFyZ2V0OiBQaHhUYXJnZXQsIG5hbWU6IGFueSwgZmlsZXM6IGFueSk6IGFueTtcblxuICAvLyBhbGxvdyB1bmtub3duIG1ldGhvZHMsIGFzIHBlb3BsZSBjYW4gZGVmaW5lIHRoZW0gaW4gdGhlaXIgaG9va3NcbiAgW2tleTogUHJvcGVydHlLZXldOiBhbnk7XG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL2Jsb2IvZmFjMWFhNzVhY2RkZGJmNGYxYTk1ZTk4ZWUyMjk3YjU0Y2U0YjRjOS90eXBlcy9waG9lbml4X2xpdmVfdmlldy9ob29rcy5kLnRzI0wyNlxuLy8gbGljZW5zZWQgdW5kZXIgTUlUXG5leHBvcnQgaW50ZXJmYWNlIEhvb2s8b3V0IFQgPSBvYmplY3QsIEUgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUaGUgbW91bnRlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTSBhbmQgaXRzIHNlcnZlciBMaXZlVmlldyBoYXMgZmluaXNoZWQgbW91bnRpbmcuXG4gICAqL1xuICBtb3VudGVkPzogKHRoaXM6IFQgJiBIb29rSW50ZXJmYWNlPEU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgYmVmb3JlVXBkYXRlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhYm91dCB0byBiZSB1cGRhdGVkIGluIHRoZSBET00uXG4gICAqIE5vdGU6IGFueSBjYWxsIGhlcmUgbXVzdCBiZSBzeW5jaHJvbm91cyBhcyB0aGUgb3BlcmF0aW9uIGNhbm5vdCBiZSBkZWZlcnJlZCBvciBjYW5jZWxsZWQuXG4gICAqL1xuICBiZWZvcmVVcGRhdGU/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB1cGRhdGVkIGNhbGxiYWNrLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBET00gYnkgdGhlIHNlcnZlclxuICAgKi9cbiAgdXBkYXRlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRlc3Ryb3llZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLCBlaXRoZXIgYnkgYSBwYXJlbnQgdXBkYXRlLCBvciBieSB0aGUgcGFyZW50IGJlaW5nIHJlbW92ZWQgZW50aXJlbHlcbiAgICovXG4gIGRlc3Ryb3llZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGRpc2Nvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBkaXNjb25uZWN0ZWQ/OiAodGhpczogVCAmIEhvb2tJbnRlcmZhY2U8RT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvbm5lY3RlZCBjYWxsYmFjay5cbiAgICpcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQncyBwYXJlbnQgTGl2ZVZpZXcgaGFzIHJlY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICByZWNvbm5lY3RlZD86ICh0aGlzOiBUICYgSG9va0ludGVyZmFjZTxFPikgPT4gdm9pZDtcblxuICAvLyBBbGxvdyBjdXN0b20gbWV0aG9kcyB3aXRoIGFueSBzaWduYXR1cmUgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gIFtrZXk6IFByb3BlcnR5S2V5XTogYW55O1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIExpdmVWaWV3IGhvb2tzLiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyB0byBkZWZpbmUgdGhlaXIgaG9va3MuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15Q3VzdG9tSG9vayBleHRlbmRzIFZpZXdIb29rIHtcbiAqICAgbXlTdGF0ZSA9IFwiaW5pdGlhbFwiO1xuICpcbiAqICAgbW91bnRlZCgpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkhvb2sgbW91bnRlZCBvbiBlbGVtZW50OlwiLCB0aGlzLmVsKTtcbiAqICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gKiAgICAgICB0aGlzLnB1c2hFdmVudChcImVsZW1lbnQtY2xpY2tlZFwiLCB7IHN0YXRlOiB0aGlzLm15U3RhdGUgfSk7XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIHVwZGF0ZWQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJIb29rIHVwZGF0ZWRcIiwgdGhpcy5lbC5pZCk7XG4gKiAgIH1cbiAqXG4gKiAgIG15Q3VzdG9tTWV0aG9kKHNvbWVBcmc6IHN0cmluZykge1xuICogICAgIGNvbnNvbGUubG9nKFwibXlDdXN0b21NZXRob2QgY2FsbGVkIHdpdGg6XCIsIHNvbWVBcmcsIFwiQ3VycmVudCBzdGF0ZTpcIiwgdGhpcy5teVN0YXRlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhlIGB0aGlzYCBjb250ZXh0IHdpdGhpbiB0aGUgaG9vayBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20gbWV0aG9kcywgZXRjLilcbiAqIHdpbGwgcmVmZXIgdG8gdGhlIGhvb2sgaW5zdGFuY2UsIHByb3ZpZGluZyBhY2Nlc3MgdG8gYHRoaXMuZWxgLCBgdGhpcy5saXZlU29ja2V0YCxcbiAqIGB0aGlzLnB1c2hFdmVudCgpYCwgZXRjLiwgYXMgd2VsbCBhcyBhbnkgcHJvcGVydGllcyBvciBtZXRob2RzIGRlZmluZWQgb24gdGhlIHN1YmNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVmlld0hvb2s8RSBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+XG4gIGltcGxlbWVudHMgSG9va0ludGVyZmFjZTxFPlxue1xuICBlbDogRTtcbiAgbGl2ZVNvY2tldDogTGl2ZVNvY2tldDtcblxuICBwcml2YXRlIF9fbGlzdGVuZXJzOiBTZXQ8Q2FsbGJhY2tSZWY+O1xuICBwcml2YXRlIF9faXNEaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX192aWV3OiAoKSA9PiBWaWV3O1xuXG4gIHN0YXRpYyBtYWtlSUQoKSB7XG4gICAgcmV0dXJuIHZpZXdIb29rSUQrKztcbiAgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHJldHVybiBET00ucHJpdmF0ZShlbCwgSE9PS19JRCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3OiBWaWV3IHwgbnVsbCwgZWw6IEUsIGNhbGxiYWNrcz86IEhvb2spIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5fX2F0dGFjaFZpZXcodmlldyk7XG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBET00ucHV0UHJpdmF0ZSh0aGlzLmVsLCBIT09LX0lELCBWaWV3SG9vay5tYWtlSUQoKSk7XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAvLyBUaGlzIGluc3RhbmNlIGlzIGZvciBhbiBvYmplY3QtbGl0ZXJhbCBob29rLiBDb3B5IG1ldGhvZHMvcHJvcGVydGllcy5cbiAgICAgIC8vIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIE5PVCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsYmFja3Mgb2JqZWN0LlxuICAgICAgY29uc3QgcHJvdGVjdGVkUHJvcHMgPSBuZXcgU2V0KFtcbiAgICAgICAgXCJlbFwiLFxuICAgICAgICBcImxpdmVTb2NrZXRcIixcbiAgICAgICAgXCJfX3ZpZXdcIixcbiAgICAgICAgXCJfX2xpc3RlbmVyc1wiLFxuICAgICAgICBcIl9faXNEaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJjb25zdHJ1Y3RvclwiLCAvLyBTdGFuZGFyZCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAvLyBDb3JlIFZpZXdIb29rIEFQSSBtZXRob2RzXG4gICAgICAgIFwianNcIixcbiAgICAgICAgXCJwdXNoRXZlbnRcIixcbiAgICAgICAgXCJwdXNoRXZlbnRUb1wiLFxuICAgICAgICBcImhhbmRsZUV2ZW50XCIsXG4gICAgICAgIFwicmVtb3ZlSGFuZGxlRXZlbnRcIixcbiAgICAgICAgXCJ1cGxvYWRcIixcbiAgICAgICAgXCJ1cGxvYWRUb1wiLFxuICAgICAgICAvLyBJbnRlcm5hbCBsaWZlY3ljbGUgY2FsbGVyc1xuICAgICAgICBcIl9fbW91bnRlZFwiLFxuICAgICAgICBcIl9fdXBkYXRlZFwiLFxuICAgICAgICBcIl9fYmVmb3JlVXBkYXRlXCIsXG4gICAgICAgIFwiX19kZXN0cm95ZWRcIixcbiAgICAgICAgXCJfX3JlY29ubmVjdGVkXCIsXG4gICAgICAgIFwiX19kaXNjb25uZWN0ZWRcIixcbiAgICAgICAgXCJfX2NsZWFudXBfX1wiLFxuICAgICAgXSk7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhbGxiYWNrcywga2V5KSkge1xuICAgICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IGNhbGxiYWNrc1trZXldO1xuICAgICAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWxsb3cgdGhlIG92ZXJ3cml0ZSwgYnV0IHdlIGxvZyBhIHdhcm5pbmdcbiAgICAgICAgICBpZiAocHJvdGVjdGVkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEhvb2sgb2JqZWN0IGZvciBlbGVtZW50ICMke2VsLmlkfSBvdmVyd3JpdGVzIGNvcmUgcHJvcGVydHkgJyR7a2V5fSchYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpZmVjeWNsZU1ldGhvZHM6IChrZXlvZiBIb29rKVtdID0gW1xuICAgICAgICBcIm1vdW50ZWRcIixcbiAgICAgICAgXCJiZWZvcmVVcGRhdGVcIixcbiAgICAgICAgXCJ1cGRhdGVkXCIsXG4gICAgICAgIFwiZGVzdHJveWVkXCIsXG4gICAgICAgIFwiZGlzY29ubmVjdGVkXCIsXG4gICAgICAgIFwicmVjb25uZWN0ZWRcIixcbiAgICAgIF07XG4gICAgICBsaWZlY3ljbGVNZXRob2RzLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNhbGxiYWNrc1ttZXRob2ROYW1lXSAmJlxuICAgICAgICAgIHR5cGVvZiBjYWxsYmFja3NbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW21ldGhvZE5hbWVdID0gY2FsbGJhY2tzW21ldGhvZE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgJ2NhbGxiYWNrcycgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIGEgdXNlci1kZWZpbmVkIGNsYXNzIChlLmcuLCBNeUhvb2spLlxuICAgIC8vIEl0cyBtZXRob2RzIChtb3VudGVkLCB1cGRhdGVkLCBjdXN0b20pIGFyZSBhbHJlYWR5IHBhcnQgb2YgaXRzIHByb3RvdHlwZSBvciBpbnN0YW5jZSxcbiAgICAvLyBhbmQgd2lsbCBjb3JyZWN0bHkgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGZyb20gVmlld0hvb2sucHJvdG90eXBlLlxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2F0dGFjaFZpZXcodmlldzogVmlldyB8IG51bGwpIHtcbiAgICBpZiAodmlldykge1xuICAgICAgdGhpcy5fX3ZpZXcgPSAoKSA9PiB2aWV3O1xuICAgICAgdGhpcy5saXZlU29ja2V0ID0gdmlldy5saXZlU29ja2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fdmlldyA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBob29rIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSBsaXZlIHZpZXc6ICR7dGhpcy5lbC5vdXRlckhUTUx9YCxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmxpdmVTb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlmZWN5Y2xlIG1ldGhvZHNcbiAgbW91bnRlZCgpOiB2b2lkIHt9XG4gIGJlZm9yZVVwZGF0ZSgpOiB2b2lkIHt9XG4gIHVwZGF0ZWQoKTogdm9pZCB7fVxuICBkZXN0cm95ZWQoKTogdm9pZCB7fVxuICBkaXNjb25uZWN0ZWQoKTogdm9pZCB7fVxuICByZWNvbm5lY3RlZCgpOiB2b2lkIHt9XG5cbiAgLy8gSW50ZXJuYWwgbGlmZWN5Y2xlIGNhbGxlcnMgLSBjYWxsZWQgYnkgdGhlIFZpZXdcblxuICAvKiogQGludGVybmFsICovXG4gIF9fbW91bnRlZCgpIHtcbiAgICB0aGlzLm1vdW50ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fdXBkYXRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZWQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9fYmVmb3JlVXBkYXRlKCkge1xuICAgIHRoaXMuYmVmb3JlVXBkYXRlKCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rlc3Ryb3llZCgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCgpO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIEhPT0tfSUQpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhvZW5peGZyYW1ld29yay9waG9lbml4X2xpdmVfdmlldy9pc3N1ZXMvMzQ5NlxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19yZWNvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5fX2lzRGlzY29ubmVjdGVkKSB7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVjb25uZWN0ZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2Rpc2Nvbm5lY3RlZCgpIHtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBqcygpOiBIb29rSlNDb21tYW5kcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmpzQ29tbWFuZHModGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LCBcImhvb2tcIiksXG4gICAgICBleGVjOiAoZW5jb2RlZEpTOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fX3ZpZXcoKS5saXZlU29ja2V0LmV4ZWNKUyh0aGlzLmVsLCBlbmNvZGVkSlMsIFwiaG9va1wiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1c2hFdmVudChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55LCBvblJlcGx5PzogT25SZXBseSkge1xuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl9fdmlldygpLnB1c2hIb29rRXZlbnQoXG4gICAgICB0aGlzLmVsLFxuICAgICAgbnVsbCxcbiAgICAgIGV2ZW50LFxuICAgICAgcGF5bG9hZCB8fCB7fSxcbiAgICApO1xuICAgIGlmIChvblJlcGx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKHsgcmVwbHkgfSkgPT4gcmVwbHkpO1xuICAgIH1cbiAgICBwcm9taXNlLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVzaEV2ZW50VG8oXG4gICAgc2VsZWN0b3JPclRhcmdldDogUGh4VGFyZ2V0LFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgcGF5bG9hZD86IG9iamVjdCxcbiAgICBvblJlcGx5PzogT25SZXBseSxcbiAgKSB7XG4gICAgaWYgKG9uUmVwbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGFyZ2V0UGFpcjogeyB2aWV3OiBWaWV3OyB0YXJnZXRDdHg6IGFueSB9W10gPSBbXTtcbiAgICAgIHRoaXMuX192aWV3KCkud2l0aGluVGFyZ2V0cyhzZWxlY3Rvck9yVGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIHRhcmdldFBhaXIucHVzaCh7IHZpZXcsIHRhcmdldEN0eCB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0YXJnZXRQYWlyLm1hcCgoeyB2aWV3LCB0YXJnZXRDdHggfSkgPT4ge1xuICAgICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRoaXMuZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQgfHwge30pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICB9XG4gICAgdGhpcy5fX3ZpZXcoKS53aXRoaW5UYXJnZXRzKHNlbGVjdG9yT3JUYXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHZpZXdcbiAgICAgICAgLnB1c2hIb29rRXZlbnQodGhpcy5lbCwgdGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCB8fCB7fSlcbiAgICAgICAgLnRoZW4oKHsgcmVwbHksIHJlZiB9KSA9PiBvblJlcGx5KHJlcGx5LCByZWYpKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAocGF5bG9hZDogYW55KSA9PiBhbnkpOiBDYWxsYmFja1JlZiB7XG4gICAgY29uc3QgY2FsbGJhY2tSZWY6IENhbGxiYWNrUmVmID0ge1xuICAgICAgZXZlbnQsXG4gICAgICBjYWxsYmFjazogKGN1c3RvbUV2ZW50OiBDdXN0b21FdmVudCkgPT4gY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKSxcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgYHBoeDoke2V2ZW50fWAsXG4gICAgICBjYWxsYmFja1JlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5hZGQoY2FsbGJhY2tSZWYpO1xuICAgIHJldHVybiBjYWxsYmFja1JlZjtcbiAgfVxuXG4gIHJlbW92ZUhhbmRsZUV2ZW50KHJlZjogQ2FsbGJhY2tSZWYpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIGBwaHg6JHtyZWYuZXZlbnR9YCxcbiAgICAgIHJlZi5jYWxsYmFjayBhcyBFdmVudExpc3RlbmVyLFxuICAgICk7XG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUocmVmKTtcbiAgfVxuXG4gIHVwbG9hZChuYW1lOiBzdHJpbmcsIGZpbGVzOiBGaWxlTGlzdCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3KCkuZGlzcGF0Y2hVcGxvYWRzKG51bGwsIG5hbWUsIGZpbGVzKTtcbiAgfVxuXG4gIHVwbG9hZFRvKHNlbGVjdG9yT3JUYXJnZXQ6IFBoeFRhcmdldCwgbmFtZTogc3RyaW5nLCBmaWxlczogRmlsZUxpc3QpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fdmlldygpLndpdGhpblRhcmdldHMoc2VsZWN0b3JPclRhcmdldCwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5kaXNwYXRjaFVwbG9hZHModGFyZ2V0Q3R4LCBuYW1lLCBmaWxlcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9fY2xlYW51cF9fKCkge1xuICAgIHRoaXMuX19saXN0ZW5lcnMuZm9yRWFjaCgoY2FsbGJhY2tSZWYpID0+XG4gICAgICB0aGlzLnJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tzT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBWaWV3SG9vayB8IEhvb2s+O1xuXG5leHBvcnQgZGVmYXVsdCBWaWV3SG9vaztcbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfVklFV19SRUYsXG4gIFBIWF9DT05ORUNURURfQ0xBU1MsXG4gIFBIWF9ESVNBQkxFX1dJVEgsXG4gIFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSxcbiAgUEhYX0RJU0FCTEVELFxuICBQSFhfTE9BRElOR19DTEFTUyxcbiAgUEhYX0VSUk9SX0NMQVNTLFxuICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfSE9PSyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BST0dSRVNTLFxuICBQSFhfUkVBRE9OTFksXG4gIFBIWF9SRUZfTE9BRElORyxcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9SRUZfTE9DSyxcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfU1RJQ0tZLFxuICBQSFhfVFJBQ0tfU1RBVElDLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUEhYX1VQREFURSxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfTUFJTixcbiAgUEhYX01PVU5URUQsXG4gIFBVU0hfVElNRU9VVCxcbiAgUEhYX1ZJRVdQT1JUX1RPUCxcbiAgUEhYX1ZJRVdQT1JUX0JPVFRPTSxcbiAgTUFYX0NISUxEX0pPSU5fQVRURU1QVFMsXG4gIFBIWF9MVl9QSUQsXG4gIFBIWF9QT1JUQUwsXG4gIFBIWF9URUxFUE9SVEVEX1JFRixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBFbGVtZW50UmVmIGZyb20gXCIuL2VsZW1lbnRfcmVmXCI7XG5pbXBvcnQgRE9NUGF0Y2ggZnJvbSBcIi4vZG9tX3BhdGNoXCI7XG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIjtcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiO1xuaW1wb3J0IHsgVmlld0hvb2sgfSBmcm9tIFwiLi92aWV3X2hvb2tcIjtcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiO1xuXG5pbXBvcnQgbW9ycGhkb20gZnJvbSBcIm1vcnBoZG9tXCI7XG5cbmV4cG9ydCBjb25zdCBwcmVwZW5kRm9ybURhdGFLZXkgPSAoa2V5LCBwcmVmaXgpID0+IHtcbiAgY29uc3QgaXNBcnJheSA9IGtleS5lbmRzV2l0aChcIltdXCIpO1xuICAvLyBSZW1vdmUgdGhlIFwiW11cIiBpZiBpdCdzIGFuIGFycmF5XG4gIGxldCBiYXNlS2V5ID0gaXNBcnJheSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG4gIC8vIFJlcGxhY2UgbGFzdCBvY2N1cnJlbmNlIG9mIGtleSBiZWZvcmUgYSBjbG9zaW5nIGJyYWNrZXQgb3IgdGhlIGVuZCB3aXRoIGtleSBwbHVzIHN1ZmZpeFxuICBiYXNlS2V5ID0gYmFzZUtleS5yZXBsYWNlKC8oW15cXFtcXF1dKykoXFxdPyQpLywgYCR7cHJlZml4fSQxJDJgKTtcbiAgLy8gQWRkIGJhY2sgdGhlIFwiW11cIiBpZiBpdCB3YXMgYW4gYXJyYXlcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICBiYXNlS2V5ICs9IFwiW11cIjtcbiAgfVxuICByZXR1cm4gYmFzZUtleTtcbn07XG5cbmNvbnN0IHNlcmlhbGl6ZUZvcm0gPSAoZm9ybSwgb3B0cywgb25seU5hbWVzID0gW10pID0+IHtcbiAgY29uc3QgeyBzdWJtaXR0ZXIgfSA9IG9wdHM7XG5cbiAgLy8gV2UgbXVzdCBpbmplY3QgdGhlIHN1Ym1pdHRlciBpbiB0aGUgb3JkZXIgdGhhdCBpdCBleGlzdHMgaW4gdGhlIERPTVxuICAvLyByZWxhdGl2ZSB0byBvdGhlciBpbnB1dHMuIEZvciBleGFtcGxlLCBmb3IgY2hlY2tib3ggZ3JvdXBzLCB0aGUgb3JkZXIgbXVzdCBiZSBtYWludGFpbmVkLlxuICBsZXQgaW5qZWN0ZWRFbGVtZW50O1xuICBpZiAoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lKSB7XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgLy8gc2V0IHRoZSBmb3JtIGF0dHJpYnV0ZSBpZiB0aGUgc3VibWl0dGVyIGhhcyBvbmU7XG4gICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBlbGVtZW50IGlzIG91dHNpZGUgdGhlIGFjdHVhbCBmb3JtIGVsZW1lbnRcbiAgICBjb25zdCBmb3JtSWQgPSBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybVwiKTtcbiAgICBpZiAoZm9ybUlkKSB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJmb3JtXCIsIGZvcm1JZCk7XG4gICAgfVxuICAgIGlucHV0Lm5hbWUgPSBzdWJtaXR0ZXIubmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHN1Ym1pdHRlci52YWx1ZTtcbiAgICBzdWJtaXR0ZXIucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaW5wdXQsIHN1Ym1pdHRlcik7XG4gICAgaW5qZWN0ZWRFbGVtZW50ID0gaW5wdXQ7XG4gIH1cblxuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgY29uc3QgdG9SZW1vdmUgPSBbXTtcblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgIHRvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsZWFudXAgYWZ0ZXIgYnVpbGRpbmcgZmlsZURhdGFcbiAgdG9SZW1vdmUuZm9yRWFjaCgoa2V5KSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSk7XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXG4gIGNvbnN0IHsgaW5wdXRzVW51c2VkLCBvbmx5SGlkZGVuSW5wdXRzIH0gPSBBcnJheS5mcm9tKGZvcm0uZWxlbWVudHMpLnJlZHVjZShcbiAgICAoYWNjLCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dHNVbnVzZWQsIG9ubHlIaWRkZW5JbnB1dHMgfSA9IGFjYztcbiAgICAgIGNvbnN0IGtleSA9IGlucHV0Lm5hbWU7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXRzVW51c2VkW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnB1dHNVbnVzZWRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob25seUhpZGRlbklucHV0c1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25seUhpZGRlbklucHV0c1trZXldID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVc2VkID1cbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHxcbiAgICAgICAgRE9NLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfU1VCTUlUVEVEKTtcbiAgICAgIGNvbnN0IGlzSGlkZGVuID0gaW5wdXQudHlwZSA9PT0gXCJoaWRkZW5cIjtcbiAgICAgIGlucHV0c1VudXNlZFtrZXldID0gaW5wdXRzVW51c2VkW2tleV0gJiYgIWlzVXNlZDtcbiAgICAgIG9ubHlIaWRkZW5JbnB1dHNba2V5XSA9IG9ubHlIaWRkZW5JbnB1dHNba2V5XSAmJiBpc0hpZGRlbjtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIHsgaW5wdXRzVW51c2VkOiB7fSwgb25seUhpZGRlbklucHV0czoge30gfSxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgaWYgKG9ubHlOYW1lcy5sZW5ndGggPT09IDAgfHwgb25seU5hbWVzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICBjb25zdCBpc1VudXNlZCA9IGlucHV0c1VudXNlZFtrZXldO1xuICAgICAgY29uc3QgaGlkZGVuID0gb25seUhpZGRlbklucHV0c1trZXldO1xuICAgICAgaWYgKGlzVW51c2VkICYmICEoc3VibWl0dGVyICYmIHN1Ym1pdHRlci5uYW1lID09IGtleSkgJiYgIWhpZGRlbikge1xuICAgICAgICBwYXJhbXMuYXBwZW5kKHByZXBlbmRGb3JtRGF0YUtleShrZXksIFwiX3VudXNlZF9cIiksIFwiXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcGFyYW1zLmFwcGVuZChrZXksIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIHRoZSBpbmplY3RlZCBlbGVtZW50IGFnYWluXG4gIC8vIChpdCB3b3VsZCBiZSByZW1vdmVkIGJ5IHRoZSBuZXh0IGRvbSBwYXRjaCBhbnl3YXksIGJ1dCB0aGlzIGlzIGNsZWFuZXIpXG4gIGlmIChzdWJtaXR0ZXIgJiYgaW5qZWN0ZWRFbGVtZW50KSB7XG4gICAgc3VibWl0dGVyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaW5qZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMudG9TdHJpbmcoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBzdGF0aWMgY2xvc2VzdFZpZXcoZWwpIHtcbiAgICBjb25zdCBsaXZlVmlld0VsID0gZWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUik7XG4gICAgcmV0dXJuIGxpdmVWaWV3RWwgPyBET00ucHJpdmF0ZShsaXZlVmlld0VsLCBcInZpZXdcIikgOiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZWwsIGxpdmVTb2NrZXQsIHBhcmVudFZpZXcsIGZsYXNoLCBsaXZlUmVmZXJlcikge1xuICAgIHRoaXMuaXNEZWFkID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldDtcbiAgICB0aGlzLmZsYXNoID0gZmxhc2g7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRWaWV3O1xuICAgIHRoaXMucm9vdCA9IHBhcmVudFZpZXcgPyBwYXJlbnRWaWV3LnJvb3QgOiB0aGlzO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvcHVsbC8zNzIxXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBib3VuZCB0byBhIHZpZXdcbiAgICBjb25zdCBib3VuZFZpZXcgPSBET00ucHJpdmF0ZSh0aGlzLmVsLCBcInZpZXdcIik7XG4gICAgaWYgKGJvdW5kVmlldyAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVmlldy5pc0RlYWQgIT09IHRydWUpIHtcbiAgICAgIGxvZ0Vycm9yKFxuICAgICAgICBgVGhlIERPTSBlbGVtZW50IGZvciB0aGlzIHZpZXcgaGFzIGFscmVhZHkgYmVlbiBib3VuZCB0byBhIHZpZXcuXG5cbiAgICAgICAgQW4gZWxlbWVudCBjYW4gb25seSBldmVyIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSB2aWV3IVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGFyZSBub3QgdHJ5aW5nIHRvIGluaXRpYWxpemUgbXVsdGlwbGUgTGl2ZVNvY2tldHMgb24gdGhlIHNhbWUgcGFnZS5cbiAgICAgICAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91J3JlIGFjY2lkZW50YWxseSB0cnlpbmcgdG8gcmVuZGVyIHlvdXIgcm9vdCBsYXlvdXQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgIEVuc3VyZSB0aGF0IHRoZSB0ZW1wbGF0ZSBzZXQgb24gdGhlIExpdmVWaWV3IGlzIGRpZmZlcmVudCB0aGFuIHRoZSByb290IGxheW91dC5cbiAgICAgIGAsXG4gICAgICAgIHsgdmlldzogYm91bmRWaWV3IH0sXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGJpbmQgbXVsdGlwbGUgdmlld3MgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQuXCIpO1xuICAgIH1cbiAgICAvLyBiaW5kIHRoZSB2aWV3IHRvIHRoZSBlbGVtZW50XG4gICAgRE9NLnB1dFByaXZhdGUodGhpcy5lbCwgXCJ2aWV3XCIsIHRoaXMpO1xuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkO1xuICAgIHRoaXMucmVmID0gMDtcbiAgICB0aGlzLmxhc3RBY2tSZWYgPSBudWxsO1xuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgLyoqXG4gICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLmxvYWRlclRpbWVyID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgdGhpcy5wZW5kaW5nRm9ybXMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5yZWRpcmVjdCA9IGZhbHNlO1xuICAgIHRoaXMuaHJlZiA9IG51bGw7XG4gICAgdGhpcy5qb2luQ291bnQgPSB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmpvaW5Db3VudCAtIDEgOiAwO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzID0gMDtcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gZnVuY3Rpb24gKG9uRG9uZSkge1xuICAgICAgb25Eb25lICYmIG9uRG9uZSgpO1xuICAgIH07XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAvLyB1c3VhbGx5LCBvbmx5IHRoZSByb290IExpdmVWaWV3IHN0b3JlcyBwZW5kaW5nXG4gICAgLy8gam9pbiBvcGVyYXRpb25zIGZvciBhbGwgY2hpbGRyZW4gKGFuZCBpdHNlbGYpLFxuICAgIC8vIGJ1dCBpbiBjYXNlIG9mIHJlam9pbnMgKGpvaW5Db3VudCA+IDEpIGVhY2ggY2hpbGRcbiAgICAvLyBzdG9yZXMgaXRzIG93biBldmVudHMgaW5zdGVhZFxuICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICB0aGlzLnZpZXdIb29rcyA9IHt9O1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSBbXTtcbiAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5wYXJlbnQgPyBudWxsIDoge307XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge307XG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5jaGFubmVsID0gdGhpcy5saXZlU29ja2V0LmNoYW5uZWwoYGx2OiR7dGhpcy5pZH1gLCAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmhyZWYgJiYgdGhpcy5leHBhbmRVUkwodGhpcy5ocmVmKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0ID8gdXJsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHRoaXMucmVkaXJlY3QgPyB1bmRlZmluZWQgOiB1cmwgfHwgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdFBhcmFtcyhsaXZlUmVmZXJlciksXG4gICAgICAgIHNlc3Npb246IHRoaXMuZ2V0U2Vzc2lvbigpLFxuICAgICAgICBzdGF0aWM6IHRoaXMuZ2V0U3RhdGljKCksXG4gICAgICAgIGZsYXNoOiB0aGlzLmZsYXNoLFxuICAgICAgICBzdGlja3k6IHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9TVElDS1kpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLnBvcnRhbEVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICBzZXRIcmVmKGhyZWYpIHtcbiAgICB0aGlzLmhyZWYgPSBocmVmO1xuICB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZikge1xuICAgIHRoaXMucmVkaXJlY3QgPSB0cnVlO1xuICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gIH1cblxuICBpc01haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwuaGFzQXR0cmlidXRlKFBIWF9NQUlOKTtcbiAgfVxuXG4gIGNvbm5lY3RQYXJhbXMobGl2ZVJlZmVyZXIpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmxpdmVTb2NrZXQucGFyYW1zKHRoaXMuZWwpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgIC5tYXAoKG5vZGUpID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZilcbiAgICAgIC5maWx0ZXIoKHVybCkgPT4gdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIik7XG5cbiAgICBpZiAobWFuaWZlc3QubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0O1xuICAgIH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnQ7XG4gICAgcGFyYW1zW1wiX21vdW50X2F0dGVtcHRzXCJdID0gdGhpcy5qb2luQXR0ZW1wdHM7XG4gICAgcGFyYW1zW1wiX2xpdmVfcmVmZXJlclwiXSA9IGxpdmVSZWZlcmVyO1xuICAgIHRoaXMuam9pbkF0dGVtcHRzKys7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5jYW5QdXNoKCk7XG4gIH1cblxuICBnZXRTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTik7XG4gIH1cblxuICBnZXRTdGF0aWMoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gXCJcIiA/IG51bGwgOiB2YWw7XG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpO1xuICAgIHRoaXMuZGVzdHJveVBvcnRhbEVsZW1lbnRzKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIERPTS5kZWxldGVQcml2YXRlKHRoaXMuZWwsIFwidmlld1wiKTtcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdO1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnBhcmVudC5pZF1bdGhpcy5pZF07XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjb25zdCBvbkZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBET00ubWFya1BoeENoaWxkRGVzdHJveWVkKHRoaXMuZWwpO1xuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKTtcbiAgICB0aGlzLmNoYW5uZWxcbiAgICAgIC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZCk7XG4gIH1cblxuICBzZXRDb250YWluZXJDbGFzc2VzKC4uLmNsYXNzZXMpIHtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICAgICAgUEhYX0xPQURJTkdfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1MsXG4gICAgICBQSFhfQ0xJRU5UX0VSUk9SX0NMQVNTLFxuICAgICAgUEhYX1NFUlZFUl9FUlJPUl9DTEFTUyxcbiAgICApO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcbiAgfVxuXG4gIHNob3dMb2FkZXIodGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMudmlld0hvb2tzKSB7XG4gICAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX2Rpc2Nvbm5lY3RlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9MT0FESU5HX0NMQVNTKTtcbiAgICB9XG4gIH1cblxuICBleGVjQWxsKGJpbmRpbmcpIHtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtiaW5kaW5nfV1gLCAoZWwpID0+XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUoYmluZGluZykpLFxuICAgICk7XG4gIH1cblxuICBoaWRlTG9hZGVyKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5kaXNjb25uZWN0ZWRUaW1lcik7XG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpO1xuICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJjb25uZWN0ZWRcIikpO1xuICB9XG5cbiAgdHJpZ2dlclJlY29ubmVjdGVkKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy52aWV3SG9va3MpIHtcbiAgICAgIHRoaXMudmlld0hvb2tzW2lkXS5fX3JlY29ubmVjdGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbG9nKGtpbmQsIG1zZ0NhbGxiYWNrKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LmxvZyh0aGlzLCBraW5kLCBtc2dDYWxsYmFjayk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKTtcbiAgfVxuXG4gIC8vIGNhbGxzIHRoZSBjYWxsYmFjayB3aXRoIHRoZSB2aWV3IGFuZCB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHBoeFRhcmdldFxuICAvLyB0YXJnZXRzIGNhbiBiZTpcbiAgLy8gICogYW4gZWxlbWVudCBpdHNlbGYsIHRoZW4gaXQgaXMgc2ltcGx5IHBhc3NlZCB0byBsaXZlU29ja2V0Lm93bmVyO1xuICAvLyAgKiBhIENJRCAoQ29tcG9uZW50IElEKSwgdGhlbiB3ZSBmaXJzdCBzZWFyY2ggdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQgaW4gdGhlIERPTVxuICAvLyAgKiBhIHNlbGVjdG9yLCB0aGVuIHdlIHNlYXJjaCB0aGUgc2VsZWN0b3IgaW4gdGhlIERPTSBhbmQgY2FsbCB0aGUgY2FsbGJhY2tcbiAgLy8gICAgZm9yIGVhY2ggZWxlbWVudCBmb3VuZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG93bmVyIHZpZXdcbiAgd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20gPSBkb2N1bWVudCkge1xuICAgIC8vIGluIHRoZSBmb3JtIHJlY292ZXJ5IGNhc2Ugd2Ugc2VhcmNoIGluIGEgdGVtcGxhdGUgZnJhZ21lbnQgaW5zdGVhZCBvZlxuICAgIC8vIHRoZSByZWFsIGRvbSwgdGhlcmVmb3JlIHdlIG9wdGlvbmFsbHkgcGFzcyBkb20gYW5kIHZpZXdFbFxuXG4gICAgaWYgKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHBoeFRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCAodmlldykgPT5cbiAgICAgICAgY2FsbGJhY2sodmlldywgcGh4VGFyZ2V0KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2lkKHBoeFRhcmdldCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuaWQsIHBoeFRhcmdldCwgZG9tKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dFcnJvcihgbm8gY29tcG9uZW50IGZvdW5kIG1hdGNoaW5nIHBoeC10YXJnZXQgb2YgJHtwaHhUYXJnZXR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayh0aGlzLCBwYXJzZUludChwaHhUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IEFycmF5LmZyb20oZG9tLnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nRXJyb3IoXG4gICAgICAgICAgYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT5cbiAgICAgICAgdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIHRhcmdldCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmxvZyh0eXBlLCAoKSA9PiBbXCJcIiwgY2xvbmUocmF3RGlmZildKTtcbiAgICBjb25zdCB7IGRpZmYsIHJlcGx5LCBldmVudHMsIHRpdGxlIH0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpO1xuICAgIGNhbGxiYWNrKHsgZGlmZiwgcmVwbHksIGV2ZW50cyB9KTtcbiAgICBpZiAodHlwZW9mIHRpdGxlID09PSBcInN0cmluZ1wiIHx8ICh0eXBlID09IFwibW91bnRcIiAmJiB0aGlzLmlzTWFpbigpKSkge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBET00ucHV0VGl0bGUodGl0bGUpKTtcbiAgICB9XG4gIH1cblxuICBvbkpvaW4ocmVzcCkge1xuICAgIGNvbnN0IHsgcmVuZGVyZWQsIGNvbnRhaW5lciwgbGl2ZXZpZXdfdmVyc2lvbiwgcGlkIH0gPSByZXNwO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IFt0YWcsIGF0dHJzXSA9IGNvbnRhaW5lcjtcbiAgICAgIHRoaXMuZWwgPSBET00ucmVwbGFjZVJvb3RDb250YWluZXIodGhpcy5lbCwgdGFnLCBhdHRycyk7XG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDA7XG4gICAgdGhpcy5qb2luUGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5mbGFzaCA9IG51bGw7XG4gICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0gdGhpcy5nZXRGb3Jtc0ZvclJlY292ZXJ5KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTWFpbigpICYmIHdpbmRvdy5oaXN0b3J5LnN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBzZXQgaW5pdGlhbCBoaXN0b3J5IGVudHJ5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhZ2UgbG9hZCAobm8gaGlzdG9yeSlcbiAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFwicmVwbGFjZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmxpdmVTb2NrZXQuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsaXZldmlld192ZXJzaW9uICE9PSB0aGlzLmxpdmVTb2NrZXQudmVyc2lvbigpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTGl2ZVZpZXcgYXNzZXQgdmVyc2lvbiBtaXNtYXRjaC4gSmF2YVNjcmlwdCB2ZXJzaW9uICR7dGhpcy5saXZlU29ja2V0LnZlcnNpb24oKX0gdnMuIHNlcnZlciAke2xpdmV2aWV3X3ZlcnNpb259LiBUbyBhdm9pZCBpc3N1ZXMsIHBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIGFzc2V0cyB1c2UgdGhlIHNhbWUgdmVyc2lvbiBhcyB0aGUgc2VydmVyLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoZSBwaWQgaXMgb25seSBzZW50IGlmXG4gICAgLy9cbiAgICAvLyAgICBjb25maWcgOnBob2VuaXhfbGl2ZV92aWV3LCA6ZGVidWdfYXR0cmlidXRlc1xuICAgIC8vXG4gICAgLy8gaWYgc2V0IHRvIHRydWUuIEl0IGlzIHRvIGhlbHAgZGVidWdnaW5nIGluIGRldmVsb3BtZW50LlxuICAgIGlmIChwaWQpIHtcbiAgICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9MVl9QSUQsIHBpZCk7XG4gICAgfVxuXG4gICAgQnJvd3Nlci5kcm9wTG9jYWwoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLFxuICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgICApO1xuICAgIHRoaXMuYXBwbHlEaWZmKFwibW91bnRcIiwgcmVuZGVyZWQsICh7IGRpZmYsIGV2ZW50cyB9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpO1xuICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIobnVsbCwgXCJqb2luXCIpO1xuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKTtcbiAgICAgIHRoaXMuam9pbkNvdW50Kys7XG4gICAgICB0aGlzLmpvaW5BdHRlbXB0cyA9IDA7XG5cbiAgICAgIHRoaXMubWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIHN0cmVhbXMsIGV2ZW50cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3BQZW5kaW5nUmVmcygpIHtcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7UEhYX1JFRl9TUkN9PVwiJHt0aGlzLnJlZlNyYygpfVwiXWAsIChlbCkgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9BRElORyk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpO1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUZfTE9DSyk7XG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5Db21wbGV0ZSh7IGxpdmVfcGF0Y2ggfSwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJvdmlkZSBhIGJldHRlciBleHBlcmllbmNlLCB3ZSB3YW50IHRvIGpvaW5cbiAgICAvLyBhbGwgTGl2ZVZpZXdzIGZpcnN0IGFuZCBvbmx5IHRoZW4gYXBwbHkgdGhlaXIgcGF0Y2hlcy5cbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxIHx8ICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQuaXNKb2luUGVuZGluZygpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKTtcbiAgICB9XG5cbiAgICAvLyBPbmUgZG93bnNpZGUgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHdlIG5lZWQgdG8gZmluZCBwaHhDaGlsZHJlblxuICAgIC8vIGluIHRoZSBodG1sIGZyYWdtZW50LCBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBET00uIFRoZSBmcmFnbWVudFxuICAgIC8vIGFsc28gZG9lcyBub3QgaW5jbHVkZSBQSFhfU1RBVElDLCBzbyB3ZSBuZWVkIHRvIGNvcHkgaXQgb3ZlciBmcm9tXG4gICAgLy8gdGhlIERPTS5cbiAgICBjb25zdCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcihcbiAgICAgICh0b0VsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21FbCA9IHRvRWwuaWQgJiYgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke3RvRWwuaWR9XCJdYCk7XG4gICAgICAgIGNvbnN0IHBoeFN0YXRpYyA9IGZyb21FbCAmJiBmcm9tRWwuZ2V0QXR0cmlidXRlKFBIWF9TVEFUSUMpO1xuICAgICAgICBpZiAocGh4U3RhdGljKSB7XG4gICAgICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgcGh4U3RhdGljKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgUEhYX1JPT1RfSUQgdG8gcHJldmVudCBldmVudHMgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRvIHRoZSByb290IHZpZXdcbiAgICAgICAgLy8gd2hpbGUgdGhlIGNoaWxkIGpvaW4gaXMgc3RpbGwgcGVuZGluZ1xuICAgICAgICBpZiAoZnJvbUVsKSB7XG4gICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCwgdGhpcy5yb290LmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5qb2luQ2hpbGQodG9FbCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW1xuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgKCkgPT4gdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBzdHJlYW1zLCBldmVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3QucGVuZGluZ0pvaW5PcHMucHVzaChbXG4gICAgICAgIHRoaXMsXG4gICAgICAgICgpID0+IHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpIHtcbiAgICB0aGlzLmVsID0gRE9NLmJ5SWQodGhpcy5pZCk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gIH1cblxuICAvLyB0aGlzIGlzIGludm9rZWQgZm9yIGRlYWQgYW5kIGxpdmUgdmlld3MsIHNvIHdlIG11c3QgZmlsdGVyIGJ5XG4gIC8vIGJ5IG93bmVyIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgZHVwbGljYXRpbmcgaG9va3MgYWNyb3NzIGRpc2Nvbm5lY3RcbiAgLy8gYW5kIGNvbm5lY3RlZCBzdGF0ZXMuIFRoaXMgYWxzbyBoYW5kbGVzIGNhc2VzIHdoZXJlIGhvb2tzIGV4aXN0XG4gIC8vIGluIGEgcm9vdCBsYXlvdXQgd2l0aCBhIExWIGluIHRoZSBib2R5XG4gIGV4ZWNOZXdNb3VudGVkKHBhcmVudCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IHBoeFZpZXdwb3J0VG9wID0gdGhpcy5iaW5kaW5nKFBIWF9WSUVXUE9SVF9UT1ApO1xuICAgIGxldCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICB0aGlzLmFsbChcbiAgICAgIHBhcmVudCxcbiAgICAgIGBbJHtwaHhWaWV3cG9ydFRvcH1dLCBbJHtwaHhWaWV3cG9ydEJvdHRvbX1dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgRE9NLm1haW50YWluUHJpdmF0ZUhvb2tzKFxuICAgICAgICAgIGhvb2tFbCxcbiAgICAgICAgICBob29rRWwsXG4gICAgICAgICAgcGh4Vmlld3BvcnRUb3AsXG4gICAgICAgICAgcGh4Vmlld3BvcnRCb3R0b20sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWF5YmVBZGROZXdIb29rKGhvb2tFbCk7XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5hbGwoXG4gICAgICBwYXJlbnQsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFBIWF9IT09LKX1dLCBbZGF0YS1waHgtJHtQSFhfSE9PS31dYCxcbiAgICAgIChob29rRWwpID0+IHtcbiAgICAgICAgdGhpcy5tYXliZUFkZE5ld0hvb2soaG9va0VsKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmFsbChwYXJlbnQsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX01PVU5URUQpfV1gLCAoZWwpID0+IHtcbiAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFsbChwYXJlbnQsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGVsKSA9PiB7XG4gICAgICBpZiAodGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgICAgY2FsbGJhY2soZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgc3RyZWFtcywgZXZlbnRzKSB7XG4gICAgLy8gaW4gY2FzZSBvZiByZWpvaW5zLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IHBlcmZvcm0gYWxsXG4gICAgLy8gcGVuZGluZyBvcHNcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nSm9pbk9wcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChjYikgPT4gdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIgJiYgY2IoKSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hdHRhY2hUcnVlRG9jRWwoKTtcbiAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBzdHJlYW1zLCBudWxsKTtcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpO1xuICAgIHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgdGhpcy5qb2luTmV3Q2hpbGRyZW4oKTtcbiAgICB0aGlzLmV4ZWNOZXdNb3VudGVkKCk7XG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgdGhpcy5hcHBseVBlbmRpbmdVcGRhdGVzKCk7XG5cbiAgICBpZiAobGl2ZV9wYXRjaCkge1xuICAgICAgY29uc3QgeyBraW5kLCB0byB9ID0gbGl2ZV9wYXRjaDtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVMb2FkZXIoKTtcbiAgICBpZiAodGhpcy5qb2luQ291bnQgPiAxKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpO1xuICAgIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjaygpO1xuICB9XG5cbiAgdHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKSB7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbkJlZm9yZUVsVXBkYXRlZFwiLCBbZnJvbUVsLCB0b0VsXSk7XG4gICAgY29uc3QgaG9vayA9IHRoaXMuZ2V0SG9vayhmcm9tRWwpO1xuICAgIGNvbnN0IGlzSWdub3JlZCA9IGhvb2sgJiYgRE9NLmlzSWdub3JlZChmcm9tRWwsIHRoaXMuYmluZGluZyhQSFhfVVBEQVRFKSk7XG4gICAgaWYgKFxuICAgICAgaG9vayAmJlxuICAgICAgIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKSAmJlxuICAgICAgIShpc0lnbm9yZWQgJiYgaXNFcXVhbE9iaihmcm9tRWwuZGF0YXNldCwgdG9FbC5kYXRhc2V0KSlcbiAgICApIHtcbiAgICAgIGhvb2suX19iZWZvcmVVcGRhdGUoKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH1cbiAgfVxuXG4gIG1heWJlTW91bnRlZChlbCkge1xuICAgIGNvbnN0IHBoeE1vdW50ZWQgPSBlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9NT1VOVEVEKSk7XG4gICAgY29uc3QgaGFzQmVlbkludm9rZWQgPSBwaHhNb3VudGVkICYmIERPTS5wcml2YXRlKGVsLCBcIm1vdW50ZWRcIik7XG4gICAgaWYgKHBoeE1vdW50ZWQgJiYgIWhhc0JlZW5JbnZva2VkKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQuZXhlY0pTKGVsLCBwaHhNb3VudGVkKTtcbiAgICAgIERPTS5wdXRQcml2YXRlKGVsLCBcIm1vdW50ZWRcIiwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWF5YmVBZGROZXdIb29rKGVsKSB7XG4gICAgY29uc3QgbmV3SG9vayA9IHRoaXMuYWRkSG9vayhlbCk7XG4gICAgaWYgKG5ld0hvb2spIHtcbiAgICAgIG5ld0hvb2suX19tb3VudGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMsIGlzSm9pblBhdGNoID0gZmFsc2UpIHtcbiAgICBjb25zdCByZW1vdmVkRWxzID0gW107XG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZTtcbiAgICBjb25zdCB1cGRhdGVkSG9va0lkcyA9IG5ldyBTZXQoKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaFN0YXJ0XCIsIFtwYXRjaC50YXJnZXRDb250YWluZXJdKTtcblxuICAgIHBhdGNoLmFmdGVyKFwiYWRkZWRcIiwgKGVsKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uTm9kZUFkZGVkXCIsIFtlbF0pO1xuICAgICAgY29uc3QgcGh4Vmlld3BvcnRUb3AgPSB0aGlzLmJpbmRpbmcoUEhYX1ZJRVdQT1JUX1RPUCk7XG4gICAgICBjb25zdCBwaHhWaWV3cG9ydEJvdHRvbSA9IHRoaXMuYmluZGluZyhQSFhfVklFV1BPUlRfQk9UVE9NKTtcbiAgICAgIERPTS5tYWludGFpblByaXZhdGVIb29rcyhlbCwgZWwsIHBoeFZpZXdwb3J0VG9wLCBwaHhWaWV3cG9ydEJvdHRvbSk7XG4gICAgICB0aGlzLm1heWJlQWRkTmV3SG9vayhlbCk7XG4gICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMubWF5YmVNb3VudGVkKGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGlmIChET00uaXNQaHhTdGlja3koZWwpKSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5qb2luUm9vdFZpZXdzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhdGNoLmJlZm9yZShcInVwZGF0ZWRcIiwgKGZyb21FbCwgdG9FbCkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IHRoaXMudHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIHVwZGF0ZWRIb29rSWRzLmFkZChmcm9tRWwuaWQpO1xuICAgICAgfVxuICAgICAgLy8gdHJpZ2dlciBKUyBzcGVjaWZpYyB1cGRhdGUgbG9naWMgKGZvciBleGFtcGxlIGZvciBKUy5pZ25vcmVfYXR0cmlidXRlcylcbiAgICAgIEpTLm9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCk7XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSkge1xuICAgICAgICB0aGlzLmdldEhvb2soZWwpLl9fdXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGF0Y2guYWZ0ZXIoXCJkaXNjYXJkZWRcIiwgKGVsKSA9PiB7XG4gICAgICBpZiAoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHJlbW92ZWRFbHMucHVzaChlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwYXRjaC5hZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIChlbHMpID0+XG4gICAgICB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKGVscywgcHJ1bmVDaWRzKSxcbiAgICApO1xuICAgIHBhdGNoLnBlcmZvcm0oaXNKb2luUGF0Y2gpO1xuICAgIHRoaXMuYWZ0ZXJFbGVtZW50c1JlbW92ZWQocmVtb3ZlZEVscywgcHJ1bmVDaWRzKTtcblxuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25QYXRjaEVuZFwiLCBbcGF0Y2gudGFyZ2V0Q29udGFpbmVyXSk7XG4gICAgcmV0dXJuIHBoeENoaWxkcmVuQWRkZWQ7XG4gIH1cblxuICBhZnRlckVsZW1lbnRzUmVtb3ZlZChlbGVtZW50cywgcHJ1bmVDaWRzKSB7XG4gICAgY29uc3QgZGVzdHJveWVkQ0lEcyA9IFtdO1xuICAgIGVsZW1lbnRzLmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske1BIWF9WSUVXX1JFRn09XCIke3RoaXMuaWR9XCJdWyR7UEhYX0NPTVBPTkVOVH1dYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rcyA9IERPTS5hbGwoXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgYFske3RoaXMuYmluZGluZyhQSFhfSE9PSyl9XSwgW2RhdGEtcGh4LWhvb2tdYCxcbiAgICAgICk7XG4gICAgICBjb21wb25lbnRzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMuY29tcG9uZW50SUQoZWwpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDaWQoY2lkKSAmJlxuICAgICAgICAgIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSAmJlxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfVklFV19SRUYpID09PSB0aGlzLmlkXG4gICAgICAgICkge1xuICAgICAgICAgIGRlc3Ryb3llZENJRHMucHVzaChjaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhvb2tzLmNvbmNhdChwYXJlbnQpLmZvckVhY2goKGhvb2tFbCkgPT4ge1xuICAgICAgICBjb25zdCBob29rID0gdGhpcy5nZXRIb29rKGhvb2tFbCk7XG4gICAgICAgIGhvb2sgJiYgdGhpcy5kZXN0cm95SG9vayhob29rKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFdlIHNob3VsZCBub3QgcHJ1bmVDaWRzIG9uIGpvaW5zLiBPdGhlcndpc2UsIGluIGNhc2Ugb2ZcbiAgICAvLyByZWpvaW5zLCB3ZSBtYXkgbm90aWZ5IGNpZHMgdGhhdCBubyBsb25nZXIgYmVsb25nIHRvIHRoZVxuICAgIC8vIGN1cnJlbnQgTGl2ZVZpZXcgdG8gYmUgcmVtb3ZlZC5cbiAgICBpZiAocHJ1bmVDaWRzKSB7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyk7XG4gICAgfVxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCkge1xuICAgIERPTS5maW5kUGh4Q2hpbGRyZW4oZG9jdW1lbnQsIHRoaXMuaWQpLmZvckVhY2goKGVsKSA9PiB0aGlzLmpvaW5DaGlsZChlbCkpO1xuICB9XG5cbiAgbWF5YmVSZWNvdmVyRm9ybXMoaHRtbCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwaHhDaGFuZ2UgPSB0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIik7XG4gICAgY29uc3Qgb2xkRm9ybXMgPSB0aGlzLnJvb3QuZm9ybXNGb3JSZWNvdmVyeTtcbiAgICAvLyBTbyB3aHkgZG8gd2UgY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBoZXJlP1xuICAgIC8vIE9uZSB3YXkgdG8gcmVjb3ZlciBmb3JtcyB3b3VsZCBiZSB0byBpbW1lZGlhdGVseSBhcHBseSB0aGUgbW91bnRcbiAgICAvLyBwYXRjaCBhbmQgdGhlbiBhZnRlcndhcmRzIHJlY292ZXIgdGhlIGZvcm1zLiBIb3dldmVyLCB0aGlzIHdvdWxkXG4gICAgLy8gY2F1c2UgYSBmbGlja2VyLCBiZWNhdXNlIHRoZSBtb3VudCBwYXRjaCB3b3VsZCByZW1vdmUgdGhlIGZvcm0gY29udGVudFxuICAgIC8vIHVudGlsIGl0IGlzIHJlc3RvcmVkLiBUaGVyZWZvcmUgTFYgZGVjaWRlZCB0byBkbyBmb3JtIHJlY292ZXJ5IHdpdGggdGhlXG4gICAgLy8gcmF3IEhUTUwgYmVmb3JlIGl0IGlzIGFwcGxpZWQgYW5kIGRlbGF5IHRoZSBtb3VudCBwYXRjaCB1bnRpbCB0aGUgZm9ybVxuICAgIC8vIHJlY292ZXJ5IGV2ZW50cyBhcmUgZG9uZS5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gd2Ugc3BlY2lhbCBjYXNlIDwucG9ydGFsPiBoZXJlIGFuZCB0ZWxlcG9ydCBpdCBpbnRvIG91ciB0ZW1wb3JhcnkgRE9NIGZvciByZWNvdmVyeVxuICAgIC8vIGFzIHdlJ2Qgb3RoZXJ3aXNlIG5vdCBmaW5kIHRlbGVwb3J0ZWQgZm9ybXNcbiAgICBET00uYWxsKHRlbXBsYXRlLmNvbnRlbnQsIGBbJHtQSFhfUE9SVEFMfV1gKS5mb3JFYWNoKChwb3J0YWxUZW1wbGF0ZSkgPT4ge1xuICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5hcHBlbmRDaGlsZChcbiAgICAgICAgcG9ydGFsVGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBiZWNhdXNlIHdlIHdvcmsgd2l0aCBhIHRlbXBsYXRlIGVsZW1lbnQsIHdlIG11c3QgbWFudWFsbHkgY29weSB0aGUgYXR0cmlidXRlc1xuICAgIC8vIG90aGVyd2lzZSB0aGUgb3duZXIgLyB0YXJnZXQgaGVscGVycyBkb24ndCB3b3JrIHByb3Blcmx5XG4gICAgY29uc3Qgcm9vdEVsID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICByb290RWwuaWQgPSB0aGlzLmlkO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQsIHRoaXMucm9vdC5pZCk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfU0VTU0lPTiwgdGhpcy5nZXRTZXNzaW9uKCkpO1xuICAgIHJvb3RFbC5zZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQywgdGhpcy5nZXRTdGF0aWMoKSk7XG4gICAgcm9vdEVsLnNldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lELCB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmlkIDogbnVsbCk7XG5cbiAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtIGVsZW1lbnRzIGluIHRoZSBuZXcgSFRNTCBmb3IgdGhlIExWXG4gICAgLy8gYW5kIGxvb2sgZm9yIG9sZCBmb3JtcyBpbiB0aGUgYGZvcm1zRm9yUmVjb3ZlcnlgIG9iamVjdDtcbiAgICAvLyB0aGUgZm9ybXNGb3JSZWNvdmVyeSBjYW4gYWxzbyBjb250YWluIGZvcm1zIGZyb20gY2hpbGQgdmlld3NcbiAgICBjb25zdCBmb3Jtc1RvUmVjb3ZlciA9XG4gICAgICAvLyB3ZSBnbyBvdmVyIGFsbCBmb3JtcyBpbiB0aGUgbmV3IERPTTsgYmVjYXVzZSB0aGlzIGlzIG9ubHkgdGhlIEhUTUwgZm9yIHRoZSBjdXJyZW50XG4gICAgICAvLyB2aWV3LCB3ZSBjYW4gYmUgc3VyZSB0aGF0IGFsbCBmb3JtcyBhcmUgb3duZWQgYnkgdGhpcyB2aWV3OlxuICAgICAgRE9NLmFsbCh0ZW1wbGF0ZS5jb250ZW50LCBcImZvcm1cIilcbiAgICAgICAgLy8gb25seSByZWNvdmVyIGZvcm1zIHRoYXQgaGF2ZSBhbiBpZCBhbmQgYXJlIGluIHRoZSBvbGQgRE9NXG4gICAgICAgIC5maWx0ZXIoKG5ld0Zvcm0pID0+IG5ld0Zvcm0uaWQgJiYgb2xkRm9ybXNbbmV3Rm9ybS5pZF0pXG4gICAgICAgIC8vIGFiYW5kb24gZm9ybXMgd2UgYWxyZWFkeSB0cmllZCB0byByZWNvdmVyIHRvIHByZXZlbnQgbG9vcGluZyBhIGZhaWxlZCBzdGF0ZVxuICAgICAgICAuZmlsdGVyKChuZXdGb3JtKSA9PiAhdGhpcy5wZW5kaW5nRm9ybXMuaGFzKG5ld0Zvcm0uaWQpKVxuICAgICAgICAvLyBvbmx5IHJlY292ZXIgaWYgdGhlIGZvcm0gaGFzIHRoZSBzYW1lIHBoeC1jaGFuZ2UgdmFsdWVcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobmV3Rm9ybSkgPT5cbiAgICAgICAgICAgIG9sZEZvcm1zW25ld0Zvcm0uaWRdLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpID09PVxuICAgICAgICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChuZXdGb3JtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtvbGRGb3Jtc1tuZXdGb3JtLmlkXSwgbmV3Rm9ybV07XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKGZvcm1zVG9SZWNvdmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZm9ybXNUb1JlY292ZXIuZm9yRWFjaCgoW29sZEZvcm0sIG5ld0Zvcm1dLCBpKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdGb3Jtcy5hZGQobmV3Rm9ybS5pZCk7XG4gICAgICAvLyBpdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBmaXJzdEVsZW1lbnRDaGlsZCBvZiB0aGUgdGVtcGxhdGUgY29udGVudFxuICAgICAgLy8gYmVjYXVzZSB3aGVuIHRyYXZlcnNpbmcgYSBkb2N1bWVudEZyYWdtZW50IHVzaW5nIHBhcmVudE5vZGUsIHdlIHdvbid0IGV2ZXIgYXJyaXZlIGF0XG4gICAgICAvLyB0aGUgZnJhZ21lbnQ7IGFzIHRoZSB0ZW1wbGF0ZSBpcyBhbHdheXMgYSBMaXZlVmlldywgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5XG4gICAgICAvLyBvbmUgY2hpbGQgb24gdGhlIHJvb3QgbGV2ZWxcbiAgICAgIHRoaXMucHVzaEZvcm1SZWNvdmVyeShcbiAgICAgICAgb2xkRm9ybSxcbiAgICAgICAgbmV3Rm9ybSxcbiAgICAgICAgdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0Zvcm1zLmRlbGV0ZShuZXdGb3JtLmlkKTtcbiAgICAgICAgICAvLyB3ZSBvbmx5IGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgYWxsIGZvcm1zIGhhdmUgYmVlbiByZWNvdmVyZWRcbiAgICAgICAgICBpZiAoaSA9PT0gZm9ybXNUb1JlY292ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hpbGRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXVtpZF07XG4gIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCkge1xuICAgIGlmIChlbC5pZCA9PT0gdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2VsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKV0/LltlbC5pZF07XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveURlc2NlbmRlbnQoaWQpIHtcbiAgICBmb3IgKGNvbnN0IHBhcmVudElkIGluIHRoaXMucm9vdC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pIHtcbiAgICAgICAgaWYgKGNoaWxkSWQgPT09IGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF1bY2hpbGRJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKSB7XG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZCk7XG4gICAgaWYgKCFjaGlsZCkge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLmxpdmVTb2NrZXQsIHRoaXMpO1xuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlldztcbiAgICAgIHZpZXcuam9pbigpO1xuICAgICAgdGhpcy5jaGlsZEpvaW5zKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpc0pvaW5QZW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmpvaW5QZW5kaW5nO1xuICB9XG5cbiAgYWNrSm9pbihfY2hpbGQpIHtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLTtcblxuICAgIGlmICh0aGlzLmNoaWxkSm9pbnMgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKCkge1xuICAgIC8vIHdlIGNhbiBjbGVhciBwZW5kaW5nIGZvcm0gcmVjb3ZlcmllcyBub3cgdGhhdCB3ZSd2ZSBqb2luZWQuXG4gICAgLy8gVGhleSBlaXRoZXIgYWxsIHJlc29sdmVkIG9yIHdlcmUgYWJhbmRvbmVkXG4gICAgdGhpcy5wZW5kaW5nRm9ybXMuY2xlYXIoKTtcbiAgICAvLyB3ZSBjYW4gYWxzbyBjbGVhciB0aGUgZm9ybXNGb3JSZWNvdmVyeSBvYmplY3QgdG8gbm90IGtlZXAgb2xkIGZvcm0gZWxlbWVudHMgYXJvdW5kXG4gICAgdGhpcy5mb3Jtc0ZvclJlY292ZXJ5ID0ge307XG4gICAgdGhpcy5qb2luQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICAgIGlmICghdmlldy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICAgb3AoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW107XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoZGlmZiwgZXZlbnRzLCBpc1BlbmRpbmcgPSBmYWxzZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNKb2luUGVuZGluZygpIHx8XG4gICAgICAodGhpcy5saXZlU29ja2V0Lmhhc1BlbmRpbmdMaW5rKCkgJiYgdGhpcy5yb290LmlzTWFpbigpKVxuICAgICkge1xuICAgICAgLy8gZG9uJ3QgbXV0YXRlIGlmIHRoaXMgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZGlmZlxuICAgICAgaWYgKCFpc1BlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7IGRpZmYsIGV2ZW50cyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihkaWZmKTtcbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlO1xuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZiAodGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpKSB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImNvbXBvbmVudCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudENpZHMgPSBET00uZmluZEV4aXN0aW5nUGFyZW50Q0lEcyhcbiAgICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgIHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSxcbiAgICAgICAgKTtcbiAgICAgICAgcGFyZW50Q2lkcy5mb3JFYWNoKChwYXJlbnRDSUQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFBhdGNoKFxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLmdldENvbXBvbmVudChkaWZmLCBwYXJlbnRDSUQpLFxuICAgICAgICAgICAgICBwYXJlbnRDSUQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaXNFbXB0eShkaWZmKSkge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJmdWxsIHBhdGNoIGNvbXBsZXRlXCIsICgpID0+IHtcbiAgICAgICAgY29uc3QgW2h0bWwsIHN0cmVhbXNdID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIik7XG4gICAgICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIG51bGwpO1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXZlU29ja2V0LmRpc3BhdGNoRXZlbnRzKGV2ZW50cyk7XG4gICAgaWYgKHBoeENoaWxkcmVuQWRkZWQpIHtcbiAgICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZW5kZXJDb250YWluZXIoZGlmZiwga2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWcgPSB0aGlzLmVsLnRhZ05hbWU7XG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBjb25zdCBjaWRzID0gZGlmZiA/IHRoaXMucmVuZGVyZWQuY29tcG9uZW50Q0lEcyhkaWZmKSA6IG51bGw7XG4gICAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC50b1N0cmluZyhjaWRzKTtcbiAgICAgIHJldHVybiBbYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmAsIHN0cmVhbXNdO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKSB7XG4gICAgaWYgKGlzRW1wdHkoZGlmZikpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB7IGJ1ZmZlcjogaHRtbCwgc3RyZWFtcyB9ID0gdGhpcy5yZW5kZXJlZC5jb21wb25lbnRUb1N0cmluZyhjaWQpO1xuICAgIGNvbnN0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIHN0cmVhbXMsIGNpZCk7XG4gICAgY29uc3QgY2hpbGRyZW5BZGRlZCA9IHRoaXMucGVyZm9ybVBhdGNoKHBhdGNoLCB0cnVlKTtcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZDtcbiAgfVxuXG4gIGdldEhvb2soZWwpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGVsKV07XG4gIH1cblxuICBhZGRIb29rKGVsKSB7XG4gICAgY29uc3QgaG9va0VsSWQgPSBWaWV3SG9vay5lbGVtZW50SUQoZWwpO1xuXG4gICAgLy8gb25seSBldmVyIHRyeSB0byBhZGQgaG9va3MgdG8gZWxlbWVudHMgb3duZWQgYnkgdGhpcyB2aWV3XG4gICAgaWYgKGVsLmdldEF0dHJpYnV0ZSAmJiAhdGhpcy5vd25zRWxlbWVudChlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9va0VsSWQgJiYgIXRoaXMudmlld0hvb2tzW2hvb2tFbElkXSkge1xuICAgICAgLy8gaG9vayBjcmVhdGVkLCBidXQgbm90IGF0dGFjaGVkIChjcmVhdGVIb29rIGZvciB3ZWIgY29tcG9uZW50KVxuICAgICAgY29uc3QgaG9vayA9XG4gICAgICAgIERPTS5nZXRDdXN0b21FbEhvb2soZWwpIHx8XG4gICAgICAgIGxvZ0Vycm9yKGBubyBob29rIGZvdW5kIGZvciBjdXN0b20gZWxlbWVudDogJHtlbC5pZH1gKTtcbiAgICAgIHRoaXMudmlld0hvb2tzW2hvb2tFbElkXSA9IGhvb2s7XG4gICAgICBob29rLl9fYXR0YWNoVmlldyh0aGlzKTtcbiAgICAgIHJldHVybiBob29rO1xuICAgIH0gZWxzZSBpZiAoaG9va0VsSWQgfHwgIWVsLmdldEF0dHJpYnV0ZSkge1xuICAgICAgLy8gbm8gaG9vayBmb3VuZFxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBuZXcgaG9vayBmb3VuZCB3aXRoIHBoeC1ob29rIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgaG9va05hbWUgPVxuICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHxcbiAgICAgICAgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpO1xuXG4gICAgICBpZiAoIWhvb2tOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9va0RlZmluaXRpb24gPSB0aGlzLmxpdmVTb2NrZXQuZ2V0SG9va0RlZmluaXRpb24oaG9va05hbWUpO1xuXG4gICAgICBpZiAoaG9va0RlZmluaXRpb24pIHtcbiAgICAgICAgaWYgKCFlbC5pZCkge1xuICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBob29rSW5zdGFuY2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGhvb2tEZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIGhvb2tEZWZpbml0aW9uLnByb3RvdHlwZSBpbnN0YW5jZW9mIFZpZXdIb29rXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJdCdzIGEgY2xhc3MgY29uc3RydWN0b3IgKHN1YmNsYXNzIG9mIFZpZXdIb29rKVxuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IGhvb2tEZWZpbml0aW9uKHRoaXMsIGVsKTsgLy8gYHRoaXNgIGlzIHRoZSBWaWV3IGluc3RhbmNlXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBob29rRGVmaW5pdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaG9va0RlZmluaXRpb24gIT09IG51bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEl0J3MgYW4gb2JqZWN0IGxpdGVyYWwsIHBhc3MgaXQgdG8gdGhlIFZpZXdIb29rIGNvbnN0cnVjdG9yIGZvciB3cmFwcGluZ1xuICAgICAgICAgICAgaG9va0luc3RhbmNlID0gbmV3IFZpZXdIb29rKHRoaXMsIGVsLCBob29rRGVmaW5pdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBob29rIGRlZmluaXRpb24gZm9yIFwiJHtob29rTmFtZX1cIi4gRXhwZWN0ZWQgYSBjbGFzcyBleHRlbmRpbmcgVmlld0hvb2sgb3IgYW4gb2JqZWN0IGRlZmluaXRpb24uYCxcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcbiAgICAgICAgICBsb2dFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBob29rIFwiJHtob29rTmFtZX1cIjogJHtlcnJvck1lc3NhZ2V9YCwgZWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld0hvb2tzW1ZpZXdIb29rLmVsZW1lbnRJRChob29rSW5zdGFuY2UuZWwpXSA9IGhvb2tJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIGhvb2tJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoaG9va05hbWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nRXJyb3IoYHVua25vd24gaG9vayBmb3VuZCBmb3IgXCIke2hvb2tOYW1lfVwiYCwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spIHtcbiAgICAvLyBfX2Rlc3Ryb3llZCBjbGVhcnMgdGhlIGVsZW1lbnRJRCBmcm9tIHRoZSBob29rLCB0aGVyZWZvcmVcbiAgICAvLyB3ZSBuZWVkIHRvIGdldCBpdCBiZWZvcmUgY2FsbGluZyBfX2Rlc3Ryb3llZFxuICAgIGNvbnN0IGhvb2tJZCA9IFZpZXdIb29rLmVsZW1lbnRJRChob29rLmVsKTtcbiAgICBob29rLl9fZGVzdHJveWVkKCk7XG4gICAgaG9vay5fX2NsZWFudXBfXygpO1xuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tob29rSWRdO1xuICB9XG5cbiAgYXBwbHlQZW5kaW5nVXBkYXRlcygpIHtcbiAgICAvLyBUbyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVyZSB3ZSBtaWdodCBzdGlsbCBiZSBwZW5kaW5nIGEgbmV3XG4gICAgLy8gbmF2aWdhdGlvbiBvciB0aGUgam9pbiBpcyBzdGlsbCBwZW5kaW5nLCBgdGhpcy51cGRhdGVgIHJldHVybnMgZmFsc2VcbiAgICAvLyBpZiB0aGUgZGlmZiB3YXMgbm90IGFwcGxpZWQuXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSB0aGlzLnBlbmRpbmdEaWZmcy5maWx0ZXIoXG4gICAgICAoeyBkaWZmLCBldmVudHMgfSkgPT4gIXRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cywgdHJ1ZSksXG4gICAgKTtcbiAgICB0aGlzLmVhY2hDaGlsZCgoY2hpbGQpID0+IGNoaWxkLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKSk7XG4gIH1cblxuICBlYWNoQ2hpbGQoY2FsbGJhY2spIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLmlkXSB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGlkIGluIGNoaWxkcmVuKSB7XG4gICAgICBjYWxsYmFjayh0aGlzLmdldENoaWxkQnlJZChpZCkpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbm5lbChldmVudCwgY2IpIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgZXZlbnQsIChyZXNwKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0pvaW5QZW5kaW5nKCkpIHtcbiAgICAgICAgLy8gaW4gY2FzZSB0aGlzIGlzIGEgcmVqb2luIChqb2luQ291bnQgPiAxKSB3ZSBzdG9yZSBvdXIgb3duIGpvaW4gb3BzXG4gICAgICAgIGlmICh0aGlzLmpvaW5Db3VudCA+IDEpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdKb2luT3BzLnB1c2goKCkgPT4gY2IocmVzcCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiBjYihyZXNwKV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiBjYihyZXNwKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpIHtcbiAgICAvLyBUaGUgZGlmZiBldmVudCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgcmVndWxhciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAgICAvLyBBbGwgb3RoZXIgb3BlcmF0aW9ucyBhcmUgcXVldWVkIHRvIGJlIGFwcGxpZWQgb25seSBhZnRlciBqb2luLlxuICAgIHRoaXMubGl2ZVNvY2tldC5vbkNoYW5uZWwodGhpcy5jaGFubmVsLCBcImRpZmZcIiwgKHJhd0RpZmYpID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmF3RGlmZiwgKHsgZGlmZiwgZXZlbnRzIH0pID0+XG4gICAgICAgICAgdGhpcy51cGRhdGUoZGlmZiwgZXZlbnRzKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMub25DaGFubmVsKFwicmVkaXJlY3RcIiwgKHsgdG8sIGZsYXNoIH0pID0+XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bywgZmxhc2ggfSksXG4gICAgKTtcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSk7XG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpO1xuICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKChyZWFzb24pID0+IHRoaXMub25FcnJvcihyZWFzb24pKTtcbiAgICB0aGlzLmNoYW5uZWwub25DbG9zZSgocmVhc29uKSA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSk7XG4gIH1cblxuICBkZXN0cm95QWxsQ2hpbGRyZW4oKSB7XG4gICAgdGhpcy5lYWNoQ2hpbGQoKGNoaWxkKSA9PiBjaGlsZC5kZXN0cm95KCkpO1xuICB9XG5cbiAgb25MaXZlUmVkaXJlY3QocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kLCBmbGFzaCB9ID0gcmVkaXI7XG4gICAgY29uc3QgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pO1xuICAgIGNvbnN0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6c2VydmVyLW5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyB0bywga2luZCwgZmxhc2ggfSxcbiAgICB9KTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KGUsIHVybCwga2luZCwgZmxhc2gpO1xuICB9XG5cbiAgb25MaXZlUGF0Y2gocmVkaXIpIHtcbiAgICBjb25zdCB7IHRvLCBraW5kIH0gPSByZWRpcjtcbiAgICB0aGlzLmhyZWYgPSB0aGlzLmV4cGFuZFVSTCh0byk7XG4gICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlQYXRjaCh0bywga2luZCk7XG4gIH1cblxuICBleHBhbmRVUkwodG8pIHtcbiAgICByZXR1cm4gdG8uc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0ke3RvfWBcbiAgICAgIDogdG87XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7dG86IHN0cmluZywgZmxhc2g/OiBzdHJpbmcsIHJlbG9hZFRva2VuPzogc3RyaW5nfX0gcmVkaXJlY3RcbiAgICovXG4gIG9uUmVkaXJlY3QoeyB0bywgZmxhc2gsIHJlbG9hZFRva2VuIH0pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoLCByZWxvYWRUb2tlbik7XG4gIH1cblxuICBpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cblxuICBqb2luRGVhZCgpIHtcbiAgICB0aGlzLmlzRGVhZCA9IHRydWU7XG4gIH1cblxuICBqb2luUHVzaCgpIHtcbiAgICB0aGlzLmpvaW5QdXNoID0gdGhpcy5qb2luUHVzaCB8fCB0aGlzLmNoYW5uZWwuam9pbigpO1xuICAgIHJldHVybiB0aGlzLmpvaW5QdXNoO1xuICB9XG5cbiAgam9pbihjYWxsYmFjaykge1xuICAgIHRoaXMuc2hvd0xvYWRlcih0aGlzLmxpdmVTb2NrZXQubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5iaW5kQ2hhbm5lbCgpO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLnN0b3BDYWxsYmFjayA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe1xuICAgICAgICB0bzogdGhpcy5ocmVmLFxuICAgICAgICBraW5kOiBcImluaXRpYWxcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IChvbkRvbmUpID0+IHtcbiAgICAgIG9uRG9uZSA9IG9uRG9uZSB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgIGNhbGxiYWNrID8gY2FsbGJhY2sodGhpcy5qb2luQ291bnQsIG9uRG9uZSkgOiBvbkRvbmUoKTtcbiAgICB9O1xuXG4gICAgdGhpcy53cmFwUHVzaCgoKSA9PiB0aGlzLmNoYW5uZWwuam9pbigpLCB7XG4gICAgICBvazogKHJlc3ApID0+IHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHRoaXMub25Kb2luKHJlc3ApKSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMub25Kb2luRXJyb3IoZXJyb3IpLFxuICAgICAgdGltZW91dDogKCkgPT4gdGhpcy5vbkpvaW5FcnJvcih7IHJlYXNvbjogXCJ0aW1lb3V0XCIgfSksXG4gICAgfSk7XG4gIH1cblxuICBvbkpvaW5FcnJvcihyZXNwKSB7XG4gICAgaWYgKHJlc3AucmVhc29uID09PSBcInJlbG9hZFwiKSB7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcbiAgICAgICAgYGZhaWxlZCBtb3VudCB3aXRoICR7cmVzcC5zdGF0dXN9LiBGYWxsaW5nIGJhY2sgdG8gcGFnZSByZWxvYWRgLFxuICAgICAgICByZXNwLFxuICAgICAgXSk7XG4gICAgICB0aGlzLm9uUmVkaXJlY3QoeyB0bzogdGhpcy5yb290LmhyZWYsIHJlbG9hZFRva2VuOiByZXNwLnRva2VuIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocmVzcC5yZWFzb24gPT09IFwidW5hdXRob3JpemVkXCIgfHwgcmVzcC5yZWFzb24gPT09IFwic3RhbGVcIikge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgIFwidW5hdXRob3JpemVkIGxpdmVfcmVkaXJlY3QuIEZhbGxpbmcgYmFjayB0byBwYWdlIHJlcXVlc3RcIixcbiAgICAgICAgcmVzcCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5vblJlZGlyZWN0KHsgdG86IHRoaXMucm9vdC5ocmVmLCBmbGFzaDogdGhpcy5mbGFzaCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QgfHwgcmVzcC5saXZlX3JlZGlyZWN0KSB7XG4gICAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNoYW5uZWwubGVhdmUoKTtcbiAgICB9XG4gICAgaWYgKHJlc3AucmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgfVxuICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hYmxlIHRvIGpvaW5cIiwgcmVzcF0pO1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9TRVJWRVJfRVJST1JfQ0xBU1NdLFxuICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5saXZlU29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmpvaW5BdHRlbXB0cyA+PSBNQVhfQ0hJTERfSk9JTl9BVFRFTVBUUykge1xuICAgICAgICAvLyBwdXQgdGhlIHJvb3QgcmV2aWV3IGludG8gcGVybWFuZW50IGVycm9yIHN0YXRlLCBidXQgZG9uJ3QgZGVzdHJveSBpdCBhcyBpdCBjYW4gcmVtYWluIGFjdGl2ZVxuICAgICAgICB0aGlzLnJvb3QuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZXNwLCBlcnJvcktpbmQ6IFwic2VydmVyXCIgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXG4gICAgICAgICAgYGdpdmluZyB1cCB0cnlpbmcgdG8gbW91bnQgYWZ0ZXIgJHtNQVhfQ0hJTERfSk9JTl9BVFRFTVBUU30gdHJpZXNgLFxuICAgICAgICAgIHJlc3AsXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRydWVDaGlsZEVsID0gRE9NLmJ5SWQodGhpcy5lbC5pZCk7XG4gICAgICBpZiAodHJ1ZUNoaWxkRWwpIHtcbiAgICAgICAgRE9NLm1lcmdlQXR0cnModHJ1ZUNoaWxkRWwsIHRoaXMuZWwpO1xuICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcihcbiAgICAgICAgICBbUEhYX0xPQURJTkdfQ0xBU1MsIFBIWF9FUlJPUl9DTEFTUywgUEhYX1NFUlZFUl9FUlJPUl9DTEFTU10sXG4gICAgICAgICAgeyB1bnN0cnVjdHVyZWRFcnJvcjogcmVzcCwgZXJyb3JLaW5kOiBcInNlcnZlclwiIH0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWwgPSB0cnVlQ2hpbGRFbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UocmVhc29uKSB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTWFpbigpICYmXG4gICAgICB0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJlxuICAgICAgcmVhc29uICE9PSBcImxlYXZlXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKTtcbiAgICB0aGlzLmxpdmVTb2NrZXQuZHJvcEFjdGl2ZUVsZW1lbnQodGhpcyk7XG4gICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpIHtcbiAgICAgIHRoaXMuc2hvd0xvYWRlcihCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUKTtcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlYXNvbikge1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pO1xuICAgIGlmICh0aGlzLmxpdmVTb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSkge1xuICAgICAgaWYgKHRoaXMubGl2ZVNvY2tldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yKFxuICAgICAgICAgIFtQSFhfTE9BRElOR19DTEFTUywgUEhYX0VSUk9SX0NMQVNTLCBQSFhfU0VSVkVSX0VSUk9SX0NMQVNTXSxcbiAgICAgICAgICB7IHVuc3RydWN0dXJlZEVycm9yOiByZWFzb24sIGVycm9yS2luZDogXCJzZXJ2ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXJyb3IoXG4gICAgICAgICAgW1BIWF9MT0FESU5HX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MsIFBIWF9DTElFTlRfRVJST1JfQ0xBU1NdLFxuICAgICAgICAgIHsgdW5zdHJ1Y3R1cmVkRXJyb3I6IHJlYXNvbiwgZXJyb3JLaW5kOiBcImNsaWVudFwiIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheUVycm9yKGNsYXNzZXMsIGRldGFpbHMgPSB7fSkge1xuICAgIGlmICh0aGlzLmlzTWFpbigpKSB7XG4gICAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7XG4gICAgICAgIGRldGFpbDogeyB0bzogdGhpcy5ocmVmLCBraW5kOiBcImVycm9yXCIsIC4uLmRldGFpbHMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNob3dMb2FkZXIoKTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyk7XG4gICAgdGhpcy5kZWxheWVkRGlzY29ubmVjdGVkKCk7XG4gIH1cblxuICBkZWxheWVkRGlzY29ubmVjdGVkKCkge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZXhlY0FsbCh0aGlzLmJpbmRpbmcoXCJkaXNjb25uZWN0ZWRcIikpO1xuICAgIH0sIHRoaXMubGl2ZVNvY2tldC5kaXNjb25uZWN0ZWRUaW1lb3V0KTtcbiAgfVxuXG4gIHdyYXBQdXNoKGNhbGxlclB1c2gsIHJlY2VpdmVzKSB7XG4gICAgY29uc3QgbGF0ZW5jeSA9IHRoaXMubGl2ZVNvY2tldC5nZXRMYXRlbmN5U2ltKCk7XG4gICAgY29uc3Qgd2l0aExhdGVuY3kgPSBsYXRlbmN5XG4gICAgICA/IChjYikgPT4gc2V0VGltZW91dCgoKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIGNiKCksIGxhdGVuY3kpXG4gICAgICA6IChjYikgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiBjYigpO1xuXG4gICAgd2l0aExhdGVuY3koKCkgPT4ge1xuICAgICAgY2FsbGVyUHVzaCgpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgKHJlc3ApID0+XG4gICAgICAgICAgd2l0aExhdGVuY3koKCkgPT4gcmVjZWl2ZXMub2sgJiYgcmVjZWl2ZXMub2socmVzcCkpLFxuICAgICAgICApXG4gICAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgKHJlYXNvbikgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy5lcnJvciAmJiByZWNlaXZlcy5lcnJvcihyZWFzb24pKSxcbiAgICAgICAgKVxuICAgICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT5cbiAgICAgICAgICB3aXRoTGF0ZW5jeSgoKSA9PiByZWNlaXZlcy50aW1lb3V0ICYmIHJlY2VpdmVzLnRpbWVvdXQoKSksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5vIGNvbm5lY3Rpb25cIikpO1xuICAgIH1cblxuICAgIGNvbnN0IFtyZWYsIFtlbF0sIG9wdHNdID0gcmVmR2VuZXJhdG9yXG4gICAgICA/IHJlZkdlbmVyYXRvcih7IHBheWxvYWQgfSlcbiAgICAgIDogW251bGwsIFtdLCB7fV07XG4gICAgY29uc3Qgb2xkSm9pbkNvdW50ID0gdGhpcy5qb2luQ291bnQ7XG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBpZiAob3B0cy5wYWdlX2xvYWRpbmcpIHtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtcbiAgICAgICAga2luZDogXCJlbGVtZW50XCIsXG4gICAgICAgIHRhcmdldDogZWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQuY2lkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICBkZWxldGUgcGF5bG9hZC5jaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMud3JhcFB1c2goKCkgPT4gdGhpcy5jaGFubmVsLnB1c2goZXZlbnQsIHBheWxvYWQsIFBVU0hfVElNRU9VVCksIHtcbiAgICAgICAgb2s6IChyZXNwKSA9PiB7XG4gICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0QWNrUmVmID0gcmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaW5pc2ggPSAoaG9va1JlcGx5KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcC5yZWRpcmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcC5saXZlX3BhdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwLmxpdmVfcmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Mb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHJlc3A6IHJlc3AsIHJlcGx5OiBob29rUmVwbHksIHJlZiB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZXNwLmRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseURpZmYoXCJ1cGRhdGVcIiwgcmVzcC5kaWZmLCAoeyBkaWZmLCByZXBseSwgZXZlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZmluaXNoKHJlcGx5KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGF5bG9hZC5ldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5pc2gobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKHJlYXNvbikgPT5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBmYWlsZWQgd2l0aCByZWFzb246ICR7SlNPTi5zdHJpbmdpZnkocmVhc29uKX1gKSksXG4gICAgICAgIHRpbWVvdXQ6ICgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidGltZW91dFwiKSk7XG4gICAgICAgICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSBvbGRKb2luQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2coXCJ0aW1lb3V0XCIsICgpID0+IFtcbiAgICAgICAgICAgICAgICBcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIixcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuZG9SZWZzKHJlZiwgcGh4RXZlbnQsIG9ubHlFbHMpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZXhpdCBpZiBleHRlcm5hbCBmb3JtIHRyaWdnZXJlZFxuICAgIGNvbnN0IHNlbGVjdG9yID0gYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gO1xuXG4gICAgaWYgKG9ubHlFbHMpIHtcbiAgICAgIG9ubHlFbHMgPSBuZXcgU2V0KG9ubHlFbHMpO1xuICAgICAgRE9NLmFsbChkb2N1bWVudCwgc2VsZWN0b3IsIChwYXJlbnQpID0+IHtcbiAgICAgICAgaWYgKG9ubHlFbHMgJiYgIW9ubHlFbHMuaGFzKHBhcmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5kbyBhbnkgY2hpbGQgcmVmcyB3aXRoaW4gcGFyZW50IGZpcnN0XG4gICAgICAgIERPTS5hbGwocGFyZW50LCBzZWxlY3RvciwgKGNoaWxkKSA9PlxuICAgICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51bmRvRWxSZWYocGFyZW50LCByZWYsIHBoeEV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBET00uYWxsKGRvY3VtZW50LCBzZWxlY3RvciwgKGVsKSA9PiB0aGlzLnVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHVuZG9FbFJlZihlbCwgcmVmLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGVsUmVmID0gbmV3IEVsZW1lbnRSZWYoZWwpO1xuXG4gICAgZWxSZWYubWF5YmVVbmRvKHJlZiwgcGh4RXZlbnQsIChjbG9uZWRUcmVlKSA9PiB7XG4gICAgICAvLyB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBmdWxsIHBhdGNoIG9uIHVubG9ja2VkIGVsZW1lbnRzXG4gICAgICAvLyB0byBwZXJmb3JtIGFsbCB0aGUgbmVjZXNzYXJ5IGxvZ2ljIChsaWtlIGNhbGxpbmcgdXBkYXRlZCBmb3IgaG9va3MsIGV0Yy4pXG4gICAgICBjb25zdCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCBlbCwgdGhpcy5pZCwgY2xvbmVkVHJlZSwgW10sIG51bGwsIHtcbiAgICAgICAgdW5kb1JlZjogcmVmLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpO1xuICAgICAgRE9NLmFsbChlbCwgYFske1BIWF9SRUZfU1JDfT1cIiR7dGhpcy5yZWZTcmMoKX1cIl1gLCAoY2hpbGQpID0+XG4gICAgICAgIHRoaXMudW5kb0VsUmVmKGNoaWxkLCByZWYsIHBoeEV2ZW50KSxcbiAgICAgICk7XG4gICAgICBpZiAocGh4Q2hpbGRyZW5BZGRlZCkge1xuICAgICAgICB0aGlzLmpvaW5OZXdDaGlsZHJlbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVmU3JjKCkge1xuICAgIHJldHVybiB0aGlzLmVsLmlkO1xuICB9XG5cbiAgcHV0UmVmKGVsZW1lbnRzLCBwaHhFdmVudCwgZXZlbnRUeXBlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBuZXdSZWYgPSB0aGlzLnJlZisrO1xuICAgIGNvbnN0IGRpc2FibGVXaXRoID0gdGhpcy5iaW5kaW5nKFBIWF9ESVNBQkxFX1dJVEgpO1xuICAgIGlmIChvcHRzLmxvYWRpbmcpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdFbHMgPSBET00uYWxsKGRvY3VtZW50LCBvcHRzLmxvYWRpbmcpLm1hcCgoZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZWwsIGxvY2s6IHRydWUsIGxvYWRpbmc6IHRydWUgfTtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudHMgPSBlbGVtZW50cy5jb25jYXQobG9hZGluZ0Vscyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7IGVsLCBsb2NrLCBsb2FkaW5nIH0gb2YgZWxlbWVudHMpIHtcbiAgICAgIGlmICghbG9jayAmJiAhbG9hZGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwdXRSZWYgcmVxdWlyZXMgbG9jayBvciBsb2FkaW5nXCIpO1xuICAgICAgfVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQURJTkcsIG5ld1JlZik7XG4gICAgICB9XG4gICAgICBpZiAobG9jaykge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRl9MT0NLLCBuZXdSZWYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICFsb2FkaW5nIHx8XG4gICAgICAgIChvcHRzLnN1Ym1pdHRlciAmJiAhKGVsID09PSBvcHRzLnN1Ym1pdHRlciB8fCBlbCA9PT0gb3B0cy5mb3JtKSlcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9ja0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoYHBoeDp1bmRvLWxvY2s6JHtuZXdSZWZ9YCwgKCkgPT4gcmVzb2x2ZShkZXRhaWwpLCB7XG4gICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbG9hZGluZ0NvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgYHBoeDp1bmRvLWxvYWRpbmc6JHtuZXdSZWZ9YCxcbiAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgeyBvbmNlOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgZWwuY2xhc3NMaXN0LmFkZChgcGh4LSR7ZXZlbnRUeXBlfS1sb2FkaW5nYCk7XG4gICAgICBjb25zdCBkaXNhYmxlVGV4dCA9IGVsLmdldEF0dHJpYnV0ZShkaXNhYmxlV2l0aCk7XG4gICAgICBpZiAoZGlzYWJsZVRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKSkge1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVUZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUEhYX0RJU0FCTEVEIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBpbiBkaXNhYmxlRm9ybVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgUEhYX0RJU0FCTEVELFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpIHx8IGVsLmRpc2FibGVkLFxuICAgICAgICApO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGV0YWlsID0ge1xuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICByZWY6IG5ld1JlZixcbiAgICAgICAgaXNMb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBpc0xvY2tlZDogbG9jayxcbiAgICAgICAgbG9ja0VsZW1lbnRzOiBlbGVtZW50cy5maWx0ZXIoKHsgbG9jayB9KSA9PiBsb2NrKS5tYXAoKHsgZWwgfSkgPT4gZWwpLFxuICAgICAgICBsb2FkaW5nRWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgICAgLmZpbHRlcigoeyBsb2FkaW5nIH0pID0+IGxvYWRpbmcpXG4gICAgICAgICAgLm1hcCgoeyBlbCB9KSA9PiBlbCksXG4gICAgICAgIHVubG9jazogKGVscykgPT4ge1xuICAgICAgICAgIGVscyA9IEFycmF5LmlzQXJyYXkoZWxzKSA/IGVscyA6IFtlbHNdO1xuICAgICAgICAgIHRoaXMudW5kb1JlZnMobmV3UmVmLCBwaHhFdmVudCwgZWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9ja0NvbXBsZXRlOiBsb2NrQ29tcGxldGVQcm9taXNlLFxuICAgICAgICBsb2FkaW5nQ29tcGxldGU6IGxvYWRpbmdDb21wbGV0ZVByb21pc2UsXG4gICAgICAgIGxvY2s6IChsb2NrRWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWNrZWQobmV3UmVmKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZXRhaWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9ja0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGX0xPQ0ssIG5ld1JlZik7XG4gICAgICAgICAgICBsb2NrRWwuc2V0QXR0cmlidXRlKFBIWF9SRUZfU1JDLCB0aGlzLnJlZlNyYygpKTtcbiAgICAgICAgICAgIGxvY2tFbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBgcGh4OmxvY2stc3RvcDoke25ld1JlZn1gLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKGRldGFpbCksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0cy5wYXlsb2FkKSB7XG4gICAgICAgIGRldGFpbFtcInBheWxvYWRcIl0gPSBvcHRzLnBheWxvYWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy50YXJnZXQpIHtcbiAgICAgICAgZGV0YWlsW1widGFyZ2V0XCJdID0gb3B0cy50YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgIGRldGFpbFtcIm9yaWdpbmFsRXZlbnRcIl0gPSBvcHRzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB9XG4gICAgICBlbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJwaHg6cHVzaFwiLCB7XG4gICAgICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKHBoeEV2ZW50KSB7XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGBwaHg6cHVzaDoke3BoeEV2ZW50fWAsIHtcbiAgICAgICAgICAgIGRldGFpbDogZGV0YWlsLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25ld1JlZiwgZWxlbWVudHMubWFwKCh7IGVsIH0pID0+IGVsKSwgb3B0c107XG4gIH1cblxuICBpc0Fja2VkKHJlZikge1xuICAgIHJldHVybiB0aGlzLmxhc3RBY2tSZWYgIT09IG51bGwgJiYgdGhpcy5sYXN0QWNrUmVmID49IHJlZjtcbiAgfVxuXG4gIGNvbXBvbmVudElEKGVsKSB7XG4gICAgY29uc3QgY2lkID0gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKTtcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGw7XG4gIH1cblxuICB0YXJnZXRDb21wb25lbnRJRCh0YXJnZXQsIHRhcmdldEN0eCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRDdHg7XG4gICAgfVxuXG4gICAgY29uc3QgY2lkT3JTZWxlY3RvciA9XG4gICAgICBvcHRzLnRhcmdldCB8fCB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSk7XG4gICAgaWYgKGlzQ2lkKGNpZE9yU2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY2lkT3JTZWxlY3Rvcik7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRDdHggJiYgKGNpZE9yU2VsZWN0b3IgIT09IG51bGwgfHwgb3B0cy50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eCkge1xuICAgIGlmIChpc0NpZCh0YXJnZXRDdHgpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0Q3R4O1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0Q3R4KSB7XG4gICAgICByZXR1cm4gbWF5YmUoXG4gICAgICAgIHRhcmdldEN0eC5jbG9zZXN0KGBbJHtQSFhfQ09NUE9ORU5UfV1gKSxcbiAgICAgICAgKGVsKSA9PiB0aGlzLm93bnNFbGVtZW50KGVsKSAmJiB0aGlzLmNvbXBvbmVudElEKGVsKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQoZWwsIHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQpIHtcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sb2coXCJob29rXCIsICgpID0+IFtcbiAgICAgICAgXCJ1bmFibGUgdG8gcHVzaCBob29rIGV2ZW50LiBMaXZlVmlldyBub3QgY29ubmVjdGVkXCIsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcInVuYWJsZSB0byBwdXNoIGhvb2sgZXZlbnQuIExpdmVWaWV3IG5vdCBjb25uZWN0ZWRcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZkdlbmVyYXRvciA9ICgpID0+XG4gICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgZXZlbnQsIFwiaG9va1wiLCB7XG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0Q3R4LFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICB0eXBlOiBcImhvb2tcIixcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIHZhbHVlOiBwYXlsb2FkLFxuICAgICAgY2lkOiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpLFxuICAgIH0pLnRoZW4oKHsgcmVzcDogX3Jlc3AsIHJlcGx5LCByZWYgfSkgPT4gKHsgcmVwbHksIHJlZiB9KSk7XG4gIH1cblxuICBleHRyYWN0TWV0YShlbCwgbWV0YSwgdmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLmJpbmRpbmcoXCJ2YWx1ZS1cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgbWV0YSA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgbmFtZSA9IGVsLmF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBtZXRhW25hbWUucmVwbGFjZShwcmVmaXgsIFwiXCIpXSA9IGVsLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShlbCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcbiAgICAgIGlmICghbWV0YSkge1xuICAgICAgICBtZXRhID0ge307XG4gICAgICB9XG4gICAgICBtZXRhLnZhbHVlID0gZWwudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmXG4gICAgICAgIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwICYmXG4gICAgICAgICFlbC5jaGVja2VkXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIG1ldGEudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgIG1ldGEgPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIG1ldGFba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXRhO1xuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhLCBvcHRzID0ge30sIG9uUmVwbHkpIHtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoXG4gICAgICAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgICB0aGlzLnB1dFJlZihbeyBlbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9XSwgcGh4RXZlbnQsIHR5cGUsIHtcbiAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgIHBheWxvYWQ6IG1heWJlUGF5bG9hZD8ucGF5bG9hZCxcbiAgICAgICAgfSksXG4gICAgICBcImV2ZW50XCIsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IHRoaXMuZXh0cmFjdE1ldGEoZWwsIG1ldGEsIG9wdHMudmFsdWUpLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoZWwsIHRhcmdldEN0eCwgb3B0cyksXG4gICAgICB9LFxuICAgIClcbiAgICAgIC50aGVuKCh7IHJlcGx5IH0pID0+IG9uUmVwbHkgJiYgb25SZXBseShyZXBseSkpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICBwdXNoRmlsZVByb2dyZXNzKGZpbGVFbCwgZW50cnlSZWYsIHByb2dyZXNzLCBvblJlcGx5ID0gZnVuY3Rpb24gKCkge30pIHtcbiAgICB0aGlzLmxpdmVTb2NrZXQud2l0aGluT3duZXJzKGZpbGVFbC5mb3JtLCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICB2aWV3XG4gICAgICAgIC5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICAgIGV2ZW50OiBmaWxlRWwuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhQSFhfUFJPR1JFU1MpKSxcbiAgICAgICAgICByZWY6IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgICAgcHJvZ3Jlc3M6IHByb2dyZXNzLFxuICAgICAgICAgIGNpZDogdmlldy50YXJnZXRDb21wb25lbnRJRChmaWxlRWwuZm9ybSwgdGFyZ2V0Q3R4KSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gb25SZXBseSgpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGZpbGUgcHJvZ3Jlc3NcIiwgZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hJbnB1dChpbnB1dEVsLCB0YXJnZXRDdHgsIGZvcmNlQ2lkLCBwaHhFdmVudCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBpZiAoIWlucHV0RWwuZm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybSBldmVudHMgcmVxdWlyZSB0aGUgaW5wdXQgdG8gYmUgaW5zaWRlIGEgZm9ybVwiKTtcbiAgICB9XG5cbiAgICBsZXQgdXBsb2FkcztcbiAgICBjb25zdCBjaWQgPSBpc0NpZChmb3JjZUNpZClcbiAgICAgID8gZm9yY2VDaWRcbiAgICAgIDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCwgb3B0cyk7XG4gICAgY29uc3QgcmVmR2VuZXJhdG9yID0gKG1heWJlUGF5bG9hZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFxuICAgICAgICBbXG4gICAgICAgICAgeyBlbDogaW5wdXRFbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICAgIHsgZWw6IGlucHV0RWwuZm9ybSwgbG9hZGluZzogdHJ1ZSwgbG9jazogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgeyAuLi5vcHRzLCBwYXlsb2FkOiBtYXliZVBheWxvYWQ/LnBheWxvYWQgfSxcbiAgICAgICk7XG4gICAgfTtcbiAgICBsZXQgZm9ybURhdGE7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoaW5wdXRFbC5mb3JtLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplT3B0cyA9IHt9O1xuICAgIGlmIChpbnB1dEVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIHNlcmlhbGl6ZU9wdHMuc3VibWl0dGVyID0gaW5wdXRFbDtcbiAgICB9XG4gICAgaWYgKGlucHV0RWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSkpIHtcbiAgICAgIGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShpbnB1dEVsLmZvcm0sIHNlcmlhbGl6ZU9wdHMsIFtpbnB1dEVsLm5hbWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwgc2VyaWFsaXplT3B0cyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmXG4gICAgICBpbnB1dEVsLmZpbGVzICYmXG4gICAgICBpbnB1dEVsLmZpbGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpO1xuICAgIH1cbiAgICB1cGxvYWRzID0gTGl2ZVVwbG9hZGVyLnNlcmlhbGl6ZVVwbG9hZHMoaW5wdXRFbCk7XG5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgbWV0YToge1xuICAgICAgICAvLyBubyB0YXJnZXQgd2FzIGltcGxpY2l0bHkgc2VudCBhcyBcInVuZGVmaW5lZFwiIGluIExWIDw9IDEuMC41LCB0aGVyZWZvcmVcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBrZWVwIGl0LiBJbiAxLjAuNiB3ZSBzd2l0Y2hlZCBmcm9tIHBhc3NpbmcgbWV0YSBhcyBVUkwgZW5jb2RlZCBkYXRhXG4gICAgICAgIC8vIHRvIHBhc3NpbmcgaXQgZGlyZWN0bHkgaW4gdGhlIGV2ZW50LCBidXQgdGhlIEpTT04gZW5jb2RlIHdvdWxkIGRyb3Aga2V5cyB3aXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZCB2YWx1ZXMuXG4gICAgICAgIF90YXJnZXQ6IG9wdHMuX3RhcmdldCB8fCBcInVuZGVmaW5lZFwiLFxuICAgICAgICAuLi5tZXRhLFxuICAgICAgfSxcbiAgICAgIHVwbG9hZHM6IHVwbG9hZHMsXG4gICAgICBjaWQ6IGNpZCxcbiAgICB9O1xuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQpXG4gICAgICAudGhlbigoeyByZXNwIH0pID0+IHtcbiAgICAgICAgaWYgKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIERPTS5pc0F1dG9VcGxvYWQoaW5wdXRFbCkpIHtcbiAgICAgICAgICAvLyB0aGUgZWxlbWVudCBjb3VsZCBiZSBpbnNpZGUgYSBsb2NrZWQgcGFyZW50IGZvciBvdGhlciB1bnJlbGF0ZWQgY2hhbmdlcztcbiAgICAgICAgICAvLyB3ZSBjYW4gb25seSBzdGFydCB1cGxvYWRzIHdoZW4gdGhlIHRyZWUgaXMgdW5sb2NrZWQgYW5kIHRoZVxuICAgICAgICAgIC8vIG5lY2Vzc2FyeSBkYXRhIGF0dHJpYnV0ZXMgYXJlIHNldCBpbiB0aGUgcmVhbCBET01cbiAgICAgICAgICBFbGVtZW50UmVmLm9uVW5sb2NrKGlucHV0RWwsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICAgICAgICAgIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCwgW2lucHV0RWwuZm9ybV0pO1xuICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKFxuICAgICAgICAgICAgICAgIGlucHV0RWwuZm9ybSxcbiAgICAgICAgICAgICAgICBwaHhFdmVudCxcbiAgICAgICAgICAgICAgICB0YXJnZXRDdHgsXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIGNpZCxcbiAgICAgICAgICAgICAgICAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQXdhaXRpbmdTdWJtaXQoaW5wdXRFbC5mb3JtLCBwaHhFdmVudCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGlucHV0IGV2ZW50XCIsIGVycm9yKSk7XG4gIH1cblxuICB0cmlnZ2VyQXdhaXRpbmdTdWJtaXQoZm9ybUVsLCBwaHhFdmVudCkge1xuICAgIGNvbnN0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKTtcbiAgICBpZiAoYXdhaXRpbmdTdWJtaXQpIHtcbiAgICAgIGNvbnN0IFtfZWwsIF9yZWYsIF9vcHRzLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdDtcbiAgICAgIHRoaXMuY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pdHMuZmluZCgoW2VsLCBfcmVmLCBfb3B0cywgX2NhbGxiYWNrXSkgPT5cbiAgICAgIGVsLmlzU2FtZU5vZGUoZm9ybUVsKSxcbiAgICApO1xuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuZ2V0U2NoZWR1bGVkU3VibWl0KGZvcm1FbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmZvcm1TdWJtaXRzLnB1c2goW2Zvcm1FbCwgcmVmLCBvcHRzLCBjYWxsYmFja10pO1xuICB9XG5cbiAgY2FuY2VsU3VibWl0KGZvcm1FbCwgcGh4RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gdGhpcy5mb3JtU3VibWl0cy5maWx0ZXIoXG4gICAgICAoW2VsLCByZWYsIF9vcHRzLCBfY2FsbGJhY2tdKSA9PiB7XG4gICAgICAgIGlmIChlbC5pc1NhbWVOb2RlKGZvcm1FbCkpIHtcbiAgICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZiwgcGh4RXZlbnQpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZGlzYWJsZUZvcm0oZm9ybUVsLCBwaHhFdmVudCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZmlsdGVySWdub3JlZCA9IChlbCkgPT4ge1xuICAgICAgY29uc3QgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhcbiAgICAgICAgZWwsXG4gICAgICAgIGAke3RoaXMuYmluZGluZyhQSFhfVVBEQVRFKX09aWdub3JlYCxcbiAgICAgICAgZWwuZm9ybSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgdXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKVxuICAgICAgKTtcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlckRpc2FibGVzID0gKGVsKSA9PiB7XG4gICAgICByZXR1cm4gZWwuaGFzQXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKSk7XG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJCdXR0b24gPSAoZWwpID0+IGVsLnRhZ05hbWUgPT0gXCJCVVRUT05cIjtcblxuICAgIGNvbnN0IGZpbHRlcklucHV0ID0gKGVsKSA9PlxuICAgICAgW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiLCBcIlNFTEVDVFwiXS5pbmNsdWRlcyhlbC50YWdOYW1lKTtcblxuICAgIGNvbnN0IGZvcm1FbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsLmVsZW1lbnRzKTtcbiAgICBjb25zdCBkaXNhYmxlcyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVyRGlzYWJsZXMpO1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpO1xuICAgIGNvbnN0IGlucHV0cyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVySW5wdXQpLmZpbHRlcihmaWx0ZXJJZ25vcmVkKTtcblxuICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKTtcbiAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSk7XG4gICAgICBpbnB1dC5yZWFkT25seSA9IHRydWU7XG4gICAgICBpZiAoaW5wdXQuZmlsZXMpIHtcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgaW5wdXQuZGlzYWJsZWQpO1xuICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZm9ybUVscyA9IGRpc2FibGVzXG4gICAgICAuY29uY2F0KGJ1dHRvbnMpXG4gICAgICAuY29uY2F0KGlucHV0cylcbiAgICAgIC5tYXAoKGVsKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGVsLCBsb2FkaW5nOiB0cnVlLCBsb2NrOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgIC8vIHdlIHJldmVyc2UgdGhlIG9yZGVyIHNvIGZvcm0gY2hpbGRyZW4gYXJlIGFscmVhZHkgbG9ja2VkIGJ5IHRoZSB0aW1lXG4gICAgLy8gdGhlIGZvcm0gaXMgbG9ja2VkXG4gICAgY29uc3QgZWxzID0gW3sgZWw6IGZvcm1FbCwgbG9hZGluZzogdHJ1ZSwgbG9jazogZmFsc2UgfV1cbiAgICAgIC5jb25jYXQoZm9ybUVscylcbiAgICAgIC5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHRoaXMucHV0UmVmKGVscywgcGh4RXZlbnQsIFwic3VibWl0XCIsIG9wdHMpO1xuICB9XG5cbiAgcHVzaEZvcm1TdWJtaXQoZm9ybUVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBzdWJtaXR0ZXIsIG9wdHMsIG9uUmVwbHkpIHtcbiAgICBjb25zdCByZWZHZW5lcmF0b3IgPSAobWF5YmVQYXlsb2FkKSA9PlxuICAgICAgdGhpcy5kaXNhYmxlRm9ybShmb3JtRWwsIHBoeEV2ZW50LCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGZvcm06IGZvcm1FbCxcbiAgICAgICAgcGF5bG9hZDogbWF5YmVQYXlsb2FkPy5wYXlsb2FkLFxuICAgICAgICBzdWJtaXR0ZXI6IHN1Ym1pdHRlcixcbiAgICAgIH0pO1xuICAgIC8vIHN0b3JlIHRoZSBzdWJtaXR0ZXIgaW4gdGhlIGZvcm0gZWxlbWVudCBpbiBvcmRlciB0byB0cmlnZ2VyIGl0XG4gICAgLy8gZm9yIHBoeC10cmlnZ2VyLWFjdGlvblxuICAgIERPTS5wdXRQcml2YXRlKGZvcm1FbCwgXCJzdWJtaXR0ZXJcIiwgc3VibWl0dGVyKTtcbiAgICBjb25zdCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KTtcbiAgICBpZiAoTGl2ZVVwbG9hZGVyLmhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCkpIHtcbiAgICAgIGNvbnN0IFtyZWYsIF9lbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwdXNoID0gKCkgPT5cbiAgICAgICAgdGhpcy5wdXNoRm9ybVN1Ym1pdChcbiAgICAgICAgICBmb3JtRWwsXG4gICAgICAgICAgdGFyZ2V0Q3R4LFxuICAgICAgICAgIHBoeEV2ZW50LFxuICAgICAgICAgIHN1Ym1pdHRlcixcbiAgICAgICAgICBvcHRzLFxuICAgICAgICAgIG9uUmVwbHksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgb3B0cywgcHVzaCk7XG4gICAgfSBlbHNlIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKCk7XG4gICAgICBjb25zdCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVscywgb3B0c107XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIChfdXBsb2FkcykgPT4ge1xuICAgICAgICAvLyBpZiB3ZSBzdGlsbCBoYXZpbmcgcGVuZGluZyBwcmVmbGlnaHRzIGl0IG1lYW5zIHdlIGhhdmUgaW52YWxpZCBlbnRyaWVzXG4gICAgICAgIC8vIGFuZCB0aGUgcGh4LXN1Ym1pdCBjYW5ub3QgYmUgY29tcGxldGVkXG4gICAgICAgIGlmIChMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudW5kb1JlZnMocmVmLCBwaHhFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZXh0cmFjdE1ldGEoZm9ybUVsLCB7fSwgb3B0cy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHsgc3VibWl0dGVyIH0pO1xuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgbWV0YTogbWV0YSxcbiAgICAgICAgICBjaWQ6IGNpZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoeyByZXNwIH0pID0+IG9uUmVwbHkocmVzcCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICEoXG4gICAgICAgIGZvcm1FbC5oYXNBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpICYmXG4gICAgICAgIGZvcm1FbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwaHgtc3VibWl0LWxvYWRpbmdcIilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmV4dHJhY3RNZXRhKGZvcm1FbCwge30sIG9wdHMudmFsdWUpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGZvcm1FbCwgeyBzdWJtaXR0ZXIgfSk7XG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocmVmR2VuZXJhdG9yLCBcImV2ZW50XCIsIHtcbiAgICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgICBtZXRhOiBtZXRhLFxuICAgICAgICBjaWQ6IGNpZCxcbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4gb25SZXBseShyZXNwKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3IoXCJGYWlsZWQgdG8gcHVzaCBmb3JtIHN1Ym1pdFwiLCBlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIHVwbG9hZEZpbGVzKGZvcm1FbCwgcGh4RXZlbnQsIHRhcmdldEN0eCwgcmVmLCBjaWQsIG9uQ29tcGxldGUpIHtcbiAgICBjb25zdCBqb2luQ291bnRBdFVwbG9hZCA9IHRoaXMuam9pbkNvdW50O1xuICAgIGNvbnN0IGlucHV0RWxzID0gTGl2ZVVwbG9hZGVyLmFjdGl2ZUZpbGVJbnB1dHMoZm9ybUVsKTtcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGg7XG5cbiAgICAvLyBnZXQgZWFjaCBmaWxlIGlucHV0XG4gICAgaW5wdXRFbHMuZm9yRWFjaCgoaW5wdXRFbCkgPT4ge1xuICAgICAgY29uc3QgdXBsb2FkZXIgPSBuZXcgTGl2ZVVwbG9hZGVyKGlucHV0RWwsIHRoaXMsICgpID0+IHtcbiAgICAgICAgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MtLTtcbiAgICAgICAgaWYgKG51bUZpbGVJbnB1dHNJblByb2dyZXNzID09PSAwKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW50cmllcyA9IHVwbG9hZGVyXG4gICAgICAgIC5lbnRyaWVzKClcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnRvUHJlZmxpZ2h0UGF5bG9hZCgpKTtcblxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcmVmOiBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXMsXG4gICAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmxvZyhcInVwbG9hZFwiLCAoKSA9PiBbXCJzZW5kaW5nIHByZWZsaWdodCByZXF1ZXN0XCIsIHBheWxvYWRdKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiYWxsb3dfdXBsb2FkXCIsIHBheWxvYWQpXG4gICAgICAgIC50aGVuKCh7IHJlc3AgfSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcImdvdCBwcmVmbGlnaHQgcmVzcG9uc2VcIiwgcmVzcF0pO1xuICAgICAgICAgIC8vIHRoZSBwcmVmbGlnaHQgd2lsbCByZWplY3QgZW50cmllcyBiZXlvbmQgdGhlIG1heCBlbnRyaWVzXG4gICAgICAgICAgLy8gc28gd2UgZXJyb3IgYW5kIGNhbmNlbCBlbnRyaWVzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3AuZW50cmllcyAmJiAhcmVzcC5lbnRyaWVzW2VudHJ5LnJlZl0pIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodChcbiAgICAgICAgICAgICAgICBlbnRyeS5yZWYsXG4gICAgICAgICAgICAgICAgXCJmYWlsZWQgcHJlZmxpZ2h0XCIsXG4gICAgICAgICAgICAgICAgdXBsb2FkZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gZm9yIGF1dG8gdXBsb2Fkcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgZW50cmllcyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyBmb3IgZm9ybSBzdWJtaXRzIHRoYXQgY29udGFpbiBpbnZhbGlkIGVudHJpZXNcbiAgICAgICAgICBpZiAocmVzcC5lcnJvciB8fCBPYmplY3Qua2V5cyhyZXNwLmVudHJpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYsIHBoeEV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3AuZXJyb3IgfHwgW107XG4gICAgICAgICAgICBlcnJvcnMubWFwKChbZW50cnlfcmVmLCByZWFzb25dKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmFpbGVkRW50cnlQcmVmbGlnaHQoZW50cnlfcmVmLCByZWFzb24sIHVwbG9hZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvbkVycm9yID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5vbkVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qb2luQ291bnQgPT09IGpvaW5Db3VudEF0VXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdXBsb2FkZXIuaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgdGhpcy5saXZlU29ja2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKFwiRmFpbGVkIHRvIHB1c2ggdXBsb2FkXCIsIGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVGYWlsZWRFbnRyeVByZWZsaWdodCh1cGxvYWRSZWYsIHJlYXNvbiwgdXBsb2FkZXIpIHtcbiAgICBpZiAodXBsb2FkZXIuaXNBdXRvVXBsb2FkKCkpIHtcbiAgICAgIC8vIHVwbG9hZFJlZiBtYXkgYmUgdG9wIGxldmVsIHVwbG9hZCBjb25maWcgcmVmIG9yIGVudHJ5IHJlZlxuICAgICAgY29uc3QgZW50cnkgPSB1cGxvYWRlclxuICAgICAgICAuZW50cmllcygpXG4gICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkucmVmID09PSB1cGxvYWRSZWYudG9TdHJpbmcoKSk7XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwbG9hZGVyLmVudHJpZXMoKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtgZXJyb3IgZm9yIGVudHJ5ICR7dXBsb2FkUmVmfWAsIHJlYXNvbl0pO1xuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKHRhcmdldEN0eCwgbmFtZSwgZmlsZXNPckJsb2JzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRoaXMudGFyZ2V0Q3R4RWxlbWVudCh0YXJnZXRDdHgpIHx8IHRoaXMuZWw7XG4gICAgY29uc3QgaW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHModGFyZ2V0RWxlbWVudCkuZmlsdGVyKFxuICAgICAgKGVsKSA9PiBlbC5uYW1lID09PSBuYW1lLFxuICAgICk7XG4gICAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0Vycm9yKGBubyBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KGlucHV0c1swXSwgUEhYX1RSQUNLX1VQTE9BRFMsIHtcbiAgICAgICAgZGV0YWlsOiB7IGZpbGVzOiBmaWxlc09yQmxvYnMgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldEN0eEVsZW1lbnQodGFyZ2V0Q3R4KSB7XG4gICAgaWYgKGlzQ2lkKHRhcmdldEN0eCkpIHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmlkLCB0YXJnZXRDdHgpO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldEN0eCkge1xuICAgICAgcmV0dXJuIHRhcmdldEN0eDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVzaEZvcm1SZWNvdmVyeShvbGRGb3JtLCBuZXdGb3JtLCB0ZW1wbGF0ZURvbSwgY2FsbGJhY2spIHtcbiAgICAvLyB3ZSBhcmUgb25seSByZWNvdmVyaW5nIGZvcm1zIGluc2lkZSB0aGUgY3VycmVudCB2aWV3LCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0b1xuICAgIC8vIHNraXAgd2l0aGluT3duZXJzIGhlcmUgYW5kIGFsd2F5cyB1c2UgdGhpcyB3aGVuIHJlZmVycmluZyB0byB0aGUgdmlld1xuICAgIGNvbnN0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKTtcbiAgICBjb25zdCBwaHhUYXJnZXQgPSBuZXdGb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpIHx8IG5ld0Zvcm07XG4gICAgY29uc3QgcGh4RXZlbnQgPVxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9BVVRPX1JFQ09WRVIpKSB8fFxuICAgICAgbmV3Rm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICBjb25zdCBpbnB1dHMgPSBBcnJheS5mcm9tKG9sZEZvcm0uZWxlbWVudHMpLmZpbHRlcihcbiAgICAgIChlbCkgPT4gRE9NLmlzRm9ybUlucHV0KGVsKSAmJiBlbC5uYW1lICYmICFlbC5oYXNBdHRyaWJ1dGUocGh4Q2hhbmdlKSxcbiAgICApO1xuICAgIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIG11c3QgY2xlYXIgdHJhY2tlZCB1cGxvYWRzIGJlZm9yZSByZWNvdmVyeSBhcyB0aGV5IG5vIGxvbmdlciBoYXZlIHZhbGlkIHJlZnNcbiAgICBpbnB1dHMuZm9yRWFjaChcbiAgICAgIChpbnB1dCkgPT5cbiAgICAgICAgaW5wdXQuaGFzQXR0cmlidXRlKFBIWF9VUExPQURfUkVGKSAmJiBMaXZlVXBsb2FkZXIuY2xlYXJGaWxlcyhpbnB1dCksXG4gICAgKTtcbiAgICAvLyBwdXNoSW5wdXQgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgc291cmNlIGVsZW1lbnQgdGhhdCBpbml0aWF0ZWQgdGhlIGNoYW5nZTtcbiAgICAvLyBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBjYXNlIHdoZW4gd2UgcmVjb3ZlciBmb3Jtcywgd2UgcHJvdmlkZSB0aGUgZmlyc3QgaW5wdXQgd2UgZmluZFxuICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzLmZpbmQoKGVsKSA9PiBlbC50eXBlICE9PSBcImhpZGRlblwiKSB8fCBpbnB1dHNbMF07XG5cbiAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSB0YXJnZXRzLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVjb3ZlcnkgZXZlbnRzXG4gICAgLy8gYW5kIG9ubHkgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSBhbGwgZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICBsZXQgcGVuZGluZyA9IDA7XG4gICAgLy8gd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrLCBkb20sIHZpZXdFbClcbiAgICB0aGlzLndpdGhpblRhcmdldHMoXG4gICAgICBwaHhUYXJnZXQsXG4gICAgICAodGFyZ2V0VmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpZCA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQobmV3Rm9ybSwgdGFyZ2V0Q3R4KTtcbiAgICAgICAgcGVuZGluZysrO1xuICAgICAgICBsZXQgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpmb3JtLXJlY292ZXJ5XCIsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgc291cmNlRWxlbWVudDogb2xkRm9ybSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdGhpcywgaW5wdXQsIFtcbiAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGFyZ2V0OiBpbnB1dC5uYW1lLFxuICAgICAgICAgICAgdGFyZ2V0VmlldyxcbiAgICAgICAgICAgIHRhcmdldEN0eCxcbiAgICAgICAgICAgIG5ld0NpZDogY2lkLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgdGVtcGxhdGVEb20sXG4gICAgKTtcbiAgfVxuXG4gIHB1c2hMaW5rUGF0Y2goZSwgaHJlZiwgdGFyZ2V0RWwsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbGlua1JlZiA9IHRoaXMubGl2ZVNvY2tldC5zZXRQZW5kaW5nTGluayhocmVmKTtcbiAgICAvLyBvbmx5IGFkZCBsb2FkaW5nIHN0YXRlcyBpZiBldmVudCBpcyB0cnVzdGVkIChpdCB3YXMgdHJpZ2dlcmVkIGJ5IHVzZXIsIHN1Y2ggYXMgY2xpY2spIGFuZFxuICAgIC8vIGl0J3Mgbm90IGEgZm9yd2FyZC9iYWNrIG5hdmlnYXRpb24gZnJvbSBwb3BzdGF0ZVxuICAgIGNvbnN0IGxvYWRpbmcgPSBlLmlzVHJ1c3RlZCAmJiBlLnR5cGUgIT09IFwicG9wc3RhdGVcIjtcbiAgICBjb25zdCByZWZHZW4gPSB0YXJnZXRFbFxuICAgICAgPyAoKSA9PlxuICAgICAgICAgIHRoaXMucHV0UmVmKFxuICAgICAgICAgICAgW3sgZWw6IHRhcmdldEVsLCBsb2FkaW5nOiBsb2FkaW5nLCBsb2NrOiB0cnVlIH1dLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmFsbGJhY2sgPSAoKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGNvbnN0IHVybCA9IGhyZWYuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgID8gYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3R9JHtocmVmfWBcbiAgICAgIDogaHJlZjtcblxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW4sIFwibGl2ZV9wYXRjaFwiLCB7IHVybCB9KS50aGVuKFxuICAgICAgKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5saW5rX3JlZGlyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgY2FsbGJhY2ssIGxpbmtSZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saXZlU29ja2V0LmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKHsgZXJyb3I6IF9lcnJvciwgdGltZW91dDogX3RpbWVvdXQgfSkgPT4gZmFsbGJhY2soKSxcbiAgICApO1xuICB9XG5cbiAgZ2V0Rm9ybXNGb3JSZWNvdmVyeSgpIHtcbiAgICAvLyBGb3JtIHJlY292ZXJ5IGlzIGNvbXBsZXggaW4gTGl2ZVZpZXc6XG4gICAgLy8gV2Ugd2FudCB0byBzdXBwb3J0IG5lc3RlZCBMaXZlVmlld3MgYW5kIGFsc28gcHJvdmlkZSBhIGdvb2QgdXNlciBleHBlcmllbmNlLlxuICAgIC8vIFRoZXJlZm9yZSwgd2hlbiB0aGUgY2hhbm5lbCByZWpvaW5zLCB3ZSBjb3B5IGFsbCBmb3JtcyB0aGF0IGFyZSBlbGlnaWJsZSBmb3JcbiAgICAvLyByZWNvdmVyeSB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGVtIGxhdGVyLlxuICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRvIGNvcHkgdGhlbT8gQmVjYXVzZSB3aGVuIHRoZSBtYWluIExpdmVWaWV3IGpvaW5zLCBhbnkgZm9ybXNcbiAgICAvLyBpbiBuZXN0ZWQgTGl2ZVZpZXdzIHdvdWxkIGJlIGxvc3QuXG4gICAgLy9cbiAgICAvLyBXZSBzaG91bGQgcmV3b3JrIHRoaXMgaW4gdGhlIGZ1dHVyZSB0byBzZXJpYWxpemUgdGhlIGZvcm0gcGF5bG9hZCBoZXJlXG4gICAgLy8gaW5zdGVhZCBvZiBjbG9uaW5nIHRoZSBET00gbm9kZXMsIGJ1dCBtYWtpbmcgdGhpcyB3b3JrIGNvcnJlY3RseSBpcyB0ZWRpb3VzLFxuICAgIC8vIGFzIHNlbmRpbmcgdGhlIGNvcnJlY3QgZm9ybSBwYXlsb2FkIHJlbGllcyBvbiBKUy5wdXNoIHRvIGV4dHJhY3QgdmFsdWVzXG4gICAgLy8gZnJvbSBKUyBjb21tYW5kcyAocGh4LWNoYW5nZT17SlMucHVzaChcImV2ZW50XCIsIHZhbHVlOiAuLi4sIHRhcmdldDogLi4uKX0pLFxuICAgIC8vIGFzIHdlbGwgYXMgdmlldy5wdXNoSW5wdXQsIHdoaWNoIGV4cGVjdHMgRE9NIGVsZW1lbnRzLlxuXG4gICAgaWYgKHRoaXMuam9pbkNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuXG4gICAgcmV0dXJuIERPTS5hbGwoXG4gICAgICBkb2N1bWVudCxcbiAgICAgIGAjJHtDU1MuZXNjYXBlKHRoaXMuaWQpfSBmb3JtWyR7cGh4Q2hhbmdlfV0sIFske1BIWF9URUxFUE9SVEVEX1JFRn09XCIke0NTUy5lc2NhcGUodGhpcy5pZCl9XCJdIGZvcm1bJHtwaHhDaGFuZ2V9XWAsXG4gICAgKVxuICAgICAgLmZpbHRlcigoZm9ybSkgPT4gZm9ybS5pZClcbiAgICAgIC5maWx0ZXIoKGZvcm0pID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChmb3JtKSA9PlxuICAgICAgICAgIGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIsXG4gICAgICApXG4gICAgICAubWFwKChmb3JtKSA9PiB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgdGhlIHdob2xlIGZvcm0sIGFzIHJlbHlpbmcgb24gZm9ybS5lbGVtZW50cyBjYW4gbGVhZCB0b1xuICAgICAgICAvLyBzaXR1YXRpb25zIHdoZXJlIHdlIGhhdmVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICA8Zm9ybT48ZmllbGRzZXQgZGlzYWJsZWQ+PGlucHV0IG5hbWU9XCJmb29cIiB2YWx1ZT1cImJhclwiPjwvZmllbGRzZXQ+PC9mb3JtPlxuICAgICAgICAvL1xuICAgICAgICAvLyBhbmQgZm9ybS5lbGVtZW50cyByZXR1cm5zIGJvdGggdGhlIGZpZWxkc2V0IGFuZCB0aGUgaW5wdXQgc2VwYXJhdGVseS5cbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQsIHRoZSBpbnB1dCBzaG91bGQgTk9UIGJlIHNlbnQgdGhvdWdoLlxuICAgICAgICAvLyBXZSBjYW4gb25seSByZWxpYWJseSBzZXJpYWxpemUgdGhlIGZvcm0gYnkgY2xvbmluZyBpdCBmdWxseS5cbiAgICAgICAgY29uc3QgY2xvbmVkRm9ybSA9IGZvcm0uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAvLyB3ZSBjYWxsIG1vcnBoZG9tIHRvIGNvcHkgYW55IHNwZWNpYWwgc3RhdGVcbiAgICAgICAgLy8gbGlrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIGEgPHNlbGVjdD4gZWxlbWVudDtcbiAgICAgICAgLy8gYW55IGFsc28gY29weSBvdmVyIHByaXZhdGVzICh3aGljaCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRvdWNoZWQgZmllbGRzKVxuICAgICAgICBtb3JwaGRvbShjbG9uZWRGb3JtLCBmb3JtLCB7XG4gICAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICAgIERPTS5jb3B5UHJpdmF0ZXMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBuZXh0IHVwLCB3ZSBhbHNvIG5lZWQgdG8gY2xvbmUgYW55IGVsZW1lbnRzIHdpdGggZm9ybT1cImlkXCIgcGFyYW1ldGVyXG4gICAgICAgIGNvbnN0IGV4dGVybmFsRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgIGBbZm9ybT1cIiR7Zm9ybS5pZH1cIl1gLFxuICAgICAgICApO1xuICAgICAgICBBcnJheS5mcm9tKGV4dGVybmFsRWxlbWVudHMpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm0uY29udGFpbnMoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNsb25lZEVsID0gZWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgIG1vcnBoZG9tKGNsb25lZEVsLCBlbCk7XG4gICAgICAgICAgRE9NLmNvcHlQcml2YXRlcyhjbG9uZWRFbCwgZWwpO1xuICAgICAgICAgIGNsb25lZEZvcm0uYXBwZW5kQ2hpbGQoY2xvbmVkRWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsb25lZEZvcm07XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBmb3JtKSA9PiB7XG4gICAgICAgIGFjY1tmb3JtLmlkXSA9IGZvcm07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICBtYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKGRlc3Ryb3llZENJRHMpIHtcbiAgICBsZXQgd2lsbERlc3Ryb3lDSURzID0gZGVzdHJveWVkQ0lEcy5maWx0ZXIoKGNpZCkgPT4ge1xuICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICBsb2dFcnJvcihcIkZhaWxlZCB0byBwdXNoIGNvbXBvbmVudHMgZGVzdHJveWVkXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHdpbGxEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyB3ZSBtdXN0IHJlc2V0IHRoZSByZW5kZXIgY2hhbmdlIHRyYWNraW5nIGZvciBjaWRzIHRoYXRcbiAgICAgIC8vIGNvdWxkIGJlIGFkZGVkIGJhY2sgZnJvbSB0aGUgc2VydmVyIHNvIHdlIGRvbid0IHNraXAgdGhlbVxuICAgICAgd2lsbERlc3Ryb3lDSURzLmZvckVhY2goKGNpZCkgPT4gdGhpcy5yZW5kZXJlZC5yZXNldFJlbmRlcihjaWQpKTtcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwgeyBjaWRzOiB3aWxsRGVzdHJveUNJRHMgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIHdlIG11c3Qgd2FpdCBmb3IgcGVuZGluZyB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgZGV0ZXJtaW5pbmdcbiAgICAgICAgICAvLyBpZiB0aGUgY2lkcyB3ZXJlIGFkZGVkIGJhY2sgdG8gdGhlIERPTSBpbiB0aGUgbWVhbnRpbWUgKCMzMTM5KVxuICAgICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNlZSBpZiBhbnkgb2YgdGhlIGNpZHMgd2Ugd2FudGVkIHRvIGRlc3Ryb3kgd2VyZSBhZGRlZCBiYWNrLFxuICAgICAgICAgICAgLy8gaWYgdGhleSB3ZXJlIGFkZGVkIGJhY2ssIHdlIGRvbid0IGFjdHVhbGx5IGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKChjaWQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5pZCwgY2lkKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBsZXRlbHlEZXN0cm95Q0lEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImNpZHNfZGVzdHJveWVkXCIsIHtcbiAgICAgICAgICAgICAgICBjaWRzOiBjb21wbGV0ZWx5RGVzdHJveUNJRHMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkLnBydW5lQ0lEcyhyZXNwLmNpZHMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gob25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3duc0VsZW1lbnQoZWwpIHtcbiAgICBsZXQgcGFyZW50Vmlld0VsID0gRE9NLmNsb3Nlc3RWaWV3RWwoZWwpO1xuICAgIHJldHVybiAoXG4gICAgICBlbC5nZXRBdHRyaWJ1dGUoUEhYX1BBUkVOVF9JRCkgPT09IHRoaXMuaWQgfHxcbiAgICAgIChwYXJlbnRWaWV3RWwgJiYgcGFyZW50Vmlld0VsLmlkID09PSB0aGlzLmlkKSB8fFxuICAgICAgKCFwYXJlbnRWaWV3RWwgJiYgdGhpcy5pc0RlYWQpXG4gICAgKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgc3VibWl0dGVyLCBvcHRzID0ge30pIHtcbiAgICBET00ucHV0UHJpdmF0ZShmb3JtLCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSk7XG4gICAgY29uc3QgaW5wdXRzID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKTtcbiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX1NVQk1JVFRFRCwgdHJ1ZSkpO1xuICAgIHRoaXMubGl2ZVNvY2tldC5ibHVyQWN0aXZlRWxlbWVudCh0aGlzKTtcbiAgICB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIHN1Ym1pdHRlciwgb3B0cywgKCkgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCkge1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKTtcbiAgfVxuXG4gIC8vIHBoeC1wb3J0YWxcbiAgcHVzaFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5hZGQoaWQpO1xuICB9XG5cbiAgZHJvcFBvcnRhbEVsZW1lbnRJZChpZCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5kZWxldGUoaWQpO1xuICB9XG5cbiAgZGVzdHJveVBvcnRhbEVsZW1lbnRzKCkge1xuICAgIHRoaXMucG9ydGFsRWxlbWVudElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIERJU0NPTk5FQ1RFRF9USU1FT1VULFxuICBNQVhfUkVMT0FEUyxcbiAgUEhYX0RFQk9VTkNFLFxuICBQSFhfRFJPUF9UQVJHRVQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0tFWSxcbiAgUEhYX0xJTktfU1RBVEUsXG4gIFBIWF9MSVZFX0xJTkssXG4gIFBIWF9MVl9ERUJVRyxcbiAgUEhYX0xWX0xBVEVOQ1lfU0lNLFxuICBQSFhfTFZfUFJPRklMRSxcbiAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gIFBIWF9NQUlOLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfVklFV19TRUxFQ1RPUixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9USFJPVFRMRSxcbiAgUEhYX1RSQUNLX1VQTE9BRFMsXG4gIFBIWF9TRVNTSU9OLFxuICBSRUxPQURfSklUVEVSX01JTixcbiAgUkVMT0FEX0pJVFRFUl9NQVgsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUkVMT0FEX1NUQVRVUyxcbiAgUEhYX1JVTlRJTUVfSE9PSyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIG1heWJlLFxuICBsb2dFcnJvcixcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIjtcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiO1xuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwiLi92aWV3XCI7XG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIjtcbmltcG9ydCBqc0NvbW1hbmRzIGZyb20gXCIuL2pzX2NvbW1hbmRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VzZWRJbnB1dCA9IChlbCkgPT4gRE9NLmlzVXNlZElucHV0KGVsKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKHVybCwgcGh4U29ja2V0LCBvcHRzID0ge30pIHtcbiAgICB0aGlzLnVubG9hZGVkID0gZmFsc2U7XG4gICAgaWYgKCFwaHhTb2NrZXQgfHwgcGh4U29ja2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICBhIHBob2VuaXggU29ja2V0IG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgTGl2ZVNvY2tldCBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG5cbiAgICAgICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICAgICAgICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApO1xuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBwaHhTb2NrZXQodXJsLCBvcHRzKTtcbiAgICB0aGlzLmJpbmRpbmdQcmVmaXggPSBvcHRzLmJpbmRpbmdQcmVmaXggfHwgQklORElOR19QUkVGSVg7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pO1xuICAgIHRoaXMudmlld0xvZ2dlciA9IG9wdHMudmlld0xvZ2dlcjtcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fTtcbiAgICB0aGlzLmRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihjbG9uZShERUZBVUxUUyksIG9wdHMuZGVmYXVsdHMgfHwge30pO1xuICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGw7XG4gICAgdGhpcy5zaWxlbmNlZCA9IGZhbHNlO1xuICAgIHRoaXMubWFpbiA9IG51bGw7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgdGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5saW5rUmVmID0gMTtcbiAgICB0aGlzLnJvb3RzID0ge307XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBjbG9uZSh3aW5kb3cubG9jYXRpb24pO1xuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9O1xuICAgIHRoaXMudXBsb2FkZXJzID0gb3B0cy51cGxvYWRlcnMgfHwge307XG4gICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gb3B0cy5sb2FkZXJUaW1lb3V0IHx8IExPQURFUl9USU1FT1VUO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkVGltZW91dCA9IG9wdHMuZGlzY29ubmVjdGVkVGltZW91dCB8fCBESVNDT05ORUNURURfVElNRU9VVDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLm1heFJlbG9hZHMgPSBvcHRzLm1heFJlbG9hZHMgfHwgTUFYX1JFTE9BRFM7XG4gICAgdGhpcy5yZWxvYWRKaXR0ZXJNaW4gPSBvcHRzLnJlbG9hZEppdHRlck1pbiB8fCBSRUxPQURfSklUVEVSX01JTjtcbiAgICB0aGlzLnJlbG9hZEppdHRlck1heCA9IG9wdHMucmVsb2FkSml0dGVyTWF4IHx8IFJFTE9BRF9KSVRURVJfTUFYO1xuICAgIHRoaXMuZmFpbHNhZmVKaXR0ZXIgPSBvcHRzLmZhaWxzYWZlSml0dGVyIHx8IEZBSUxTQUZFX0pJVFRFUjtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG9wdHMubG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgd2luZG93LnNlc3Npb25TdG9yYWdlO1xuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlO1xuICAgIHRoaXMuYm91bmRFdmVudE5hbWVzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuYmxvY2tQaHhDaGFuZ2VXaGlsZUNvbXBvc2luZyA9XG4gICAgICBvcHRzLmJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3NpbmcgfHwgZmFsc2U7XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgdGhpcy5kb21DYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBqc1F1ZXJ5U2VsZWN0b3JBbGw6IG51bGwsXG4gICAgICAgIG9uUGF0Y2hTdGFydDogY2xvc3VyZSgpLFxuICAgICAgICBvblBhdGNoRW5kOiBjbG9zdXJlKCksXG4gICAgICAgIG9uTm9kZUFkZGVkOiBjbG9zdXJlKCksXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiBjbG9zdXJlKCksXG4gICAgICB9LFxuICAgICAgb3B0cy5kb20gfHwge30sXG4gICAgKTtcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFRyYW5zaXRpb25TZXQoKTtcbiAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24gPVxuICAgICAgcGFyc2VJbnQodGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OKSkgfHwgMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIChfZSkgPT4ge1xuICAgICAgdGhpcy51bmxvYWRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZSBhbmQgYnJvd3NlciBkb2VzIG5vdCBlbWl0IFwicGFnZXNob3dcIlxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWNcblxuICB2ZXJzaW9uKCkge1xuICAgIHJldHVybiBMVl9WU047XG4gIH1cblxuICBpc1Byb2ZpbGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX1BST0ZJTEUpID09PSBcInRydWVcIjtcbiAgfVxuXG4gIGlzRGVidWdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0RFQlVHKSA9PT0gXCJ0cnVlXCI7XG4gIH1cblxuICBpc0RlYnVnRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcImZhbHNlXCI7XG4gIH1cblxuICBlbmFibGVEZWJ1ZygpIHtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIik7XG4gIH1cblxuICBlbmFibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9QUk9GSUxFLCBcInRydWVcIik7XG4gIH1cblxuICBkaXNhYmxlRGVidWcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJmYWxzZVwiKTtcbiAgfVxuXG4gIGRpc2FibGVQcm9maWxpbmcoKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9QUk9GSUxFKTtcbiAgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKSB7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIsXG4gICAgKTtcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpO1xuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKSB7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSk7XG4gIH1cblxuICBnZXRMYXRlbmN5U2ltKCkge1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfTEFURU5DWV9TSU0pO1xuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbDtcbiAgfVxuXG4gIGdldFNvY2tldCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ7XG4gIH1cblxuICBjb25uZWN0KCkge1xuICAgIC8vIGVuYWJsZSBkZWJ1ZyBieSBkZWZhdWx0IGlmIG9uIGxvY2FsaG9zdCBhbmQgbm90IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSBcImxvY2FsaG9zdFwiICYmICF0aGlzLmlzRGVidWdEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmVuYWJsZURlYnVnKCk7XG4gICAgfVxuICAgIGNvbnN0IGRvQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzZXRSZWxvYWRTdGF0dXMoKTtcbiAgICAgIGlmICh0aGlzLmpvaW5Sb290Vmlld3MoKSkge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWFpbikge1xuICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmpvaW5EZWFkVmlldygpO1xuICAgIH07XG4gICAgaWYgKFxuICAgICAgW1wiY29tcGxldGVcIiwgXCJsb2FkZWRcIiwgXCJpbnRlcmFjdGl2ZVwiXS5pbmRleE9mKGRvY3VtZW50LnJlYWR5U3RhdGUpID49IDBcbiAgICApIHtcbiAgICAgIGRvQ29ubmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBkb0Nvbm5lY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgZGlzY29ubmVjdChjYWxsYmFjaykge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFdpdGhKaXR0ZXJUaW1lcik7XG4gICAgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgY2xvc2UgbGlzdGVuZXIgdG8gYXZvaWQgdHJ5aW5nIHRvIGhhbmRsZVxuICAgIC8vIGEgc2VydmVyIGNsb3NlIGV2ZW50IHdoZW4gaXQgaXMgYWN0dWFsbHkgY2F1c2VkIGJ5IHVzIGRpc2Nvbm5lY3RpbmdcbiAgICBpZiAodGhpcy5zZXJ2ZXJDbG9zZVJlZikge1xuICAgICAgdGhpcy5zb2NrZXQub2ZmKHRoaXMuc2VydmVyQ2xvc2VSZWYpO1xuICAgICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0LmRpc2Nvbm5lY3QoY2FsbGJhY2spO1xuICB9XG5cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuc29ja2V0LnJlcGxhY2VUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIGV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUgPSBudWxsKSB7XG4gICAgY29uc3QgZSA9IG5ldyBDdXN0b21FdmVudChcInBoeDpleGVjXCIsIHsgZGV0YWlsOiB7IHNvdXJjZUVsZW1lbnQ6IGVsIH0gfSk7XG4gICAgdGhpcy5vd25lcihlbCwgKHZpZXcpID0+IEpTLmV4ZWMoZSwgZXZlbnRUeXBlLCBlbmNvZGVkSlMsIHZpZXcsIGVsKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2pzX2NvbW1hbmRzXCIpLkxpdmVTb2NrZXRKU0NvbW1hbmRzfVxuICAgKi9cbiAganMoKSB7XG4gICAgcmV0dXJuIGpzQ29tbWFuZHModGhpcywgXCJqc1wiKTtcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKHRoaXMudW5sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFpbiAmJiB0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgIHRoaXMubG9nKHRoaXMubWFpbiwgXCJzb2NrZXRcIiwgKCkgPT4gW1wiZGlzY29ubmVjdCBmb3IgcGFnZSBuYXZcIl0pO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3lBbGxWaWV3cygpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgdHJpZ2dlckRPTShraW5kLCBhcmdzKSB7XG4gICAgdGhpcy5kb21DYWxsYmFja3Nba2luZF0oLi4uYXJncyk7XG4gIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpIHtcbiAgICBpZiAoIXRoaXMuaXNQcm9maWxlRW5hYmxlZCgpIHx8ICFjb25zb2xlLnRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jKCk7XG4gICAgfVxuICAgIGNvbnNvbGUudGltZShuYW1lKTtcbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgY29uc29sZS50aW1lRW5kKG5hbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBsb2codmlldywga2luZCwgbXNnQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy52aWV3TG9nZ2VyKSB7XG4gICAgICBjb25zdCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMudmlld0xvZ2dlcih2aWV3LCBraW5kLCBtc2csIG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRGVidWdFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpO1xuICAgICAgZGVidWcodmlldywga2luZCwgbXNnLCBvYmopO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RET01VcGRhdGUoY2FsbGJhY2spIHtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFmdGVyKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRBc3luY1RyYW5zaXRpb24ocHJvbWlzZSk7XG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uICgpIHt9KSB7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSk7XG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKSB7XG4gICAgY2hhbm5lbC5vbihldmVudCwgKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGxhdGVuY3kgPSB0aGlzLmdldExhdGVuY3lTaW0oKTtcbiAgICAgIGlmICghbGF0ZW5jeSkge1xuICAgICAgICBjYihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkV2l0aEppdHRlcih2aWV3LCBsb2cpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5yZWxvYWRXaXRoSml0dGVyVGltZXIpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGNvbnN0IG1pbk1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNaW47XG4gICAgY29uc3QgbWF4TXMgPSB0aGlzLnJlbG9hZEppdHRlck1heDtcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXM7XG4gICAgY29uc3QgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKFxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UsXG4gICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBDT05TRUNVVElWRV9SRUxPQURTLFxuICAgICAgMCxcbiAgICAgIChjb3VudCkgPT4gY291bnQgKyAxLFxuICAgICk7XG4gICAgaWYgKHRyaWVzID49IHRoaXMubWF4UmVsb2Fkcykge1xuICAgICAgYWZ0ZXJNcyA9IHRoaXMuZmFpbHNhZmVKaXR0ZXI7XG4gICAgfVxuICAgIHRoaXMucmVsb2FkV2l0aEppdHRlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBpZiB2aWV3IGhhcyByZWNvdmVyZWQsIHN1Y2ggYXMgdHJhbnNwb3J0IHJlcGxhY2VkLCB0aGVuIGNhbmNlbFxuICAgICAgaWYgKHZpZXcuaXNEZXN0cm95ZWQoKSB8fCB2aWV3LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmlldy5kZXN0cm95KCk7XG4gICAgICBsb2dcbiAgICAgICAgPyBsb2coKVxuICAgICAgICA6IHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgICBgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2AsXG4gICAgICAgICAgXSk7XG4gICAgICBpZiAodHJpZXMgPj0gdGhpcy5tYXhSZWxvYWRzKSB7XG4gICAgICAgIHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbXG4gICAgICAgICAgYGV4Y2VlZGVkICR7dGhpcy5tYXhSZWxvYWRzfSBjb25zZWN1dGl2ZSByZWxvYWRzLiBFbnRlcmluZyBmYWlsc2FmZSBtb2RlYCxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNQZW5kaW5nTGluaygpKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSwgYWZ0ZXJNcyk7XG4gIH1cblxuICBnZXRIb29rRGVmaW5pdGlvbihuYW1lKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1heWJlSW50ZXJuYWxIb29rKG5hbWUpIHx8XG4gICAgICB0aGlzLmhvb2tzW25hbWVdIHx8XG4gICAgICB0aGlzLm1heWJlUnVudGltZUhvb2sobmFtZSlcbiAgICApO1xuICB9XG5cbiAgbWF5YmVJbnRlcm5hbEhvb2sobmFtZSkge1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpICYmIEhvb2tzW25hbWUuc3BsaXQoXCIuXCIpWzFdXTtcbiAgfVxuXG4gIG1heWJlUnVudGltZUhvb2sobmFtZSkge1xuICAgIGNvbnN0IHJ1bnRpbWVIb29rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIGBzY3JpcHRbJHtQSFhfUlVOVElNRV9IT09LfT1cIiR7Q1NTLmVzY2FwZShuYW1lKX1cIl1gLFxuICAgICk7XG4gICAgaWYgKCFydW50aW1lSG9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gd2luZG93W2BwaHhfaG9va18ke25hbWV9YF07XG4gICAgaWYgKCFjYWxsYmFja3MgfHwgdHlwZW9mIGNhbGxiYWNrcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dFcnJvcihcImEgcnVudGltZSBob29rIG11c3QgYmUgYSBmdW5jdGlvblwiLCBydW50aW1lSG9vayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvb2tEZWZpbml0b24gPSBjYWxsYmFja3MoKTtcbiAgICBpZiAoXG4gICAgICBob29rRGVmaW5pdG9uICYmXG4gICAgICAodHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGhvb2tEZWZpbml0b24gPT09IFwiZnVuY3Rpb25cIilcbiAgICApIHtcbiAgICAgIHJldHVybiBob29rRGVmaW5pdG9uO1xuICAgIH1cbiAgICBsb2dFcnJvcihcbiAgICAgIFwicnVudGltZSBob29rIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGhvb2sgY2FsbGJhY2tzIG9yIGFuIGluc3RhbmNlIG9mIFZpZXdIb29rXCIsXG4gICAgICBydW50aW1lSG9vayxcbiAgICApO1xuICB9XG5cbiAgaXNVbmxvYWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy51bmxvYWRlZDtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpO1xuICB9XG5cbiAgZ2V0QmluZGluZ1ByZWZpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5iaW5kaW5nUHJlZml4O1xuICB9XG5cbiAgYmluZGluZyhraW5kKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gO1xuICB9XG5cbiAgY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwodG9waWMsIHBhcmFtcyk7XG4gIH1cblxuICBqb2luRGVhZFZpZXcoKSB7XG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgaWYgKFxuICAgICAgYm9keSAmJlxuICAgICAgIXRoaXMuaXNQaHhWaWV3KGJvZHkpICYmXG4gICAgICAhdGhpcy5pc1BoeFZpZXcoZG9jdW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpXG4gICAgKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhib2R5KTtcbiAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSk7XG4gICAgICB2aWV3LmpvaW5EZWFkKCk7XG4gICAgICBpZiAoIXRoaXMubWFpbikge1xuICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgfVxuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHZpZXcuZXhlY05ld01vdW50ZWQoKTtcbiAgICAgICAgLy8gcmVzdG9yZSBzY3JvbGwgcG9zaXRpb24gd2hlbiBuYXZpZ2F0aW5nIGZyb20gYW4gZXh0ZXJuYWwgLyBub24tbGl2ZSBwYWdlXG4gICAgICAgIHRoaXMubWF5YmVTY3JvbGwoaGlzdG9yeS5zdGF0ZT8uc2Nyb2xsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGpvaW5Sb290Vmlld3MoKSB7XG4gICAgbGV0IHJvb3RzRm91bmQgPSBmYWxzZTtcbiAgICBET00uYWxsKFxuICAgICAgZG9jdW1lbnQsXG4gICAgICBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLFxuICAgICAgKHJvb3RFbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSkge1xuICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLm5ld1Jvb3RWaWV3KHJvb3RFbCk7XG4gICAgICAgICAgLy8gc3RpY2tpZXMgY2Fubm90IGJlIG1vdW50ZWQgYXQgdGhlIHJvdXRlciBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3RcbiAgICAgICAgICAvLyBnZXQgYSBocmVmIHNldCBvbiB0aGVtXG4gICAgICAgICAgaWYgKCFET00uaXNQaHhTdGlja3kocm9vdEVsKSkge1xuICAgICAgICAgICAgdmlldy5zZXRIcmVmKHRoaXMuZ2V0SHJlZigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlldy5qb2luKCk7XG4gICAgICAgICAgaWYgKHJvb3RFbC5oYXNBdHRyaWJ1dGUoUEhYX01BSU4pKSB7XG4gICAgICAgICAgICB0aGlzLm1haW4gPSB2aWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByb290c0ZvdW5kID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcm9vdHNGb3VuZDtcbiAgfVxuXG4gIHJlZGlyZWN0KHRvLCBmbGFzaCwgcmVsb2FkVG9rZW4pIHtcbiAgICBpZiAocmVsb2FkVG9rZW4pIHtcbiAgICAgIEJyb3dzZXIuc2V0Q29va2llKFBIWF9SRUxPQURfU1RBVFVTLCByZWxvYWRUb2tlbiwgNjApO1xuICAgIH1cbiAgICB0aGlzLnVubG9hZCgpO1xuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKTtcbiAgfVxuXG4gIHJlcGxhY2VNYWluKFxuICAgIGhyZWYsXG4gICAgZmxhc2gsXG4gICAgY2FsbGJhY2sgPSBudWxsLFxuICAgIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpLFxuICApIHtcbiAgICBjb25zdCBsaXZlUmVmZXJlciA9IHRoaXMuY3VycmVudExvY2F0aW9uLmhyZWY7XG4gICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IHRoaXMub3V0Z29pbmdNYWluRWwgfHwgdGhpcy5tYWluLmVsO1xuXG4gICAgY29uc3Qgc3RpY2tpZXMgPSBET00uZmluZFBoeFN0aWNreShkb2N1bWVudCkgfHwgW107XG4gICAgY29uc3QgcmVtb3ZlRWxzID0gRE9NLmFsbChcbiAgICAgIHRoaXMub3V0Z29pbmdNYWluRWwsXG4gICAgICBgWyR7dGhpcy5iaW5kaW5nKFwicmVtb3ZlXCIpfV1gLFxuICAgICkuZmlsdGVyKChlbCkgPT4gIURPTS5pc0NoaWxkT2ZBbnkoZWwsIHN0aWNraWVzKSk7XG5cbiAgICBjb25zdCBuZXdNYWluRWwgPSBET00uY2xvbmVOb2RlKHRoaXMub3V0Z29pbmdNYWluRWwsIFwiXCIpO1xuICAgIHRoaXMubWFpbi5zaG93TG9hZGVyKHRoaXMubG9hZGVyVGltZW91dCk7XG4gICAgdGhpcy5tYWluLmRlc3Ryb3koKTtcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMubWFpbi5zZXRSZWRpcmVjdChocmVmKTtcbiAgICB0aGlzLnRyYW5zaXRpb25SZW1vdmVzKHJlbW92ZUVscyk7XG4gICAgdGhpcy5tYWluLmpvaW4oKGpvaW5Db3VudCwgb25Eb25lKSA9PiB7XG4gICAgICBpZiAoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IHtcbiAgICAgICAgICAvLyByZW1vdmUgcGh4LXJlbW92ZSBlbHMgcmlnaHQgYmVmb3JlIHdlIHJlcGxhY2UgdGhlIG1haW4gZWxlbWVudFxuICAgICAgICAgIHJlbW92ZUVscy5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgICAgICAgIHN0aWNraWVzLmZvckVhY2goKGVsKSA9PiBuZXdNYWluRWwuYXBwZW5kQ2hpbGQoZWwpKTtcbiAgICAgICAgICB0aGlzLm91dGdvaW5nTWFpbkVsLnJlcGxhY2VXaXRoKG5ld01haW5FbCk7XG4gICAgICAgICAgdGhpcy5vdXRnb2luZ01haW5FbCA9IG51bGw7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobGlua1JlZik7XG4gICAgICAgICAgb25Eb25lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNpdGlvblJlbW92ZXMoZWxlbWVudHMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVtb3ZlQXR0ciA9IHRoaXMuYmluZGluZyhcInJlbW92ZVwiKTtcbiAgICBjb25zdCBzaWxlbmNlRXZlbnRzID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgLy8gcHJldmVudCBhbGwgbGlzdGVuZXJzIHdlIGNhcmUgYWJvdXQgZnJvbSBidWJibGluZyB0byB3aW5kb3dcbiAgICAgIC8vIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZWxlbWVudFxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBzaWxlbmNlRXZlbnRzLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY0pTKGVsLCBlbC5nZXRBdHRyaWJ1dGUocmVtb3ZlQXR0ciksIFwicmVtb3ZlXCIpO1xuICAgIH0pO1xuICAgIC8vIHJlbW92ZSB0aGUgc2lsZW5jZWQgbGlzdGVuZXJzIHdoZW4gdHJhbnNpdGlvbnMgYXJlIGRvbmUgaW5jYXNlIHRoZSBlbGVtZW50IGlzIHJlLXVzZWRcbiAgICAvLyBhbmQgY2FsbCBjYWxsZXIncyBjYWxsYmFjayBhcyBzb29uIGFzIHdlIGFyZSBkb25lIHdpdGggdHJhbnNpdGlvbnNcbiAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0aGlzLmJvdW5kRXZlbnROYW1lcykge1xuICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIHNpbGVuY2VFdmVudHMsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBpc1BoeFZpZXcoZWwpIHtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgIT09IG51bGw7XG4gIH1cblxuICBuZXdSb290VmlldyhlbCwgZmxhc2gsIGxpdmVSZWZlcmVyKSB7XG4gICAgY29uc3QgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaCwgbGl2ZVJlZmVyZXIpO1xuICAgIHRoaXMucm9vdHNbdmlldy5pZF0gPSB2aWV3O1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgb3duZXIoY2hpbGRFbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgdmlldztcbiAgICBjb25zdCB2aWV3RWwgPSBET00uY2xvc2VzdFZpZXdFbChjaGlsZEVsKTtcbiAgICBpZiAodmlld0VsKSB7XG4gICAgICAvLyBpdCBjYW4gaGFwcGVuIHRoYXQgd2UgZmluZCBhIHZpZXcgdGhhdCBpcyBhbHJlYWR5IGRlc3Ryb3llZDtcbiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBETyBOT1Qgd2FudCB0byBmYWxsYmFjayB0byB0aGUgbWFpbiBlbGVtZW50XG4gICAgICB2aWV3ID0gdGhpcy5nZXRWaWV3QnlFbCh2aWV3RWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWV3ID0gdGhpcy5tYWluO1xuICAgIH1cbiAgICByZXR1cm4gdmlldyAmJiBjYWxsYmFjayA/IGNhbGxiYWNrKHZpZXcpIDogdmlldztcbiAgfVxuXG4gIHdpdGhpbk93bmVycyhjaGlsZEVsLCBjYWxsYmFjaykge1xuICAgIHRoaXMub3duZXIoY2hpbGRFbCwgKHZpZXcpID0+IGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpKTtcbiAgfVxuXG4gIGdldFZpZXdCeUVsKGVsKSB7XG4gICAgY29uc3Qgcm9vdElkID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ST09UX0lEKTtcbiAgICByZXR1cm4gbWF5YmUodGhpcy5nZXRSb290QnlJZChyb290SWQpLCAocm9vdCkgPT5cbiAgICAgIHJvb3QuZ2V0RGVzY2VuZGVudEJ5RWwoZWwpLFxuICAgICk7XG4gIH1cblxuICBnZXRSb290QnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLnJvb3RzW2lkXTtcbiAgfVxuXG4gIGRlc3Ryb3lBbGxWaWV3cygpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucm9vdHMpIHtcbiAgICAgIHRoaXMucm9vdHNbaWRdLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW2lkXTtcbiAgICB9XG4gICAgdGhpcy5tYWluID0gbnVsbDtcbiAgfVxuXG4gIGRlc3Ryb3lWaWV3QnlFbChlbCkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmdldFJvb3RCeUlkKGVsLmdldEF0dHJpYnV0ZShQSFhfUk9PVF9JRCkpO1xuICAgIGlmIChyb290ICYmIHJvb3QuaWQgPT09IGVsLmlkKSB7XG4gICAgICByb290LmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RzW3Jvb3QuaWRdO1xuICAgIH0gZWxzZSBpZiAocm9vdCkge1xuICAgICAgcm9vdC5kZXN0cm95RGVzY2VuZGVudChlbC5pZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpIHtcbiAgICBpZiAodGhpcy5wcmV2QWN0aXZlICYmIHZpZXcub3duc0VsZW1lbnQodGhpcy5wcmV2QWN0aXZlKSkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJldkFjdGl2ZSAmJlxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKSB7XG4gICAgdGhpcy5wcmV2QWN0aXZlID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICB0aGlzLnByZXZBY3RpdmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgdGhpcy5wcmV2QWN0aXZlLmJsdXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGVhZD86IGJvb2xlYW59fSBbb3B0aW9ucz17fV1cbiAgICovXG4gIGJpbmRUb3BMZXZlbEV2ZW50cyh7IGRlYWQgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWU7XG4gICAgLy8gZW50ZXIgZmFpbHNhZmUgcmVsb2FkIGlmIHNlcnZlciBoYXMgZ29uZSBhd2F5IGludGVudGlvbmFsbHksIHN1Y2ggYXMgXCJkaXNjb25uZWN0XCIgYnJvYWRjYXN0XG4gICAgdGhpcy5zZXJ2ZXJDbG9zZVJlZiA9IHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBmYWlsc2FmZSByZWxvYWQgaWYgbm9ybWFsIGNsb3N1cmUgYW5kIHdlIHN0aWxsIGhhdmUgYSBtYWluIExWXG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuY29kZSA9PT0gMTAwMCAmJiB0aGlzLm1haW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkV2l0aEppdHRlcih0aGlzLm1haW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHt9KTsgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBhZ2VzaG93XCIsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5wZXJzaXN0ZWQpIHtcbiAgICAgICAgICAvLyByZWxvYWQgcGFnZSBpZiBiZWluZyByZXN0b3JlZCBmcm9tIGJhY2svZm9yd2FyZCBjYWNoZVxuICAgICAgICAgIHRoaXMuZ2V0U29ja2V0KCkuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMud2l0aFBhZ2VMb2FkaW5nKHsgdG86IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBraW5kOiBcInJlZGlyZWN0XCIgfSk7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kTmF2KCk7XG4gICAgfVxuICAgIHRoaXMuYmluZENsaWNrcygpO1xuICAgIGlmICghZGVhZCkge1xuICAgICAgdGhpcy5iaW5kRm9ybXMoKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kKFxuICAgICAgeyBrZXl1cDogXCJrZXl1cFwiLCBrZXlkb3duOiBcImtleWRvd25cIiB9LFxuICAgICAgKGUsIHR5cGUsIHZpZXcsIHRhcmdldEVsLCBwaHhFdmVudCwgX3BoeFRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaEtleSA9IHRhcmdldEVsLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0tFWSkpO1xuICAgICAgICBjb25zdCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKTsgLy8gY2hyb21lIGNsaWNrZWQgYXV0b2NvbXBsZXRlcyBzZW5kIGEga2V5ZG93biB3aXRob3V0IGtleVxuICAgICAgICBpZiAobWF0Y2hLZXkgJiYgbWF0Y2hLZXkudG9Mb3dlckNhc2UoKSAhPT0gcHJlc3NlZEtleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICBKUy5leGVjKGUsIHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7IGRhdGEgfV0pO1xuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuYmluZChcbiAgICAgIHsgYmx1cjogXCJmb2N1c291dFwiLCBmb2N1czogXCJmb2N1c2luXCIgfSxcbiAgICAgIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgICBpZiAoIXBoeFRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IGtleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSB9O1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmJpbmQoXG4gICAgICB7IGJsdXI6IFwiYmx1clwiLCBmb2N1czogXCJmb2N1c1wiIH0sXG4gICAgICAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBwaHhUYXJnZXQpID0+IHtcbiAgICAgICAgLy8gYmx1ciBhbmQgZm9jdXMgYXJlIHRyaWdnZXJlZCBvbiBkb2N1bWVudCBhbmQgd2luZG93LiBEaXNjYXJkIG9uZSB0byBhdm9pZCBkdXBzXG4gICAgICAgIGlmIChwaHhUYXJnZXQgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpO1xuICAgICAgICAgIEpTLmV4ZWMoZSwgdHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHsgZGF0YSB9XSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLm9uKFwiZHJhZ292ZXJcIiwgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgdGhpcy5vbihcImRyb3BcIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BUYXJnZXRJZCA9IG1heWJlKFxuICAgICAgICBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgdGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpLFxuICAgICAgICAodHJ1ZVRhcmdldCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0cnVlVGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgZHJvcFRhcmdldCA9IGRyb3BUYXJnZXRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkcm9wVGFyZ2V0SWQpO1xuICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzIHx8IFtdKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRyb3BUYXJnZXQgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgfHxcbiAgICAgICAgZHJvcFRhcmdldC5kaXNhYmxlZCB8fFxuICAgICAgICBmaWxlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgIShkcm9wVGFyZ2V0LmZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyhkcm9wVGFyZ2V0LCBmaWxlcywgZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gICAgdGhpcy5vbihQSFhfVFJBQ0tfVVBMT0FEUywgKGUpID0+IHtcbiAgICAgIGNvbnN0IHVwbG9hZFRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgaWYgKCFET00uaXNVcGxvYWRJbnB1dCh1cGxvYWRUYXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAoZikgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IsXG4gICAgICApO1xuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXModXBsb2FkVGFyZ2V0LCBmaWxlcyk7XG4gICAgICB1cGxvYWRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXTtcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhlLCB0YXJnZXRFbCkgOiB7fTtcbiAgfVxuXG4gIHNldFBlbmRpbmdMaW5rKGhyZWYpIHtcbiAgICB0aGlzLmxpbmtSZWYrKztcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gaHJlZjtcbiAgICB0aGlzLnJlc2V0UmVsb2FkU3RhdHVzKCk7XG4gICAgcmV0dXJuIHRoaXMubGlua1JlZjtcbiAgfVxuXG4gIC8vIGFueXRpbWUgd2UgYXJlIG5hdmlnYXRpbmcgb3IgY29ubmVjdGluZywgZHJvcCByZWxvYWQgY29va2llIGluIGNhc2VcbiAgLy8gd2UgaXNzdWUgdGhlIGNvb2tpZSBidXQgdGhlIG5leHQgcmVxdWVzdCB3YXMgaW50ZXJydXB0ZWQgYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgZHJvcHBlZCBpdFxuICByZXNldFJlbG9hZFN0YXR1cygpIHtcbiAgICBCcm93c2VyLmRlbGV0ZUNvb2tpZShQSFhfUkVMT0FEX1NUQVRVUyk7XG4gIH1cblxuICBjb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSB7XG4gICAgaWYgKHRoaXMubGlua1JlZiAhPT0gbGlua1JlZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rO1xuICAgICAgdGhpcy5wZW5kaW5nTGluayA9IG51bGw7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCkge1xuICAgIHJldHVybiB0aGlzLmhyZWY7XG4gIH1cblxuICBoYXNQZW5kaW5nTGluaygpIHtcbiAgICByZXR1cm4gISF0aGlzLnBlbmRpbmdMaW5rO1xuICB9XG5cbiAgYmluZChldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGNvbnN0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdO1xuXG4gICAgICB0aGlzLm9uKGJyb3dzZXJFdmVudE5hbWUsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmcoZXZlbnQpO1xuICAgICAgICBjb25zdCB3aW5kb3dCaW5kaW5nID0gdGhpcy5iaW5kaW5nKGB3aW5kb3ctJHtldmVudH1gKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGh4RXZlbnQgPVxuICAgICAgICAgIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSAmJiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoYmluZGluZyk7XG4gICAgICAgIGlmICh0YXJnZXRQaHhFdmVudCkge1xuICAgICAgICAgIHRoaXMuZGVib3VuY2UoZS50YXJnZXQsIGUsIGJyb3dzZXJFdmVudE5hbWUsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZS50YXJnZXQsIHRhcmdldFBoeEV2ZW50LCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCAoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBoeEV2ZW50ID0gZWwuZ2V0QXR0cmlidXRlKHdpbmRvd0JpbmRpbmcpO1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZShlbCwgZSwgYnJvd3NlckV2ZW50TmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHBoeEV2ZW50LCBcIndpbmRvd1wiKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpIHtcbiAgICB0aGlzLm9uKFwibW91c2Vkb3duXCIsIChlKSA9PiAodGhpcy5jbGlja1N0YXJ0ZWRBdFRhcmdldCA9IGUudGFyZ2V0KSk7XG4gICAgdGhpcy5iaW5kQ2xpY2soXCJjbGlja1wiLCBcImNsaWNrXCIpO1xuICB9XG5cbiAgYmluZENsaWNrKGV2ZW50TmFtZSwgYmluZGluZ05hbWUpIHtcbiAgICBjb25zdCBjbGljayA9IHRoaXMuYmluZGluZyhiaW5kaW5nTmFtZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICBsZXQgdGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gYSBzeW50aGV0aWMgY2xpY2sgZXZlbnQgKGRldGFpbCAwKSB3aWxsIG5vdCBoYXZlIGNhdXNlZCBhIG1vdXNlZG93biBldmVudCxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSBjbGlja1N0YXJ0ZWRBdFRhcmdldCBpcyBzdGFsZVxuICAgICAgICBpZiAoZS5kZXRhaWwgPT09IDApIHRoaXMuY2xpY2tTdGFydGVkQXRUYXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgY29uc3QgY2xpY2tTdGFydGVkQXRUYXJnZXQgPSB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0IHx8IGUudGFyZ2V0O1xuICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyB0aGUgdGFyZ2V0IGZvciB0aGUgY2xpY2sgZXZlbnQsIHdlIGFsd2F5cyB3YW50IHRvXG4gICAgICAgIC8vIHVzZSB0aGUgYWN0dWFsIGV2ZW50IHRhcmdldCwgc2VlICMzMzcyXG4gICAgICAgIHRhcmdldCA9IGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCBjbGljayk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXRUYXJnZXQpO1xuICAgICAgICB0aGlzLmNsaWNrU3RhcnRlZEF0VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljayk7XG4gICAgICAgIGlmICghcGh4RXZlbnQpIHtcbiAgICAgICAgICBpZiAoRE9NLmlzTmV3UGFnZUNsaWNrKGUsIHdpbmRvdy5sb2NhdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub29wIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGF3YWl0aW5nIGFuIGFjayBmb3IgdGhpcyBlbCBhbHJlYWR5XG4gICAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKFBIWF9SRUZfU1JDKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVib3VuY2UodGFyZ2V0LCBlLCBcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLndpdGhpbk93bmVycyh0YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgICBKUy5leGVjKGUsIFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldCwgW1xuICAgICAgICAgICAgICBcInB1c2hcIixcbiAgICAgICAgICAgICAgeyBkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIHRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tTdGFydGVkQXQpIHtcbiAgICBjb25zdCBwaHhDbGlja0F3YXkgPSB0aGlzLmJpbmRpbmcoXCJjbGljay1hd2F5XCIpO1xuICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHtwaHhDbGlja0F3YXl9XWAsIChlbCkgPT4ge1xuICAgICAgaWYgKCEoZWwuaXNTYW1lTm9kZShjbGlja1N0YXJ0ZWRBdCkgfHwgZWwuY29udGFpbnMoY2xpY2tTdGFydGVkQXQpKSkge1xuICAgICAgICB0aGlzLndpdGhpbk93bmVycyhlbCwgKHZpZXcpID0+IHtcbiAgICAgICAgICBjb25zdCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpO1xuICAgICAgICAgIGlmIChKUy5pc1Zpc2libGUoZWwpICYmIEpTLmlzSW5WaWV3cG9ydChlbCkpIHtcbiAgICAgICAgICAgIEpTLmV4ZWMoZSwgXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgZWwsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgZGF0YTogdGhpcy5ldmVudE1ldGEoXCJjbGlja1wiLCBlLCBlLnRhcmdldCkgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBiaW5kTmF2KCkge1xuICAgIGlmICghQnJvd3Nlci5jYW5QdXNoU3RhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCI7XG4gICAgfVxuICAgIGxldCBzY3JvbGxUaW1lciA9IG51bGw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgKF9lKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpO1xuICAgICAgc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHsgc2Nyb2xsOiB3aW5kb3cuc2Nyb2xsWSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBcInBvcHN0YXRlXCIsXG4gICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lzdGVyTmV3TG9jYXRpb24od2luZG93LmxvY2F0aW9uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR5cGUsIGJhY2tUeXBlLCBpZCwgc2Nyb2xsLCBwb3NpdGlvbiB9ID0gZXZlbnQuc3RhdGUgfHwge307XG4gICAgICAgIGNvbnN0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblxuICAgICAgICAvLyBDb21wYXJlIHBvc2l0aW9ucyB0byBkZXRlcm1pbmUgZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzRm9yd2FyZCA9IHBvc2l0aW9uID4gdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uO1xuICAgICAgICBjb25zdCBuYXZUeXBlID0gaXNGb3J3YXJkID8gdHlwZSA6IGJhY2tUeXBlIHx8IHR5cGU7XG5cbiAgICAgICAgLy8gVXBkYXRlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uID0gcG9zaXRpb24gfHwgMDtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIFBIWF9MVl9ISVNUT1JZX1BPU0lUSU9OLFxuICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICApO1xuXG4gICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgIHBhdGNoOiBuYXZUeXBlID09PSBcInBhdGNoXCIsXG4gICAgICAgICAgICBwb3A6IHRydWUsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGlzRm9yd2FyZCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYXliZVNjcm9sbChzY3JvbGwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYWluLmlzQ29ubmVjdGVkKCkgJiZcbiAgICAgICAgICAgIG5hdlR5cGUgPT09IFwicGF0Y2hcIiAmJlxuICAgICAgICAgICAgaWQgPT09IHRoaXMubWFpbi5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goZXZlbnQsIGhyZWYsIG51bGwsIGNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJjbGlja1wiLFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIFBIWF9MSVZFX0xJTkspO1xuICAgICAgICBjb25zdCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSyk7XG4gICAgICAgIGlmICghdHlwZSB8fCAhdGhpcy5pc0Nvbm5lY3RlZCgpIHx8ICF0aGlzLm1haW4gfHwgRE9NLndhbnRzTmV3VGFiKGUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB3cmFwcGluZyBhbiBTVkcgZWxlbWVudCBpbiBhbiBhbmNob3IgdGFnLCB0aGUgaHJlZiBjYW4gYmUgYW4gU1ZHQW5pbWF0ZWRTdHJpbmdcbiAgICAgICAgY29uc3QgaHJlZiA9XG4gICAgICAgICAgdGFyZ2V0LmhyZWYgaW5zdGFuY2VvZiBTVkdBbmltYXRlZFN0cmluZ1xuICAgICAgICAgICAgPyB0YXJnZXQuaHJlZi5iYXNlVmFsXG4gICAgICAgICAgICA6IHRhcmdldC5ocmVmO1xuXG4gICAgICAgIGNvbnN0IGxpbmtTdGF0ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJTktfU1RBVEUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IC8vIGRvIG5vdCBidWJibGUgY2xpY2sgdG8gcmVndWxhciBwaHgtY2xpY2sgYmluZGluZ3NcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0xpbmsgPT09IGhyZWYpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlID09PSBcInBhdGNoXCIpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgbnVsbCwgdGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXhwZWN0ZWQgJHtQSFhfTElWRV9MSU5LfSB0byBiZSBcInBhdGNoXCIgb3IgXCJyZWRpcmVjdFwiLCBnb3Q6ICR7dHlwZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGh4Q2xpY2sgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNsaWNrXCIpKTtcbiAgICAgICAgICBpZiAocGh4Q2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLmV4ZWNKUyh0YXJnZXQsIHBoeENsaWNrLCBcImNsaWNrXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBtYXliZVNjcm9sbChzY3JvbGwpIHtcbiAgICBpZiAodHlwZW9mIHNjcm9sbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHNjcm9sbCk7XG4gICAgICB9KTsgLy8gdGhlIGJvZHkgbmVlZHMgdG8gcmVuZGVyIGJlZm9yZSB3ZSBzY3JvbGwuXG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudCwgcGF5bG9hZCA9IHt9KSB7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBgcGh4OiR7ZXZlbnR9YCwgeyBkZXRhaWw6IHBheWxvYWQgfSk7XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpIHtcbiAgICBldmVudHMuZm9yRWFjaCgoW2V2ZW50LCBwYXlsb2FkXSkgPT4gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCBwYXlsb2FkKSk7XG4gIH1cblxuICB3aXRoUGFnZUxvYWRpbmcoaW5mbywgY2FsbGJhY2spIHtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCB7IGRldGFpbDogaW5mbyB9KTtcbiAgICBjb25zdCBkb25lID0gKCkgPT5cbiAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgeyBkZXRhaWw6IGluZm8gfSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrID8gY2FsbGJhY2soZG9uZSkgOiBkb25lO1xuICB9XG5cbiAgcHVzaEhpc3RvcnlQYXRjaChlLCBocmVmLCBsaW5rU3RhdGUsIHRhcmdldEVsKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbi5pc01haW4oKSkge1xuICAgICAgcmV0dXJuIEJyb3dzZXIucmVkaXJlY3QoaHJlZik7XG4gICAgfVxuXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJwYXRjaFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLm1haW4ucHVzaExpbmtQYXRjaChlLCBocmVmLCB0YXJnZXRFbCwgKGxpbmtSZWYpID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBoaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmID0gdGhpcy5zZXRQZW5kaW5nTGluayhocmVmKSkge1xuICAgIGlmICghdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluY3JlbWVudCBwb3NpdGlvbiBmb3IgbmV3IHN0YXRlXG4gICAgdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uKys7XG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgUEhYX0xWX0hJU1RPUllfUE9TSVRJT04sXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24udG9TdHJpbmcoKSxcbiAgICApO1xuXG4gICAgLy8gc3RvcmUgdGhlIHR5cGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuICAgIEJyb3dzZXIudXBkYXRlQ3VycmVudFN0YXRlKChzdGF0ZSkgPT4gKHsgLi4uc3RhdGUsIGJhY2tUeXBlOiBcInBhdGNoXCIgfSkpO1xuXG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXG4gICAgICBsaW5rU3RhdGUsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwicGF0Y2hcIixcbiAgICAgICAgaWQ6IHRoaXMubWFpbi5pZCxcbiAgICAgICAgcG9zaXRpb246IHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbixcbiAgICAgIH0sXG4gICAgICBocmVmLFxuICAgICk7XG5cbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4Om5hdmlnYXRlXCIsIHtcbiAgICAgIGRldGFpbDogeyBwYXRjaDogdHJ1ZSwgaHJlZiwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICB9XG5cbiAgaGlzdG9yeVJlZGlyZWN0KGUsIGhyZWYsIGxpbmtTdGF0ZSwgZmxhc2gsIHRhcmdldEVsKSB7XG4gICAgY29uc3QgY2xpY2tMb2FkaW5nID0gdGFyZ2V0RWwgJiYgZS5pc1RydXN0ZWQgJiYgZS50eXBlICE9PSBcInBvcHN0YXRlXCI7XG4gICAgaWYgKGNsaWNrTG9hZGluZykge1xuICAgICAgdGFyZ2V0RWwuY2xhc3NMaXN0LmFkZChcInBoeC1jbGljay1sb2FkaW5nXCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSB8fCAhdGhpcy5tYWluLmlzTWFpbigpKSB7XG4gICAgICByZXR1cm4gQnJvd3Nlci5yZWRpcmVjdChocmVmLCBmbGFzaCk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBmdWxsIGhyZWYgaWYgb25seSBwYXRoIHByZWZpeFxuICAgIGlmICgvXlxcLyR8XlxcL1teXFwvXSsuKiQvLnRlc3QoaHJlZikpIHtcbiAgICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3QgfSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgIGhyZWYgPSBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke2hyZWZ9YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFk7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoeyB0bzogaHJlZiwga2luZDogXCJyZWRpcmVjdFwiIH0sIChkb25lKSA9PiB7XG4gICAgICB0aGlzLnJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCAobGlua1JlZikgPT4ge1xuICAgICAgICBpZiAobGlua1JlZiA9PT0gdGhpcy5saW5rUmVmKSB7XG4gICAgICAgICAgLy8gSW5jcmVtZW50IHBvc2l0aW9uIGZvciBuZXcgc3RhdGVcbiAgICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5UG9zaXRpb24rKztcbiAgICAgICAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICBQSFhfTFZfSElTVE9SWV9QT1NJVElPTixcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlQb3NpdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBzdG9yZSB0aGUgdHlwZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG4gICAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBiYWNrVHlwZTogXCJyZWRpcmVjdFwiLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIEJyb3dzZXIucHVzaFN0YXRlKFxuICAgICAgICAgICAgbGlua1N0YXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgIGlkOiB0aGlzLm1haW4uaWQsXG4gICAgICAgICAgICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5jdXJyZW50SGlzdG9yeVBvc2l0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6bmF2aWdhdGVcIiwge1xuICAgICAgICAgICAgZGV0YWlsOiB7IGhyZWYsIHBhdGNoOiBmYWxzZSwgcG9wOiBmYWxzZSwgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgdW5kbyBjbGljay1sb2FkaW5nIGNsYXNzXG4gICAgICAgIC8vIChpbiBjYXNlIGl0IG9yaWdpbmF0ZWQgaW4gYSBzdGlja3kgbGl2ZSB2aWV3LCBvdGhlcndpc2UgaXQgd291bGQgYmUgcmVtb3ZlZCBhbnl3YXkpXG4gICAgICAgIGlmIChjbGlja0xvYWRpbmcpIHtcbiAgICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKFwicGh4LWNsaWNrLWxvYWRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3Rlck5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvbjtcbiAgICBpZiAocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUobmV3TG9jYXRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgYmluZEZvcm1zKCkge1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBsZXQgZXh0ZXJuYWxGb3JtU3VibWl0dGVkID0gZmFsc2U7XG5cbiAgICAvLyBkaXNhYmxlIGZvcm1zIG9uIHN1Ym1pdCB0aGF0IHRyYWNrIHBoeC1jaGFuZ2UgYnV0IHBlcmZvcm0gZXh0ZXJuYWwgc3VibWl0XG4gICAgdGhpcy5vbihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgcGh4U3VibWl0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSk7XG4gICAgICBjb25zdCBwaHhDaGFuZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpKTtcbiAgICAgIGlmICghZXh0ZXJuYWxGb3JtU3VibWl0dGVkICYmIHBoeENoYW5nZSAmJiAhcGh4U3VibWl0KSB7XG4gICAgICAgIGV4dGVybmFsRm9ybVN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3KSA9PiB7XG4gICAgICAgICAgdmlldy5kaXNhYmxlRm9ybShlLnRhcmdldCk7XG4gICAgICAgICAgLy8gc2FmYXJpIG5lZWRzIG5leHQgdGlja1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKERPTS5pc1VubG9hZGFibGVGb3JtU3VibWl0KGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLnRhcmdldC5zdWJtaXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIChlKSA9PiB7XG4gICAgICBjb25zdCBwaHhFdmVudCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJzdWJtaXRcIikpO1xuICAgICAgaWYgKCFwaHhFdmVudCkge1xuICAgICAgICBpZiAoRE9NLmlzVW5sb2FkYWJsZUZvcm1TdWJtaXQoZSkpIHtcbiAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMud2l0aGluT3duZXJzKGUudGFyZ2V0LCAodmlldykgPT4ge1xuICAgICAgICBKUy5leGVjKGUsIFwic3VibWl0XCIsIHBoeEV2ZW50LCB2aWV3LCBlLnRhcmdldCwgW1xuICAgICAgICAgIFwicHVzaFwiLFxuICAgICAgICAgIHsgc3VibWl0dGVyOiBlLnN1Ym1pdHRlciB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFtcImNoYW5nZVwiLCBcImlucHV0XCJdKSB7XG4gICAgICB0aGlzLm9uKHR5cGUsIChlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlIGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQgJiZcbiAgICAgICAgICAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50IHx8XG4gICAgICAgICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpICYmXG4gICAgICAgICAgZS50YXJnZXQuZm9ybSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRocm93IG9uIGludmFsaWQgSlMuZGlzcGF0Y2ggdGFyZ2V0IGFuZCBub29wIGlmIEN1c3RvbUV2ZW50IHRyaWdnZXJlZCBvdXRzaWRlIEpTLmRpc3BhdGNoXG4gICAgICAgICAgaWYgKGUuZGV0YWlsICYmIGUuZGV0YWlsLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGRpc3BhdGNoaW5nIGEgY3VzdG9tICR7dHlwZX0gZXZlbnQgaXMgb25seSBzdXBwb3J0ZWQgb24gaW5wdXQgZWxlbWVudHMgaW5zaWRlIGEgZm9ybWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0O1xuICAgICAgICBpZiAodGhpcy5ibG9ja1BoeENoYW5nZVdoaWxlQ29tcG9zaW5nICYmIGUuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgY29tcG9zaXRpb24tbGlzdGVuZXItJHt0eXBlfWA7XG4gICAgICAgICAgaWYgKCFET00ucHJpdmF0ZShpbnB1dCwga2V5KSkge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGEgbmV3IGlucHV0L2NoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgRE9NLmRlbGV0ZVByaXZhdGUoaW5wdXQsIGtleSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUocGh4Q2hhbmdlKTtcbiAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpO1xuICAgICAgICBjb25zdCBwaHhFdmVudCA9IGlucHV0RXZlbnQgfHwgZm9ybUV2ZW50O1xuICAgICAgICBpZiAoIXBoeEV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbnB1dC50eXBlID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgaW5wdXQudmFsaWRpdHkgJiZcbiAgICAgICAgICBpbnB1dC52YWxpZGl0eS5iYWRJbnB1dFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gaW5wdXRFdmVudCA/IGlucHV0IDogaW5wdXQuZm9ybTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgIGNvbnN0IHsgYXQ6IGF0LCB0eXBlOiBsYXN0VHlwZSB9ID1cbiAgICAgICAgICBET00ucHJpdmF0ZShpbnB1dCwgXCJwcmV2LWl0ZXJhdGlvblwiKSB8fCB7fTtcbiAgICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIGFsd2F5cyBmaXJlIGF0IGxlYXN0IG9uZSBcImlucHV0XCIgZXZlbnQgYmVmb3JlIGV2ZXJ5IFwiY2hhbmdlXCJcbiAgICAgICAgLy8gSWdub3JlIFwiY2hhbmdlXCIgZXZlbnRzLCB1bmxlc3MgdGhlcmUgd2FzIG5vIHByaW9yIFwiaW5wdXRcIiBldmVudC5cbiAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdXNlciBjb2RlIHRyaWdnZXJzIGEgXCJjaGFuZ2VcIiBldmVudCwgb3IgaWYgdGhlIGJyb3dzZXIgaXMgbm9uLWNvbmZvcm1pbmcuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhdCA9PT0gY3VycmVudEl0ZXJhdGlvbnMgLSAxICYmXG4gICAgICAgICAgdHlwZSA9PT0gXCJjaGFuZ2VcIiAmJlxuICAgICAgICAgIGxhc3RUeXBlID09PSBcImlucHV0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge1xuICAgICAgICAgIGF0OiBjdXJyZW50SXRlcmF0aW9ucyxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlYm91bmNlKGlucHV0LCBlLCB0eXBlLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZGlzcGF0Y2hlciwgKHZpZXcpID0+IHtcbiAgICAgICAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQsIHRydWUpO1xuICAgICAgICAgICAgSlMuZXhlYyhlLCBcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcbiAgICAgICAgICAgICAgXCJwdXNoXCIsXG4gICAgICAgICAgICAgIHsgX3RhcmdldDogZS50YXJnZXQubmFtZSwgZGlzcGF0Y2hlcjogZGlzcGF0Y2hlciB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub24oXCJyZXNldFwiLCAoZSkgPT4ge1xuICAgICAgY29uc3QgZm9ybSA9IGUudGFyZ2V0O1xuICAgICAgRE9NLnJlc2V0Rm9ybShmb3JtKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gQXJyYXkuZnJvbShmb3JtLmVsZW1lbnRzKS5maW5kKChlbCkgPT4gZWwudHlwZSA9PT0gXCJyZXNldFwiKTtcbiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAvLyB3YWl0IHVudGlsIG5leHQgdGljayB0byBnZXQgdXBkYXRlZCBpbnB1dCB2YWx1ZVxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpbnB1dC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRlYm91bmNlKGVsLCBldmVudCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGlmIChldmVudFR5cGUgPT09IFwiYmx1clwiIHx8IGV2ZW50VHlwZSA9PT0gXCJmb2N1c291dFwiKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaHhEZWJvdW5jZSA9IHRoaXMuYmluZGluZyhQSFhfREVCT1VOQ0UpO1xuICAgIGNvbnN0IHBoeFRocm90dGxlID0gdGhpcy5iaW5kaW5nKFBIWF9USFJPVFRMRSk7XG4gICAgY29uc3QgZGVmYXVsdERlYm91bmNlID0gdGhpcy5kZWZhdWx0cy5kZWJvdW5jZS50b1N0cmluZygpO1xuICAgIGNvbnN0IGRlZmF1bHRUaHJvdHRsZSA9IHRoaXMuZGVmYXVsdHMudGhyb3R0bGUudG9TdHJpbmcoKTtcblxuICAgIHRoaXMud2l0aGluT3duZXJzKGVsLCAodmlldykgPT4ge1xuICAgICAgY29uc3QgYXN5bmNGaWx0ZXIgPSAoKSA9PlxuICAgICAgICAhdmlldy5pc0Rlc3Ryb3llZCgpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpO1xuICAgICAgRE9NLmRlYm91bmNlKFxuICAgICAgICBlbCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHBoeERlYm91bmNlLFxuICAgICAgICBkZWZhdWx0RGVib3VuY2UsXG4gICAgICAgIHBoeFRocm90dGxlLFxuICAgICAgICBkZWZhdWx0VGhyb3R0bGUsXG4gICAgICAgIGFzeW5jRmlsdGVyLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zaWxlbmNlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2U7XG4gIH1cblxuICBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmJvdW5kRXZlbnROYW1lcy5hZGQoZXZlbnQpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNpbGVuY2VkKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAganNRdWVyeVNlbGVjdG9yQWxsKHNvdXJjZUVsLCBxdWVyeSwgZGVmYXVsdFF1ZXJ5KSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5kb21DYWxsYmFja3MuanNRdWVyeVNlbGVjdG9yQWxsO1xuICAgIHJldHVybiBhbGwgPyBhbGwoc291cmNlRWwsIHF1ZXJ5LCBkZWZhdWx0UXVlcnkpIDogZGVmYXVsdFF1ZXJ5KCk7XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNpdGlvblNldCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5wcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdPcHMgPSBbXTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMudHJhbnNpdGlvbnMuZm9yRWFjaCgodGltZXIpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcik7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gIH1cblxuICBhZnRlcihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoUGVuZGluZ09wKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSkge1xuICAgIG9uU3RhcnQoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmFuc2l0aW9ucy5kZWxldGUodGltZXIpO1xuICAgICAgb25Eb25lKCk7XG4gICAgICB0aGlzLmZsdXNoUGVuZGluZ09wcygpO1xuICAgIH0sIHRpbWUpO1xuICAgIHRoaXMudHJhbnNpdGlvbnMuYWRkKHRpbWVyKTtcbiAgfVxuXG4gIGFkZEFzeW5jVHJhbnNpdGlvbihwcm9taXNlKSB7XG4gICAgdGhpcy5wcm9taXNlcy5hZGQocHJvbWlzZSk7XG4gICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucHJvbWlzZXMuZGVsZXRlKHByb21pc2UpO1xuICAgICAgdGhpcy5mbHVzaFBlbmRpbmdPcHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1c2hQZW5kaW5nT3Aob3ApIHtcbiAgICB0aGlzLnBlbmRpbmdPcHMucHVzaChvcCk7XG4gIH1cblxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25zLnNpemUgKyB0aGlzLnByb21pc2VzLnNpemU7XG4gIH1cblxuICBmbHVzaFBlbmRpbmdPcHMoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSgpID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcCA9IHRoaXMucGVuZGluZ09wcy5zaGlmdCgpO1xuICAgIGlmIChvcCkge1xuICAgICAgb3AoKTtcbiAgICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5QaG9lbml4IExpdmVWaWV3IEphdmFTY3JpcHQgQ2xpZW50XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TZWUgdGhlIGhleGRvY3MgYXQgYGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlld2AgZm9yIGRvY3VtZW50YXRpb24uXG4qL1xuXG5pbXBvcnQgT3JpZ2luYWxMaXZlU29ja2V0LCB7IGlzVXNlZElucHV0IH0gZnJvbSBcIi4vbGl2ZV9zb2NrZXRcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCI7XG5pbXBvcnQgeyBWaWV3SG9vayB9IGZyb20gXCIuL3ZpZXdfaG9va1wiO1xuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiO1xuXG5pbXBvcnQgdHlwZSB7IExpdmVTb2NrZXRKU0NvbW1hbmRzIH0gZnJvbSBcIi4vanNfY29tbWFuZHNcIjtcbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va3NPcHRpb25zIH0gZnJvbSBcIi4vdmlld19ob29rXCI7XG5pbXBvcnQgdHlwZSB7IFNvY2tldCBhcyBQaG9lbml4U29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgTGl2ZVNvY2tldCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXZlU29ja2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgcGh4LWRlYm91bmNlIGFuZCBwaHgtdGhyb3R0bGUuXG4gICAqL1xuICBkZWZhdWx0cz86IHtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICBkZWJvdW5jZT86IG51bWJlcjtcbiAgICAvKiogVGhlIG1pbGxpc2Vjb25kIHBoeC10aHJvdHRsZSB0aW1lLiBEZWZhdWx0cyAzMDAgKi9cbiAgICB0aHJvdHRsZT86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIExpdmVWaWV3LiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAgICpcbiAgICovXG4gIHBhcmFtcz86XG4gICAgfCAoKGVsOiBIVE1MRWxlbWVudCkgPT4geyBba2V5OiBzdHJpbmddOiBhbnkgfSlcbiAgICB8IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwicGh4LVwiLlxuICAgKi9cbiAgYmluZGluZ1ByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhbGxiYWNrcyBmb3IgTGl2ZVZpZXcgaG9va3MuXG4gICAqXG4gICAqIFNlZSBbQ2xpZW50IGhvb2tzIHZpYSBgcGh4LWhvb2tgXShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sI2NsaWVudC1ob29rcy12aWEtcGh4LWhvb2spIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgaG9va3M/OiBIb29rc09wdGlvbnM7XG4gIC8qKiBDYWxsYmFja3MgZm9yIExpdmVWaWV3IHVwbG9hZGVycy4gKi9cbiAgdXBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTsgLy8gVE9ETzogZGVmaW5lIG1vcmUgc3BlY2lmaWNhbGx5XG4gIC8qKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGFwcGx5aW5nIGxvYWRpbmcgc3RhdGVzLiAqL1xuICBsb2FkZXJUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpbmcgcGh4LWRpc2Nvbm5lY3RlZCBjb21tYW5kcy4gKi9cbiAgZGlzY29ubmVjdGVkVGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmVsb2FkcyBiZWZvcmUgZW50ZXJpbmcgZmFpbHNhZmUgbW9kZS4gKi9cbiAgbWF4UmVsb2Fkcz86IG51bWJlcjtcbiAgLyoqIE1pbmltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1pbj86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuICovXG4gIHJlbG9hZEppdHRlck1heD86IG51bWJlcjtcbiAgLyoqIFRpbWUgYmV0d2VlbiByZWxvYWQgYXR0ZW1wdHMgaW4gZmFpbHNhZmUgbW9kZS4gKi9cbiAgZmFpbHNhZmVKaXR0ZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBsb2cgZGVidWcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gICAqL1xuICB2aWV3TG9nZ2VyPzogKHZpZXc6IFZpZXcsIGtpbmQ6IHN0cmluZywgbXNnOiBzdHJpbmcsIG9iajogYW55KSA9PiB2b2lkO1xuICAvKipcbiAgICogT2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gZnVuY3Rpb25zIGZvciBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKlxuICAgKiAgICAgbWV0YWRhdGE6IHtcbiAgICogICAgICAgY2xpY2s6IChlLCBlbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiB7XG4gICAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAqICAgICAgICAgICBkZXRhaWw6IGUuZGV0YWlsIHx8IDEsXG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBrZXlkb3duOiAoZSwgZWwpID0+IHtcbiAgICogICAgICAgICByZXR1cm4ge1xuICAgKiAgICAgICAgICAga2V5OiBlLmtleSxcbiAgICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAgICogICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqXG4gICAqL1xuICBtZXRhZGF0YT86IHsgW2V2ZW50TmFtZTogc3RyaW5nXTogKGU6IEV2ZW50LCBlbDogSFRNTEVsZW1lbnQpID0+IG9iamVjdCB9O1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgc2Vzc2lvblN0b3JhZ2VgLiBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICAgKiBoYXBwZW4gaWYgYSBzaXRlIGxvYWRzIGEgY3Jvc3MtZG9tYWluIExpdmVWaWV3IGluIGFuIGlmcmFtZS5cbiAgICpcbiAgICogRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gICAqICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLnN0b3JhZ2UgPSB7fSB9XG4gICAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIHx8IG51bGwgfVxuICAgKiAgICAgICByZW1vdmVJdGVtKGtleU5hbWUpIHsgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXlOYW1lXSB9XG4gICAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICAgKiAgICAgfVxuICAgKi9cbiAgc2Vzc2lvblN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICAgKiBVc2VmdWwgd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogU2VlIGBzZXNzaW9uU3RvcmFnZWAgZm9yIGFuIGV4YW1wbGUuXG4gICAqL1xuICBsb2NhbFN0b3JhZ2U/OiBTdG9yYWdlO1xuICAvKipcbiAgICogSWYgc2V0IHRvIGB0cnVlYCwgYHBoeC1jaGFuZ2VgIGV2ZW50cyB3aWxsIGJlIGJsb2NrZWQgKHdpbGwgbm90IGZpcmUpXG4gICAqIHdoaWxlIHRoZSB1c2VyIGlzIGNvbXBvc2luZyBpbnB1dCB1c2luZyBhbiBJTUUgKElucHV0IE1ldGhvZCBFZGl0b3IpLlxuICAgKiBUaGlzIGlzIGRldGVybWluZWQgYnkgdGhlIGBlLmlzQ29tcG9zaW5nYCBwcm9wZXJ0eSBvbiBrZXlib2FyZCBldmVudHMsXG4gICAqIHdoaWNoIGlzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGVudGVyaW5nIGNvbXBvc2VkIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgKiB3aGVuIHR5cGluZyBKYXBhbmVzZSBvciBDaGluZXNlIHVzaW5nIHJvbWFqaSBvciBwaW55aW4gaW5wdXQgbWV0aG9kcykuXG4gICAqIEJ5IGRlZmF1bHQsIGBwaHgtY2hhbmdlYCB3aWxsIG5vdCBiZSBibG9ja2VkIGR1cmluZyBhIGNvbXBvc2l0aW9uIHNlc3Npb24sXG4gICAqIGJ1dCBub3RlIHRoYXQgdGhlcmUgd2VyZSBpc3N1ZXMgcmVwb3J0ZWQgaW4gb2xkZXIgdmVyc2lvbnMgb2YgU2FmYXJpLFxuICAgKiB3aGVyZSBhIExpdmVWaWV3IHBhdGNoIHRvIHRoZSBpbnB1dCBjYXVzZWQgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICpcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuICAgKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2lzQ29tcG9zaW5nXG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peF9saXZlX3ZpZXcvaXNzdWVzLzMzMjJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGJsb2NrUGh4Q2hhbmdlV2hpbGVDb21wb3Npbmc/OiBib29sZWFuO1xuICAvKiogRE9NIGNhbGxiYWNrcy4gKi9cbiAgZG9tPzoge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgcXVlcnlpbmcgZWxlbWVudHMgaW4gSlMgY29tbWFuZHMuXG4gICAgICogQHBhcmFtIHNvdXJjZUVsIC0gVGhlIHNvdXJjZSBlbGVtZW50LCBlLmcuIHRoZSBidXR0b24gdGhhdCB3YXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdmFsdWUuXG4gICAgICogQHBhcmFtIGRlZmF1bHRRdWVyeSAtIEEgZGVmYXVsdCBxdWVyeSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGlmIG5vIGN1c3RvbSBxdWVyeSBzaG91bGQgYmUgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGpzUXVlcnlTZWxlY3RvckFsbD86IChcbiAgICAgIHNvdXJjZUVsOiBIVE1MRWxlbWVudCxcbiAgICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgICBkZWZhdWx0UXVlcnk6ICgpID0+IEVsZW1lbnRbXSxcbiAgICApID0+IEVsZW1lbnRbXTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaFN0YXJ0PzogKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgRE9NIHBhdGNoIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgb25QYXRjaEVuZD86IChjb250YWluZXI6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IERPTSBub2RlIGlzIGFkZGVkLlxuICAgICAqL1xuICAgIG9uTm9kZUFkZGVkPzogKG5vZGU6IE5vZGUpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJlZm9yZSBhbiBlbGVtZW50IGlzIHVwZGF0ZWQuXG4gICAgICovXG4gICAgb25CZWZvcmVFbFVwZGF0ZWQ/OiAoZnJvbUVsOiBFbGVtZW50LCB0b0VsOiBFbGVtZW50KSA9PiB2b2lkO1xuICB9O1xuICAvKiogQWxsb3cgcGFzc3Rocm91Z2ggb2Ygb3RoZXIgb3B0aW9ucyB0byB0aGUgUGhvZW5peCBTb2NrZXQgY29uc3RydWN0b3IuICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcHVibGljIEFQSSBvZiBhIExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZVNvY2tldEluc3RhbmNlSW50ZXJmYWNlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIExpdmVWaWV3IGNsaWVudC5cbiAgICovXG4gIHZlcnNpb24oKTogc3RyaW5nO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLiBTZWUgYGVuYWJsZVByb2ZpbGluZ2AgYW5kIGBkaXNhYmxlUHJvZmlsaW5nYC5cbiAgICovXG4gIGlzUHJvZmlsZUVuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gU2VlIGBlbmFibGVEZWJ1Z2AgYW5kIGBkaXNhYmxlRGVidWdgLlxuICAgKi9cbiAgaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIFNlZSBgZW5hYmxlRGVidWdgIGFuZCBgZGlzYWJsZURlYnVnYC5cbiAgICovXG4gIGlzRGVidWdEaXNhYmxlZCgpOiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlcyBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIFdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWQsIHRoZSBMaXZlVmlldyBjbGllbnQgd2lsbCBsb2cgZGVidWcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIFNlZSBbRGVidWdnaW5nIGNsaWVudCBldmVudHNdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9qcy1pbnRlcm9wLmh0bWwjZGVidWdnaW5nLWNsaWVudC1ldmVudHMpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlRGVidWcoKTogdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcHJvZmlsaW5nLlxuICAgKlxuICAgKiBXaGVuIHByb2ZpbGluZyBpcyBlbmFibGVkLCB0aGUgTGl2ZVZpZXcgY2xpZW50IHdpbGwgbG9nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS5cbiAgICovXG4gIGVuYWJsZVByb2ZpbGluZygpOiB2b2lkO1xuICAvKipcbiAgICogRGlzYWJsZXMgZGVidWdnaW5nLlxuICAgKi9cbiAgZGlzYWJsZURlYnVnKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBwcm9maWxpbmcuXG4gICAqL1xuICBkaXNhYmxlUHJvZmlsaW5nKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGVzIGxhdGVuY3kgc2ltdWxhdGlvbi5cbiAgICpcbiAgICogV2hlbiBsYXRlbmN5IHNpbXVsYXRpb24gaXMgZW5hYmxlZCwgdGhlIExpdmVWaWV3IGNsaWVudCB3aWxsIGFkZCBhIGRlbGF5IHRvIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgc2VydmVyLlxuICAgKiBTZWUgW1NpbXVsYXRpbmcgTGF0ZW5jeV0oaHR0cHM6Ly9oZXhkb2NzLnBtL3Bob2VuaXhfbGl2ZV92aWV3L2pzLWludGVyb3AuaHRtbCNzaW11bGF0aW5nLWxhdGVuY3kpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW5hYmxlTGF0ZW5jeVNpbSh1cHBlckJvdW5kTXM6IG51bWJlcik6IHZvaWQ7XG4gIC8qKlxuICAgKiBEaXNhYmxlcyBsYXRlbmN5IHNpbXVsYXRpb24uXG4gICAqL1xuICBkaXNhYmxlTGF0ZW5jeVNpbSgpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsYXRlbmN5IHNpbXVsYXRpb24gdXBwZXIgYm91bmQuXG4gICAqL1xuICBnZXRMYXRlbmN5U2ltKCk6IG51bWJlciB8IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBQaG9lbml4IFNvY2tldCBpbnN0YW5jZS5cbiAgICovXG4gIGdldFNvY2tldCgpOiBQaG9lbml4U29ja2V0O1xuICAvKipcbiAgICogQ29ubmVjdHMgdG8gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGNvbm5lY3QoKTogdm9pZDtcbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIExpdmVWaWV3IHNlcnZlci5cbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIHRyYW5zcG9ydCB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIFBob2VuaXggU29ja2V0LlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydCh0cmFuc3BvcnQ6IGFueSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBlbmNvZGVkIEpTIGNvbW1hbmQsIHRhcmdldGluZyB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogU2VlIFtgUGhvZW5peC5MaXZlVmlldy5KU2BdKGh0dHBzOi8vaGV4ZG9jcy5wbS9waG9lbml4X2xpdmVfdmlldy9QaG9lbml4LkxpdmVWaWV3LkpTLmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZXhlY0pTKGVsOiBIVE1MRWxlbWVudCwgZW5jb2RlZEpTOiBzdHJpbmcsIGV2ZW50VHlwZT86IHN0cmluZyB8IG51bGwpOiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIG1hbmlwbHVhdGUgdGhlIERPTSBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LlxuICAgKiBUaGUgYXBwbGllZCBjaGFuZ2VzIGludGVncmF0ZSB3aXRoIHNlcnZlciBET00gcGF0Y2hpbmcuXG4gICAqXG4gICAqIFNlZSBbSmF2YVNjcmlwdCBpbnRlcm9wZXJhYmlsaXR5XShodHRwczovL2hleGRvY3MucG0vcGhvZW5peF9saXZlX3ZpZXcvanMtaW50ZXJvcC5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGpzKCk6IExpdmVTb2NrZXRKU0NvbW1hbmRzO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVTb2NrZXRDb25zdHJ1Y3RvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExpdmVTb2NrZXQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9saXZlXCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICAgKiBAcGFyYW0gc29ja2V0IC0gdGhlIHJlcXVpcmVkIFBob2VuaXggU29ja2V0IGNsYXNzIGltcG9ydGVkIGZyb20gXCJwaG9lbml4XCIuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAgICogICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICogICAgIGxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHsuLi59KVxuICAgKlxuICAgKiBAcGFyYW0gb3B0cyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBuZXcgKFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgc29ja2V0OiB0eXBlb2YgUGhvZW5peFNvY2tldCxcbiAgICBvcHRzPzogTGl2ZVNvY2tldE9wdGlvbnMsXG4gICk6IExpdmVTb2NrZXRJbnN0YW5jZUludGVyZmFjZTtcbn1cblxuLy8gYmVjYXVzZSBMaXZlU29ja2V0IGlzIGluIEpTIChmb3Igbm93KSwgd2UgY2FzdCBpdCB0byBvdXIgZGVmaW5lZCBUeXBlU2NyaXB0IGNvbnN0cnVjdG9yLlxuY29uc3QgTGl2ZVNvY2tldCA9IE9yaWdpbmFsTGl2ZVNvY2tldCBhcyB1bmtub3duIGFzIExpdmVTb2NrZXRDb25zdHJ1Y3RvcjtcblxuLyoqIENyZWF0ZXMgYSBob29rIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBob29rLlxuICogQHBhcmFtIGNhbGxiYWNrcyAtIFRoZSBsaXN0IG9mIGhvb2sgY2FsbGJhY2tzLCBzdWNoIGFzIG1vdW50ZWQsXG4gKiAgIHVwZGF0ZWQsIGRlc3Ryb3llZCwgZXRjLlxuICpcbiAqICpOb3RlKjogYGNyZWF0ZUhvb2tgIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGBjb25uZWN0ZWRDYWxsYmFja2AgbGlmZWN5Y2xlXG4gKiB3aGljaCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIERPTS4gSWYgeW91IHRyeVxuICogdG8gY2FsbCBgY3JlYXRlSG9va2AgZnJvbSB0aGUgY29uc3RydWN0b3IsIGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gKiAgIGNvbm5lY3RlZENhbGxiYWNrKCl7XG4gKiAgICAgbGV0IG9uTGl2ZVZpZXdNb3VudGVkID0gKCkgPT4gdGhpcy5ob29rLnB1c2hFdmVudCguLi4pKVxuICogICAgIHRoaXMuaG9vayA9IGNyZWF0ZUhvb2sodGhpcywge21vdW50ZWQ6IG9uTGl2ZVZpZXdNb3VudGVkfSlcbiAqICAgfVxuICogfVxuICpcbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIEhvb2sgaW5zdGFuY2UgZm9yIHRoZSBjdXN0b20gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSG9vayhlbDogSFRNTEVsZW1lbnQsIGNhbGxiYWNrczogSG9vayk6IFZpZXdIb29rIHtcbiAgbGV0IGV4aXN0aW5nSG9vayA9IERPTS5nZXRDdXN0b21FbEhvb2soZWwpO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSG9vaztcbiAgfVxuXG4gIGxldCBob29rID0gbmV3IFZpZXdIb29rKFZpZXcuY2xvc2VzdFZpZXcoZWwpLCBlbCwgY2FsbGJhY2tzKTtcbiAgRE9NLnB1dEN1c3RvbUVsSG9vayhlbCwgaG9vayk7XG4gIHJldHVybiBob29rO1xufVxuXG5leHBvcnQgeyBMaXZlU29ja2V0LCBpc1VzZWRJbnB1dCwgY3JlYXRlSG9vaywgVmlld0hvb2ssIEhvb2ssIEhvb2tzT3B0aW9ucyB9O1xuIiwgImltcG9ydCBcInBob2VuaXhfaHRtbFwiO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSBcInBob2VuaXhcIjtcbmltcG9ydCB7IExpdmVTb2NrZXQgfSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIjtcbmltcG9ydCBDbGlwYm9hcmRKUyBmcm9tIFwiY2xpcGJvYXJkXCI7XG5pbXBvcnQgdG9wYmFyIGZyb20gXCJ0b3BiYXJcIjtcbmltcG9ydCB7aG9va3MgYXMgY29sb2NhdGVkSG9va3N9IGZyb20gXCJwaG9lbml4LWNvbG9jYXRlZC9saXZlX2FkbWluXCI7XG5cbnRvcGJhci5jb25maWcoe1xuICBiYXJDb2xvcnM6IHsgMDogXCJyZ2IoNjcsIDU2LCAyMDIpXCIgfSxcbiAgc2hhZG93Q29sb3I6IFwicmdiYSgwLCAwLCAwLCAuMylcIixcbiAgY2xhc3NOYW1lOiBcInRvcGJhclwiLFxufSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIiwgKGluZm8pID0+IHRvcGJhci5zaG93KCkpO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgKCkgPT4gdG9wYmFyLmhpZGUoKSk7XG5cbmxldCBIb29rcyA9IHt9O1xuXG5Ib29rcy5BcnJheUlucHV0ID0ge1xuICBtb3VudGVkKCkge1xuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBlID0+IGUuc3RvcFByb3BhZ2F0aW9uKCkpO1xuXG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBlID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGUudGFyZ2V0LmJsdXIoKVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSk7XG4gIH1cbn07XG5cbkhvb2tzLlNob3cgPSB7XG4gIHNldFRhYihlbCkge1xuICAgIGNvbnN0IHVybEhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaCB8fCAnI21haW4nO1xuXG4gICAgZm9yICh0YWJMaW5rIG9mIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWJzIGEnKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGFiTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgIGlmICh0YXJnZXQgPT09IHVybEhhc2gpIHtcbiAgICAgICAgdGFiTGluay5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIH0gZWxzZSBpZiAodGFiTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSAhPT0gXCIjbWFpblwiICYmIGVsLnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KS5xdWVyeVNlbGVjdG9yKHVybEhhc2gpIHx8IChlbC5xdWVyeVNlbGVjdG9yKHRhcmdldCkucGFyZW50Tm9kZSA9PT0gZWwucXVlcnlTZWxlY3Rvcih1cmxIYXNoKS5wYXJlbnRFbGVtZW50ICYmICF0YWJMaW5rLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcihgOnNjb3BlID4gYVtocmVmPVwiJHt1cmxIYXNofVwiXWApKSkge1xuICAgICAgICB0YWJMaW5rLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiTGluay5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGN1cnJlbnRUYWJDb250ZW50ID0gZWwucXVlcnlTZWxlY3Rvcih1cmxIYXNoKVxuXG4gICAgZm9yIChjb25zdCBmaWVsZFNldCBvZiBlbC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZC1zZWN0aW9uJykpIHtcbiAgICAgIGlmIChmaWVsZFNldC5wYXJlbnROb2RlID09PSBjdXJyZW50VGFiQ29udGVudCkge1xuICAgICAgICBmaWVsZFNldC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZFNldC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgdGFiQ29udGVudCBvZiBjdXJyZW50VGFiQ29udGVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXRhaWwtdmlldycpKSB7XG4gICAgICBpZiAodGFiQ29udGVudCA9PT0gY3VycmVudFRhYkNvbnRlbnQpIHtcbiAgICAgICAgdGFiQ29udGVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICB0YWJDb250ZW50LnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBtb3VudGVkKCkge1xuICAgIHRoaXMuc2V0VGFiKHRoaXMuZWwpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCAoKSA9PiB0aGlzLnNldFRhYih0aGlzLmVsKSk7XG4gIH0sXG59XG5cbkhvb2tzLkZvcm0gPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmFkZCgnZHJhZ2dpbmcnKTtcblxuICAgICAgZm9yIChjb25zdCBidG4gb2YgdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuYWRkLXNlY3Rpb24tYnRuJykpIHtcbiAgICAgICAgYnRuLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoYC5kcm9wLXpvbmU6bm90KFtkYXRhLWlkeD1cIiR7ZS50YXJnZXQuZGF0YXNldC5pZHh9XCJdKTpub3QoW2RhdGEtaWR4PVwiJHsoK2UudGFyZ2V0LmRhdGFzZXQuaWR4KSsxfVwiXSlgKSkge1xuICAgICAgICB6b25lLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ2ZsZXgnKTtcbiAgICAgIH07XG5cbiAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCBlLnRhcmdldC5kYXRhc2V0LmlkeCk7XG4gICAgfSk7XG5cblxuICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCAoZSkgPT4ge1xuICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnaW5nJyk7XG5cbiAgICBmb3IgKGNvbnN0IGJ0biBvZiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZGQtc2VjdGlvbi1idG4nKSkge1xuICAgICAgYnRuLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLXpvbmUnKSkge1xuICAgICAgem9uZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgIH07XG4gIH0pO1xuXG4gIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIGUgPT4ge1xuICAgIGlmIChlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Atem9uZScpKSB7XG4gICAgICBlLnRhcmdldC5zdHlsZS5zZXRQcm9wZXJ0eSgnb3BhY2l0eScsIDEpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ2xlYXZlXCIsIGUgPT4ge1xuICAgIGlmIChlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Atem9uZScpKSB7XG4gICAgICBlLnRhcmdldC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnb3BhY2l0eScpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBlID0+IHtcbiAgICAgaWYgKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZHJvcC16b25lJykpIHtcbiAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgY29uc3QgZW1iZWQgPSBlLnRhcmdldC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoYC5lbWJlZC1zZWN0aW9uW2RhdGEtaWR4PVwiJHtlLmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9wbGFpblwiKX1cIl1gKVxuICAgICAgIGUudGFyZ2V0LmFmdGVyKGVtYmVkKTtcblxuICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJjaGFuZ2VcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcbiAgICB9O1xuICB9KTtcbiAgfVxufVxuXG5Ib29rcy5TZWFyY2hTZWxlY3QgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5oYW5kbGVFdmVudChcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLmVsXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIilcbiAgICAgICAgLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcbiAgICB9KTtcbiAgfSxcbn07XG5cbkhvb2tzLkNvcHlGaWVsZCA9IHtcbiAgbW91bnRlZCgpIHtcbiAgICBuZXcgQ2xpcGJvYXJkSlModGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jbGlwYm9hcmQtdGFyZ2V0XScpKVxuICB9LFxufVxuXG5Ib29rcy5JbmRleFBhZ2UgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IFtdO1xuXG4gICAgLy8gdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwibGl2ZV9hZG1pbjphY3Rpb25cIiwgKGUpID0+IHtcbiAgICAvLyAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSBcIkZPUk1cIikge1xuICAgIC8vICAgICBjb25zdCBwYXJhbXMgPSBbLi4ubmV3IEZvcm1EYXRhKGUudGFyZ2V0KV0ucmVkdWNlKFxuICAgIC8vICAgICAgIChwYXJhbXMsIFtrZXksIHZhbF0pID0+IHtcbiAgICAvLyAgICAgICAgIGlmIChrZXkgPT09IFwiYXJnc1tdXCIpIHtcbiAgICAvLyAgICAgICAgICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBhcmdzOiBbLi4ucGFyYW1zLmFyZ3MsIHZhbF0gfTtcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAgIHJldHVybiB7IC4uLnBhcmFtcywgW2tleV06IHZhbCB9O1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgIH0sXG4gICAgLy8gICAgICAgeyBhcmdzOiBbXSB9LFxuICAgIC8vICAgICApO1xuXG4gICAgLy8gICAgIHRoaXMucHVzaEV2ZW50VG8odGhpcy5lbCwgXCJhY3Rpb25cIiwgeyAuLi5wYXJhbXMsIGlkczogdGhpcy5zZWxlY3RlZCB9KTtcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIHRoaXMucHVzaEV2ZW50VG8odGhpcy5lbCwgXCJhY3Rpb25cIiwge1xuICAgIC8vICAgICAgIG5hbWU6IGUudGFyZ2V0LmRhdGFzZXQuYWN0aW9uLFxuICAgIC8vICAgICAgIGlkczogdGhpcy5zZWxlY3RlZCxcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG5cbiAgICAvLyB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJsaXZlX2FkbWluOnRvZ2dsZV9zZWxlY3RcIiwgKGUpID0+IHtcbiAgICAvLyAgIGlmIChlLnRhcmdldC5pZCA9PT0gXCJzZWxlY3QtYWxsXCIpIHtcbiAgICAvLyAgICAgdGhpcy5lbFxuICAgIC8vICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLnJlc291cmNlX19zZWxlY3RcIilcbiAgICAvLyAgICAgICAuZm9yRWFjaCgoYm94KSA9PiAoYm94LmNoZWNrZWQgPSBlLnRhcmdldC5jaGVja2VkKSk7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoXCIjc2VsZWN0LWFsbFwiKS5jaGVja2VkID0gZmFsc2U7XG4gICAgLy8gICB9XG5cbiAgICAvLyAgIHRoaXMuc2VsZWN0ZWQgPSBBcnJheS5mcm9tKFxuICAgIC8vICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFtkYXRhLXJlY29yZC1rZXldOmNoZWNrZWRcIiksXG4gICAgLy8gICAgIChlKSA9PiBlLmRhdGFzZXQucmVjb3JkS2V5LFxuICAgIC8vICAgKTtcblxuICAgIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgIC8vICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZvb3Rlci1zZWxlY3RcIikuc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJkaXNwbGF5XCIpO1xuICAgIC8vICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZvb3Rlci1uYXZcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItbmF2XCIpLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiZGlzcGxheVwiKTtcbiAgICAvLyAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXItc2VsZWN0XCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAvLyAgIH1cbiAgICAvLyB9KTtcbiAgfSxcbiAgdXBkYXRlZCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gW107XG4gIH0sXG59O1xuXG5sZXQgY3NyZlRva2VuID0gZG9jdW1lbnRcbiAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuICAuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKTtcbmxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHtcbiAgaG9va3M6IHsuLi5Ib29rcywgLi4uY29sb2NhdGVkSG9va3N9LFxuICBwYXJhbXM6IHsgX2NzcmZfdG9rZW46IGNzcmZUb2tlbiB9LFxufSk7XG5cbi8vIENvbm5lY3QgaWYgdGhlcmUgYXJlIGFueSBMaXZlVmlld3Mgb24gdGhlIHBhZ2VcbmxpdmVTb2NrZXQuY29ubmVjdCgpO1xuXG5pZiAoRU5WID09IFwiZGV2XCIpIHtcbiAgbGl2ZVNvY2tldC5lbmFibGVEZWJ1ZygpO1xuICBsaXZlU29ja2V0LmVuYWJsZUxhdGVuY3lTaW0ocHJvY2Vzcy5lbnYuTEFURU5DWV9TSU0pO1xufVxuXG53aW5kb3cubGl2ZVNvY2tldCA9IGxpdmVTb2NrZXQ7XG4iLCAiXG4gIGV4cG9ydCBkZWZhdWx0IHtcbiAgICBtb3VudGVkKCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVsLmRhdGFzZXRbJ3R5cGUnXSAhPT0gJ2Vycm9yJykge1xuICAgICAgICAgIHRoaXMucHVzaEV2ZW50KCdkaXNtaXNzJywge2luZGV4OiBwYXJzZUludCh0aGlzLmVsLmRhdGFzZXRbJ2luZGV4J10pfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDMwMDApO1xuICAgIH1cbiAgfVxuIiwgImNvbnN0IGpzID0ge307IGV4cG9ydCBkZWZhdWx0IGpzO1xuY29uc3QgaW1wX25ieHc2MjN0ID0ge307IGV4cG9ydCB7IGltcF9uYnh3NjIzdCBhcyBob29rcyB9O1xuaW1wb3J0IGpzX3BrcHU3ZXB1cTV1cHR4am92cmNpYWZ0M3B5IGZyb20gXCIuL0xpdmVBZG1pbi5Db21wb25lbnRzLkFsZXJ0QmFyLzIwXzZmam51YTVjcmh3bmlpbmlzM2I0cWx0ZDQ0LmpzXCI7IGltcF9uYnh3NjIzdFtcIkxpdmVBZG1pbi5Db21wb25lbnRzLkFsZXJ0QmFyLkFsZXJ0SXRlbVwiXSA9IGpzX3BrcHU3ZXB1cTV1cHR4am92cmNpYWZ0M3B5O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFB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
diff --git a/lib/live_admin.ex b/lib/live_admin.ex
index 564602c6..d0b460e3 100644
--- a/lib/live_admin.ex
+++ b/lib/live_admin.ex
@@ -14,25 +14,23 @@ defmodule LiveAdmin do
nav: [type: :atom],
home: [type: :atom],
session: [type: :atom],
- new: [type: :atom],
+ create: [type: :atom],
edit: [type: :atom],
- list: [type: :atom],
- view: [type: :atom]
+ index: [type: :atom],
+ show: [type: :atom]
]
],
ecto_repo: [
type: :atom,
type_doc: "Ecto Repo used to query resource"
],
- list_with: [
+ query_with: [
type: {:or, [:atom, {:tuple, [:atom, :atom]}]},
- type_doc:
- "`t:func_ref/0` returning `{records, count}` used to fetch records in LiveAdmin :list component"
+ type_doc: "`t:func_ref/0` returning an Ecto queryable"
],
render_with: [
type: {:or, [:atom, {:tuple, [:atom, :atom]}]},
- type_doc:
- "`t:func_ref/0` used to convert field values to string in LiveAdmin :list component"
+ type_doc: "`t:func_ref/0` used to convert field values to strings when rendering"
],
delete_with: [
type: {:or, [:atom, {:tuple, [:atom, :atom]}]},
@@ -131,6 +129,9 @@ defmodule LiveAdmin do
key
end
+ def announce(message, type, session),
+ do: LiveAdmin.PubSub.broadcast(session.id, {:announce, %{message: message, type: type}})
+
def route_with_params(assigns, parts \\ []) do
resource_path = parts[:resource_path] || assigns.key
@@ -282,4 +283,12 @@ defmodule LiveAdmin do
{:error, _} -> %{}
end
end
+
+ def safe_render(val) when is_list(val), do: inspect(val, pretty: true)
+
+ def safe_render(val) do
+ to_string(val)
+ rescue
+ _ -> inspect(val, pretty: true)
+ end
end
diff --git a/lib/live_admin/components.ex b/lib/live_admin/components.ex
index e8170e64..a307805d 100644
--- a/lib/live_admin/components.ex
+++ b/lib/live_admin/components.ex
@@ -1,220 +1,545 @@
defmodule LiveAdmin.Components do
use Phoenix.Component
- import Phoenix.HTML.Form
use PhoenixHTMLHelpers
- alias LiveAdmin.Components.Container.Form
- alias Phoenix.LiveView.JS
+ import Phoenix.HTML.Form
+ import LiveAdmin
- slot(:inner_block, required: true)
- slot(:control)
- slot(:empty_label)
+ alias Phoenix.LiveView.JS
+ alias LiveAdmin.Components.Container.Form.{ArrayInput, SearchSelect}
+ attr(:id, :string, required: true)
attr(:label, :string, required: true)
- attr(:disabled, :boolean, default: false)
- attr(:items, :list, default: [])
- attr(:orientation, :atom, values: [:up, :down], default: :down)
- attr(:id, :string, default: nil)
- attr(:base_class, :string, default: "resource__action")
+ attr(:items, :list, required: true)
+ slot(:inner_block)
- def dropdown(assigns) do
+ def drop_down(assigns) do
~H"""
-
- <%= if @orientation == :up do %>
- <.list items={@items} inner_block={@inner_block} />
- <% end %>
- <%= if render_slot(@control) do %>
- {render_slot(@control)}
- <% else %>
-
- {@label}
-
- <% end %>
- <%= if @orientation == :down do %>
- <.list items={@items} inner_block={@inner_block} empty_label={@empty_label} />
- <% end %>
-
+
+ {@label}
+
+
"""
end
- def embed(assigns) do
+ def form_grid(assigns) do
~H"""
-
"_container"} class="embed__group" phx-hook="EmbedComponent">
- <%= unless @disabled do %>
- <.inputs_for :let={embed_form} field={@form[@field]} skip_hidden={true}>
-
- <%= if match?({_, {_, %{cardinality: :many}}}, @type) do %>
-
"[]"}
- value={embed_form.index}
- class="embed__index"
- phx-page-loading
- />
-
"[]"}
- value={embed_form.index}
- class="embed__drop"
- phx-page-loading
+
+
+ <%= for {field, {_,{Ecto.Embedded, embed}}, opts} <- @fields, {_, val} = Ecto.Changeset.fetch_field(@form.source, field) do %>
+ <.embed_form
+ field={field}
+ embed={embed}
+ form={@form}
+ value={val}
+ resource={@resource}
+ resources={@resources}
+ config={@config}
+ session={@session}
+ prefix={@prefix}
+ repo={@repo}
+ target={@target}
+ />
+ <% end %>
+
+ """
+ end
+
+ def embed_form(assigns) do
+ ~H"""
+
+
+
+
{@field |> humanize() |> trans()}
+
+ <%= if @value do %>
+ <.inputs_for :let={embed_form} field={@form[@field]} skip_hidden={true}>
+ <%= if sortable?(@value) do %>
+
{trans("Move here")}
<% end %>
-
- <%= for {field, type, _} <- embed_fields(@type) do %>
-
+ <%= if sortable?(@value) do %>
+ "[]"}
+ value={embed_form.index}
/>
<% end %>
+ if @embed.cardinality == :one, do: "", else: "[]"}
+ value={if @embed.cardinality == :one, do: "", else: embed_form.index}
+ phx-click={JS.dispatch("change")}
+ >
+
+
+
+
+
+
+ <%= if sortable?(@value) do %>
+
+
+
+
+
+
+ <% end %>
+ <.form_grid
+ form={embed_form}
+ resource={@resource}
+ resources={@resources}
+ session={@session}
+ prefix={@prefix}
+ repo={@repo}
+ config={@config}
+ fields={
+ Enum.map(
+ @embed.related.__schema__(:fields),
+ &{&1, @embed.related.__schema__(:type, &1), []}
+ )
+ }
+ target={@target}
+ cycle={!assigns[:cycle]}
+ />
-
-
- <%= if match?({_, {_, %{cardinality: :many}}}, @type) || !input_value(@form, @field) do %>
-
"[]"}
- class="embed__sort"
- phx-page-loading
- />
-
- <% end %>
- <%= if match?({_, {_, %{cardinality: :one}}}, @type) do %>
-
+ <%= if sortable?(@value) && embed_form.index + 1 == length(@value) do %>
+
{trans("Move here")}
+ <% end %>
+
<% end %>
- <% else %>
-
<%= @form |> input_value(@field) |> inspect() %>
- <% end %>
+
+ <%= if @embed.cardinality == :many || (@form[@field].value in ["", nil]) do %>
+
if @embed.cardinality == :one, do: "", else: "[]"}
+ value="new"
+ phx-click={JS.dispatch("change")}
+ phx-target={@target}
+ >
+ +
+ {@field |> humanize() |> trans()}
+
+ <% end %>
"""
end
- def action_control(assigns) do
- {name, _, _, arity, docs} =
- LiveAdmin.fetch_function(assigns.resource, assigns.session, :actions, assigns.action)
+ defp sortable?(val) when is_list(val) and length(val) > 1, do: true
+ defp sortable?(_), do: false
+
+ defp editable_inline?(form, field, type) when type in [:id, :binary_id],
+ do: form.data |> Ecto.primary_key() |> Keyword.keys() |> Enum.member?(field) |> Kernel.not()
+
+ defp editable_inline?(_, _, {_, {Ecto.Embedded, _}}), do: false
- extra_arg_count = arity - 2
+ defp editable_inline?(_, _, :map), do: false
- assigns =
- assign(assigns,
- extra_arg_count: extra_arg_count,
- function_docs: docs,
- modalize: extra_arg_count > 0 or Enum.any?(docs),
- title: name |> to_string() |> humanize()
+ defp editable_inline?(_, _, _), do: true
+
+ defp input(assigns = %{type: id}) when id in [:id, :binary_id] do
+ assoc_resource =
+ associated_resource(
+ LiveAdmin.fetch_config(assigns.resource, :schema, assigns.session),
+ assigns.field,
+ assigns.resources,
+ :resource
)
+ if assoc_resource do
+ value = assigns.form[assigns.field].value
+
+ selected_option =
+ case value do
+ empty when empty in [nil, ""] ->
+ {nil, nil}
+
+ key ->
+ assoc_record =
+ LiveAdmin.Resource.find!(key, assoc_resource, assigns.prefix, assigns.repo)
+
+ {key, record_label(assoc_record, assoc_resource, assigns.config)}
+ end
+
+ assigns = assign(assigns, selected_option: selected_option, resource: assoc_resource)
+
+ ~H"""
+ <.live_component
+ module={SearchSelect}
+ id={@form[@field].id}
+ name={@form[@field].name}
+ disabled={@disabled}
+ selected_option={@selected_option}
+ options={{__MODULE__, :search_select_options, [@resource, @prefix, @session, @repo, @config]}}
+ />
+ """
+ else
+ ~H"""
+
+ """
+ end
+ end
+
+ defp input(assigns = %{type: {:array, :string}}) do
~H"""
-
- {@title}
-
- <%= if @modalize do %>
- <.modal id={"#{@action}-action-modal"}>
-
{@title}
- <%= for {_lang, doc} <- @function_docs do %>
-
{doc}
- <% end %>
- <.form
- for={Phoenix.Component.to_form(%{})}
- phx-submit={JS.dispatch("live_admin:action") |> JS.hide(to: "##{@action}-action-modal")}
+ <.live_component
+ module={ArrayInput}
+ id={input_id(@form, @field)}
+ form={@form}
+ field={@field}
+ disabled={@disabled}
+ />
+ """
+ end
+
+ defp input(assigns = %{type: :string}) do
+ ~H"""
+
+ """
+ end
+
+ defp input(assigns = %{type: :boolean}) do
+ ~H"""
+ <% normalize_value(:boolean, @form[@field].value) %>
+
+
"_left"}
+ checked={normalize_value("checkbox", @form[@field].value) == false}
+ value="false"
+ />
+
"_center"}
+ checked={@form[@field].value in [nil, ""]}
+ value=""
+ />
+
"_right"}
+ checked={normalize_value("checkbox", @form[@field].value) == true}
+ value="true"
+ />
+
+
+
+
+
"_left"} class="label-area left">
+
"_center"} class="label-area center">
+
"_right"} class="label-area right">
+
+
+ """
+ end
+
+ defp input(assigns = %{type: :date}) do
+ ~H"""
+
+ """
+ end
+
+ defp input(assigns = %{type: number}) when number in [:integer, :id, :float] do
+ ~H"""
+
+ """
+ end
+
+ defp input(assigns = %{type: type}) when type in [:naive_datetime, :utc_datetime] do
+ ~H"""
+
+ """
+ end
+
+ defp input(assigns = %{type: {_, {Ecto.Enum, %{mappings: mappings}}}}) do
+ assigns = assign(assigns, :mappings, mappings)
+
+ ~H"""
+
+
+ <%= for {k, v} <- @mappings do %>
+ {v}
+ <% end %>
+
+ """
+ end
+
+ defp input(assigns = %{type: {:array, {_, {Ecto.Enum, %{mappings: mappings}}}}}) do
+ assigns = assign(assigns, :mappings, mappings)
+
+ ~H"""
+
"[]"} class="form-select" multiple={true}>
+ <%= for {k, v} <- @mappings do %>
+ {v}
+ <% end %>
+
+ """
+ end
+
+ defp input(assigns) do
+ ~H"""
+ NO INPUT
+ """
+ end
+
+ def error(assigns) do
+ ~H"""
+
+ """
+ end
+
+ def expand_modal(assigns) do
+ ~H"""
+
+ <.modal id={@id <> "-modal"}>
+ <:title>{@title}
{@field}
+
{safe_render(@value)}
+
-
- <%= if @extra_arg_count > 0 do %>
- Arguments
- <%= for num <- 1..@extra_arg_count do %>
-
- {num}
-
-
- <% end %>
- <% end %>
-
-
+
+
+
+
+
- <% end %>
+
+
+
+
+
+
+
+
+
"""
end
def modal(assigns) do
~H"""
-
-
- {render_slot(@inner_block)}
+
+
@id)}
+ >
+
+
+ {render_slot(@inner_block)}
+
"""
end
- defp list(assigns) do
+ def function_control(assigns) do
+ assigns = assign(assigns, :modalize, assigns.extra_arg_count > 0 || Enum.any?(assigns.docs))
+
~H"""
-
-
- <%= if Enum.empty?(@items) && assigns[:empty_label] do %>
- {render_slot(@empty_label)}
- <% end %>
- <%= for item <- @items do %>
- {render_slot(@inner_block, item)}
- <% end %>
-
-
+ <%= if @modalize do %>
+ <.modal id={"#{@type}-#{@name}-modal"}>
+ <:title>{@name |> to_string() |> humanize()}
+ <.form
+ for={Phoenix.Component.to_form(%{})}
+ phx-submit={@type}
+ phx-target={assigns[:target]}
+ class="form-line"
+ >
+ <%= for {_lang, doc} <- @docs do %>
+
{doc}
+ <% end %>
+
+ <%= if @extra_arg_count > 0 do %>
+
+ <%= for num <- 1..@extra_arg_count do %>
+
+ {num}
+
+
+ <% end %>
+ <% end %>
+
+ {trans("Submit")}
+
+
+
+ <% end %>
+
@name}, page_loading: true, target: @target)
+ }
+ data-confirm={if @modalize, do: nil, else: trans("Are you sure you?")}
+ >
+ {trans(humanize(@name))}
+
"""
end
- defp embed_fields({_, {_, %{related: schema}}}),
- do: Enum.map(schema.__schema__(:fields), &{&1, schema.__schema__(:type, &1), []})
+ def search_select_options(q, resource, prefix, session, repo, config) do
+ resource
+ |> LiveAdmin.Resource.list([prefix: prefix, search: q], session, repo, config)
+ |> elem(0)
+ |> Enum.map(
+ &{Map.fetch!(&1, LiveAdmin.primary_key!(resource)), record_label(&1, resource, config)}
+ )
+ end
+
+ @supported_primitive_types [
+ :string,
+ :boolean,
+ :date,
+ :integer,
+ :naive_datetime,
+ :utc_datetime,
+ :id,
+ :binary_id,
+ :float
+ ]
+ def supported_type?(type) when type in @supported_primitive_types, do: true
+ def supported_type?(:map), do: true
+ def supported_type?({:array, _}), do: true
+ def supported_type?({_, {Ecto.Embedded, _}}), do: true
+ def supported_type?({_, {Ecto.Enum, _}}), do: true
+ def supported_type?(_), do: false
end
diff --git a/lib/live_admin/components/alert_bar.ex b/lib/live_admin/components/alert_bar.ex
new file mode 100644
index 00000000..8be9a5de
--- /dev/null
+++ b/lib/live_admin/components/alert_bar.ex
@@ -0,0 +1,87 @@
+defmodule LiveAdmin.Components.AlertBar do
+ use Phoenix.LiveView
+
+ require Logger
+
+ alias Phoenix.LiveView.JS
+
+ @impl true
+ def mount(_, %{"session_id" => session_id}, socket) do
+ if connected?(socket) do
+ :ok = LiveAdmin.PubSub.subscribe(session_id)
+ :ok = LiveAdmin.PubSub.subscribe()
+ end
+
+ {:ok, assign(socket, alerts: []), layout: false}
+ end
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+ <%= for {{alert, type}, index} <- Enum.with_index(@alerts) do %>
+
+
+ <%= if index == 0 && Enum.count(@alerts) > 1 do %>
+
+ {Enum.count(@alerts)}
+
+ <% else %>
+
+
+
+
+
+ <% end %>
+
+
{alert}
+
+
+ <% end %>
+
+
+ """
+ end
+
+ @impl true
+ def handle_event("dismiss", %{"index" => 0}, socket),
+ do: {:noreply, assign(socket, :alerts, [])}
+
+ def handle_event("dismiss", %{"index" => index}, socket),
+ do: {:noreply, update(socket, :alerts, &List.delete_at(&1, index))}
+
+ @impl true
+ def handle_info(info = {:announce, %{message: message, type: type}}, socket) do
+ Logger.debug("ANNOUNCE: #{inspect(info)}")
+ {:noreply, update(socket, :alerts, &[{message, type} | &1])}
+ end
+
+ def handle_info(_, socket), do: {:noreply, socket}
+end
diff --git a/lib/live_admin/components/container.ex b/lib/live_admin/components/container.ex
index 51ce169f..e09b65ad 100644
--- a/lib/live_admin/components/container.ex
+++ b/lib/live_admin/components/container.ex
@@ -6,47 +6,27 @@ defmodule LiveAdmin.Components.Container do
import LiveAdmin,
only: [
- resource_title: 2,
route_with_params: 1,
- route_with_params: 2,
- trans: 1,
- trans: 2
+ route_with_params: 2
]
- import LiveAdmin.Components
- import LiveAdmin.View, only: [get_function_keys: 3]
-
alias LiveAdmin.Resource
- alias Phoenix.LiveView.JS
@impl true
def mount(_params, _session, socket) do
socket =
- assign(socket, loading: !connected?(socket), jobs: [])
-
- if connected?(socket) do
- Process.send_after(self(), :clear_flash, 1000)
- end
+ assign(socket, loading: !connected?(socket))
{:ok, socket}
end
- @impl true
- def handle_info(:clear_flash, socket) do
- {:noreply, clear_flash(socket)}
- end
-
- def handle_info(_, socket) do
- {:noreply, socket}
- end
-
@impl true
def handle_params(
params = %{"record_id" => id},
uri,
socket = %{assigns: %{live_action: action, loading: false}}
)
- when action in [:edit, :view] do
+ when action in [:edit, :show] do
socket =
socket
|> assign_resource_info(uri)
@@ -68,7 +48,7 @@ defmodule LiveAdmin.Components.Container do
end
@impl true
- def handle_params(params, uri, socket = %{assigns: %{live_action: :list, loading: false}}) do
+ def handle_params(params, uri, socket = %{assigns: %{live_action: :index, loading: false}}) do
socket =
socket
|> assign(search: params["s"])
@@ -83,7 +63,7 @@ defmodule LiveAdmin.Components.Container do
end
@impl true
- def handle_params(params, uri, socket = %{assigns: %{live_action: :new}}),
+ def handle_params(params, uri, socket = %{assigns: %{live_action: :create}}),
do:
{:noreply,
socket
@@ -94,62 +74,6 @@ defmodule LiveAdmin.Components.Container do
def handle_params(_, _, socket), do: {:noreply, socket}
- @impl true
- def handle_event(
- "task",
- params = %{"name" => name},
- socket = %{
- assigns: %{session: session, resource: resource, config: config}
- }
- ) do
- {_, m, f, _, _} =
- LiveAdmin.fetch_function(resource, session, :tasks, String.to_existing_atom(name))
-
- args = [session | Map.get(params, "args", [])]
-
- search = Map.get(socket.assigns, :search)
-
- task =
- Task.Supervisor.async_nolink(LiveAdmin.Task.Supervisor, fn ->
- try do
- case apply(m, f, [Resource.query(resource, search, config) | args]) do
- {:ok, message} ->
- LiveAdmin.PubSub.announce(
- session.id,
- :success,
- trans("Task %{name} succeeded: '%{message}'",
- inter: [name: name, message: message]
- )
- )
-
- {:error, message} ->
- LiveAdmin.PubSub.announce(
- session.id,
- :error,
- trans("Task %{name} failed: '%{message}'",
- inter: [name: name, message: message]
- )
- )
- end
- rescue
- error ->
- Logger.error(inspect(error))
-
- LiveAdmin.PubSub.announce(
- session.id,
- :error,
- trans("Task %{name} failed", inter: [name: name])
- )
- after
- LiveAdmin.PubSub.update_job(session.id, self(), progress: 1)
- end
- end)
-
- LiveAdmin.PubSub.update_job(session.id, task.pid, progress: 0, label: name)
-
- {:noreply, push_navigate(socket, to: route_with_params(socket.assigns))}
- end
-
@impl true
def handle_event("set_locale", %{"locale" => locale}, socket) do
new_session = Map.put(socket.assigns.session, :locale, locale)
@@ -164,89 +88,20 @@ defmodule LiveAdmin.Components.Container do
{:noreply, socket}
end
- def render(assigns = %{loading: true}), do: ~H""
-
@impl true
+ def render(assigns = %{loading: true}), do: ~H"LOADING"
+
def render(assigns) do
~H"""
-
-
- {resource_title(@resource, @config)}
-
-
-
-
- <.link
- navigate={route_with_params(assigns, params: [prefix: @prefix])}
- class="resource__action--btn"
- >
- {trans("List")}
-
- <%= if LiveAdmin.fetch_config(@resource, :create_with, @config) != false do %>
- <.link
- navigate={route_with_params(assigns, segments: ["new"], params: [prefix: @prefix])}
- class="resource__action--btn"
- >
- {trans("New")}
-
- <% else %>
-
- {trans("New")}
-
- <% end %>
- <.dropdown
- :let={task}
- label={trans("Run task")}
- items={get_function_keys(@resource, @config, :tasks)}
- disabled={Enum.empty?(get_function_keys(@resource, @config, :tasks))}
- >
- <.task_control task={task} session={@session} resource={@resource} />
-
- <%= if Enum.any?(@prefix_options) do %>
- <.dropdown
- :let={prefix}
- id="prefix-select"
- label={@prefix || trans("Set prefix")}
- items={[""] ++ Enum.filter(@prefix_options, &(to_string(&1) != @prefix))}
- >
- <.link navigate={route_with_params(assigns, params: [prefix: prefix])}>
- {if prefix == "", do: trans("clear"), else: prefix}
-
-
- <% end %>
- <%= if LiveAdmin.use_i18n? do %>
- <.dropdown
- :let={locale}
- id="locale-select"
- label={@session.locale || "Set locale"}
- items={
- Enum.filter(
- LiveAdmin.gettext_backend().locales(),
- &(to_string(&1) != @session.locale)
- )
- }
- >
-
- {locale}
-
-
- <% end %>
-
-
-
-
- {render("#{@live_action}.html", assigns)}
+ {render(@live_action, assigns)}
"""
end
- def render("list.html", assigns) do
+ def render(:index, assigns) do
~H"""
<.live_component
module={@mod}
- id="list"
+ id="index"
key={@key}
resource={@resource}
page={@page}
@@ -264,7 +119,7 @@ defmodule LiveAdmin.Components.Container do
"""
end
- def render("new.html", assigns) do
+ def render(:create, assigns) do
~H"""
<.live_component
module={@mod}
@@ -282,7 +137,7 @@ defmodule LiveAdmin.Components.Container do
"""
end
- def render("edit.html", assigns) do
+ def render(:edit, assigns) do
~H"""
<.live_component
module={@mod}
@@ -301,11 +156,11 @@ defmodule LiveAdmin.Components.Container do
"""
end
- def render("view.html", assigns) do
+ def render(:show, assigns) do
~H"""
<.live_component
module={@mod}
- id="view"
+ id="show"
record={@record}
resource={@resource}
resources={@resources}
@@ -421,59 +276,4 @@ defmodule LiveAdmin.Components.Container do
)
end
end
-
- defp task_control(assigns) do
- {name, _, _, arity, docs} =
- LiveAdmin.fetch_function(assigns.resource, assigns.session, :tasks, assigns.task)
-
- extra_arg_count = arity - 2
-
- assigns =
- assign(assigns,
- extra_arg_count: extra_arg_count,
- function_docs: docs,
- modalize: extra_arg_count > 0 or Enum.any?(docs),
- title: name |> to_string() |> humanize()
- )
-
- ~H"""
-
@task}, page_loading: true)
- }
- ,
- data-confirm={if @modalize, do: nil, else: "Are you sure?"}
- >
- {@task |> to_string() |> humanize()}
-
- <%= if @modalize do %>
- <.modal id={"#{@task}-task-modal"}>
-
{@title}
- <%= for {_lang, doc} <- @function_docs do %>
-
{doc}
- <% end %>
- <.form for={Phoenix.Component.to_form(%{})} phx-submit="task">
-
- <%= if @extra_arg_count > 0 do %>
-
Arguments
- <%= for num <- 1..@extra_arg_count do %>
-
- {num}
-
-
- <% end %>
- <% end %>
-
-
-
- <% end %>
- """
- end
end
diff --git a/lib/live_admin/components/home/content.ex b/lib/live_admin/components/home/content.ex
index 3ffbd9d0..844775d3 100644
--- a/lib/live_admin/components/home/content.ex
+++ b/lib/live_admin/components/home/content.ex
@@ -4,12 +4,30 @@ defmodule LiveAdmin.Components.Home.Content do
@impl true
def render(assigns) do
~H"""
-
-
- This is the default LiveAdmin home page content.
+
+
+
+
+
Welcome to LiveAdmin!
+
This is the default LiveAdmin home page content.
- To use your own component, set the value of
:home
- in the components option to a module that uses LiveComponent. LiveAdmin will render that component instead of this one in your app.
+
+ To use your own component, set the value of :home
+ in the components option to a module that uses LiveComponent. LiveAdmin will render that component instead of this one in your app.
+
+
+
+
+
"""
diff --git a/lib/live_admin/components/layout/app.html.heex b/lib/live_admin/components/layout/app.html.heex
index 78e6f22d..f7c0124a 100644
--- a/lib/live_admin/components/layout/app.html.heex
+++ b/lib/live_admin/components/layout/app.html.heex
@@ -1,13 +1,55 @@
-
- {Phoenix.Flash.get(@flash, :success)}
- {Phoenix.Flash.get(@flash, :info)}
- {Phoenix.Flash.get(@flash, :error)}
- {live_render(@socket, LiveAdmin.Components.Nav.Jobs,
+