ngx-dynamic-entity 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Component, Input, Output, EventEmitter, signal, computed, inject, ViewChild, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, Input, Output, EventEmitter, signal, computed, inject, afterNextRender, ElementRef, Injector, ViewChild } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { ReactiveFormsModule } from '@angular/forms';
4
4
  import { findTab, formatDisplayValue, getTabData, resolveLabel } from '@dynamic-entity/core';
@@ -45,6 +45,8 @@ export class DynamicRecordFormComponent {
45
45
  sectionSave = new EventEmitter();
46
46
  dynamicFormComp;
47
47
  rulesEvaluation = inject(RulesEvaluationService);
48
+ host = inject(ElementRef);
49
+ injector = inject(Injector);
48
50
  currentData = signal({});
49
51
  originalBaseline = signal({});
50
52
  /**
@@ -434,29 +436,64 @@ export class DynamicRecordFormComponent {
434
436
  formatFieldValue(field) {
435
437
  return formatDisplayValue(field.type, field.options, this.fieldValue(field.id), this.language);
436
438
  }
437
- jumpToField(fieldId) {
438
- // Find parent tab for field
439
+ /**
440
+ * Finds which tab — and, where the field lives one level down, which sub-tab — owns a
441
+ * field. The walk used to check top-level `fields` only, so every field in a sub-tab was
442
+ * simply not found and the jump did nothing at all.
443
+ */
444
+ locateField(fieldId) {
439
445
  for (const tab of this.config?.tabs || []) {
440
- const hasField = (tab.fields || []).some(f => f.id === fieldId);
441
- if (hasField) {
442
- this.dynamicFormComp?.setActiveTab(tab.id);
443
- setTimeout(() => {
444
- const el = document.getElementById(`field-container-${fieldId}`);
445
- if (el) {
446
- el.scrollIntoView({ behavior: 'smooth', block: 'center' });
447
- el.focus();
448
- }
449
- }, 50);
450
- break;
446
+ if ((tab.fields || []).some(f => f.id === fieldId))
447
+ return { tabId: tab.id };
448
+ for (const child of tab.children || []) {
449
+ if ((child.fields || []).some(f => f.id === fieldId)) {
450
+ return { tabId: tab.id, subTabId: child.id };
451
+ }
451
452
  }
452
453
  }
454
+ return null;
455
+ }
456
+ /**
457
+ * Switches to the tab holding `fieldId`, then scrolls it into view and moves focus to it.
458
+ *
459
+ * The wait for the new tab to render used to be a 50 ms `setTimeout`, which was wrong three
460
+ * ways: `document` is undefined on a server render, 50 ms is a guess that a large tab can
461
+ * outrun, and nothing cancelled the timer if the component went away first.
462
+ * `afterNextRender` fixes all three — it never runs on the server, it runs when the panel
463
+ * has actually rendered rather than when a guess expires, and it is tied to the injector so
464
+ * destroying the component cancels it. The query is scoped to this component's own element,
465
+ * so the library no longer reaches for the global `document` at all.
466
+ */
467
+ jumpToField(fieldId) {
468
+ const location = this.locateField(fieldId);
469
+ if (!location)
470
+ return;
471
+ this.dynamicFormComp?.setActiveTab(location.tabId);
472
+ // `setActiveTab` resets to a tab's first child, so the sub-tab has to be selected after
473
+ // it, not before. Without this the walk found sub-tab fields and then rendered the wrong
474
+ // panel, so the element the callback below looks for never existed.
475
+ if (location.subTabId)
476
+ this.dynamicFormComp?.setActiveSubTab(location.subTabId);
477
+ afterNextRender(() => {
478
+ // The field id comes from config, so it never goes into a selector string: no
479
+ // escaping to get wrong, and no need for `CSS.escape`, which jsdom and older
480
+ // browsers do not provide and whose absence throws silently inside a render hook.
481
+ const wanted = `field-container-${fieldId}`;
482
+ const el = Array.from(this.host.nativeElement.querySelectorAll('[id^="field-container-"]')).find(slot => slot.id === wanted);
483
+ if (!el)
484
+ return;
485
+ el.scrollIntoView({ behavior: 'smooth', block: 'center' });
486
+ // The slot carries tabindex="-1" so this actually moves focus. Without it the jump
487
+ // scrolled the field into view and left focus behind on the link.
488
+ el.focus();
489
+ }, { injector: this.injector });
453
490
  }
454
491
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicRecordFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
455
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DynamicRecordFormComponent, isStandalone: true, selector: "ngx-dynamic-record-form", inputs: { config: "config", rules: "rules", initialData: "initialData", userRoles: "userRoles", language: "language", readonly: "readonly", loading: "loading", error: "error", isReadOnly: "isReadOnly", readOnlyFields: "readOnlyFields", viewMode: "viewMode" }, outputs: { formSubmit: "formSubmit", formChange: "formChange", formReset: "formReset", sectionSave: "sectionSave" }, viewQueries: [{ propertyName: "dynamicFormComp", first: true, predicate: DynamicFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-record-editor\">\n <!-- Record Header -->\n <div class=\"ngx-record-editor__header\">\n <div class=\"ngx-record-editor__title-group\">\n @if (profileImageUrl) {\n <img\n class=\"ngx-record-editor__avatar\"\n data-testid=\"header-profile-image\"\n [src]=\"profileImageUrl\"\n [alt]=\"recordTitle\"\n />\n } @else {\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\n {{ avatarLetter }}\n </div>\n }\n <div>\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\n {{ recordTitle }}\n </h2>\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\n </div>\n </div>\n\n <!-- Record-level status switch, outside section editing -->\n @if (headerToggleField; as toggleField) {\n <label class=\"ngx-record-editor__header-toggle\">\n <span>{{ formatFieldLabel(toggleField) }}</span>\n <input\n type=\"checkbox\"\n role=\"switch\"\n data-testid=\"header-toggle\"\n [checked]=\"headerToggleValue\"\n [disabled]=\"recordReadOnly\"\n [attr.aria-checked]=\"headerToggleValue\"\n (change)=\"toggleHeaderStatus()\"\n />\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\n </label>\n }\n </div>\n\n <!-- Dismissible info banners (rules `info` action) -->\n @for (banner of infoBanners; track banner.fieldId) {\n <div\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\n role=\"status\"\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\n >\n <span>\u2139\uFE0F {{ banner.message }}</span>\n <button\n type=\"button\"\n class=\"ngx-record-editor__banner-dismiss\"\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\n (click)=\"dismissInfoBanner(banner.fieldId)\"\n >\u2715</button>\n </div>\n }\n\n <!-- Modification baseline banner -->\n @if (isModified()) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\n </div>\n }\n\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\n @if (summaryFields().length > 0) {\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\n @for (sf of summaryFields(); track sf.id) {\n <div\n class=\"ngx-record-editor__summary-item\"\n [attr.data-testid]=\"'summary-' + sf.id\"\n (click)=\"jumpToField(sf.id)\"\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\n >\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\n @if (viewMode && !recordReadOnly) {\n <div class=\"ngx-record-editor__section-bar\">\n @if (isEditingActiveTab) {\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\n Cancel\n </button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\n Save section\n </button>\n } @else {\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\n Edit section\n </button>\n }\n </div>\n }\n\n @if (Object.keys(sectionErrors()).length > 0) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\n @for (key of Object.keys(sectionErrors()); track key) {\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\n }\n </div>\n }\n\n <!-- Array rows: listed here, edited in the drawer below -->\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\n <div class=\"ngx-record-editor__rows-head\">\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\n @if (!sectionReadOnly) {\n <button\n type=\"button\"\n class=\"ngx-form__reset\"\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\n (click)=\"openAddRow(arrayField)\"\n >+ Row</button>\n }\n </div>\n\n @for (row of rowsOf(arrayField); track $index) {\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\n @if (!sectionReadOnly) {\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\n }\n </div>\n } @empty {\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\n }\n </div>\n }\n\n <!--\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\n tab view races the tab's own initialisation (the reference hit this with FormArray).\n -->\n @if (inlineRowField(); as rowField) {\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\n <div class=\"ngx-record-editor__rows-head\">\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\n </div>\n\n <div class=\"ngx-form__panel\">\n @for (child of rowField.children ?? []; track child.id) {\n <ngx-dynamic-field\n [field]=\"child\"\n [control]=\"inlineRowForm!.get(child.id)!\"\n [config]=\"config\"\n [language]=\"language\"\n [readonly]=\"false\"\n [userRoles]=\"userRoles\"\n [style.gridColumn]=\"'span 12'\"\n />\n }\n </div>\n\n <div class=\"ngx-record-editor__section-bar\">\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\n </div>\n </div>\n }\n\n <!-- Main Dynamic Form -->\n <ngx-dynamic-form\n [config]=\"config\"\n [rules]=\"rules\"\n [initialData]=\"initialData\"\n [originalData]=\"originalBaseline()\"\n [userRoles]=\"userRoles\"\n [language]=\"language\"\n [readonly]=\"sectionReadOnly\"\n [readOnlyFields]=\"readOnlyFields\"\n [showInfoBanners]=\"false\"\n [loading]=\"loading\"\n [error]=\"error\"\n (formChange)=\"onFormChange($event)\"\n (formSubmit)=\"onFormSubmit($event)\"\n (formReset)=\"onFormReset()\"\n (activeTabChange)=\"onActiveTabChange($event)\"\n />\n</div>\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicFormComponent, selector: "ngx-dynamic-form", inputs: ["config", "rules", "initialData", "originalData", "userRoles", "language", "readonly", "readOnlyFields", "showInfoBanners", "loading", "error", "changeDebounceMs", "preview"], outputs: ["formSubmit", "formChange", "formReset", "activeTabChange", "saveRejected"] }, { kind: "component", type: DynamicFieldComponent, selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }] });
492
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DynamicRecordFormComponent, isStandalone: true, selector: "ngx-dynamic-record-form", inputs: { config: "config", rules: "rules", initialData: "initialData", userRoles: "userRoles", language: "language", readonly: "readonly", loading: "loading", error: "error", isReadOnly: "isReadOnly", readOnlyFields: "readOnlyFields", viewMode: "viewMode" }, outputs: { formSubmit: "formSubmit", formChange: "formChange", formReset: "formReset", sectionSave: "sectionSave" }, viewQueries: [{ propertyName: "dynamicFormComp", first: true, predicate: DynamicFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ngx-record-editor\">\n <!-- Record Header -->\n <div class=\"ngx-record-editor__header\">\n <div class=\"ngx-record-editor__title-group\">\n @if (profileImageUrl) {\n <img\n class=\"ngx-record-editor__avatar\"\n data-testid=\"header-profile-image\"\n [src]=\"profileImageUrl\"\n [alt]=\"recordTitle\"\n />\n } @else {\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\n {{ avatarLetter }}\n </div>\n }\n <div>\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\n {{ recordTitle }}\n </h2>\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\n </div>\n </div>\n\n <!-- Record-level status switch, outside section editing -->\n @if (headerToggleField; as toggleField) {\n <label class=\"ngx-record-editor__header-toggle\">\n <span>{{ formatFieldLabel(toggleField) }}</span>\n <input\n type=\"checkbox\"\n role=\"switch\"\n data-testid=\"header-toggle\"\n [checked]=\"headerToggleValue\"\n [disabled]=\"recordReadOnly\"\n [attr.aria-checked]=\"headerToggleValue\"\n (change)=\"toggleHeaderStatus()\"\n />\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\n </label>\n }\n </div>\n\n <!-- Dismissible info banners (rules `info` action) -->\n @for (banner of infoBanners; track banner.fieldId) {\n <div\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\n role=\"status\"\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\n >\n <span>\u2139\uFE0F {{ banner.message }}</span>\n <button\n type=\"button\"\n class=\"ngx-record-editor__banner-dismiss\"\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\n (click)=\"dismissInfoBanner(banner.fieldId)\"\n >\u2715</button>\n </div>\n }\n\n <!-- Modification baseline banner -->\n @if (isModified()) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\n </div>\n }\n\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\n @if (summaryFields().length > 0) {\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\n @for (sf of summaryFields(); track sf.id) {\n <div\n class=\"ngx-record-editor__summary-item\"\n [attr.data-testid]=\"'summary-' + sf.id\"\n (click)=\"jumpToField(sf.id)\"\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\n >\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\n @if (viewMode && !recordReadOnly) {\n <div class=\"ngx-record-editor__section-bar\">\n @if (isEditingActiveTab) {\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\n Cancel\n </button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\n Save section\n </button>\n } @else {\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\n Edit section\n </button>\n }\n </div>\n }\n\n @if (Object.keys(sectionErrors()).length > 0) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\n @for (key of Object.keys(sectionErrors()); track key) {\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\n }\n </div>\n }\n\n <!-- Array rows: listed here, edited in the drawer below -->\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\n <div class=\"ngx-record-editor__rows-head\">\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\n @if (!sectionReadOnly) {\n <button\n type=\"button\"\n class=\"ngx-form__reset\"\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\n (click)=\"openAddRow(arrayField)\"\n >+ Row</button>\n }\n </div>\n\n @for (row of rowsOf(arrayField); track $index) {\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\n @if (!sectionReadOnly) {\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\n }\n </div>\n } @empty {\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\n }\n </div>\n }\n\n <!--\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\n tab view races the tab's own initialisation (the reference hit this with FormArray).\n -->\n @if (inlineRowField(); as rowField) {\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\n <div class=\"ngx-record-editor__rows-head\">\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\n </div>\n\n <div class=\"ngx-form__panel\">\n @for (child of rowField.children ?? []; track child.id) {\n <ngx-dynamic-field\n [field]=\"child\"\n [control]=\"inlineRowForm!.get(child.id)!\"\n [config]=\"config\"\n [language]=\"language\"\n [readonly]=\"false\"\n [userRoles]=\"userRoles\"\n [style.gridColumn]=\"'span 12'\"\n />\n }\n </div>\n\n <div class=\"ngx-record-editor__section-bar\">\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\n </div>\n </div>\n }\n\n <!-- Main Dynamic Form -->\n <ngx-dynamic-form\n [config]=\"config\"\n [rules]=\"rules\"\n [initialData]=\"initialData\"\n [originalData]=\"originalBaseline()\"\n [userRoles]=\"userRoles\"\n [language]=\"language\"\n [readonly]=\"sectionReadOnly\"\n [readOnlyFields]=\"readOnlyFields\"\n [showInfoBanners]=\"false\"\n [loading]=\"loading\"\n [error]=\"error\"\n (formChange)=\"onFormChange($event)\"\n (formSubmit)=\"onFormSubmit($event)\"\n (formReset)=\"onFormReset()\"\n (activeTabChange)=\"onActiveTabChange($event)\"\n />\n</div>\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicFormComponent, selector: "ngx-dynamic-form", inputs: ["config", "rules", "initialData", "originalData", "userRoles", "language", "readonly", "readOnlyFields", "showInfoBanners", "loading", "error", "changeDebounceMs", "preview"], outputs: ["formSubmit", "formChange", "formReset", "activeTabChange", "saveRejected"] }, { kind: "component", type: DynamicFieldComponent, selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
456
493
  }
457
494
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicRecordFormComponent, decorators: [{
458
495
  type: Component,
459
- args: [{ selector: 'ngx-dynamic-record-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, DynamicFormComponent, DynamicFieldComponent], template: "<div class=\"ngx-record-editor\">\n <!-- Record Header -->\n <div class=\"ngx-record-editor__header\">\n <div class=\"ngx-record-editor__title-group\">\n @if (profileImageUrl) {\n <img\n class=\"ngx-record-editor__avatar\"\n data-testid=\"header-profile-image\"\n [src]=\"profileImageUrl\"\n [alt]=\"recordTitle\"\n />\n } @else {\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\n {{ avatarLetter }}\n </div>\n }\n <div>\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\n {{ recordTitle }}\n </h2>\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\n </div>\n </div>\n\n <!-- Record-level status switch, outside section editing -->\n @if (headerToggleField; as toggleField) {\n <label class=\"ngx-record-editor__header-toggle\">\n <span>{{ formatFieldLabel(toggleField) }}</span>\n <input\n type=\"checkbox\"\n role=\"switch\"\n data-testid=\"header-toggle\"\n [checked]=\"headerToggleValue\"\n [disabled]=\"recordReadOnly\"\n [attr.aria-checked]=\"headerToggleValue\"\n (change)=\"toggleHeaderStatus()\"\n />\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\n </label>\n }\n </div>\n\n <!-- Dismissible info banners (rules `info` action) -->\n @for (banner of infoBanners; track banner.fieldId) {\n <div\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\n role=\"status\"\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\n >\n <span>\u2139\uFE0F {{ banner.message }}</span>\n <button\n type=\"button\"\n class=\"ngx-record-editor__banner-dismiss\"\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\n (click)=\"dismissInfoBanner(banner.fieldId)\"\n >\u2715</button>\n </div>\n }\n\n <!-- Modification baseline banner -->\n @if (isModified()) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\n </div>\n }\n\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\n @if (summaryFields().length > 0) {\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\n @for (sf of summaryFields(); track sf.id) {\n <div\n class=\"ngx-record-editor__summary-item\"\n [attr.data-testid]=\"'summary-' + sf.id\"\n (click)=\"jumpToField(sf.id)\"\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\n >\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\n @if (viewMode && !recordReadOnly) {\n <div class=\"ngx-record-editor__section-bar\">\n @if (isEditingActiveTab) {\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\n Cancel\n </button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\n Save section\n </button>\n } @else {\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\n Edit section\n </button>\n }\n </div>\n }\n\n @if (Object.keys(sectionErrors()).length > 0) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\n @for (key of Object.keys(sectionErrors()); track key) {\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\n }\n </div>\n }\n\n <!-- Array rows: listed here, edited in the drawer below -->\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\n <div class=\"ngx-record-editor__rows-head\">\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\n @if (!sectionReadOnly) {\n <button\n type=\"button\"\n class=\"ngx-form__reset\"\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\n (click)=\"openAddRow(arrayField)\"\n >+ Row</button>\n }\n </div>\n\n @for (row of rowsOf(arrayField); track $index) {\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\n @if (!sectionReadOnly) {\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\n }\n </div>\n } @empty {\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\n }\n </div>\n }\n\n <!--\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\n tab view races the tab's own initialisation (the reference hit this with FormArray).\n -->\n @if (inlineRowField(); as rowField) {\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\n <div class=\"ngx-record-editor__rows-head\">\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\n </div>\n\n <div class=\"ngx-form__panel\">\n @for (child of rowField.children ?? []; track child.id) {\n <ngx-dynamic-field\n [field]=\"child\"\n [control]=\"inlineRowForm!.get(child.id)!\"\n [config]=\"config\"\n [language]=\"language\"\n [readonly]=\"false\"\n [userRoles]=\"userRoles\"\n [style.gridColumn]=\"'span 12'\"\n />\n }\n </div>\n\n <div class=\"ngx-record-editor__section-bar\">\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\n </div>\n </div>\n }\n\n <!-- Main Dynamic Form -->\n <ngx-dynamic-form\n [config]=\"config\"\n [rules]=\"rules\"\n [initialData]=\"initialData\"\n [originalData]=\"originalBaseline()\"\n [userRoles]=\"userRoles\"\n [language]=\"language\"\n [readonly]=\"sectionReadOnly\"\n [readOnlyFields]=\"readOnlyFields\"\n [showInfoBanners]=\"false\"\n [loading]=\"loading\"\n [error]=\"error\"\n (formChange)=\"onFormChange($event)\"\n (formSubmit)=\"onFormSubmit($event)\"\n (formReset)=\"onFormReset()\"\n (activeTabChange)=\"onActiveTabChange($event)\"\n />\n</div>\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"] }]
496
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngx-dynamic-record-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, DynamicFormComponent, DynamicFieldComponent], template: "<div class=\"ngx-record-editor\">\n <!-- Record Header -->\n <div class=\"ngx-record-editor__header\">\n <div class=\"ngx-record-editor__title-group\">\n @if (profileImageUrl) {\n <img\n class=\"ngx-record-editor__avatar\"\n data-testid=\"header-profile-image\"\n [src]=\"profileImageUrl\"\n [alt]=\"recordTitle\"\n />\n } @else {\n <div class=\"ngx-record-editor__avatar\" data-testid=\"header-avatar-initial\">\n {{ avatarLetter }}\n </div>\n }\n <div>\n <h2 class=\"ngx-record-editor__title\" data-testid=\"record-title\">\n {{ recordTitle }}\n </h2>\n <span class=\"ngx-record-editor__subtitle\">Entity: {{ config.entity }}</span>\n </div>\n </div>\n\n <!-- Record-level status switch, outside section editing -->\n @if (headerToggleField; as toggleField) {\n <label class=\"ngx-record-editor__header-toggle\">\n <span>{{ formatFieldLabel(toggleField) }}</span>\n <input\n type=\"checkbox\"\n role=\"switch\"\n data-testid=\"header-toggle\"\n [checked]=\"headerToggleValue\"\n [disabled]=\"recordReadOnly\"\n [attr.aria-checked]=\"headerToggleValue\"\n (change)=\"toggleHeaderStatus()\"\n />\n <span class=\"ngx-record-editor__header-toggle-text\">{{ headerToggleValue ? 'Yes' : 'No' }}</span>\n </label>\n }\n </div>\n\n <!-- Dismissible info banners (rules `info` action) -->\n @for (banner of infoBanners; track banner.fieldId) {\n <div\n class=\"ngx-record-editor__banner ngx-record-editor__banner--info\"\n role=\"status\"\n [attr.data-testid]=\"'info-banner-' + banner.fieldId\"\n >\n <span>\u2139\uFE0F {{ banner.message }}</span>\n <button\n type=\"button\"\n class=\"ngx-record-editor__banner-dismiss\"\n [attr.data-testid]=\"'dismiss-' + banner.fieldId\"\n [attr.aria-label]=\"'Dismiss: ' + banner.message\"\n (click)=\"dismissInfoBanner(banner.fieldId)\"\n >\u2715</button>\n </div>\n }\n\n <!-- Modification baseline banner -->\n @if (isModified()) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--warning\">\n \uD83D\uDD12 Record modified from session baseline \u2014 unsaved changes pending.\n </div>\n }\n\n <!-- Summary Panel (showOnMinimize fields with interactive jump) -->\n @if (summaryFields().length > 0) {\n <div class=\"ngx-record-editor__summary-panel\" data-testid=\"summary-panel\">\n @for (sf of summaryFields(); track sf.id) {\n <div\n class=\"ngx-record-editor__summary-item\"\n [attr.data-testid]=\"'summary-' + sf.id\"\n (click)=\"jumpToField(sf.id)\"\n [title]=\"'Click to jump to ' + formatFieldLabel(sf)\"\n >\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(sf) }}</span>\n <span class=\"ngx-record-editor__summary-val\">{{ formatFieldValue(sf) }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Section edit bar: one tab is edited at a time, and validated on its own -->\n @if (viewMode && !recordReadOnly) {\n <div class=\"ngx-record-editor__section-bar\">\n @if (isEditingActiveTab) {\n <span class=\"ngx-record-editor__section-hint\">Editing this section</span>\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-section\" (click)=\"cancelSection()\">\n Cancel\n </button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-section\" (click)=\"saveSection()\">\n Save section\n </button>\n } @else {\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"edit-section\" (click)=\"editSection()\">\n Edit section\n </button>\n }\n </div>\n }\n\n @if (Object.keys(sectionErrors()).length > 0) {\n <div class=\"ngx-record-editor__banner ngx-record-editor__banner--error\" role=\"alert\" data-testid=\"section-errors\">\n @for (key of Object.keys(sectionErrors()); track key) {\n <div>\u26A0\uFE0F {{ sectionErrors()[key] }}</div>\n }\n </div>\n }\n\n <!-- Array rows: listed here, edited in the drawer below -->\n @for (arrayField of arrayFieldsForActiveTab; track arrayField.id) {\n <div class=\"ngx-record-editor__rows\" [attr.data-testid]=\"'rows-' + arrayField.id\">\n <div class=\"ngx-record-editor__rows-head\">\n <span class=\"ngx-record-editor__summary-label\">{{ formatFieldLabel(arrayField) }}</span>\n @if (!sectionReadOnly) {\n <button\n type=\"button\"\n class=\"ngx-form__reset\"\n [attr.data-testid]=\"'add-row-' + arrayField.id\"\n (click)=\"openAddRow(arrayField)\"\n >+ Row</button>\n }\n </div>\n\n @for (row of rowsOf(arrayField); track $index) {\n <div class=\"ngx-record-editor__row\" [attr.data-testid]=\"'row-' + arrayField.id + '-' + $index\">\n <span class=\"ngx-record-editor__row-text\">{{ rowSummary(arrayField, row) }}</span>\n @if (!sectionReadOnly) {\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'edit-row-' + arrayField.id + '-' + $index\"\n (click)=\"openEditRow(arrayField, $index)\">Edit</button>\n <button type=\"button\" class=\"ngx-record-editor__row-btn\"\n [attr.data-testid]=\"'delete-row-' + arrayField.id + '-' + $index\"\n (click)=\"deleteRow(arrayField, $index)\">Delete</button>\n }\n </div>\n } @empty {\n <p class=\"ngx-record-editor__row-empty\">No rows yet.</p>\n }\n </div>\n }\n\n <!--\n Row drawer. Deliberately outside the tab panel: building a row's FormGroup inside the\n tab view races the tab's own initialisation (the reference hit this with FormArray).\n -->\n @if (inlineRowField(); as rowField) {\n <div class=\"ngx-record-editor__drawer\" data-testid=\"row-drawer\" [formGroup]=\"inlineRowForm!\">\n <div class=\"ngx-record-editor__rows-head\">\n <strong>{{ inlineRowIndex() === null ? 'Add' : 'Edit' }} {{ formatFieldLabel(rowField) }} row</strong>\n </div>\n\n <div class=\"ngx-form__panel\">\n @for (child of rowField.children ?? []; track child.id) {\n <ngx-dynamic-field\n [field]=\"child\"\n [control]=\"inlineRowForm!.get(child.id)!\"\n [config]=\"config\"\n [language]=\"language\"\n [readonly]=\"false\"\n [userRoles]=\"userRoles\"\n [style.gridColumn]=\"'span 12'\"\n />\n }\n </div>\n\n <div class=\"ngx-record-editor__section-bar\">\n <button type=\"button\" class=\"ngx-form__reset\" data-testid=\"cancel-row\" (click)=\"cancelRow()\">Cancel</button>\n <button type=\"button\" class=\"ngx-form__submit\" data-testid=\"save-row\" (click)=\"saveRow()\">Save row</button>\n </div>\n </div>\n }\n\n <!-- Main Dynamic Form -->\n <ngx-dynamic-form\n [config]=\"config\"\n [rules]=\"rules\"\n [initialData]=\"initialData\"\n [originalData]=\"originalBaseline()\"\n [userRoles]=\"userRoles\"\n [language]=\"language\"\n [readonly]=\"sectionReadOnly\"\n [readOnlyFields]=\"readOnlyFields\"\n [showInfoBanners]=\"false\"\n [loading]=\"loading\"\n [error]=\"error\"\n (formChange)=\"onFormChange($event)\"\n (formSubmit)=\"onFormSubmit($event)\"\n (formReset)=\"onFormReset()\"\n (activeTabChange)=\"onActiveTabChange($event)\"\n />\n</div>\n", styles: [".ngx-record-editor{display:flex;flex-direction:column;gap:16px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:20px;box-shadow:0 4px 6px -1px #0000000d}.ngx-record-editor__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;border-bottom:1px solid #f3f4f6}.ngx-record-editor__title-group{display:flex;align-items:center;gap:12px}.ngx-record-editor__avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e0e7ff;color:#4f46e5;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:18px}.ngx-record-editor__title{font-size:20px;font-weight:700;color:#111827;margin:0}.ngx-record-editor__subtitle{font-size:13px;color:#6b7280}.ngx-record-editor__header-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:#374151}.ngx-record-editor__header-toggle-text{font-weight:600}.ngx-record-editor__banner{padding:10px 14px;border-radius:8px;font-size:13px;font-weight:500}.ngx-record-editor__banner--info{background:#eff6ff;border:1px solid #dbeafe;color:#1d4ed8;display:flex;align-items:center;justify-content:space-between;gap:12px}.ngx-record-editor__banner-dismiss{background:none;border:none;cursor:pointer;color:inherit;font-size:14px;line-height:1;padding:2px 6px;border-radius:4px}.ngx-record-editor__banner-dismiss:hover{background:#0000000f}.ngx-record-editor__banner--error{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c}.ngx-record-editor__section-bar{display:flex;align-items:center;justify-content:flex-end;gap:8px}.ngx-record-editor__section-hint{margin-right:auto;font-size:12px;color:#6b7280}.ngx-record-editor__banner--warning{background:#fffbeb;border:1px solid #fef3c7;color:#b45309}.ngx-record-editor__rows{border:1px solid #f3f4f6;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:6px}.ngx-record-editor__rows-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.ngx-record-editor__row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;background:#f9fafb}.ngx-record-editor__row-text{flex:1;font-size:13px;overflow-wrap:anywhere}.ngx-record-editor__row-btn{background:none;border:1px solid #e5e7eb;border-radius:6px;cursor:pointer;font-size:12px;padding:2px 8px}.ngx-record-editor__row-empty{font-size:12px;color:#6b7280;margin:0}.ngx-record-editor__drawer{border:1px solid #dbeafe;background:#f8fafc;border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:12px}.ngx-record-editor__summary-panel{background:#f9fafb;border:1px solid #f3f4f6;border-radius:8px;padding:12px 16px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.ngx-record-editor__summary-item{display:flex;flex-direction:column;cursor:pointer;padding:6px 10px;border-radius:6px;transition:background .15s}.ngx-record-editor__summary-item:hover{background:#eff6ff}.ngx-record-editor__summary-label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280;font-weight:600}.ngx-record-editor__summary-val{font-size:14px;font-weight:600;color:#1f2937}\n"] }]
460
497
  }], propDecorators: { config: [{
461
498
  type: Input
462
499
  }], rules: [{
@@ -491,4 +528,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
491
528
  type: ViewChild,
492
529
  args: [DynamicFormComponent]
493
530
  }] } });
494
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUE4QixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7QUFFOUU7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFbEQ7Ozs7R0FJRztBQW9NSCxNQUFNLE9BQU8sMEJBQTBCO0lBQzVCLE1BQU0sQ0FBb0I7SUFDMUIsS0FBSyxDQUFjO0lBQ25CLFdBQVcsQ0FBdUI7SUFDbEMsU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixLQUFL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QUFDO2dCQUNQLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7d0dBMWRVLDBCQUEwQjs0RkFBMUIsMEJBQTBCLDZmQTRCMUIsb0JBQW9CLHFFQzlQakMsdWhQQWtNQSwwa0dEaEtZLFlBQVksOEJBQUUsbUJBQW1CLDRVQUFFLG9CQUFvQiw2VUFBRSxxQkFBcUI7OzRGQWdNN0UsMEJBQTBCO2tCQW5NdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDOzhCQWlNaEYsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQVFHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFMEIsZUFBZTtzQkFBL0MsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eUZvcm1Db25maWcsIEZvcm1SdWxlLCBOZXN0ZWRGaWVsZENvbmZpZywgTmVzdGVkVGFiQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgZmluZFRhYiwgZm9ybWF0RGlzcGxheVZhbHVlLCBnZXRUYWJEYXRhLCByZXNvbHZlTGFiZWwgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQvZHluYW1pYy1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnVsZXNFdmFsdWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3J1bGVzLWV2YWx1YXRpb24uc2VydmljZSc7XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBcIm5vIHRhYiBob2xkcyB0aGlzIGZpZWxkXCIgZnJvbSBcInRoZSBmaWVsZCBob2xkcyB1bmRlZmluZWRcIiwgc28gdGhlIHRhYiB3YWxrXG4gKiBjYW4ga2VlcCBzZWFyY2hpbmcgaW4gdGhlIGZpcnN0IGNhc2UgYW5kIHN0b3AgaW4gdGhlIHNlY29uZC5cbiAqL1xuY29uc3QgRklFTERfTk9UX0ZPVU5EID0gU3ltYm9sKCdmaWVsZC1ub3QtZm91bmQnKTtcblxuLyoqXG4gKiBEeW5hbWljUmVjb3JkRm9ybUNvbXBvbmVudCDigJQgY29tcHJlaGVuc2l2ZSB0YWJiZWQgcmVjb3JkIHZpZXcgJiBlZGl0IGNvbXBvbmVudC5cbiAqIFN1cHBvcnRzIGNyb3NzLXRhYiBydWxlIGV2YWx1YXRpb24sIHByb2ZpbGUgaGVhZGVyLCBzdW1tYXJ5IGRyYXdlciAoc2hvd09uTWluaW1pemUpLFxuICogaW50ZXJhY3RpdmUgcXVpY2stanVtcCBsaW5rcywgYW5kIGJhc2VsaW5lIG1vZGlmaWNhdGlvbiB0cmFja2luZy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWR5bmFtaWMtcmVjb3JkLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBEeW5hbWljRm9ybUNvbXBvbmVudCwgRHluYW1pY0ZpZWxkQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtcmVjb3JkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubmd4LXJlY29yZC1lZGl0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjNmNGY2O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX190aXRsZS1ncm91cCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyIHtcbiAgICAgICAgd2lkdGg6IDQ4cHg7XG4gICAgICAgIGhlaWdodDogNDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2UwZTdmZjtcbiAgICAgICAgY29sb3I6ICM0ZjQ2ZTU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdWJ0aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgY29sb3I6ICM2YjcyODA7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBjb2xvcjogIzM3NDE1MTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZS10ZXh0IHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyIHtcbiAgICAgICAgcGFkZGluZzogMTBweCAxNHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcbiAgICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzcyB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItZGlzbWlzczpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci0tZXJyb3Ige1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVjYWNhO1xuICAgICAgICBjb2xvcjogI2I5MWMxYztcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1iYXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1oaW50IHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLXdhcm5pbmcge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmVmM2M3O1xuICAgICAgICBjb2xvcjogI2I0NTMwOTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93cyB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LXRleHQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19yb3ctYnRuIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWVtcHR5IHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogIzZiNzI4MDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19kcmF3ZXIge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGJlYWZlO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDE0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbCB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE4MHB4LCAxZnIpKTtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWl0ZW0ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktaXRlbTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktbGFiZWwge1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LXZhbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY29sb3I6ICMxZjI5Mzc7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1JlY29yZEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWchOiBFbnRpdHlGb3JtQ29uZmlnO1xuICBASW5wdXQoKSBydWxlcz86IEZvcm1SdWxlW107XG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgQElucHV0KCkgdXNlclJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaG9sZSByZWNvcmQgcmVhZC1vbmx5LCByZWdhcmRsZXNzIG9mIFJCQUMuIEVxdWl2YWxlbnQgdG8gdGhlIHJlZmVyZW5jZSdzIGBpc1JlYWRPbmx5YC4gKi9cbiAgQElucHV0KCkgaXNSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU3BlY2lmaWMgZmllbGQgaWRzIGZvcmNlZCByZWFkLW9ubHkgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIHJlY29yZCBzdGF5cyBlZGl0YWJsZS4gKi9cbiAgQElucHV0KCkgcmVhZE9ubHlGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIC8qKlxuICAgKiBPcGVuIHRoZSByZWNvcmQgcmVhZC1vbmx5LCB3aXRoIGEgcGVyLXRhYiBcIkVkaXQgc2VjdGlvblwiIGZsb3cg4oCUIG9uZSB0YWIgaXMgZWRpdGVkIGFuZFxuICAgKiB2YWxpZGF0ZWQgYXQgYSB0aW1lLiBUaGlzIGlzIHRoZSBmcmFtZXdvcmsncyBgRW50aXR5UmVjb3JkQ29tcG9uZW50YCBtb2RlbCBhbmQgdGhlXG4gICAqIGRlZmF1bHQgaGVyZS5cbiAgICpcbiAgICogU2V0IGZhbHNlIGZvciBhIGRpcmVjdGx5IGVkaXRhYmxlIHJlY29yZCB3aXRoIG5vIHZpZXcvZWRpdCBkaXN0aW5jdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIHZpZXdNb2RlOiBib29sZWFuID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj4oKTtcbiAgQE91dHB1dCgpIGZvcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZDxzdHJpbmcsIGFueT4+KCk7XG4gIEBPdXRwdXQoKSBmb3JtUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBPbmUgdGFiIHNlY3Rpb24gd2FzIHNhdmVkLiBDYXJyaWVzIHRoZSB3aG9sZSByZWNvcmQsIHBsdXMgd2hpY2ggdGFiIHdhcyBlZGl0ZWQuICovXG4gIEBPdXRwdXQoKSBzZWN0aW9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyB0YWJJZDogc3RyaW5nOyByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfT4oKTtcblxuICBAVmlld0NoaWxkKER5bmFtaWNGb3JtQ29tcG9uZW50KSBkeW5hbWljRm9ybUNvbXA/OiBEeW5hbWljRm9ybUNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJ1bGVzRXZhbHVhdGlvbiA9IGluamVjdChSdWxlc0V2YWx1YXRpb25TZXJ2aWNlKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0YSA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG4gIHJlYWRvbmx5IG9yaWdpbmFsQmFzZWxpbmUgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgYW55Pj4oe30pO1xuXG4gIC8qKlxuICAgKiBJbmZvIGJhbm5lcnMgdGhlIHVzZXIgaGFzIGRpc21pc3NlZCwgYnkgZmllbGQgaWQuXG4gICAqXG4gICAqIFRoZSByZWZlcmVuY2UncyBjb250cmFjdDogYW4gaW5mbyBiYW5uZXIgcGVyc2lzdHMgdW50aWwgZGlzbWlzc2VkLCAqKm5vdCoqIHVudGlsIHRoZVxuICAgKiB2YWx1ZSBjaGFuZ2VzLiBEaXNtaXNzYWwgaXMga2V5ZWQgYnkgZmllbGQgc28gcmUtdHJpZ2dlcmluZyBhIGRpZmZlcmVudCBmaWVsZCdzIHJ1bGVcbiAgICogc3RpbGwgc2hvd3MuIFJlLWFybWVkIHdoZW4gYSBkaWZmZXJlbnQgcmVjb3JkIGlzIGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzbWlzc2VkID0gc2lnbmFsPFJlYWRvbmx5U2V0PHN0cmluZz4+KG5ldyBTZXQ8c3RyaW5nPigpKTtcblxuICAvKipcbiAgICogSW5mbyBiYW5uZXJzIGZyb20gdGhlIHJ1bGVzIGVuZ2luZSB0aGF0IGFyZSBzdGlsbCBzaG93aW5nLlxuICAgKlxuICAgKiBBIGdldHRlciwgbm90IGEgYGNvbXB1dGVkYDogdGhlIHNvdXJjZSBpcyBgZHluYW1pY0Zvcm1Db21wYCwgYSBWaWV3Q2hpbGQuIEEgY29tcHV0ZWRcbiAgICogZXZhbHVhdGVkIGJlZm9yZSB0aGUgdmlldyBpbml0aWFsaXNlcyB3b3VsZCBjYXB0dXJlIG5vIGRlcGVuZGVuY3kgb24gdGhlIGNoaWxkJ3NcbiAgICogYHJ1bGVSZXN1bHRgIHNpZ25hbCBhbmQgdGhlbiBuZXZlciByZWNvbXB1dGUuIFJlYWQgcGVyIGNoYW5nZS1kZXRlY3Rpb24gcGFzcyBpbnN0ZWFkLlxuICAgKi9cbiAgZ2V0IGluZm9CYW5uZXJzKCk6IHsgZmllbGRJZDogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8ucnVsZVJlc3VsdCgpO1xuICAgIGNvbnN0IGdvbmUgPSB0aGlzLmRpc21pc3NlZCgpO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQ/LmluZm9CYW5uZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW2ZpZWxkSWRdKSA9PiAhZ29uZS5oYXMoZmllbGRJZCkpXG4gICAgICAubWFwKChbZmllbGRJZCwgbWVzc2FnZV0pID0+ICh7IGZpZWxkSWQsIG1lc3NhZ2U6IFN0cmluZyhtZXNzYWdlKSB9KSk7XG4gIH1cblxuICBkaXNtaXNzSW5mb0Jhbm5lcihmaWVsZElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3NlZC5zZXQobmV3IFNldCh0aGlzLmRpc21pc3NlZCgpKS5hZGQoZmllbGRJZCkpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBub3RoaW5nIGluIHRoZSByZWNvcmQgbWF5IGJlIGVkaXRlZC4gKi9cbiAgZ2V0IHJlY29yZFJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuaXNSZWFkT25seTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbmxpbmUgYXJyYXktcm93IGVkaXRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEEgcm93IG9mIGFuIGBhcnJheWAgZmllbGQgaXMgZWRpdGVkIGluIGEgZHJhd2VyLCBub3QgaW5saW5lIGluIHRoZSB0YWIgcGFuZWwuXG4gICAqXG4gICAqIFRoZSBkcmF3ZXIgaXMgcmVuZGVyZWQgb3V0c2lkZSB0aGUgdGFiIGNvbnRhaW5lciBvbiBwdXJwb3NlOiB0aGUgcmVmZXJlbmNlIGZvdW5kIHRoYXRcbiAgICogYnVpbGRpbmcgYSByb3cncyBGb3JtR3JvdXAgaW5zaWRlIHRoZSB0YWIgdmlldyByYWNlcyB0aGUgdGFiJ3Mgb3duIGluaXRpYWxpc2F0aW9uLCBzb1xuICAgKiB0aGUgcm93IGZvcm0gaXMga2VwdCBkZXRhY2hlZCBhbmQgb25seSBwdXNoZWQgaW50byB0aGUgRm9ybUFycmF5IG9uIHNhdmUuXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVSb3dGaWVsZCA9IHNpZ25hbDxOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBpbmxpbmVSb3dJbmRleCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgaW5saW5lUm93Rm9ybTogRm9ybUdyb3VwIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIGBhcnJheWAgZmllbGRzIG9uIHRoZSB0YWIgY3VycmVudGx5IHNob3duLCBzbyB0aGUgdGVtcGxhdGUgY2FuIGxpc3QgdGhlaXIgcm93cy4gKi9cbiAgZ2V0IGFycmF5RmllbGRzRm9yQWN0aXZlVGFiKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5hY3RpdmVUYWJJZDtcbiAgICBjb25zdCB0YWIgPSB0YWJJZCA/IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKSA6IG51bGw7XG4gICAgcmV0dXJuICh0YWI/LmZpZWxkcyA/PyBbXSkuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnYXJyYXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3dzIGN1cnJlbnRseSBoZWxkIGJ5IGFuIGBhcnJheWAgZmllbGQsIHJlYWQgZnJvbSB0aGUgcmVjb3JkIHZhbHVlLlxuICAgKlxuICAgKiBEZWxpYmVyYXRlbHkgbm90IHJlYWQgb2ZmIHRoZSBjaGlsZCdzIEZvcm1BcnJheTogdGhhdCBjb250cm9sIG9ubHkgZXhpc3RzIG9uY2UgdGhlXG4gICAqIGNoaWxkIGhhcyBpbml0aWFsaXNlZCwgc28gcmVuZGVyaW5nIGZyb20gaXQgY2hhbmdlZCB2YWx1ZSBtaWQtcGFzcy4gYGN1cnJlbnREYXRhYCBpcyBhXG4gICAqIHNpZ25hbCBzZWVkZWQgZnJvbSBgaW5pdGlhbERhdGFgIGFuZCBrZXB0IGN1cnJlbnQgYnkgdGhlIGNoaWxkJ3MgYGZvcm1DaGFuZ2VgLlxuICAgKi9cbiAgcm93c09mKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10ge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5hY3RpdmVUYWJJZDtcbiAgICBjb25zdCB0YWJEYXRhID0gdGFiSWQgPyBnZXRUYWJEYXRhKHRhYklkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSA6IG51bGw7XG4gICAgY29uc3Qgcm93cyA9ICh0YWJEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LltmaWVsZC5pZF07XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocm93cykgPyAocm93cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA6IFtdO1xuICB9XG5cbiAgLyoqIE9uZSByb3cgcmVuZGVyZWQgYXMgdGV4dCwgc28gdGhlIGxpc3QgaXMgcmVhZGFibGUgd2l0aG91dCBvcGVuaW5nIHRoZSBkcmF3ZXIuICovXG4gIHJvd1N1bW1hcnkoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvdyA/PyB7fTtcbiAgICBjb25zdCBwYXJ0cyA9IChmaWVsZC5jaGlsZHJlbiA/PyBbXSlcbiAgICAgIC5tYXAoY2hpbGQgPT4gdmFsdWVbY2hpbGQuaWRdKVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwgJiYgdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09ICcnKVxuICAgICAgLm1hcCh2ID0+ICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2KSA6IFN0cmluZyh2KSkpO1xuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPyBwYXJ0cy5qb2luKCcgwrcgJykgOiAnKGVtcHR5KSc7XG4gIH1cblxuICBvcGVuQWRkUm93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChudWxsKTtcbiAgICB0aGlzLmlubGluZVJvd0Zvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uY3JlYXRlQXJyYXlSb3coZmllbGQpIGFzIEZvcm1Hcm91cDtcbiAgfVxuXG4gIG9wZW5FZGl0Um93KGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlY3Rpb25SZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMuaW5saW5lUm93RmllbGQuc2V0KGZpZWxkKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChpbmRleCk7XG4gICAgdGhpcy5pbmxpbmVSb3dGb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA/LmNyZWF0ZUFycmF5Um93KGZpZWxkLCB0aGlzLnJvd3NPZihmaWVsZClbaW5kZXhdKSBhcyBGb3JtR3JvdXA7XG4gIH1cblxuICBjYW5jZWxSb3coKTogdm9pZCB7XG4gICAgdGhpcy5pbmxpbmVSb3dGaWVsZC5zZXQobnVsbCk7XG4gICAgdGhpcy5pbmxpbmVSb3dJbmRleC5zZXQobnVsbCk7XG4gICAgdGhpcy5pbmxpbmVSb3dGb3JtID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBDb21taXQgdGhlIGRyYXdlciBpbnRvIHRoZSBGb3JtQXJyYXkuIFJ1bGVzIHJlLWV2YWx1YXRlIG9mZiB0aGUgcmVzdWx0aW5nIHZhbHVlIGNoYW5nZS4gKi9cbiAgc2F2ZVJvdygpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaW5saW5lUm93RmllbGQoKTtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA7XG4gICAgaWYgKCFmaWVsZCB8fCAhZm9ybSB8fCAhdGhpcy5pbmxpbmVSb3dGb3JtKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5pbmxpbmVSb3dGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuaW5saW5lUm93Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXkgPSBmb3JtLmdldEFycmF5Q29udHJvbChmaWVsZC5pZCwgdGhpcy5hY3RpdmVUYWJJZCA/PyB1bmRlZmluZWQpO1xuICAgIGlmICghYXJyYXkpIHJldHVybjtcblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmxpbmVSb3dJbmRleCgpO1xuICAgIGlmIChpbmRleCA9PT0gbnVsbCkgYXJyYXkucHVzaChmb3JtLmNyZWF0ZUFycmF5Um93KGZpZWxkLCB0aGlzLmlubGluZVJvd0Zvcm0udmFsdWUpKTtcbiAgICBlbHNlIGFycmF5LmF0KGluZGV4KS5wYXRjaFZhbHVlKHRoaXMuaW5saW5lUm93Rm9ybS52YWx1ZSk7XG5cbiAgICBhcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoZm9ybS5leHRyYWN0UmVjb3JkKCkpO1xuICAgIHRoaXMuY2FuY2VsUm93KCk7XG4gIH1cblxuICBkZWxldGVSb3coZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VjdGlvblJlYWRPbmx5KSByZXR1cm47XG4gICAgY29uc3QgYXJyYXkgPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uZ2V0QXJyYXlDb250cm9sKGZpZWxkLmlkLCB0aGlzLmFjdGl2ZVRhYklkID8/IHVuZGVmaW5lZCk7XG4gICAgYXJyYXk/LnJlbW92ZUF0KGluZGV4KTtcbiAgICBhcnJheT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcbiAgICBpZiAodGhpcy5pbmxpbmVSb3dJbmRleCgpID09PSBpbmRleCkgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQZXItdGFiIHNlY3Rpb24gZWRpdGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHRhYiBjdXJyZW50bHkgb3BlbiBmb3IgZWRpdGluZywgb3IgbnVsbCB3aGVuIHRoZSByZWNvcmQgaXMgYmVpbmcgdmlld2VkLlxuICAgKlxuICAgKiBUaGUgcmVmZXJlbmNlIGVkaXRzIG9uZSB0YWIgc2VjdGlvbiBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHJlY29yZCwgYW5kXG4gICAqIHZhbGlkYXRlcyBvbmx5IHRoYXQgc2VjdGlvbiBvbiBzYXZlIOKAlCBhIHJlcXVpcmVkIGZpZWxkIG9uIGFuIHVudG91Y2hlZCB0YWIgbXVzdCBub3RcbiAgICogYmxvY2sgc2F2aW5nIHRoZSB0YWIgeW91IGFyZSBhY3R1YWxseSB3b3JraW5nIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdGluZ1RhYklkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFiIHRoZSBpbm5lciBmb3JtIGlzIHNob3dpbmcuXG4gICAqXG4gICAqIFRyYWNrZWQgaGVyZSByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgVmlld0NoaWxkLiBUaGUgY2hpbGQgcmVzb2x2ZXMgaXRzIGZpcnN0IHRhYiBhc1xuICAgKiBwYXJ0IG9mIGl0cyBvd24gaW5pdGlhbGlzYXRpb24sIHNvIHJlYWRpbmcgaXQgZHVyaW5nIHRoaXMgY29tcG9uZW50J3MgcmVuZGVyIGNoYW5nZWRcbiAgICogdmFsdWUgbWlkLXBhc3Mg4oCUIGFuIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkIGVycm9yLiBTZWVkZWQgZnJvbSB0aGVcbiAgICogY29uZmlnIGFuZCBrZXB0IGluIHN0ZXAgYnkgdGhlIGNoaWxkJ3MgYGFjdGl2ZVRhYkNoYW5nZWAgb3V0cHV0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVUYWJJZFNpZyA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBnZXQgYWN0aXZlVGFiSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiSWRTaWcoKTtcbiAgfVxuXG4gIG9uQWN0aXZlVGFiQ2hhbmdlKHRhYklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVUYWJJZFNpZygpID09PSB0YWJJZCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlVGFiSWRTaWcuc2V0KHRhYklkKTtcbiAgICAvLyBFZGl0aW5nIGRvZXMgbm90IGZvbGxvdyB0aGUgdXNlciB0byBhbm90aGVyIHRhYi5cbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIC8qKiBGaXJzdCB0YWIgYSB1c2VyIGNhbiBzZWUsIHVzZWQgdG8gc2VlZCB0aGUgYWN0aXZlIHRhYiBiZWZvcmUgdGhlIGNoaWxkIHJlcG9ydHMgb25lLiAqL1xuICBwcml2YXRlIGZpcnN0VmlzaWJsZVRhYklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8udGFicz8uZmluZCh0ID0+IHQudmlzaWJpbGl0eSAhPT0gZmFsc2UpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEVycm9ycyBmcm9tIHRoZSBsYXN0IHNhdmUgYXR0ZW1wdCwgYnkgZmllbGQgaWQuICovXG4gIHJlYWRvbmx5IHNlY3Rpb25FcnJvcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuXG4gIC8qKiBUZW1wbGF0ZSBhY2Nlc3MgdG8gYE9iamVjdC5rZXlzYCBmb3IgaXRlcmF0aW5nIHRoZSBlcnJvciBtYXAuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBPYmplY3QgPSBPYmplY3Q7XG5cbiAgZ2V0IGlzRWRpdGluZ0FjdGl2ZVRhYigpOiBib29sZWFuIHtcbiAgICAvLyBXaXRob3V0IHZpZXcgbW9kZSB0aGVyZSBpcyBubyB2aWV3L2VkaXQgZGlzdGluY3Rpb24g4oCUIGV2ZXJ5dGhpbmcgaXMgYWx3YXlzIGVkaXRhYmxlLlxuICAgIGlmICghdGhpcy52aWV3TW9kZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdGhpcy5hY3RpdmVUYWJJZCAmJiB0aGlzLmVkaXRpbmdUYWJJZCgpID09PSB0aGlzLmFjdGl2ZVRhYklkO1xuICB9XG5cbiAgLyoqIEZpZWxkcyByZW5kZXIgcmVhZC1vbmx5IHVubGVzcyB0aGVpciBvd24gdGFiIGlzIHRoZSBvbmUgYmVpbmcgZWRpdGVkLiAqL1xuICBnZXQgc2VjdGlvblJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmlzRWRpdGluZ0FjdGl2ZVRhYjtcbiAgfVxuXG4gIGVkaXRTZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3TW9kZSB8fCB0aGlzLnJlY29yZFJlYWRPbmx5IHx8ICF0aGlzLmFjdGl2ZVRhYklkKSByZXR1cm47XG4gICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldCh7fSk7XG4gICAgdGhpcy5lZGl0aW5nVGFiSWQuc2V0KHRoaXMuYWN0aXZlVGFiSWQpO1xuICB9XG5cbiAgLyoqIERpc2NhcmQgdGhpcyBzZWN0aW9uJ3MgZWRpdHMsIHJlc3RvcmluZyBlYWNoIGZpZWxkIGZyb20gdGhlIHNlc3Npb24gYmFzZWxpbmUuICovXG4gIGNhbmNlbFNlY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdGFiSWQgPSB0aGlzLmVkaXRpbmdUYWJJZCgpO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcDtcbiAgICBpZiAodGFiSWQgJiYgZm9ybSkge1xuICAgICAgY29uc3QgdGFiID0gZmluZFRhYih0aGlzLmNvbmZpZz8udGFicywgdGFiSWQpO1xuICAgICAgY29uc3QgYmFzZWxpbmVUYWIgPSAoZ2V0VGFiRGF0YSh0YWJJZCwgdGhpcy5vcmlnaW5hbEJhc2VsaW5lKCksIHRoaXMuY29uZmlnKSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRhYj8uZmllbGRzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGJhc2VsaW5lVmFsdWUgPSBiYXNlbGluZVRhYltmaWVsZC5pZF07XG5cbiAgICAgICAgLy8gQSBGb3JtQXJyYXkgY2Fubm90IGJlIHJlc3RvcmVkIHdpdGggc2V0VmFsdWUg4oCUIHRoYXQgZGVtYW5kcyBhIHZhbHVlIHNoYXBlZCBleGFjdGx5XG4gICAgICAgIC8vIGxpa2UgdGhlIGN1cnJlbnQgcm93cy4gUmVidWlsZCBpdCBmcm9tIHRoZSBiYXNlbGluZSByb3dzIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybS5nZXRBcnJheUNvbnRyb2woZmllbGQuaWQsIHRhYklkKTtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXkuY2xlYXIoKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBBcnJheS5pc0FycmF5KGJhc2VsaW5lVmFsdWUpID8gYmFzZWxpbmVWYWx1ZSA6IFtdKSB7XG4gICAgICAgICAgICBhcnJheS5wdXNoKGZvcm0uY3JlYXRlQXJyYXlSb3coZmllbGQsIHJvdykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKT8uc2V0VmFsdWUoYmFzZWxpbmVWYWx1ZSA/PyBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudERhdGEuc2V0KGZvcm0uZXh0cmFjdFJlY29yZCgpKTtcbiAgICB9XG4gICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldCh7fSk7XG4gICAgdGhpcy5lZGl0aW5nVGFiSWQuc2V0KG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoaXMgc2VjdGlvbiBvbmx5LCB0aGVuIGVtaXQgaXQuIFZhbGlkYXRpb24gaXMgc2NvcGVkIHR3byB3YXlzOiBBbmd1bGFyXG4gICAqIHZhbGlkaXR5IG9mIHRoZSB0YWIncyBvd24gY29udHJvbHMsIGFuZCBydWxlcyBmaWx0ZXJlZCB0byB0aGlzIHRhYiDigJQgYSBydWxlIHRhcmdldGluZ1xuICAgKiBhIGhpZGRlbiB0YWIgbXVzdCBub3QgYmxvY2sgdGhlIHNhdmUgKHRoZSByZWZlcmVuY2UncyBPVjAtOTY4IGZpeCkuXG4gICAqL1xuICBzYXZlU2VjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJJZCA9IHRoaXMuZWRpdGluZ1RhYklkKCk7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wO1xuICAgIGlmICghdGFiSWQgfHwgIWZvcm0pIHJldHVybjtcblxuICAgIGNvbnN0IHRhYiA9IGZpbmRUYWIodGhpcy5jb25maWc/LnRhYnMsIHRhYklkKTtcbiAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGFiPy5maWVsZHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGN0cmwgPSBmb3JtLmdldENvbnRyb2woZmllbGQuaWQsIHRhYklkKTtcbiAgICAgIGlmIChjdHJsPy5pbnZhbGlkKSB7XG4gICAgICAgIGN0cmwubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICBlcnJvcnNbZmllbGQuaWRdID0gYCR7cmVzb2x2ZUxhYmVsKGZpZWxkLmxhYmVsLCB0aGlzLmxhbmd1YWdlKX0gaXMgaW52YWxpZC5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlZCA9IHRoaXMucnVsZXNFdmFsdWF0aW9uLmZpbHRlckZvclRhYih0aGlzLnJ1bGVzLCB0YWJJZCwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IHJ1bGVFcnJvcnMgPSB0aGlzLnJ1bGVzRXZhbHVhdGlvbi5ldmFsdWF0ZShzY29wZWQsIGZvcm0uZm9ybVZhbHVlcygpLCB0aGlzLm9yaWdpbmFsQmFzZWxpbmUoKSlcbiAgICAgIC52YWxpZGF0aW9uRXJyb3JzO1xuICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCBydWxlRXJyb3JzKTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VjdGlvbkVycm9ycy5zZXQoZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG5cbiAgICBjb25zdCByZWNvcmQgPSBmb3JtLmV4dHJhY3RSZWNvcmQoKTtcbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChyZWNvcmQpO1xuICAgIHRoaXMuc2VjdGlvblNhdmUuZW1pdCh7IHRhYklkLCByZWNvcmQgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VlZCB0aGUgc2Vzc2lvbiBiYXNlbGluZSBmcm9tIHRoZSBsb2FkZWQgcmVjb3JkIHNvIGBWQUxVRV9DSEFOR0VEYCBydWxlcyBhbmQgdGhlXG4gICAqIG1vZGlmaWNhdGlvbiBiYW5uZXIgY29tcGFyZSBhZ2FpbnN0IHRoZSByZWNvcmQgYXMgaXQgd2FzIG9wZW5lZCDigJQgbm90IGFzIGl0IHdhc1xuICAgKiBhZnRlciB0aGUgZmlyc3Qga2V5c3Ryb2tlLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsRGF0YSddIHx8IGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsQmFzZWxpbmUuc2V0KHsgLi4uKHRoaXMuaW5pdGlhbERhdGEgPz8ge30pIH0pO1xuICAgICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoeyAuLi4odGhpcy5pbml0aWFsRGF0YSA/PyB7fSkgfSk7XG4gICAgICB0aGlzLmFjdGl2ZVRhYklkU2lnLnNldCh0aGlzLmZpcnN0VmlzaWJsZVRhYklkKCkpO1xuICAgICAgLy8gQSBkaWZmZXJlbnQgcmVjb3JkIGlzIGEgZGlmZmVyZW50IHNldCBvZiBiYW5uZXJzIOKAlCByZS1hcm0gdGhlbS5cbiAgICAgIHRoaXMuZGlzbWlzc2VkLnNldChuZXcgU2V0PHN0cmluZz4oKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlY29yZFRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgcmV0dXJuICdSZWNvcmQnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5uYW1lID8gcmVzb2x2ZUxhYmVsKHRoaXMuY29uZmlnLm5hbWUsIHRoaXMubGFuZ3VhZ2UpIDogdGhpcy5jb25maWcuZW50aXR5O1xuICB9XG5cbiAgZ2V0IGF2YXRhckxldHRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5yZWNvcmRUaXRsZSB8fCAnUicpLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEhlYWRlciBmaWVsZHMgKGlzUHJvZmlsZUltYWdlIC8gaXNIZWFkZXJUb2dnbGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFdmVyeSBmaWVsZCBpbiB0aGUgY29uZmlnLCBhdCBhbnkgZGVwdGguICovXG4gIHByaXZhdGUgYWxsRmllbGRzKCk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xuICAgIGNvbnN0IG91dDogTmVzdGVkRmllbGRDb25maWdbXSA9IFtdO1xuICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzID8/IFtdKSB7XG4gICAgICAgIG91dC5wdXNoKGYpO1xuICAgICAgICB3YWxrRmllbGRzKGYuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0YWJzID8/IFtdKSB7XG4gICAgICAgIHdhbGtGaWVsZHModC5maWVsZHMpO1xuICAgICAgICB3YWxrVGFicyh0LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKHRoaXMuY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFRoZSBmaWVsZCBmbGFnZ2VkIGBpc1Byb2ZpbGVJbWFnZWAsIHJlbmRlcmVkIGFzIHRoZSByZWNvcmQgYXZhdGFyLiAqL1xuICBnZXQgaGVhZGVyUHJvZmlsZUZpZWxkKCk6IE5lc3RlZEZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWxsRmllbGRzKCkuZmluZChmID0+IGYuaXNQcm9maWxlSW1hZ2UpID8/IG51bGw7XG4gIH1cblxuICAvKiogVGhlIGZpZWxkIGZsYWdnZWQgYGlzSGVhZGVyVG9nZ2xlYCwgcmVuZGVyZWQgYXMgYSBzdGF0dXMgc3dpdGNoIGluIHRoZSBoZWFkZXIuICovXG4gIGdldCBoZWFkZXJUb2dnbGVGaWVsZCgpOiBOZXN0ZWRGaWVsZENvbmZpZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFsbEZpZWxkcygpLmZpbmQoZiA9PiBmLmlzSGVhZGVyVG9nZ2xlKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIEF2YXRhciBpbWFnZSBVUkwsIHdoZW4gdGhlIHByb2ZpbGUgZmllbGQgaG9sZHMgYSBwZXJzaXN0ZWQgRmlsZVJlZi4gKi9cbiAgZ2V0IHByb2ZpbGVJbWFnZVVybCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaGVhZGVyUHJvZmlsZUZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZFZhbHVlKGZpZWxkLmlkKSBhcyB7IHVybD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICByZXR1cm4gdmFsdWU/LnVybCA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGhlYWRlclRvZ2dsZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5oZWFkZXJUb2dnbGVGaWVsZDtcbiAgICByZXR1cm4gZmllbGQgPyB0aGlzLmZpZWxkVmFsdWUoZmllbGQuaWQpID09PSB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmxpcCB0aGUgaGVhZGVyIHRvZ2dsZS4gSXQgd3JpdGVzIHN0cmFpZ2h0IHRvIHRoZSBjb250cm9sIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2hcbiAgICogc2VjdGlvbiBlZGl0aW5nIOKAlCB0aGUgcmVmZXJlbmNlIHRyZWF0cyBpdCBhcyBhIHJlY29yZC1sZXZlbCBzdGF0dXMgc3dpdGNoLCBub3QgcGFydCBvZlxuICAgKiBhbnkgb25lIHRhYidzIHNlY3Rpb24uXG4gICAqL1xuICB0b2dnbGVIZWFkZXJTdGF0dXMoKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmhlYWRlclRvZ2dsZUZpZWxkO1xuICAgIGlmICghZmllbGQgfHwgdGhpcy5yZWNvcmRSZWFkT25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmNvbnRyb2xGb3IoZmllbGQuaWQpO1xuICAgIGlmICghY3RybCkgcmV0dXJuO1xuICAgIGN0cmwuc2V0VmFsdWUoIXRoaXMuaGVhZGVyVG9nZ2xlVmFsdWUpO1xuICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtQ29tcCkgdGhpcy5jdXJyZW50RGF0YS5zZXQodGhpcy5keW5hbWljRm9ybUNvbXAuZXh0cmFjdFJlY29yZCgpKTtcbiAgfVxuXG4gIC8qKiBMb2NhdGUgYSBmaWVsZCdzIGNvbnRyb2wgd2hlcmV2ZXIgaXQgbGl2ZXMsIHNpbmNlIGhlYWRlciBmaWVsZHMgbWF5IGJlIG9uIGFueSB0YWIuICovXG4gIHByaXZhdGUgY29udHJvbEZvcihmaWVsZElkOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRm9ybUNvbXA/LmdldENvbnRyb2woZmllbGRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZpZWxkJ3MgY3VycmVudCB2YWx1ZSwgcmVhZCBmcm9tIHRoZSByZWNvcmQgc28gaXQgaXMgc3RhYmxlIGR1cmluZyByZW5kZXIuXG4gICAqXG4gICAqIFJlc29sdmVkIHRocm91Z2ggYGdldFRhYkRhdGFgIHNvIGl0IGhvbm91cnMgZXhhY3RseSB0aGUgbmVzdGluZyBjb250cmFjdCB0aGUgZm9ybVxuICAgKiBwYXRjaGVzIHdpdGgg4oCUIGB7IHRhYklkOiB7IGZpZWxkSWQgfSB9YCwgb3IgdGhlIHJlY29yZCByb290IHdoZW4gdGhlIHRhYiBzZXRzXG4gICAqIGBmbGF0RGF0YWAuIFJlYWRpbmcgdGhlIHJlY29yZCBmbGF0IGluc3RlYWQgaXMgbm90IGEgc2hvcnRjdXQ6IGl0IG1ha2VzIHRoZSBzdW1tYXJ5XG4gICAqIGRpc3BsYXkgdmFsdWVzIHRoZSBmb3JtIG5ldmVyIGxvYWRlZCwgd2hpY2ggcmVhZHMgYXMgXCJ0aGUgZGF0YSBpcyB0aGVyZVwiIHdoaWxlIGV2ZXJ5XG4gICAqIGNvbnRyb2wgYmVoaW5kIGl0IGlzIGVtcHR5LlxuICAgKlxuICAgKiBXYWxrcyBzdWItdGFicyBhcyB3ZWxsOiBhIHN1bW1hcnksIGhlYWRlciwgb3IgcHJvZmlsZSBmaWVsZCBtYXkgc2l0IG9uIGFueSB0YWIgYXQgYW55XG4gICAqIGRlcHRoLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWVsZFZhbHVlKGZpZWxkSWQ6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHZpc2l0ID0gKHRhYnM6IE5lc3RlZFRhYkNvbmZpZ1tdID0gW10pOiB1bmtub3duID0+IHtcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRhYnMpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGdldFRhYkRhdGEodGFiLmlkLCB0aGlzLmN1cnJlbnREYXRhKCksIHRoaXMuY29uZmlnKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gICAgICAgIGlmIChkYXRhICYmIGZpZWxkSWQgaW4gZGF0YSkgcmV0dXJuIGRhdGFbZmllbGRJZF07XG4gICAgICAgIGlmICh0YWIuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHZpc2l0KHRhYi5jaGlsZHJlbik7XG4gICAgICAgICAgaWYgKGZvdW5kICE9PSBGSUVMRF9OT1RfRk9VTkQpIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIEZJRUxEX05PVF9GT1VORDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdmlzaXQodGhpcy5jb25maWc/LnRhYnMpO1xuICAgIHJldHVybiByZXN1bHQgPT09IEZJRUxEX05PVF9GT1VORCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuXG4gIHJlYWRvbmx5IGlzTW9kaWZpZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3JpZyA9IHRoaXMub3JpZ2luYWxCYXNlbGluZSgpO1xuICAgIGNvbnN0IGN1cnIgPSB0aGlzLmN1cnJlbnREYXRhKCk7XG4gICAgaWYgKCFvcmlnIHx8ICFjdXJyIHx8IE9iamVjdC5rZXlzKG9yaWcpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvcmlnKSAhPT0gSlNPTi5zdHJpbmdpZnkoY3Vycik7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN1bW1hcnlGaWVsZHMgPSBjb21wdXRlZDxOZXN0ZWRGaWVsZENvbmZpZ1tdPigoKSA9PiB7XG4gICAgY29uc3QgZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdID0gW107XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gPSBbXSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0IG9mIHRhYnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHQuZmllbGRzID8/IFtdKSB7XG4gICAgICAgICAgaWYgKGYuc2hvd09uTWluaW1pemUpIGZpZWxkcy5wdXNoKGYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0LmNoaWxkcmVuKSB3YWxrVGFicyh0LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKHRoaXMuY29uZmlnPy50YWJzKTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9KTtcblxuICBvbkZvcm1DaGFuZ2UoZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIC8vIEJhc2VsaW5lIGlzIHNlZWRlZCBmcm9tIGBpbml0aWFsRGF0YWAgaW4gbmdPbkNoYW5nZXM7IG9ubHkgZmlsbCBpdCBoZXJlIHdoZW4gdGhlXG4gICAgLy8gcmVjb3JkIHdhcyBvcGVuZWQgZW1wdHkgKGNyZWF0ZSBmbG93KSwgc28gdGhlIGZpcnN0IGVtaXR0ZWQgc2hhcGUgYmVjb21lcyB0aGUgYmFzZWxpbmUuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMub3JpZ2luYWxCYXNlbGluZSgpKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub3JpZ2luYWxCYXNlbGluZS5zZXQoeyAuLi5kYXRhIH0pO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChkYXRhKTtcbiAgICB0aGlzLmZvcm1DaGFuZ2UuZW1pdChkYXRhKTtcbiAgfVxuXG4gIG9uRm9ybVN1Ym1pdChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoZGF0YSk7XG4gIH1cblxuICBvbkZvcm1SZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1SZXNldC5lbWl0KCk7XG4gIH1cblxuICBmb3JtYXRGaWVsZExhYmVsKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbChmaWVsZC5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICAvKiogU3VtbWFyeSB2YWx1ZXMgcmVuZGVyIHRocm91Z2ggdGhlIHNoYXJlZCBjb3JlIGZvcm1hdHRlciwgbm90IGEgbG9jYWwgc3RyaW5naWZpZXIuICovXG4gIGZvcm1hdEZpZWxkVmFsdWUoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0RGlzcGxheVZhbHVlKGZpZWxkLnR5cGUsIGZpZWxkLm9wdGlvbnMsIHRoaXMuZmllbGRWYWx1ZShmaWVsZC5pZCksIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAganVtcFRvRmllbGQoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRmluZCBwYXJlbnQgdGFiIGZvciBmaWVsZFxuICAgIGZvciAoY29uc3QgdGFiIG9mIHRoaXMuY29uZmlnPy50YWJzIHx8IFtdKSB7XG4gICAgICBjb25zdCBoYXNGaWVsZCA9ICh0YWIuZmllbGRzIHx8IFtdKS5zb21lKGYgPT4gZi5pZCA9PT0gZmllbGRJZCk7XG4gICAgICBpZiAoaGFzRmllbGQpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRm9ybUNvbXA/LnNldEFjdGl2ZVRhYih0YWIuaWQpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBmaWVsZC1jb250YWluZXItJHtmaWVsZElkfWApO1xuICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yXCI+XG4gIDwhLS0gUmVjb3JkIEhlYWRlciAtLT5cbiAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3RpdGxlLWdyb3VwXCI+XG4gICAgICBAaWYgKHByb2ZpbGVJbWFnZVVybCkge1xuICAgICAgICA8aW1nXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImhlYWRlci1wcm9maWxlLWltYWdlXCJcbiAgICAgICAgICBbc3JjXT1cInByb2ZpbGVJbWFnZVVybFwiXG4gICAgICAgICAgW2FsdF09XCJyZWNvcmRUaXRsZVwiXG4gICAgICAgIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19hdmF0YXJcIiBkYXRhLXRlc3RpZD1cImhlYWRlci1hdmF0YXItaW5pdGlhbFwiPlxuICAgICAgICAgIHt7IGF2YXRhckxldHRlciB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXY+XG4gICAgICAgIDxoMiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX190aXRsZVwiIGRhdGEtdGVzdGlkPVwicmVjb3JkLXRpdGxlXCI+XG4gICAgICAgICAge3sgcmVjb3JkVGl0bGUgfX1cbiAgICAgICAgPC9oMj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VidGl0bGVcIj5FbnRpdHk6IHt7IGNvbmZpZy5lbnRpdHkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmVjb3JkLWxldmVsIHN0YXR1cyBzd2l0Y2gsIG91dHNpZGUgc2VjdGlvbiBlZGl0aW5nIC0tPlxuICAgIEBpZiAoaGVhZGVyVG9nZ2xlRmllbGQ7IGFzIHRvZ2dsZUZpZWxkKSB7XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyLXRvZ2dsZVwiPlxuICAgICAgICA8c3Bhbj57eyBmb3JtYXRGaWVsZExhYmVsKHRvZ2dsZUZpZWxkKSB9fTwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICByb2xlPVwic3dpdGNoXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImhlYWRlci10b2dnbGVcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImhlYWRlclRvZ2dsZVZhbHVlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVjb3JkUmVhZE9ubHlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJoZWFkZXJUb2dnbGVWYWx1ZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVIZWFkZXJTdGF0dXMoKVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUtdGV4dFwiPnt7IGhlYWRlclRvZ2dsZVZhbHVlID8gJ1llcycgOiAnTm8nIH19PC9zcGFuPlxuICAgICAgPC9sYWJlbD5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gRGlzbWlzc2libGUgaW5mbyBiYW5uZXJzIChydWxlcyBgaW5mb2AgYWN0aW9uKSAtLT5cbiAgQGZvciAoYmFubmVyIG9mIGluZm9CYW5uZXJzOyB0cmFjayBiYW5uZXIuZmllbGRJZCkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1pbmZvXCJcbiAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2luZm8tYmFubmVyLScgKyBiYW5uZXIuZmllbGRJZFwiXG4gICAgPlxuICAgICAgPHNwYW4+4oS577iPIHt7IGJhbm5lci5tZXNzYWdlIH19PC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLWRpc21pc3NcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZGlzbWlzcy0nICsgYmFubmVyLmZpZWxkSWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEaXNtaXNzOiAnICsgYmFubmVyLm1lc3NhZ2VcIlxuICAgICAgICAoY2xpY2spPVwiZGlzbWlzc0luZm9CYW5uZXIoYmFubmVyLmZpZWxkSWQpXCJcbiAgICAgID7inJU8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gTW9kaWZpY2F0aW9uIGJhc2VsaW5lIGJhbm5lciAtLT5cbiAgQGlmIChpc01vZGlmaWVkKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS13YXJuaW5nXCI+XG4gICAgICDwn5SSIFJlY29yZCBtb2RpZmllZCBmcm9tIHNlc3Npb24gYmFzZWxpbmUg4oCUIHVuc2F2ZWQgY2hhbmdlcyBwZW5kaW5nLlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBTdW1tYXJ5IFBhbmVsIChzaG93T25NaW5pbWl6ZSBmaWVsZHMgd2l0aCBpbnRlcmFjdGl2ZSBqdW1wKSAtLT5cbiAgQGlmIChzdW1tYXJ5RmllbGRzKCkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1wYW5lbFwiIGRhdGEtdGVzdGlkPVwic3VtbWFyeS1wYW5lbFwiPlxuICAgICAgQGZvciAoc2Ygb2Ygc3VtbWFyeUZpZWxkcygpOyB0cmFjayBzZi5pZCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1pdGVtXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInc3VtbWFyeS0nICsgc2YuaWRcIlxuICAgICAgICAgIChjbGljayk9XCJqdW1wVG9GaWVsZChzZi5pZClcIlxuICAgICAgICAgIFt0aXRsZV09XCInQ2xpY2sgdG8ganVtcCB0byAnICsgZm9ybWF0RmllbGRMYWJlbChzZilcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1sYWJlbFwiPnt7IGZvcm1hdEZpZWxkTGFiZWwoc2YpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktdmFsXCI+e3sgZm9ybWF0RmllbGRWYWx1ZShzZikgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBTZWN0aW9uIGVkaXQgYmFyOiBvbmUgdGFiIGlzIGVkaXRlZCBhdCBhIHRpbWUsIGFuZCB2YWxpZGF0ZWQgb24gaXRzIG93biAtLT5cbiAgQGlmICh2aWV3TW9kZSAmJiAhcmVjb3JkUmVhZE9ubHkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XG4gICAgICBAaWYgKGlzRWRpdGluZ0FjdGl2ZVRhYikge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWhpbnRcIj5FZGl0aW5nIHRoaXMgc2VjdGlvbjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIiBkYXRhLXRlc3RpZD1cImNhbmNlbC1zZWN0aW9uXCIgKGNsaWNrKT1cImNhbmNlbFNlY3Rpb24oKVwiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fc3VibWl0XCIgZGF0YS10ZXN0aWQ9XCJzYXZlLXNlY3Rpb25cIiAoY2xpY2spPVwic2F2ZVNlY3Rpb24oKVwiPlxuICAgICAgICAgIFNhdmUgc2VjdGlvblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1mb3JtX19yZXNldFwiIGRhdGEtdGVzdGlkPVwiZWRpdC1zZWN0aW9uXCIgKGNsaWNrKT1cImVkaXRTZWN0aW9uKClcIj5cbiAgICAgICAgICBFZGl0IHNlY3Rpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyIG5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLWVycm9yXCIgcm9sZT1cImFsZXJ0XCIgZGF0YS10ZXN0aWQ9XCJzZWN0aW9uLWVycm9yc1wiPlxuICAgICAgQGZvciAoa2V5IG9mIE9iamVjdC5rZXlzKHNlY3Rpb25FcnJvcnMoKSk7IHRyYWNrIGtleSkge1xuICAgICAgICA8ZGl2PuKaoO+4jyB7eyBzZWN0aW9uRXJyb3JzKClba2V5XSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBBcnJheSByb3dzOiBsaXN0ZWQgaGVyZSwgZWRpdGVkIGluIHRoZSBkcmF3ZXIgYmVsb3cgLS0+XG4gIEBmb3IgKGFycmF5RmllbGQgb2YgYXJyYXlGaWVsZHNGb3JBY3RpdmVUYWI7IHRyYWNrIGFycmF5RmllbGQuaWQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvd3NcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCIncm93cy0nICsgYXJyYXlGaWVsZC5pZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3dzLWhlYWRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1sYWJlbFwiPnt7IGZvcm1hdEZpZWxkTGFiZWwoYXJyYXlGaWVsZCkgfX08L3NwYW4+XG4gICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2FkZC1yb3ctJyArIGFycmF5RmllbGQuaWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZGRSb3coYXJyYXlGaWVsZClcIlxuICAgICAgICAgID4rIFJvdzwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGZvciAocm93IG9mIHJvd3NPZihhcnJheUZpZWxkKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93XCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3Jvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvdy10ZXh0XCI+e3sgcm93U3VtbWFyeShhcnJheUZpZWxkLCByb3cpIH19PC9zcGFuPlxuICAgICAgICAgIEBpZiAoIXNlY3Rpb25SZWFkT25seSkge1xuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidlZGl0LXJvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRWRpdFJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidkZWxldGUtcm93LScgKyBhcnJheUZpZWxkLmlkICsgJy0nICsgJGluZGV4XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdyhhcnJheUZpZWxkLCAkaW5kZXgpXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgPHAgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWVtcHR5XCI+Tm8gcm93cyB5ZXQuPC9wPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLVxuICAgIFJvdyBkcmF3ZXIuIERlbGliZXJhdGVseSBvdXRzaWRlIHRoZSB0YWIgcGFuZWw6IGJ1aWxkaW5nIGEgcm93J3MgRm9ybUdyb3VwIGluc2lkZSB0aGVcbiAgICB0YWIgdmlldyByYWNlcyB0aGUgdGFiJ3Mgb3duIGluaXRpYWxpc2F0aW9uICh0aGUgcmVmZXJlbmNlIGhpdCB0aGlzIHdpdGggRm9ybUFycmF5KS5cbiAgLS0+XG4gIEBpZiAoaW5saW5lUm93RmllbGQoKTsgYXMgcm93RmllbGQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2RyYXdlclwiIGRhdGEtdGVzdGlkPVwicm93LWRyYXdlclwiIFtmb3JtR3JvdXBdPVwiaW5saW5lUm93Rm9ybSFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkXCI+XG4gICAgICAgIDxzdHJvbmc+e3sgaW5saW5lUm93SW5kZXgoKSA9PT0gbnVsbCA/ICdBZGQnIDogJ0VkaXQnIH19IHt7IGZvcm1hdEZpZWxkTGFiZWwocm93RmllbGQpIH19IHJvdzwvc3Ryb25nPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZm9ybV9fcGFuZWxcIj5cbiAgICAgICAgQGZvciAoY2hpbGQgb2Ygcm93RmllbGQuY2hpbGRyZW4gPz8gW107IHRyYWNrIGNoaWxkLmlkKSB7XG4gICAgICAgICAgPG5neC1keW5hbWljLWZpZWxkXG4gICAgICAgICAgICBbZmllbGRdPVwiY2hpbGRcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwiaW5saW5lUm93Rm9ybSEuZ2V0KGNoaWxkLmlkKSFcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgICAgW2xhbmd1YWdlXT1cImxhbmd1YWdlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgICAgICAgICBbc3R5bGUuZ3JpZENvbHVtbl09XCInc3BhbiAxMidcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3Jlc2V0XCIgZGF0YS10ZXN0aWQ9XCJjYW5jZWwtcm93XCIgKGNsaWNrKT1cImNhbmNlbFJvdygpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3N1Ym1pdFwiIGRhdGEtdGVzdGlkPVwic2F2ZS1yb3dcIiAoY2xpY2spPVwic2F2ZVJvdygpXCI+U2F2ZSByb3c8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBNYWluIER5bmFtaWMgRm9ybSAtLT5cbiAgPG5neC1keW5hbWljLWZvcm1cbiAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgW3J1bGVzXT1cInJ1bGVzXCJcbiAgICBbaW5pdGlhbERhdGFdPVwiaW5pdGlhbERhdGFcIlxuICAgIFtvcmlnaW5hbERhdGFdPVwib3JpZ2luYWxCYXNlbGluZSgpXCJcbiAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgW2xhbmd1YWdlXT1cImxhbmd1YWdlXCJcbiAgICBbcmVhZG9ubHldPVwic2VjdGlvblJlYWRPbmx5XCJcbiAgICBbcmVhZE9ubHlGaWVsZHNdPVwicmVhZE9ubHlGaWVsZHNcIlxuICAgIFtzaG93SW5mb0Jhbm5lcnNdPVwiZmFsc2VcIlxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgIFtlcnJvcl09XCJlcnJvclwiXG4gICAgKGZvcm1DaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKCRldmVudClcIlxuICAgIChmb3JtU3VibWl0KT1cIm9uRm9ybVN1Ym1pdCgkZXZlbnQpXCJcbiAgICAoZm9ybVJlc2V0KT1cIm9uRm9ybVJlc2V0KClcIlxuICAgIChhY3RpdmVUYWJDaGFuZ2UpPVwib25BY3RpdmVUYWJDaGFuZ2UoJGV2ZW50KVwiXG4gIC8+XG48L2Rpdj5cbiJdfQ==
531
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2Zvcm0vZHluYW1pYy1yZWNvcmQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUE0QixNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdE0sT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBOEIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7O0FBRTlFOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRWxEOzs7O0dBSUc7QUFxTUgsTUFBTSxPQUFPLDBCQUEwQjtJQUM1QixNQUFNLENBQW9CO0lBQzFCLEtBQUssQ0FBYztJQUNuQixXQUFXLENBQXVCO0lBQ2xDLFNBQVMsR0FBYSxFQUFFLENBQUM7SUFDekIsUUFBUSxHQUFXLElBQUksQ0FBQztJQUN4QixRQUFRLEdBQVksS0FB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RUFDRCxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQzVCLENBQUM7SUFDSixDQUFDO3dHQW5nQlUsMEJBQTBCOzRGQUExQiwwQkFBMEIsNmZBNEIxQixvQkFBb0IscUVDcFBqQyx1aFBBa01BLDBrR0QxS1ksWUFBWSw4QkFBRSxtQkFBbUIsNFVBQUUsb0JBQW9CLDZVQUFFLHFCQUFxQjs7NEZBZ003RSwwQkFBMEI7a0JBcE10QyxTQUFTO3NDQUNTLHVCQUF1QixDQUFDLE1BQU0sWUFDckMseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsQ0FBQzs4QkFpTWhGLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFRRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRTBCLGVBQWU7c0JBQS9DLFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIHNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCwgYWZ0ZXJOZXh0UmVuZGVyLCBFbGVtZW50UmVmLCBJbmplY3RvciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eUZvcm1Db25maWcsIEZvcm1SdWxlLCBOZXN0ZWRGaWVsZENvbmZpZywgTmVzdGVkVGFiQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgZmluZFRhYiwgZm9ybWF0RGlzcGxheVZhbHVlLCBnZXRUYWJEYXRhLCByZXNvbHZlTGFiZWwgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQvZHluYW1pYy1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnVsZXNFdmFsdWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3J1bGVzLWV2YWx1YXRpb24uc2VydmljZSc7XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBcIm5vIHRhYiBob2xkcyB0aGlzIGZpZWxkXCIgZnJvbSBcInRoZSBmaWVsZCBob2xkcyB1bmRlZmluZWRcIiwgc28gdGhlIHRhYiB3YWxrXG4gKiBjYW4ga2VlcCBzZWFyY2hpbmcgaW4gdGhlIGZpcnN0IGNhc2UgYW5kIHN0b3AgaW4gdGhlIHNlY29uZC5cbiAqL1xuY29uc3QgRklFTERfTk9UX0ZPVU5EID0gU3ltYm9sKCdmaWVsZC1ub3QtZm91bmQnKTtcblxuLyoqXG4gKiBEeW5hbWljUmVjb3JkRm9ybUNvbXBvbmVudCDigJQgY29tcHJlaGVuc2l2ZSB0YWJiZWQgcmVjb3JkIHZpZXcgJiBlZGl0IGNvbXBvbmVudC5cbiAqIFN1cHBvcnRzIGNyb3NzLXRhYiBydWxlIGV2YWx1YXRpb24sIHByb2ZpbGUgaGVhZGVyLCBzdW1tYXJ5IGRyYXdlciAoc2hvd09uTWluaW1pemUpLFxuICogaW50ZXJhY3RpdmUgcXVpY2stanVtcCBsaW5rcywgYW5kIGJhc2VsaW5lIG1vZGlmaWNhdGlvbiB0cmFja2luZy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzZWxlY3RvcjogJ25neC1keW5hbWljLXJlY29yZC1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRHluYW1pY0Zvcm1Db21wb25lbnQsIER5bmFtaWNGaWVsZENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLXJlY29yZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxNnB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19oZWFkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxNnB4O1xuICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YzZjRmNjtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fdGl0bGUtZ3JvdXAge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2F2YXRhciB7XG4gICAgICAgIHdpZHRoOiA0OHB4O1xuICAgICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlMGU3ZmY7XG4gICAgICAgIGNvbG9yOiAjNGY0NmU1O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX190aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VidGl0bGUge1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19oZWFkZXItdG9nZ2xlIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgY29sb3I6ICMzNzQxNTE7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGUtdGV4dCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciB7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci0taW5mbyB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkYmVhZmU7XG4gICAgICAgIGNvbG9yOiAjMWQ0ZWQ4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLWRpc21pc3Mge1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLWRpc21pc3M6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDYpO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXItLWVycm9yIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZlZjJmMjtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlY2FjYTtcbiAgICAgICAgY29sb3I6ICNiOTFjMWM7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24tYmFyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3NlY3Rpb24taGludCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogYXV0bztcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogIzZiNzI4MDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS13YXJuaW5nIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZmJlYjtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlZjNjNztcbiAgICAgICAgY29sb3I6ICNiNDUzMDk7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3Jvd3Mge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZjNmNGY2O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTRweDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3Jvd3MtaGVhZCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3JvdyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBwYWRkaW5nOiA2cHggOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3Jvdy10ZXh0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fcm93LWJ0biB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDJweCA4cHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3Jvdy1lbXB0eSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6ICM2YjcyODA7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fZHJhd2VyIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RiZWFmZTtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBwYWRkaW5nOiAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgICAubmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktcGFuZWwge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZjNmNGY2O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTZweDtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxODBweCwgMWZyKSk7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS1pdGVtIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWl0ZW06aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgfVxuICAgICAgLm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LWxhYmVsIHtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xuICAgICAgICBjb2xvcjogIzZiNzI4MDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIH1cbiAgICAgIC5uZ3gtcmVjb3JkLWVkaXRvcl9fc3VtbWFyeS12YWwge1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGNvbG9yOiAjMWYyOTM3O1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNSZWNvcmRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnITogRW50aXR5Rm9ybUNvbmZpZztcbiAgQElucHV0KCkgcnVsZXM/OiBGb3JtUnVsZVtdO1xuICBASW5wdXQoKSBpbml0aWFsRGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIEBJbnB1dCgpIHVzZXJSb2xlczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogV2hvbGUgcmVjb3JkIHJlYWQtb25seSwgcmVnYXJkbGVzcyBvZiBSQkFDLiBFcXVpdmFsZW50IHRvIHRoZSByZWZlcmVuY2UncyBgaXNSZWFkT25seWAuICovXG4gIEBJbnB1dCgpIGlzUmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNwZWNpZmljIGZpZWxkIGlkcyBmb3JjZWQgcmVhZC1vbmx5IHdoaWxlIHRoZSByZXN0IG9mIHRoZSByZWNvcmQgc3RheXMgZWRpdGFibGUuICovXG4gIEBJbnB1dCgpIHJlYWRPbmx5RmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAvKipcbiAgICogT3BlbiB0aGUgcmVjb3JkIHJlYWQtb25seSwgd2l0aCBhIHBlci10YWIgXCJFZGl0IHNlY3Rpb25cIiBmbG93IOKAlCBvbmUgdGFiIGlzIGVkaXRlZCBhbmRcbiAgICogdmFsaWRhdGVkIGF0IGEgdGltZS4gVGhpcyBpcyB0aGUgZnJhbWV3b3JrJ3MgYEVudGl0eVJlY29yZENvbXBvbmVudGAgbW9kZWwgYW5kIHRoZVxuICAgKiBkZWZhdWx0IGhlcmUuXG4gICAqXG4gICAqIFNldCBmYWxzZSBmb3IgYSBkaXJlY3RseSBlZGl0YWJsZSByZWNvcmQgd2l0aCBubyB2aWV3L2VkaXQgZGlzdGluY3Rpb24uXG4gICAqL1xuICBASW5wdXQoKSB2aWV3TW9kZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZDxzdHJpbmcsIGFueT4+KCk7XG4gIEBPdXRwdXQoKSBmb3JtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ8c3RyaW5nLCBhbnk+PigpO1xuICBAT3V0cHV0KCkgZm9ybVJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogT25lIHRhYiBzZWN0aW9uIHdhcyBzYXZlZC4gQ2FycmllcyB0aGUgd2hvbGUgcmVjb3JkLCBwbHVzIHdoaWNoIHRhYiB3YXMgZWRpdGVkLiAqL1xuICBAT3V0cHV0KCkgc2VjdGlvblNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdGFiSWQ6IHN0cmluZzsgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0+KCk7XG5cbiAgQFZpZXdDaGlsZChEeW5hbWljRm9ybUNvbXBvbmVudCkgZHluYW1pY0Zvcm1Db21wPzogRHluYW1pY0Zvcm1Db21wb25lbnQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBydWxlc0V2YWx1YXRpb24gPSBpbmplY3QoUnVsZXNFdmFsdWF0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRhID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcbiAgcmVhZG9ubHkgb3JpZ2luYWxCYXNlbGluZSA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7fSk7XG5cbiAgLyoqXG4gICAqIEluZm8gYmFubmVycyB0aGUgdXNlciBoYXMgZGlzbWlzc2VkLCBieSBmaWVsZCBpZC5cbiAgICpcbiAgICogVGhlIHJlZmVyZW5jZSdzIGNvbnRyYWN0OiBhbiBpbmZvIGJhbm5lciBwZXJzaXN0cyB1bnRpbCBkaXNtaXNzZWQsICoqbm90KiogdW50aWwgdGhlXG4gICAqIHZhbHVlIGNoYW5nZXMuIERpc21pc3NhbCBpcyBrZXllZCBieSBmaWVsZCBzbyByZS10cmlnZ2VyaW5nIGEgZGlmZmVyZW50IGZpZWxkJ3MgcnVsZVxuICAgKiBzdGlsbCBzaG93cy4gUmUtYXJtZWQgd2hlbiBhIGRpZmZlcmVudCByZWNvcmQgaXMgbG9hZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkaXNtaXNzZWQgPSBzaWduYWw8UmVhZG9ubHlTZXQ8c3RyaW5nPj4obmV3IFNldDxzdHJpbmc+KCkpO1xuXG4gIC8qKlxuICAgKiBJbmZvIGJhbm5lcnMgZnJvbSB0aGUgcnVsZXMgZW5naW5lIHRoYXQgYXJlIHN0aWxsIHNob3dpbmcuXG4gICAqXG4gICAqIEEgZ2V0dGVyLCBub3QgYSBgY29tcHV0ZWRgOiB0aGUgc291cmNlIGlzIGBkeW5hbWljRm9ybUNvbXBgLCBhIFZpZXdDaGlsZC4gQSBjb21wdXRlZFxuICAgKiBldmFsdWF0ZWQgYmVmb3JlIHRoZSB2aWV3IGluaXRpYWxpc2VzIHdvdWxkIGNhcHR1cmUgbm8gZGVwZW5kZW5jeSBvbiB0aGUgY2hpbGQnc1xuICAgKiBgcnVsZVJlc3VsdGAgc2lnbmFsIGFuZCB0aGVuIG5ldmVyIHJlY29tcHV0ZS4gUmVhZCBwZXIgY2hhbmdlLWRldGVjdGlvbiBwYXNzIGluc3RlYWQuXG4gICAqL1xuICBnZXQgaW5mb0Jhbm5lcnMoKTogeyBmaWVsZElkOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZHluYW1pY0Zvcm1Db21wPy5ydWxlUmVzdWx0KCk7XG4gICAgY29uc3QgZ29uZSA9IHRoaXMuZGlzbWlzc2VkKCk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdD8uaW5mb0Jhbm5lcnMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbZmllbGRJZF0pID0+ICFnb25lLmhhcyhmaWVsZElkKSlcbiAgICAgIC5tYXAoKFtmaWVsZElkLCBtZXNzYWdlXSkgPT4gKHsgZmllbGRJZCwgbWVzc2FnZTogU3RyaW5nKG1lc3NhZ2UpIH0pKTtcbiAgfVxuXG4gIGRpc21pc3NJbmZvQmFubmVyKGZpZWxkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkLnNldChuZXcgU2V0KHRoaXMuZGlzbWlzc2VkKCkpLmFkZChmaWVsZElkKSk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIG5vdGhpbmcgaW4gdGhlIHJlY29yZCBtYXkgYmUgZWRpdGVkLiAqL1xuICBnZXQgcmVjb3JkUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHkgfHwgdGhpcy5pc1JlYWRPbmx5O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIElubGluZSBhcnJheS1yb3cgZWRpdGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQSByb3cgb2YgYW4gYGFycmF5YCBmaWVsZCBpcyBlZGl0ZWQgaW4gYSBkcmF3ZXIsIG5vdCBpbmxpbmUgaW4gdGhlIHRhYiBwYW5lbC5cbiAgICpcbiAgICogVGhlIGRyYXdlciBpcyByZW5kZXJlZCBvdXRzaWRlIHRoZSB0YWIgY29udGFpbmVyIG9uIHB1cnBvc2U6IHRoZSByZWZlcmVuY2UgZm91bmQgdGhhdFxuICAgKiBidWlsZGluZyBhIHJvdydzIEZvcm1Hcm91cCBpbnNpZGUgdGhlIHRhYiB2aWV3IHJhY2VzIHRoZSB0YWIncyBvd24gaW5pdGlhbGlzYXRpb24sIHNvXG4gICAqIHRoZSByb3cgZm9ybSBpcyBrZXB0IGRldGFjaGVkIGFuZCBvbmx5IHB1c2hlZCBpbnRvIHRoZSBGb3JtQXJyYXkgb24gc2F2ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlubGluZVJvd0ZpZWxkID0gc2lnbmFsPE5lc3RlZEZpZWxkQ29uZmlnIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGlubGluZVJvd0luZGV4ID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBpbmxpbmVSb3dGb3JtOiBGb3JtR3JvdXAgfCBudWxsID0gbnVsbDtcblxuICAvKiogYGFycmF5YCBmaWVsZHMgb24gdGhlIHRhYiBjdXJyZW50bHkgc2hvd24sIHNvIHRoZSB0ZW1wbGF0ZSBjYW4gbGlzdCB0aGVpciByb3dzLiAqL1xuICBnZXQgYXJyYXlGaWVsZHNGb3JBY3RpdmVUYWIoKTogTmVzdGVkRmllbGRDb25maWdbXSB7XG4gICAgY29uc3QgdGFiSWQgPSB0aGlzLmFjdGl2ZVRhYklkO1xuICAgIGNvbnN0IHRhYiA9IHRhYklkID8gZmluZFRhYih0aGlzLmNvbmZpZz8udGFicywgdGFiSWQpIDogbnVsbDtcbiAgICByZXR1cm4gKHRhYj8uZmllbGRzID8/IFtdKS5maWx0ZXIoZiA9PiBmLnR5cGUgPT09ICdhcnJheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvd3MgY3VycmVudGx5IGhlbGQgYnkgYW4gYGFycmF5YCBmaWVsZCwgcmVhZCBmcm9tIHRoZSByZWNvcmQgdmFsdWUuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBub3QgcmVhZCBvZmYgdGhlIGNoaWxkJ3MgRm9ybUFycmF5OiB0aGF0IGNvbnRyb2wgb25seSBleGlzdHMgb25jZSB0aGVcbiAgICogY2hpbGQgaGFzIGluaXRpYWxpc2VkLCBzbyByZW5kZXJpbmcgZnJvbSBpdCBjaGFuZ2VkIHZhbHVlIG1pZC1wYXNzLiBgY3VycmVudERhdGFgIGlzIGFcbiAgICogc2lnbmFsIHNlZWRlZCBmcm9tIGBpbml0aWFsRGF0YWAgYW5kIGtlcHQgY3VycmVudCBieSB0aGUgY2hpbGQncyBgZm9ybUNoYW5nZWAuXG4gICAqL1xuICByb3dzT2YoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB7XG4gICAgY29uc3QgdGFiSWQgPSB0aGlzLmFjdGl2ZVRhYklkO1xuICAgIGNvbnN0IHRhYkRhdGEgPSB0YWJJZCA/IGdldFRhYkRhdGEodGFiSWQsIHRoaXMuY3VycmVudERhdGEoKSwgdGhpcy5jb25maWcpIDogbnVsbDtcbiAgICBjb25zdCByb3dzID0gKHRhYkRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsKT8uW2ZpZWxkLmlkXTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyb3dzKSA/IChyb3dzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10pIDogW107XG4gIH1cblxuICAvKiogT25lIHJvdyByZW5kZXJlZCBhcyB0ZXh0LCBzbyB0aGUgbGlzdCBpcyByZWFkYWJsZSB3aXRob3V0IG9wZW5pbmcgdGhlIGRyYXdlci4gKi9cbiAgcm93U3VtbWFyeShmaWVsZDogTmVzdGVkRmllbGRDb25maWcsIHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gcm93ID8/IHt9O1xuICAgIGNvbnN0IHBhcnRzID0gKGZpZWxkLmNoaWxkcmVuID8/IFtdKVxuICAgICAgLm1hcChjaGlsZCA9PiB2YWx1ZVtjaGlsZC5pZF0pXG4gICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gJycpXG4gICAgICAubWFwKHYgPT4gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHYpIDogU3RyaW5nKHYpKSk7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA/IHBhcnRzLmpvaW4oJyDCtyAnKSA6ICcoZW1wdHkpJztcbiAgfVxuXG4gIG9wZW5BZGRSb3coZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VjdGlvblJlYWRPbmx5KSByZXR1cm47XG4gICAgdGhpcy5pbmxpbmVSb3dGaWVsZC5zZXQoZmllbGQpO1xuICAgIHRoaXMuaW5saW5lUm93SW5kZXguc2V0KG51bGwpO1xuICAgIHRoaXMuaW5saW5lUm93Rm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wPy5jcmVhdGVBcnJheVJvdyhmaWVsZCkgYXMgRm9ybUdyb3VwO1xuICB9XG5cbiAgb3BlbkVkaXRSb3coZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VjdGlvblJlYWRPbmx5KSByZXR1cm47XG4gICAgdGhpcy5pbmxpbmVSb3dGaWVsZC5zZXQoZmllbGQpO1xuICAgIHRoaXMuaW5saW5lUm93SW5kZXguc2V0KGluZGV4KTtcbiAgICB0aGlzLmlubGluZVJvd0Zvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uY3JlYXRlQXJyYXlSb3coZmllbGQsIHRoaXMucm93c09mKGZpZWxkKVtpbmRleF0pIGFzIEZvcm1Hcm91cDtcbiAgfVxuXG4gIGNhbmNlbFJvdygpOiB2b2lkIHtcbiAgICB0aGlzLmlubGluZVJvd0ZpZWxkLnNldChudWxsKTtcbiAgICB0aGlzLmlubGluZVJvd0luZGV4LnNldChudWxsKTtcbiAgICB0aGlzLmlubGluZVJvd0Zvcm0gPSBudWxsO1xuICB9XG5cbiAgLyoqIENvbW1pdCB0aGUgZHJhd2VyIGludG8gdGhlIEZvcm1BcnJheS4gUnVsZXMgcmUtZXZhbHVhdGUgb2ZmIHRoZSByZXN1bHRpbmcgdmFsdWUgY2hhbmdlLiAqL1xuICBzYXZlUm93KCk6IHZvaWQge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5pbmxpbmVSb3dGaWVsZCgpO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmR5bmFtaWNGb3JtQ29tcDtcbiAgICBpZiAoIWZpZWxkIHx8ICFmb3JtIHx8ICF0aGlzLmlubGluZVJvd0Zvcm0pIHJldHVybjtcblxuICAgIGlmICh0aGlzLmlubGluZVJvd0Zvcm0uaW52YWxpZCkge1xuICAgICAgdGhpcy5pbmxpbmVSb3dGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhcnJheSA9IGZvcm0uZ2V0QXJyYXlDb250cm9sKGZpZWxkLmlkLCB0aGlzLmFjdGl2ZVRhYklkID8/IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFhcnJheSkgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmlubGluZVJvd0luZGV4KCk7XG4gICAgaWYgKGluZGV4ID09PSBudWxsKSBhcnJheS5wdXNoKGZvcm0uY3JlYXRlQXJyYXlSb3coZmllbGQsIHRoaXMuaW5saW5lUm93Rm9ybS52YWx1ZSkpO1xuICAgIGVsc2UgYXJyYXkuYXQoaW5kZXgpLnBhdGNoVmFsdWUodGhpcy5pbmxpbmVSb3dGb3JtLnZhbHVlKTtcblxuICAgIGFycmF5LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB0aGlzLmN1cnJlbnREYXRhLnNldChmb3JtLmV4dHJhY3RSZWNvcmQoKSk7XG4gICAgdGhpcy5jYW5jZWxSb3coKTtcbiAgfVxuXG4gIGRlbGV0ZVJvdyhmaWVsZDogTmVzdGVkRmllbGRDb25maWcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWN0aW9uUmVhZE9ubHkpIHJldHVybjtcbiAgICBjb25zdCBhcnJheSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wPy5nZXRBcnJheUNvbnRyb2woZmllbGQuaWQsIHRoaXMuYWN0aXZlVGFiSWQgPz8gdW5kZWZpbmVkKTtcbiAgICBhcnJheT8ucmVtb3ZlQXQoaW5kZXgpO1xuICAgIGFycmF5Py51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgaWYgKHRoaXMuZHluYW1pY0Zvcm1Db21wKSB0aGlzLmN1cnJlbnREYXRhLnNldCh0aGlzLmR5bmFtaWNGb3JtQ29tcC5leHRyYWN0UmVjb3JkKCkpO1xuICAgIGlmICh0aGlzLmlubGluZVJvd0luZGV4KCkgPT09IGluZGV4KSB0aGlzLmNhbmNlbFJvdygpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFBlci10YWIgc2VjdGlvbiBlZGl0aW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUaGUgdGFiIGN1cnJlbnRseSBvcGVuIGZvciBlZGl0aW5nLCBvciBudWxsIHdoZW4gdGhlIHJlY29yZCBpcyBiZWluZyB2aWV3ZWQuXG4gICAqXG4gICAqIFRoZSByZWZlcmVuY2UgZWRpdHMgb25lIHRhYiBzZWN0aW9uIGF0IGEgdGltZSByYXRoZXIgdGhhbiB0aGUgd2hvbGUgcmVjb3JkLCBhbmRcbiAgICogdmFsaWRhdGVzIG9ubHkgdGhhdCBzZWN0aW9uIG9uIHNhdmUg4oCUIGEgcmVxdWlyZWQgZmllbGQgb24gYW4gdW50b3VjaGVkIHRhYiBtdXN0IG5vdFxuICAgKiBibG9jayBzYXZpbmcgdGhlIHRhYiB5b3UgYXJlIGFjdHVhbGx5IHdvcmtpbmcgb24uXG4gICAqL1xuICByZWFkb25seSBlZGl0aW5nVGFiSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWIgdGhlIGlubmVyIGZvcm0gaXMgc2hvd2luZy5cbiAgICpcbiAgICogVHJhY2tlZCBoZXJlIHJhdGhlciB0aGFuIHJlYWQgb2ZmIHRoZSBWaWV3Q2hpbGQuIFRoZSBjaGlsZCByZXNvbHZlcyBpdHMgZmlyc3QgdGFiIGFzXG4gICAqIHBhcnQgb2YgaXRzIG93biBpbml0aWFsaXNhdGlvbiwgc28gcmVhZGluZyBpdCBkdXJpbmcgdGhpcyBjb21wb25lbnQncyByZW5kZXIgY2hhbmdlZFxuICAgKiB2YWx1ZSBtaWQtcGFzcyDigJQgYW4gRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWQgZXJyb3IuIFNlZWRlZCBmcm9tIHRoZVxuICAgKiBjb25maWcgYW5kIGtlcHQgaW4gc3RlcCBieSB0aGUgY2hpbGQncyBgYWN0aXZlVGFiQ2hhbmdlYCBvdXRwdXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZVRhYklkU2lnID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIGdldCBhY3RpdmVUYWJJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWJJZFNpZygpO1xuICB9XG5cbiAgb25BY3RpdmVUYWJDaGFuZ2UodGFiSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZVRhYklkU2lnKCkgPT09IHRhYklkKSByZXR1cm47XG4gICAgdGhpcy5hY3RpdmVUYWJJZFNpZy5zZXQodGFiSWQpO1xuICAgIC8vIEVkaXRpbmcgZG9lcyBub3QgZm9sbG93IHRoZSB1c2VyIHRvIGFub3RoZXIgdGFiLlxuICAgIHRoaXMuZWRpdGluZ1RhYklkLnNldChudWxsKTtcbiAgICB0aGlzLmNhbmNlbFJvdygpO1xuICB9XG5cbiAgLyoqIEZpcnN0IHRhYiBhIHVzZXIgY2FuIHNlZSwgdXNlZCB0byBzZWVkIHRoZSBhY3RpdmUgdGFiIGJlZm9yZSB0aGUgY2hpbGQgcmVwb3J0cyBvbmUuICovXG4gIHByaXZhdGUgZmlyc3RWaXNpYmxlVGFiSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy50YWJzPy5maW5kKHQgPT4gdC52aXNpYmlsaXR5ICE9PSBmYWxzZSk/LmlkID8/IG51bGw7XG4gIH1cblxuICAvKiogRXJyb3JzIGZyb20gdGhlIGxhc3Qgc2F2ZSBhdHRlbXB0LCBieSBmaWVsZCBpZC4gKi9cbiAgcmVhZG9ubHkgc2VjdGlvbkVycm9ycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSk7XG5cbiAgLyoqIFRlbXBsYXRlIGFjY2VzcyB0byBgT2JqZWN0LmtleXNgIGZvciBpdGVyYXRpbmcgdGhlIGVycm9yIG1hcC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IE9iamVjdCA9IE9iamVjdDtcblxuICBnZXQgaXNFZGl0aW5nQWN0aXZlVGFiKCk6IGJvb2xlYW4ge1xuICAgIC8vIFdpdGhvdXQgdmlldyBtb2RlIHRoZXJlIGlzIG5vIHZpZXcvZWRpdCBkaXN0aW5jdGlvbiDigJQgZXZlcnl0aGluZyBpcyBhbHdheXMgZWRpdGFibGUuXG4gICAgaWYgKCF0aGlzLnZpZXdNb2RlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gISF0aGlzLmFjdGl2ZVRhYklkICYmIHRoaXMuZWRpdGluZ1RhYklkKCkgPT09IHRoaXMuYWN0aXZlVGFiSWQ7XG4gIH1cblxuICAvKiogRmllbGRzIHJlbmRlciByZWFkLW9ubHkgdW5sZXNzIHRoZWlyIG93biB0YWIgaXMgdGhlIG9uZSBiZWluZyBlZGl0ZWQuICovXG4gIGdldCBzZWN0aW9uUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkUmVhZE9ubHkgfHwgIXRoaXMuaXNFZGl0aW5nQWN0aXZlVGFiO1xuICB9XG5cbiAgZWRpdFNlY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdNb2RlIHx8IHRoaXMucmVjb3JkUmVhZE9ubHkgfHwgIXRoaXMuYWN0aXZlVGFiSWQpIHJldHVybjtcbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQodGhpcy5hY3RpdmVUYWJJZCk7XG4gIH1cblxuICAvKiogRGlzY2FyZCB0aGlzIHNlY3Rpb24ncyBlZGl0cywgcmVzdG9yaW5nIGVhY2ggZmllbGQgZnJvbSB0aGUgc2Vzc2lvbiBiYXNlbGluZS4gKi9cbiAgY2FuY2VsU2VjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJJZCA9IHRoaXMuZWRpdGluZ1RhYklkKCk7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZHluYW1pY0Zvcm1Db21wO1xuICAgIGlmICh0YWJJZCAmJiBmb3JtKSB7XG4gICAgICBjb25zdCB0YWIgPSBmaW5kVGFiKHRoaXMuY29uZmlnPy50YWJzLCB0YWJJZCk7XG4gICAgICBjb25zdCBiYXNlbGluZVRhYiA9IChnZXRUYWJEYXRhKHRhYklkLCB0aGlzLm9yaWdpbmFsQmFzZWxpbmUoKSwgdGhpcy5jb25maWcpID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGFiPy5maWVsZHMgPz8gW10pIHtcbiAgICAgICAgY29uc3QgYmFzZWxpbmVWYWx1ZSA9IGJhc2VsaW5lVGFiW2ZpZWxkLmlkXTtcblxuICAgICAgICAvLyBBIEZvcm1BcnJheSBjYW5ub3QgYmUgcmVzdG9yZWQgd2l0aCBzZXRWYWx1ZSDigJQgdGhhdCBkZW1hbmRzIGEgdmFsdWUgc2hhcGVkIGV4YWN0bHlcbiAgICAgICAgLy8gbGlrZSB0aGUgY3VycmVudCByb3dzLiBSZWJ1aWxkIGl0IGZyb20gdGhlIGJhc2VsaW5lIHJvd3MgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtLmdldEFycmF5Q29udHJvbChmaWVsZC5pZCwgdGFiSWQpO1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBhcnJheS5jbGVhcigpO1xuICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIEFycmF5LmlzQXJyYXkoYmFzZWxpbmVWYWx1ZSkgPyBiYXNlbGluZVZhbHVlIDogW10pIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2goZm9ybS5jcmVhdGVBcnJheVJvdyhmaWVsZCwgcm93KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFycmF5LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm0uZ2V0Q29udHJvbChmaWVsZC5pZCwgdGFiSWQpPy5zZXRWYWx1ZShiYXNlbGluZVZhbHVlID8/IG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50RGF0YS5zZXQoZm9ybS5leHRyYWN0UmVjb3JkKCkpO1xuICAgIH1cbiAgICB0aGlzLnNlY3Rpb25FcnJvcnMuc2V0KHt9KTtcbiAgICB0aGlzLmVkaXRpbmdUYWJJZC5zZXQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhpcyBzZWN0aW9uIG9ubHksIHRoZW4gZW1pdCBpdC4gVmFsaWRhdGlvbiBpcyBzY29wZWQgdHdvIHdheXM6IEFuZ3VsYXJcbiAgICogdmFsaWRpdHkgb2YgdGhlIHRhYidzIG93biBjb250cm9scywgYW5kIHJ1bGVzIGZpbHRlcmVkIHRvIHRoaXMgdGFiIOKAlCBhIHJ1bGUgdGFyZ2V0aW5nXG4gICAqIGEgaGlkZGVuIHRhYiBtdXN0IG5vdCBibG9jayB0aGUgc2F2ZSAodGhlIHJlZmVyZW5jZSdzIE9WMC05NjggZml4KS5cbiAgICovXG4gIHNhdmVTZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYklkID0gdGhpcy5lZGl0aW5nVGFiSWQoKTtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5keW5hbWljRm9ybUNvbXA7XG4gICAgaWYgKCF0YWJJZCB8fCAhZm9ybSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGFiID0gZmluZFRhYih0aGlzLmNvbmZpZz8udGFicywgdGFiSWQpO1xuICAgIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0YWI/LmZpZWxkcyA/PyBbXSkge1xuICAgICAgY29uc3QgY3RybCA9IGZvcm0uZ2V0Q29udHJvbChmaWVsZC5pZCwgdGFiSWQpO1xuICAgICAgaWYgKGN0cmw/LmludmFsaWQpIHtcbiAgICAgICAgY3RybC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIGVycm9yc1tmaWVsZC5pZF0gPSBgJHtyZXNvbHZlTGFiZWwoZmllbGQubGFiZWwsIHRoaXMubGFuZ3VhZ2UpfSBpcyBpbnZhbGlkLmA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGVkID0gdGhpcy5ydWxlc0V2YWx1YXRpb24uZmlsdGVyRm9yVGFiKHRoaXMucnVsZXMsIHRhYklkLCB0aGlzLmNvbmZpZyk7XG4gICAgY29uc3QgcnVsZUVycm9ycyA9IHRoaXMucnVsZXNFdmFsdWF0aW9uLmV2YWx1YXRlKHNjb3BlZCwgZm9ybS5mb3JtVmFsdWVzKCksIHRoaXMub3JpZ2luYWxCYXNlbGluZSgpKVxuICAgICAgLnZhbGlkYXRpb25FcnJvcnM7XG4gICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIHJ1bGVFcnJvcnMpO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWN0aW9uRXJyb3JzLnNldChlcnJvcnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VjdGlvbkVycm9ycy5zZXQoe30pO1xuICAgIHRoaXMuZWRpdGluZ1RhYklkLnNldChudWxsKTtcblxuICAgIGNvbnN0IHJlY29yZCA9IGZvcm0uZXh0cmFjdFJlY29yZCgpO1xuICAgIHRoaXMuY3VycmVudERhdGEuc2V0KHJlY29yZCk7XG4gICAgdGhpcy5zZWN0aW9uU2F2ZS5lbWl0KHsgdGFiSWQsIHJlY29yZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVkIHRoZSBzZXNzaW9uIGJhc2VsaW5lIGZyb20gdGhlIGxvYWRlZCByZWNvcmQgc28gYFZBTFVFX0NIQU5HRURgIHJ1bGVzIGFuZCB0aGVcbiAgICogbW9kaWZpY2F0aW9uIGJhbm5lciBjb21wYXJlIGFnYWluc3QgdGhlIHJlY29yZCBhcyBpdCB3YXMgb3BlbmVkIOKAlCBub3QgYXMgaXQgd2FzXG4gICAqIGFmdGVyIHRoZSBmaXJzdCBrZXlzdHJva2UuXG4gICAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxEYXRhJ10gfHwgY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIHRoaXMub3JpZ2luYWxCYXNlbGluZS5zZXQoeyAuLi4odGhpcy5pbml0aWFsRGF0YSA/PyB7fSkgfSk7XG4gICAgICB0aGlzLmN1cnJlbnREYXRhLnNldCh7IC4uLih0aGlzLmluaXRpYWxEYXRhID8/IHt9KSB9KTtcbiAgICAgIHRoaXMuYWN0aXZlVGFiSWRTaWcuc2V0KHRoaXMuZmlyc3RWaXNpYmxlVGFiSWQoKSk7XG4gICAgICAvLyBBIGRpZmZlcmVudCByZWNvcmQgaXMgYSBkaWZmZXJlbnQgc2V0IG9mIGJhbm5lcnMg4oCUIHJlLWFybSB0aGVtLlxuICAgICAgdGhpcy5kaXNtaXNzZWQuc2V0KG5ldyBTZXQ8c3RyaW5nPigpKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcmVjb3JkVGl0bGUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSByZXR1cm4gJ1JlY29yZCc7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm5hbWUgPyByZXNvbHZlTGFiZWwodGhpcy5jb25maWcubmFtZSwgdGhpcy5sYW5ndWFnZSkgOiB0aGlzLmNvbmZpZy5lbnRpdHk7XG4gIH1cblxuICBnZXQgYXZhdGFyTGV0dGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLnJlY29yZFRpdGxlIHx8ICdSJykuY2hhckF0KDApLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICAvLyDilIDilIDilIAgSGVhZGVyIGZpZWxkcyAoaXNQcm9maWxlSW1hZ2UgLyBpc0hlYWRlclRvZ2dsZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEV2ZXJ5IGZpZWxkIGluIHRoZSBjb25maWcsIGF0IGFueSBkZXB0aC4gKi9cbiAgcHJpdmF0ZSBhbGxGaWVsZHMoKTogTmVzdGVkRmllbGRDb25maWdbXSB7XG4gICAgY29uc3Qgb3V0OiBOZXN0ZWRGaWVsZENvbmZpZ1tdID0gW107XG4gICAgY29uc3Qgd2Fsa0ZpZWxkcyA9IChmaWVsZHM6IE5lc3RlZEZpZWxkQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHMgPz8gW10pIHtcbiAgICAgICAgb3V0LnB1c2goZik7XG4gICAgICAgIHdhbGtGaWVsZHMoZi5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB3YWxrVGFicyA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0IG9mIHRhYnMgPz8gW10pIHtcbiAgICAgICAgd2Fsa0ZpZWxkcyh0LmZpZWxkcyk7XG4gICAgICAgIHdhbGtUYWJzKHQuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsa1RhYnModGhpcy5jb25maWc/LnRhYnMpO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogVGhlIGZpZWxkIGZsYWdnZWQgYGlzUHJvZmlsZUltYWdlYCwgcmVuZGVyZWQgYXMgdGhlIHJlY29yZCBhdmF0YXIuICovXG4gIGdldCBoZWFkZXJQcm9maWxlRmllbGQoKTogTmVzdGVkRmllbGRDb25maWcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hbGxGaWVsZHMoKS5maW5kKGYgPT4gZi5pc1Byb2ZpbGVJbWFnZSkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgZmllbGQgZmxhZ2dlZCBgaXNIZWFkZXJUb2dnbGVgLCByZW5kZXJlZCBhcyBhIHN0YXR1cyBzd2l0Y2ggaW4gdGhlIGhlYWRlci4gKi9cbiAgZ2V0IGhlYWRlclRvZ2dsZUZpZWxkKCk6IE5lc3RlZEZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWxsRmllbGRzKCkuZmluZChmID0+IGYuaXNIZWFkZXJUb2dnbGUpID8/IG51bGw7XG4gIH1cblxuICAvKiogQXZhdGFyIGltYWdlIFVSTCwgd2hlbiB0aGUgcHJvZmlsZSBmaWVsZCBob2xkcyBhIHBlcnNpc3RlZCBGaWxlUmVmLiAqL1xuICBnZXQgcHJvZmlsZUltYWdlVXJsKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5oZWFkZXJQcm9maWxlRmllbGQ7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZpZWxkVmFsdWUoZmllbGQuaWQpIGFzIHsgdXJsPzogc3RyaW5nIH0gfCBudWxsO1xuICAgIHJldHVybiB2YWx1ZT8udXJsID8/IG51bGw7XG4gIH1cblxuICBnZXQgaGVhZGVyVG9nZ2xlVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmhlYWRlclRvZ2dsZUZpZWxkO1xuICAgIHJldHVybiBmaWVsZCA/IHRoaXMuZmllbGRWYWx1ZShmaWVsZC5pZCkgPT09IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGlwIHRoZSBoZWFkZXIgdG9nZ2xlLiBJdCB3cml0ZXMgc3RyYWlnaHQgdG8gdGhlIGNvbnRyb2wgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICAgKiBzZWN0aW9uIGVkaXRpbmcg4oCUIHRoZSByZWZlcmVuY2UgdHJlYXRzIGl0IGFzIGEgcmVjb3JkLWxldmVsIHN0YXR1cyBzd2l0Y2gsIG5vdCBwYXJ0IG9mXG4gICAqIGFueSBvbmUgdGFiJ3Mgc2VjdGlvbi5cbiAgICovXG4gIHRvZ2dsZUhlYWRlclN0YXR1cygpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuaGVhZGVyVG9nZ2xlRmllbGQ7XG4gICAgaWYgKCFmaWVsZCB8fCB0aGlzLnJlY29yZFJlYWRPbmx5KSByZXR1cm47XG4gICAgY29uc3QgY3RybCA9IHRoaXMuY29udHJvbEZvcihmaWVsZC5pZCk7XG4gICAgaWYgKCFjdHJsKSByZXR1cm47XG4gICAgY3RybC5zZXRWYWx1ZSghdGhpcy5oZWFkZXJUb2dnbGVWYWx1ZSk7XG4gICAgaWYgKHRoaXMuZHluYW1pY0Zvcm1Db21wKSB0aGlzLmN1cnJlbnREYXRhLnNldCh0aGlzLmR5bmFtaWNGb3JtQ29tcC5leHRyYWN0UmVjb3JkKCkpO1xuICB9XG5cbiAgLyoqIExvY2F0ZSBhIGZpZWxkJ3MgY29udHJvbCB3aGVyZXZlciBpdCBsaXZlcywgc2luY2UgaGVhZGVyIGZpZWxkcyBtYXkgYmUgb24gYW55IHRhYi4gKi9cbiAgcHJpdmF0ZSBjb250cm9sRm9yKGZpZWxkSWQ6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uZ2V0Q29udHJvbChmaWVsZElkKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmllbGQncyBjdXJyZW50IHZhbHVlLCByZWFkIGZyb20gdGhlIHJlY29yZCBzbyBpdCBpcyBzdGFibGUgZHVyaW5nIHJlbmRlci5cbiAgICpcbiAgICogUmVzb2x2ZWQgdGhyb3VnaCBgZ2V0VGFiRGF0YWAgc28gaXQgaG9ub3VycyBleGFjdGx5IHRoZSBuZXN0aW5nIGNvbnRyYWN0IHRoZSBmb3JtXG4gICAqIHBhdGNoZXMgd2l0aCDigJQgYHsgdGFiSWQ6IHsgZmllbGRJZCB9IH1gLCBvciB0aGUgcmVjb3JkIHJvb3Qgd2hlbiB0aGUgdGFiIHNldHNcbiAgICogYGZsYXREYXRhYC4gUmVhZGluZyB0aGUgcmVjb3JkIGZsYXQgaW5zdGVhZCBpcyBub3QgYSBzaG9ydGN1dDogaXQgbWFrZXMgdGhlIHN1bW1hcnlcbiAgICogZGlzcGxheSB2YWx1ZXMgdGhlIGZvcm0gbmV2ZXIgbG9hZGVkLCB3aGljaCByZWFkcyBhcyBcInRoZSBkYXRhIGlzIHRoZXJlXCIgd2hpbGUgZXZlcnlcbiAgICogY29udHJvbCBiZWhpbmQgaXQgaXMgZW1wdHkuXG4gICAqXG4gICAqIFdhbGtzIHN1Yi10YWJzIGFzIHdlbGw6IGEgc3VtbWFyeSwgaGVhZGVyLCBvciBwcm9maWxlIGZpZWxkIG1heSBzaXQgb24gYW55IHRhYiBhdCBhbnlcbiAgICogZGVwdGguXG4gICAqL1xuICBwcml2YXRlIGZpZWxkVmFsdWUoZmllbGRJZDogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgdmlzaXQgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gPSBbXSk6IHVua25vd24gPT4ge1xuICAgICAgZm9yIChjb25zdCB0YWIgb2YgdGFicykge1xuICAgICAgICBjb25zdCBkYXRhID0gZ2V0VGFiRGF0YSh0YWIuaWQsIHRoaXMuY3VycmVudERhdGEoKSwgdGhpcy5jb25maWcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgICAgICAgaWYgKGRhdGEgJiYgZmllbGRJZCBpbiBkYXRhKSByZXR1cm4gZGF0YVtmaWVsZElkXTtcbiAgICAgICAgaWYgKHRhYi5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gdmlzaXQodGFiLmNoaWxkcmVuKTtcbiAgICAgICAgICBpZiAoZm91bmQgIT09IEZJRUxEX05PVF9GT1VORCkgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gRklFTERfTk9UX0ZPVU5EO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSB2aXNpdCh0aGlzLmNvbmZpZz8udGFicyk7XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gRklFTERfTk9UX0ZPVU5EID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG5cbiAgcmVhZG9ubHkgaXNNb2RpZmllZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBvcmlnID0gdGhpcy5vcmlnaW5hbEJhc2VsaW5lKCk7XG4gICAgY29uc3QgY3VyciA9IHRoaXMuY3VycmVudERhdGEoKTtcbiAgICBpZiAoIW9yaWcgfHwgIWN1cnIgfHwgT2JqZWN0LmtleXMob3JpZykubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9yaWcpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3VtbWFyeUZpZWxkcyA9IGNvbXB1dGVkPE5lc3RlZEZpZWxkQ29uZmlnW10+KCgpID0+IHtcbiAgICBjb25zdCBmaWVsZHM6IE5lc3RlZEZpZWxkQ29uZmlnW10gPSBbXTtcbiAgICBjb25zdCB3YWxrVGFicyA9ICh0YWJzOiBOZXN0ZWRUYWJDb25maWdbXSA9IFtdKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgdGFicykge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgdC5maWVsZHMgPz8gW10pIHtcbiAgICAgICAgICBpZiAoZi5zaG93T25NaW5pbWl6ZSkgZmllbGRzLnB1c2goZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHQuY2hpbGRyZW4pIHdhbGtUYWJzKHQuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsa1RhYnModGhpcy5jb25maWc/LnRhYnMpO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH0pO1xuXG4gIG9uRm9ybUNoYW5nZShkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgLy8gQmFzZWxpbmUgaXMgc2VlZGVkIGZyb20gYGluaXRpYWxEYXRhYCBpbiBuZ09uQ2hhbmdlczsgb25seSBmaWxsIGl0IGhlcmUgd2hlbiB0aGVcbiAgICAvLyByZWNvcmQgd2FzIG9wZW5lZCBlbXB0eSAoY3JlYXRlIGZsb3cpLCBzbyB0aGUgZmlyc3QgZW1pdHRlZCBzaGFwZSBiZWNvbWVzIHRoZSBiYXNlbGluZS5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcmlnaW5hbEJhc2VsaW5lKCkpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5vcmlnaW5hbEJhc2VsaW5lLnNldCh7IC4uLmRhdGEgfSk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudERhdGEuc2V0KGRhdGEpO1xuICAgIHRoaXMuZm9ybUNoYW5nZS5lbWl0KGRhdGEpO1xuICB9XG5cbiAgb25Gb3JtU3VibWl0KGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIG9uRm9ybVJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVJlc2V0LmVtaXQoKTtcbiAgfVxuXG4gIGZvcm1hdEZpZWxkTGFiZWwoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKGZpZWxkLmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIC8qKiBTdW1tYXJ5IHZhbHVlcyByZW5kZXIgdGhyb3VnaCB0aGUgc2hhcmVkIGNvcmUgZm9ybWF0dGVyLCBub3QgYSBsb2NhbCBzdHJpbmdpZmllci4gKi9cbiAgZm9ybWF0RmllbGRWYWx1ZShmaWVsZDogTmVzdGVkRmllbGRDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXREaXNwbGF5VmFsdWUoZmllbGQudHlwZSwgZmllbGQub3B0aW9ucywgdGhpcy5maWVsZFZhbHVlKGZpZWxkLmlkKSwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgd2hpY2ggdGFiIOKAlCBhbmQsIHdoZXJlIHRoZSBmaWVsZCBsaXZlcyBvbmUgbGV2ZWwgZG93biwgd2hpY2ggc3ViLXRhYiDigJQgb3ducyBhXG4gICAqIGZpZWxkLiBUaGUgd2FsayB1c2VkIHRvIGNoZWNrIHRvcC1sZXZlbCBgZmllbGRzYCBvbmx5LCBzbyBldmVyeSBmaWVsZCBpbiBhIHN1Yi10YWIgd2FzXG4gICAqIHNpbXBseSBub3QgZm91bmQgYW5kIHRoZSBqdW1wIGRpZCBub3RoaW5nIGF0IGFsbC5cbiAgICovXG4gIHByaXZhdGUgbG9jYXRlRmllbGQoZmllbGRJZDogc3RyaW5nKTogeyB0YWJJZDogc3RyaW5nOyBzdWJUYWJJZD86IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB0YWIgb2YgdGhpcy5jb25maWc/LnRhYnMgfHwgW10pIHtcbiAgICAgIGlmICgodGFiLmZpZWxkcyB8fCBbXSkuc29tZShmID0+IGYuaWQgPT09IGZpZWxkSWQpKSByZXR1cm4geyB0YWJJZDogdGFiLmlkIH07XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRhYi5jaGlsZHJlbiB8fCBbXSkge1xuICAgICAgICBpZiAoKGNoaWxkLmZpZWxkcyB8fCBbXSkuc29tZShmID0+IGYuaWQgPT09IGZpZWxkSWQpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdGFiSWQ6IHRhYi5pZCwgc3ViVGFiSWQ6IGNoaWxkLmlkIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdG8gdGhlIHRhYiBob2xkaW5nIGBmaWVsZElkYCwgdGhlbiBzY3JvbGxzIGl0IGludG8gdmlldyBhbmQgbW92ZXMgZm9jdXMgdG8gaXQuXG4gICAqXG4gICAqIFRoZSB3YWl0IGZvciB0aGUgbmV3IHRhYiB0byByZW5kZXIgdXNlZCB0byBiZSBhIDUwIG1zIGBzZXRUaW1lb3V0YCwgd2hpY2ggd2FzIHdyb25nIHRocmVlXG4gICAqIHdheXM6IGBkb2N1bWVudGAgaXMgdW5kZWZpbmVkIG9uIGEgc2VydmVyIHJlbmRlciwgNTAgbXMgaXMgYSBndWVzcyB0aGF0IGEgbGFyZ2UgdGFiIGNhblxuICAgKiBvdXRydW4sIGFuZCBub3RoaW5nIGNhbmNlbGxlZCB0aGUgdGltZXIgaWYgdGhlIGNvbXBvbmVudCB3ZW50IGF3YXkgZmlyc3QuXG4gICAqIGBhZnRlck5leHRSZW5kZXJgIGZpeGVzIGFsbCB0aHJlZSDigJQgaXQgbmV2ZXIgcnVucyBvbiB0aGUgc2VydmVyLCBpdCBydW5zIHdoZW4gdGhlIHBhbmVsXG4gICAqIGhhcyBhY3R1YWxseSByZW5kZXJlZCByYXRoZXIgdGhhbiB3aGVuIGEgZ3Vlc3MgZXhwaXJlcywgYW5kIGl0IGlzIHRpZWQgdG8gdGhlIGluamVjdG9yIHNvXG4gICAqIGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudCBjYW5jZWxzIGl0LiBUaGUgcXVlcnkgaXMgc2NvcGVkIHRvIHRoaXMgY29tcG9uZW50J3Mgb3duIGVsZW1lbnQsXG4gICAqIHNvIHRoZSBsaWJyYXJ5IG5vIGxvbmdlciByZWFjaGVzIGZvciB0aGUgZ2xvYmFsIGBkb2N1bWVudGAgYXQgYWxsLlxuICAgKi9cbiAganVtcFRvRmllbGQoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmxvY2F0ZUZpZWxkKGZpZWxkSWQpO1xuICAgIGlmICghbG9jYXRpb24pIHJldHVybjtcblxuICAgIHRoaXMuZHluYW1pY0Zvcm1Db21wPy5zZXRBY3RpdmVUYWIobG9jYXRpb24udGFiSWQpO1xuICAgIC8vIGBzZXRBY3RpdmVUYWJgIHJlc2V0cyB0byBhIHRhYidzIGZpcnN0IGNoaWxkLCBzbyB0aGUgc3ViLXRhYiBoYXMgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXJcbiAgICAvLyBpdCwgbm90IGJlZm9yZS4gV2l0aG91dCB0aGlzIHRoZSB3YWxrIGZvdW5kIHN1Yi10YWIgZmllbGRzIGFuZCB0aGVuIHJlbmRlcmVkIHRoZSB3cm9uZ1xuICAgIC8vIHBhbmVsLCBzbyB0aGUgZWxlbWVudCB0aGUgY2FsbGJhY2sgYmVsb3cgbG9va3MgZm9yIG5ldmVyIGV4aXN0ZWQuXG4gICAgaWYgKGxvY2F0aW9uLnN1YlRhYklkKSB0aGlzLmR5bmFtaWNGb3JtQ29tcD8uc2V0QWN0aXZlU3ViVGFiKGxvY2F0aW9uLnN1YlRhYklkKTtcblxuICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gVGhlIGZpZWxkIGlkIGNvbWVzIGZyb20gY29uZmlnLCBzbyBpdCBuZXZlciBnb2VzIGludG8gYSBzZWxlY3RvciBzdHJpbmc6IG5vXG4gICAgICAgIC8vIGVzY2FwaW5nIHRvIGdldCB3cm9uZywgYW5kIG5vIG5lZWQgZm9yIGBDU1MuZXNjYXBlYCwgd2hpY2gganNkb20gYW5kIG9sZGVyXG4gICAgICAgIC8vIGJyb3dzZXJzIGRvIG5vdCBwcm92aWRlIGFuZCB3aG9zZSBhYnNlbmNlIHRocm93cyBzaWxlbnRseSBpbnNpZGUgYSByZW5kZXIgaG9vay5cbiAgICAgICAgY29uc3Qgd2FudGVkID0gYGZpZWxkLWNvbnRhaW5lci0ke2ZpZWxkSWR9YDtcbiAgICAgICAgY29uc3QgZWwgPSBBcnJheS5mcm9tKFxuICAgICAgICAgIHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdbaWRePVwiZmllbGQtY29udGFpbmVyLVwiXScpLFxuICAgICAgICApLmZpbmQoc2xvdCA9PiBzbG90LmlkID09PSB3YW50ZWQpO1xuICAgICAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgICAgIC8vIFRoZSBzbG90IGNhcnJpZXMgdGFiaW5kZXg9XCItMVwiIHNvIHRoaXMgYWN0dWFsbHkgbW92ZXMgZm9jdXMuIFdpdGhvdXQgaXQgdGhlIGp1bXBcbiAgICAgICAgLy8gc2Nyb2xsZWQgdGhlIGZpZWxkIGludG8gdmlldyBhbmQgbGVmdCBmb2N1cyBiZWhpbmQgb24gdGhlIGxpbmsuXG4gICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICB9LFxuICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvclwiPlxuICA8IS0tIFJlY29yZCBIZWFkZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9faGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX190aXRsZS1ncm91cFwiPlxuICAgICAgQGlmIChwcm9maWxlSW1hZ2VVcmwpIHtcbiAgICAgICAgPGltZ1xuICAgICAgICAgIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2F2YXRhclwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJoZWFkZXItcHJvZmlsZS1pbWFnZVwiXG4gICAgICAgICAgW3NyY109XCJwcm9maWxlSW1hZ2VVcmxcIlxuICAgICAgICAgIFthbHRdPVwicmVjb3JkVGl0bGVcIlxuICAgICAgICAvPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fYXZhdGFyXCIgZGF0YS10ZXN0aWQ9XCJoZWFkZXItYXZhdGFyLWluaXRpYWxcIj5cbiAgICAgICAgICB7eyBhdmF0YXJMZXR0ZXIgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8ZGl2PlxuICAgICAgICA8aDIgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fdGl0bGVcIiBkYXRhLXRlc3RpZD1cInJlY29yZC10aXRsZVwiPlxuICAgICAgICAgIHt7IHJlY29yZFRpdGxlIH19XG4gICAgICAgIDwvaDI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1YnRpdGxlXCI+RW50aXR5OiB7eyBjb25maWcuZW50aXR5IH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJlY29yZC1sZXZlbCBzdGF0dXMgc3dpdGNoLCBvdXRzaWRlIHNlY3Rpb24gZWRpdGluZyAtLT5cbiAgICBAaWYgKGhlYWRlclRvZ2dsZUZpZWxkOyBhcyB0b2dnbGVGaWVsZCkge1xuICAgICAgPGxhYmVsIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2hlYWRlci10b2dnbGVcIj5cbiAgICAgICAgPHNwYW4+e3sgZm9ybWF0RmllbGRMYWJlbCh0b2dnbGVGaWVsZCkgfX08L3NwYW4+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgcm9sZT1cInN3aXRjaFwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJoZWFkZXItdG9nZ2xlXCJcbiAgICAgICAgICBbY2hlY2tlZF09XCJoZWFkZXJUb2dnbGVWYWx1ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInJlY29yZFJlYWRPbmx5XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaGVhZGVyVG9nZ2xlVmFsdWVcIlxuICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlSGVhZGVyU3RhdHVzKClcIlxuICAgICAgICAvPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19oZWFkZXItdG9nZ2xlLXRleHRcIj57eyBoZWFkZXJUb2dnbGVWYWx1ZSA/ICdZZXMnIDogJ05vJyB9fTwvc3Bhbj5cbiAgICAgIDwvbGFiZWw+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8IS0tIERpc21pc3NpYmxlIGluZm8gYmFubmVycyAocnVsZXMgYGluZm9gIGFjdGlvbikgLS0+XG4gIEBmb3IgKGJhbm5lciBvZiBpbmZvQmFubmVyczsgdHJhY2sgYmFubmVyLmZpZWxkSWQpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXIgbmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci0taW5mb1wiXG4gICAgICByb2xlPVwic3RhdHVzXCJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidpbmZvLWJhbm5lci0nICsgYmFubmVyLmZpZWxkSWRcIlxuICAgID5cbiAgICAgIDxzcGFuPuKEue+4jyB7eyBiYW5uZXIubWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci1kaXNtaXNzXCJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2Rpc21pc3MtJyArIGJhbm5lci5maWVsZElkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGlzbWlzczogJyArIGJhbm5lci5tZXNzYWdlXCJcbiAgICAgICAgKGNsaWNrKT1cImRpc21pc3NJbmZvQmFubmVyKGJhbm5lci5maWVsZElkKVwiXG4gICAgICA+4pyVPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cblxuICA8IS0tIE1vZGlmaWNhdGlvbiBiYXNlbGluZSBiYW5uZXIgLS0+XG4gIEBpZiAoaXNNb2RpZmllZCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19iYW5uZXIgbmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lci0td2FybmluZ1wiPlxuICAgICAg8J+UkiBSZWNvcmQgbW9kaWZpZWQgZnJvbSBzZXNzaW9uIGJhc2VsaW5lIOKAlCB1bnNhdmVkIGNoYW5nZXMgcGVuZGluZy5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gU3VtbWFyeSBQYW5lbCAoc2hvd09uTWluaW1pemUgZmllbGRzIHdpdGggaW50ZXJhY3RpdmUganVtcCkgLS0+XG4gIEBpZiAoc3VtbWFyeUZpZWxkcygpLmxlbmd0aCA+IDApIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktcGFuZWxcIiBkYXRhLXRlc3RpZD1cInN1bW1hcnktcGFuZWxcIj5cbiAgICAgIEBmb3IgKHNmIG9mIHN1bW1hcnlGaWVsZHMoKTsgdHJhY2sgc2YuaWQpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktaXRlbVwiXG4gICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3N1bW1hcnktJyArIHNmLmlkXCJcbiAgICAgICAgICAoY2xpY2spPVwianVtcFRvRmllbGQoc2YuaWQpXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ0NsaWNrIHRvIGp1bXAgdG8gJyArIGZvcm1hdEZpZWxkTGFiZWwoc2YpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktbGFiZWxcIj57eyBmb3JtYXRGaWVsZExhYmVsKHNmKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zdW1tYXJ5LXZhbFwiPnt7IGZvcm1hdEZpZWxkVmFsdWUoc2YpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gU2VjdGlvbiBlZGl0IGJhcjogb25lIHRhYiBpcyBlZGl0ZWQgYXQgYSB0aW1lLCBhbmQgdmFsaWRhdGVkIG9uIGl0cyBvd24gLS0+XG4gIEBpZiAodmlld01vZGUgJiYgIXJlY29yZFJlYWRPbmx5KSB7XG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWJhclwiPlxuICAgICAgQGlmIChpc0VkaXRpbmdBY3RpdmVUYWIpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fc2VjdGlvbi1oaW50XCI+RWRpdGluZyB0aGlzIHNlY3Rpb248L3NwYW4+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3Jlc2V0XCIgZGF0YS10ZXN0aWQ9XCJjYW5jZWwtc2VjdGlvblwiIChjbGljayk9XCJjYW5jZWxTZWN0aW9uKClcIj5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZvcm1fX3N1Ym1pdFwiIGRhdGEtdGVzdGlkPVwic2F2ZS1zZWN0aW9uXCIgKGNsaWNrKT1cInNhdmVTZWN0aW9uKClcIj5cbiAgICAgICAgICBTYXZlIHNlY3Rpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZm9ybV9fcmVzZXRcIiBkYXRhLXRlc3RpZD1cImVkaXQtc2VjdGlvblwiIChjbGljayk9XCJlZGl0U2VjdGlvbigpXCI+XG4gICAgICAgICAgRWRpdCBzZWN0aW9uXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgQGlmIChPYmplY3Qua2V5cyhzZWN0aW9uRXJyb3JzKCkpLmxlbmd0aCA+IDApIHtcbiAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX2Jhbm5lciBuZ3gtcmVjb3JkLWVkaXRvcl9fYmFubmVyLS1lcnJvclwiIHJvbGU9XCJhbGVydFwiIGRhdGEtdGVzdGlkPVwic2VjdGlvbi1lcnJvcnNcIj5cbiAgICAgIEBmb3IgKGtleSBvZiBPYmplY3Qua2V5cyhzZWN0aW9uRXJyb3JzKCkpOyB0cmFjayBrZXkpIHtcbiAgICAgICAgPGRpdj7imqDvuI8ge3sgc2VjdGlvbkVycm9ycygpW2tleV0gfX08L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gQXJyYXkgcm93czogbGlzdGVkIGhlcmUsIGVkaXRlZCBpbiB0aGUgZHJhd2VyIGJlbG93IC0tPlxuICBAZm9yIChhcnJheUZpZWxkIG9mIGFycmF5RmllbGRzRm9yQWN0aXZlVGFiOyB0cmFjayBhcnJheUZpZWxkLmlkKSB7XG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3dzXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3Jvd3MtJyArIGFycmF5RmllbGQuaWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtcmVjb3JkLWVkaXRvcl9fcm93cy1oZWFkXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3N1bW1hcnktbGFiZWxcIj57eyBmb3JtYXRGaWVsZExhYmVsKGFycmF5RmllbGQpIH19PC9zcGFuPlxuICAgICAgICBAaWYgKCFzZWN0aW9uUmVhZE9ubHkpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibmd4LWZvcm1fX3Jlc2V0XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidhZGQtcm93LScgKyBhcnJheUZpZWxkLmlkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuQWRkUm93KGFycmF5RmllbGQpXCJcbiAgICAgICAgICA+KyBSb3c8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBmb3IgKHJvdyBvZiByb3dzT2YoYXJyYXlGaWVsZCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvd1wiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidyb3ctJyArIGFycmF5RmllbGQuaWQgKyAnLScgKyAkaW5kZXhcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19yb3ctdGV4dFwiPnt7IHJvd1N1bW1hcnkoYXJyYXlGaWVsZCwgcm93KSB9fTwvc3Bhbj5cbiAgICAgICAgICBAaWYgKCFzZWN0aW9uUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvdy1idG5cIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZWRpdC1yb3ctJyArIGFycmF5RmllbGQuaWQgKyAnLScgKyAkaW5kZXhcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkVkaXRSb3coYXJyYXlGaWVsZCwgJGluZGV4KVwiPkVkaXQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvdy1idG5cIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZGVsZXRlLXJvdy0nICsgYXJyYXlGaWVsZC5pZCArICctJyArICRpbmRleFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coYXJyYXlGaWVsZCwgJGluZGV4KVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbXB0eSB7XG4gICAgICAgIDxwIGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvdy1lbXB0eVwiPk5vIHJvd3MgeWV0LjwvcD5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS1cbiAgICBSb3cgZHJhd2VyLiBEZWxpYmVyYXRlbHkgb3V0c2lkZSB0aGUgdGFiIHBhbmVsOiBidWlsZGluZyBhIHJvdydzIEZvcm1Hcm91cCBpbnNpZGUgdGhlXG4gICAgdGFiIHZpZXcgcmFjZXMgdGhlIHRhYidzIG93biBpbml0aWFsaXNhdGlvbiAodGhlIHJlZmVyZW5jZSBoaXQgdGhpcyB3aXRoIEZvcm1BcnJheSkuXG4gIC0tPlxuICBAaWYgKGlubGluZVJvd0ZpZWxkKCk7IGFzIHJvd0ZpZWxkKSB7XG4gICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19kcmF3ZXJcIiBkYXRhLXRlc3RpZD1cInJvdy1kcmF3ZXJcIiBbZm9ybUdyb3VwXT1cImlubGluZVJvd0Zvcm0hXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LXJlY29yZC1lZGl0b3JfX3Jvd3MtaGVhZFwiPlxuICAgICAgICA8c3Ryb25nPnt7IGlubGluZVJvd0luZGV4KCkgPT09IG51bGwgPyAnQWRkJyA6ICdFZGl0JyB9fSB7eyBmb3JtYXRGaWVsZExhYmVsKHJvd0ZpZWxkKSB9fSByb3c8L3N0cm9uZz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibmd4LWZvcm1fX3BhbmVsXCI+XG4gICAgICAgIEBmb3IgKGNoaWxkIG9mIHJvd0ZpZWxkLmNoaWxkcmVuID8/IFtdOyB0cmFjayBjaGlsZC5pZCkge1xuICAgICAgICAgIDxuZ3gtZHluYW1pYy1maWVsZFxuICAgICAgICAgICAgW2ZpZWxkXT1cImNoaWxkXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cImlubGluZVJvd0Zvcm0hLmdldChjaGlsZC5pZCkhXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgICAgIFtsYW5ndWFnZV09XCJsYW5ndWFnZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3VzZXJSb2xlc109XCJ1c2VyUm9sZXNcIlxuICAgICAgICAgICAgW3N0eWxlLmdyaWRDb2x1bW5dPVwiJ3NwYW4gMTInXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm5neC1yZWNvcmQtZWRpdG9yX19zZWN0aW9uLWJhclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1mb3JtX19yZXNldFwiIGRhdGEtdGVzdGlkPVwiY2FuY2VsLXJvd1wiIChjbGljayk9XCJjYW5jZWxSb3coKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1mb3JtX19zdWJtaXRcIiBkYXRhLXRlc3RpZD1cInNhdmUtcm93XCIgKGNsaWNrKT1cInNhdmVSb3coKVwiPlNhdmUgcm93PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gTWFpbiBEeW5hbWljIEZvcm0gLS0+XG4gIDxuZ3gtZHluYW1pYy1mb3JtXG4gICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgIFtydWxlc109XCJydWxlc1wiXG4gICAgW2luaXRpYWxEYXRhXT1cImluaXRpYWxEYXRhXCJcbiAgICBbb3JpZ2luYWxEYXRhXT1cIm9yaWdpbmFsQmFzZWxpbmUoKVwiXG4gICAgW3VzZXJSb2xlc109XCJ1c2VyUm9sZXNcIlxuICAgIFtsYW5ndWFnZV09XCJsYW5ndWFnZVwiXG4gICAgW3JlYWRvbmx5XT1cInNlY3Rpb25SZWFkT25seVwiXG4gICAgW3JlYWRPbmx5RmllbGRzXT1cInJlYWRPbmx5RmllbGRzXCJcbiAgICBbc2hvd0luZm9CYW5uZXJzXT1cImZhbHNlXCJcbiAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICBbZXJyb3JdPVwiZXJyb3JcIlxuICAgIChmb3JtQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgkZXZlbnQpXCJcbiAgICAoZm9ybVN1Ym1pdCk9XCJvbkZvcm1TdWJtaXQoJGV2ZW50KVwiXG4gICAgKGZvcm1SZXNldCk9XCJvbkZvcm1SZXNldCgpXCJcbiAgICAoYWN0aXZlVGFiQ2hhbmdlKT1cIm9uQWN0aXZlVGFiQ2hhbmdlKCRldmVudClcIlxuICAvPlxuPC9kaXY+XG4iXX0=
@@ -9,6 +9,8 @@ import { PasswordFieldComponent } from '../field-types/password-field.component'
9
9
  import { CheckboxFieldComponent } from '../field-types/checkbox-field.component';
10
10
  import { BooleanFieldComponent } from '../field-types/boolean-field.component';
11
11
  import { DateFieldComponent } from '../field-types/date-field.component';
12
+ import { DateTimeFieldComponent } from '../field-types/date-time-field.component';
13
+ import { TimeFieldComponent } from '../field-types/time-field.component';
12
14
  import { MonthYearFieldComponent } from '../field-types/month-year-field.component';
13
15
  import { DropdownFieldComponent } from '../field-types/dropdown-field.component';
14
16
  import { RadioFieldComponent } from '../field-types/radio-field.component';
@@ -47,7 +49,8 @@ export function builtInFieldTypes() {
47
49
  checkbox: CheckboxFieldComponent,
48
50
  boolean: BooleanFieldComponent,
49
51
  date: DateFieldComponent,
50
- datetime: DateFieldComponent,
52
+ datetime: DateTimeFieldComponent,
53
+ time: TimeFieldComponent,
51
54
  monthYear: MonthYearFieldComponent,
52
55
  dropdown: DropdownFieldComponent,
53
56
  radio: RadioFieldComponent,
@@ -69,4 +72,4 @@ export function provideFieldTypes(types) {
69
72
  export function provideBuiltInFieldTypes() {
70
73
  return provideFieldTypes(builtInFieldTypes());
71
74
  }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1maWVsZC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGUtZmllbGQtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4Qix3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixPQUFPO1FBQ0wsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixRQUFRLEVBQUUsc0JBQXNCO1FBQ2hDLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxPQUFPLEVBQUUscUJBQXFCO1FBQzlCLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixTQUFTLEVBQUUsdUJBQXVCO1FBQ2xDLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixXQUFXLEVBQUUseUJBQXlCO1FBQ3RDLFlBQVksRUFBRSx1QkFBdUI7UUFDckMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsSUFBSSxFQUFFLGtCQUFrQjtLQUN6QixDQUFDO0FBQ0osQ0FBQztBQUVELHdGQUF3RjtBQUN4RixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBZ0M7SUFDaEUsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQzNELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIFR5cGUsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRklFTERfVFlQRV9TRVRTIH0gZnJvbSAnLi4vdG9rZW5zL2luamVjdGlvbi10b2tlbnMnO1xuXG5pbXBvcnQgeyBUZXh0RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy90ZXh0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0YXJlYUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvdGV4dGFyZWEtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvbnVtYmVyLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXJyZW5jeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvY3VycmVuY3ktZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVtYWlsRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9lbWFpbC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFzc3dvcmRGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL3Bhc3N3b3JkLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGVja2JveEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvY2hlY2tib3gtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEJvb2xlYW5GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2Jvb2xlYW4tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2RhdGUtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE1vbnRoWWVhckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvbW9udGgteWVhci1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcGRvd25GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2Ryb3Bkb3duLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSYWRpb0ZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvcmFkaW8tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpU2VsZWN0RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9tdWx0aS1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVudGl0eVJlZkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZW50aXR5LXJlZi1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR3JvdXBGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2dyb3VwLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcnJheUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvYXJyYXktZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEltYWdlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9pbWFnZS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmlsZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZmlsZS1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIEZpZWxkLXR5cGUgcmVnaXN0cmF0aW9uIOKAlCB0aGUgdHJlZS1zaGFraW5nIHNlYW0uXG4gKlxuICogYEZpZWxkUmVnaXN0cnlTZXJ2aWNlYCBpbXBvcnRzIG5vIGNvbXBvbmVudHMuIFdoYXRldmVyIHlvdSByZWdpc3RlciBoZXJlIGlzIHdoYXQgZ2V0c1xuICogYnVuZGxlZCwgc28gYW4gYXBwIHRoYXQgb25seSB1c2VzIHRleHQvbnVtYmVyL2Ryb3Bkb3duIHBheXMgZm9yIHRocmVlIGNvbXBvbmVudHMgYW5kXG4gKiB0aGVpciBpbXBvcnRzLCBub3QgbmluZXRlZW4uXG4gKlxuICogYGBgdHNcbiAqIC8vIEV2ZXJ5dGhpbmcgKGNvbnZlbmllbnQ7IGJ1bmRsZXMgYWxsIGJ1aWx0LWlucyk6XG4gKiBwcm92aWRlTmd4RHluYW1pY0VudGl0eSgpLCBwcm92aWRlQnVpbHRJbkZpZWxkVHlwZXMoKVxuICpcbiAqIC8vIE9ubHkgd2hhdCB0aGlzIGFwcCByZW5kZXJzOlxuICogcHJvdmlkZUZpZWxkVHlwZXMoeyB0ZXh0OiBUZXh0RmllbGRDb21wb25lbnQsIG51bWJlcjogTnVtYmVyRmllbGRDb21wb25lbnQgfSlcbiAqIGBgYFxuICpcbiAqIEJvdGggbWVyZ2UgaW50byBgRklFTERfVFlQRV9SRUdJU1RSWWA7IGxhdGVyIHJlZ2lzdHJhdGlvbnMgd2luIG9uIGtleSBjb2xsaXNpb24uXG4gKi9cblxuLyoqIE1hcCBvZiBldmVyeSBidWlsdC1pbiBmaWVsZCB0eXBlIGtleSDihpIgY29tcG9uZW50LiBSZWZlcmVuY2luZyB0aGlzIHB1bGxzIGluIGFsbCBvZiB0aGVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWx0SW5GaWVsZFR5cGVzKCk6IFJlY29yZDxzdHJpbmcsIFR5cGU8YW55Pj4ge1xuICByZXR1cm4ge1xuICAgIHRleHQ6IFRleHRGaWVsZENvbXBvbmVudCxcbiAgICB0ZXh0YXJlYTogVGV4dGFyZWFGaWVsZENvbXBvbmVudCxcbiAgICBudW1iZXI6IE51bWJlckZpZWxkQ29tcG9uZW50LFxuICAgIGN1cnJlbmN5OiBDdXJyZW5jeUZpZWxkQ29tcG9uZW50LFxuICAgIGVtYWlsOiBFbWFpbEZpZWxkQ29tcG9uZW50LFxuICAgIHBhc3N3b3JkOiBQYXNzd29yZEZpZWxkQ29tcG9uZW50LFxuICAgIGNoZWNrYm94OiBDaGVja2JveEZpZWxkQ29tcG9uZW50LFxuICAgIGJvb2xlYW46IEJvb2xlYW5GaWVsZENvbXBvbmVudCxcbiAgICBkYXRlOiBEYXRlRmllbGRDb21wb25lbnQsXG4gICAgZGF0ZXRpbWU6IERhdGVGaWVsZENvbXBvbmVudCxcbiAgICBtb250aFllYXI6IE1vbnRoWWVhckZpZWxkQ29tcG9uZW50LFxuICAgIGRyb3Bkb3duOiBEcm9wZG93bkZpZWxkQ29tcG9uZW50LFxuICAgIHJhZGlvOiBSYWRpb0ZpZWxkQ29tcG9uZW50LFxuICAgIG11bHRpU2VsZWN0OiBNdWx0aVNlbGVjdEZpZWxkQ29tcG9uZW50LFxuICAgICdlbnRpdHktcmVmJzogRW50aXR5UmVmRmllbGRDb21wb25lbnQsXG4gICAgZ3JvdXA6IEdyb3VwRmllbGRDb21wb25lbnQsXG4gICAgYXJyYXk6IEFycmF5RmllbGRDb21wb25lbnQsXG4gICAgaW1hZ2U6IEltYWdlRmllbGRDb21wb25lbnQsXG4gICAgZmlsZTogRmlsZUZpZWxkQ29tcG9uZW50LFxuICB9O1xufVxuXG4vKiogUmVnaXN0ZXIgYSBzcGVjaWZpYyBzZXQgb2YgZmllbGQgdHlwZXMuIE9ubHkgdGhlIGNvbXBvbmVudHMgeW91IG5hbWUgYXJlIGJ1bmRsZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUZpZWxkVHlwZXModHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGU8YW55Pj4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHsgcHJvdmlkZTogRklFTERfVFlQRV9TRVRTLCB1c2VWYWx1ZTogdHlwZXMsIG11bHRpOiB0cnVlIH0sXG4gIF0pO1xufVxuXG4vKiogUmVnaXN0ZXIgYWxsIDE5IGJ1aWx0LWluIGZpZWxkIHR5cGUga2V5cy4gQ29udmVuaWVuY2UgZm9yIGFwcHMgdGhhdCB1c2UgbW9zdCBvZiB0aGVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVCdWlsdEluRmllbGRUeXBlcygpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBwcm92aWRlRmllbGRUeXBlcyhidWlsdEluRmllbGRUeXBlcygpKTtcbn1cbiJdfQ==
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1maWVsZC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGUtZmllbGQtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4Qix3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixPQUFPO1FBQ0wsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixRQUFRLEVBQUUsc0JBQXNCO1FBQ2hDLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxPQUFPLEVBQUUscUJBQXFCO1FBQzlCLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFNBQVMsRUFBRSx1QkFBdUI7UUFDbEMsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLFdBQVcsRUFBRSx5QkFBeUI7UUFDdEMsWUFBWSxFQUFFLHVCQUF1QjtRQUNyQyxLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixJQUFJLEVBQUUsa0JBQWtCO0tBQ3pCLENBQUM7QUFDSixDQUFDO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFnQztJQUNoRSxPQUFPLHdCQUF3QixDQUFDO1FBQzlCLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7S0FDM0QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDRGQUE0RjtBQUM1RixNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8saUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgVHlwZSwgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGSUVMRF9UWVBFX1NFVFMgfSBmcm9tICcuLi90b2tlbnMvaW5qZWN0aW9uLXRva2Vucyc7XG5cbmltcG9ydCB7IFRleHRGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL3RleHQtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRhcmVhRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy90ZXh0YXJlYS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnVtYmVyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9udW1iZXItZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEN1cnJlbmN5RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9jdXJyZW5jeS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1haWxGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2VtYWlsLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXNzd29yZEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvcGFzc3dvcmQtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrYm94RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9jaGVja2JveC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQm9vbGVhbkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvYm9vbGVhbi1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZGF0ZS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVRpbWVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2RhdGUtdGltZS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGltZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvdGltZS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTW9udGhZZWFyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9tb250aC15ZWFyLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93bkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZHJvcGRvd24tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IFJhZGlvRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9yYWRpby1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL211bHRpLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW50aXR5UmVmRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9lbnRpdHktcmVmLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcm91cEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZ3JvdXAtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEFycmF5RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9hcnJheS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW1hZ2VGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2ltYWdlLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWxlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9maWxlLWZpZWxkLmNvbXBvbmVudCc7XG5cbi8qKlxuICogRmllbGQtdHlwZSByZWdpc3RyYXRpb24g4oCUIHRoZSB0cmVlLXNoYWtpbmcgc2VhbS5cbiAqXG4gKiBgRmllbGRSZWdpc3RyeVNlcnZpY2VgIGltcG9ydHMgbm8gY29tcG9uZW50cy4gV2hhdGV2ZXIgeW91IHJlZ2lzdGVyIGhlcmUgaXMgd2hhdCBnZXRzXG4gKiBidW5kbGVkLCBzbyBhbiBhcHAgdGhhdCBvbmx5IHVzZXMgdGV4dC9udW1iZXIvZHJvcGRvd24gcGF5cyBmb3IgdGhyZWUgY29tcG9uZW50cyBhbmRcbiAqIHRoZWlyIGltcG9ydHMsIG5vdCBuaW5ldGVlbi5cbiAqXG4gKiBgYGB0c1xuICogLy8gRXZlcnl0aGluZyAoY29udmVuaWVudDsgYnVuZGxlcyBhbGwgYnVpbHQtaW5zKTpcbiAqIHByb3ZpZGVOZ3hEeW5hbWljRW50aXR5KCksIHByb3ZpZGVCdWlsdEluRmllbGRUeXBlcygpXG4gKlxuICogLy8gT25seSB3aGF0IHRoaXMgYXBwIHJlbmRlcnM6XG4gKiBwcm92aWRlRmllbGRUeXBlcyh7IHRleHQ6IFRleHRGaWVsZENvbXBvbmVudCwgbnVtYmVyOiBOdW1iZXJGaWVsZENvbXBvbmVudCB9KVxuICogYGBgXG4gKlxuICogQm90aCBtZXJnZSBpbnRvIGBGSUVMRF9UWVBFX1JFR0lTVFJZYDsgbGF0ZXIgcmVnaXN0cmF0aW9ucyB3aW4gb24ga2V5IGNvbGxpc2lvbi5cbiAqL1xuXG4vKiogTWFwIG9mIGV2ZXJ5IGJ1aWx0LWluIGZpZWxkIHR5cGUga2V5IOKGkiBjb21wb25lbnQuIFJlZmVyZW5jaW5nIHRoaXMgcHVsbHMgaW4gYWxsIG9mIHRoZW0uICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbHRJbkZpZWxkVHlwZXMoKTogUmVjb3JkPHN0cmluZywgVHlwZTxhbnk+PiB7XG4gIHJldHVybiB7XG4gICAgdGV4dDogVGV4dEZpZWxkQ29tcG9uZW50LFxuICAgIHRleHRhcmVhOiBUZXh0YXJlYUZpZWxkQ29tcG9uZW50LFxuICAgIG51bWJlcjogTnVtYmVyRmllbGRDb21wb25lbnQsXG4gICAgY3VycmVuY3k6IEN1cnJlbmN5RmllbGRDb21wb25lbnQsXG4gICAgZW1haWw6IEVtYWlsRmllbGRDb21wb25lbnQsXG4gICAgcGFzc3dvcmQ6IFBhc3N3b3JkRmllbGRDb21wb25lbnQsXG4gICAgY2hlY2tib3g6IENoZWNrYm94RmllbGRDb21wb25lbnQsXG4gICAgYm9vbGVhbjogQm9vbGVhbkZpZWxkQ29tcG9uZW50LFxuICAgIGRhdGU6IERhdGVGaWVsZENvbXBvbmVudCxcbiAgICBkYXRldGltZTogRGF0ZVRpbWVGaWVsZENvbXBvbmVudCxcbiAgICB0aW1lOiBUaW1lRmllbGRDb21wb25lbnQsXG4gICAgbW9udGhZZWFyOiBNb250aFllYXJGaWVsZENvbXBvbmVudCxcbiAgICBkcm9wZG93bjogRHJvcGRvd25GaWVsZENvbXBvbmVudCxcbiAgICByYWRpbzogUmFkaW9GaWVsZENvbXBvbmVudCxcbiAgICBtdWx0aVNlbGVjdDogTXVsdGlTZWxlY3RGaWVsZENvbXBvbmVudCxcbiAgICAnZW50aXR5LXJlZic6IEVudGl0eVJlZkZpZWxkQ29tcG9uZW50LFxuICAgIGdyb3VwOiBHcm91cEZpZWxkQ29tcG9uZW50LFxuICAgIGFycmF5OiBBcnJheUZpZWxkQ29tcG9uZW50LFxuICAgIGltYWdlOiBJbWFnZUZpZWxkQ29tcG9uZW50LFxuICAgIGZpbGU6IEZpbGVGaWVsZENvbXBvbmVudCxcbiAgfTtcbn1cblxuLyoqIFJlZ2lzdGVyIGEgc3BlY2lmaWMgc2V0IG9mIGZpZWxkIHR5cGVzLiBPbmx5IHRoZSBjb21wb25lbnRzIHlvdSBuYW1lIGFyZSBidW5kbGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVGaWVsZFR5cGVzKHR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlPGFueT4+KTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7IHByb3ZpZGU6IEZJRUxEX1RZUEVfU0VUUywgdXNlVmFsdWU6IHR5cGVzLCBtdWx0aTogdHJ1ZSB9LFxuICBdKTtcbn1cblxuLyoqIFJlZ2lzdGVyIGFsbCAxOSBidWlsdC1pbiBmaWVsZCB0eXBlIGtleXMuIENvbnZlbmllbmNlIGZvciBhcHBzIHRoYXQgdXNlIG1vc3Qgb2YgdGhlbS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlQnVpbHRJbkZpZWxkVHlwZXMoKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gcHJvdmlkZUZpZWxkVHlwZXMoYnVpbHRJbkZpZWxkVHlwZXMoKSk7XG59XG4iXX0=