tango-app-ui-store-builder 1.0.99 → 1.2.1
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.
- package/esm2022/lib/components/create-layout/create-layout.component.mjs +1 -1
- package/esm2022/lib/components/create-store/create-store.component.mjs +1 -1
- package/esm2022/lib/components/custom-select/custom-select.component.mjs +6 -3
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +1 -1
- package/esm2022/lib/components/layout-summary/layout-summary.component.mjs +1 -1
- package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +10 -2
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +38 -7
- package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.mjs +11 -1
- package/esm2022/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.mjs +1 -1
- package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.mjs +628 -0
- package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +24 -12
- package/esm2022/lib/components/multiselect-chip-dropdown/multiselect-chip-dropdown.component.mjs +34 -8
- package/esm2022/lib/components/onboard-store-plano/create-planogram/create-planogram.component.mjs +19 -7
- package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +2 -2
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +10 -2
- package/esm2022/lib/tango-store-builder.module.mjs +8 -1
- package/fesm2022/tango-app-ui-store-builder.mjs +770 -41
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/custom-select/custom-select.component.d.ts +2 -1
- package/lib/components/manage-plano/onboard-table/onboard-table.component.d.ts +1 -1
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -4
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +1 -0
- package/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.d.ts +1 -1
- package/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.d.ts +89 -0
- package/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.d.ts +4 -1
- package/lib/components/multiselect-chip-dropdown/multiselect-chip-dropdown.component.d.ts +9 -2
- package/lib/components/onboard-store-plano/create-planogram/create-planogram.component.d.ts +1 -0
- package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +1 -1
- package/lib/services/store-builder.service.d.ts +5 -3
- package/lib/tango-store-builder.module.d.ts +68 -66
- package/package.json +1 -1
package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs
CHANGED
|
@@ -663,7 +663,7 @@ export class InstanceProductsComponent {
|
|
|
663
663
|
this.submitEvent.emit(data);
|
|
664
664
|
}
|
|
665
665
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InstanceProductsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.PlanoDataService }, { token: i3.ToastService }, { token: i4.GlobalStateService }, { token: i5.StoreBuilderService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
666
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InstanceProductsComponent, isStandalone: true, selector: "lib-instance-products", inputs: { fixtureData: "fixtureData", editMode: "editMode", isSubmitted: "isSubmitted", isRollout: "isRollout", revertOnEdit: "revertOnEdit", zoneEditMode: "zoneEditMode" }, outputs: { submitEvent: "submitEvent" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-template-products\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!-- ====================================Left Column==================================== -->\r\n <div class=\"cols col\" style=\"max-width: 380px;\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" [class.disabled-click]=\"!isEditMode || zoneEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let library of ['brand', 'product']\">\r\n <button class=\"nav-link w-100\" [class.active]=\"selectedLibrary === library\"\r\n (click)=\"selectedLibrary = library\" [attr.aria-current]=\"selectedLibrary === library ? 'page' : null\">\r\n {{ library | titlecase }} Library\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"selectedLibrary === 'brand'\">\r\n <div *ngIf=\"selectedLevel !== 'spot'\">\r\n <h2>Add products by brand level</h2>\r\n <p>Place the product brand in the designated placement area.</p>\r\n </div>\r\n <!-- Fixture level within Brand Library -->\r\n <form [formGroup]=\"fixtureLevelForm\" *ngIf=\"selectedLevel === 'fixture'\">\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n [placeholder]=\"'Select brands'\" formControlName=\"productBrandName\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container\r\n *ngIf=\"fixtureLevelForm.get('productBrandName')?.touched && fixtureLevelForm.get('productBrandName')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"fixtureLevelForm.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\" [items]=\"categoriesList\"\r\n [placeholder]=\"'Select categories'\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </form>\r\n\r\n <!-- Section level within Brand Library -->\r\n <form [formGroup]=\"sectionLevelForm\" *ngIf=\"selectedLevel === 'section'\">\r\n <div formArrayName=\"section\" class=\"array-wrapper\">\r\n <div *ngFor=\"let section of sectionArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">SECTION {{ i + 1 }}</h6>\r\n <svg [class.disabled-click]=\"!isEditMode || zoneEditMode\" *ngIf=\"i !== 0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeSection(i)\" class=\"cursor-pointer\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zone\" class=\"form-label mb-1\">Section label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"label\" formControlName=\"zone\" />\r\n\r\n <ng-container *ngIf=\"section.get('zone')?.touched && section.get('zone')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('required')\"> Section name is\r\n required. </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('whitespace')\">\r\n Section name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('notUnique')\"> Duplicate section name.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"shelves\" class=\"form-label mb-1\">Pick the shelf(s) for section {{ i + 1 }}</label>\r\n <multiselect-chip-dropdown [items]=\"shelvesList\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n formControlName=\"shelves\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <ng-container *ngIf=\"section.get('shelves')?.touched && section.get('shelves')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('shelves')?.hasError('required')\"> Pick the shelf(s)\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"section.get('productBrandName')?.touched && section.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('section' + i) ?? []\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 d-flex justify-content-end mt-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <span [ngbTooltip]=\"\r\n isAllShelvesUsedInSections\r\n ? 'All shelves are assigned. No shelves available for new sections.'\r\n : 'You cannot create more sections than the total shelves available.'\r\n \" [disableTooltip]=\"\r\n sectionArray.length < (fixtureTemplateDetails?.shelfConfig?.length ?? 0) && !isAllShelvesUsedInSections\r\n \">\r\n <button [disabled]=\"\r\n sectionArray.length >= (fixtureTemplateDetails?.shelfConfig?.length ?? 0) || isAllShelvesUsedInSections\r\n \" class=\"btn btn-outline text-end\" (click)=\"addSection()\">\r\n Add section\r\n </button>\r\n </span>\r\n </div>\r\n </form>\r\n\r\n <!-- Shelf level within Brand Library -->\r\n <form [formGroup]=\"shelfLevelForm\" *ngIf=\"selectedLevel === 'shelf'\">\r\n <div formArrayName=\"shelf\" class=\"array-wrapper\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <h6 class=\"shelf-title\">SHELF {{ i + 1 }}</h6>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"shelf.get('productBrandName')?.touched && shelf.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('shelf' + i) ?? []\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!-- Spot level within Brand Library -->\r\n <!-- <form [formGroup]=\"spotLevelForm\" *ngIf=\"selectedLevel === 'spot'\">Spot level Form</form> -->\r\n <div *ngIf=\"selectedLevel === 'spot'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\" style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Coming soon for all levels -->\r\n <div *ngIf=\"selectedLibrary === 'product'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center mt-5\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Start adding product from brand library</p>\r\n </div>\r\n </div>\r\n\r\n <!-- =======================================Right Column =======================================-->\r\n <div class=\"cols col\">\r\n <h6>Product brand placements</h6>\r\n\r\n <ul class=\"nav nav-tabs custom-tabs d-flex mt-4\" [class.disabled-click]=\"!isEditMode || zoneEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let level of ['fixture', 'section', 'shelf', 'spot']\">\r\n <button class=\"nav-link w-100\" [class.active]=\"selectedLevel === level\" (click)=\"setTab(level)\"\r\n [attr.aria-current]=\"selectedLevel === level ? 'page' : null\">\r\n {{ level | titlecase }} level\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'fixture'\">\r\n <div id=\"fixture-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div id=\"brand-category\" class=\"brand-category\"\r\n *ngIf=\"fixtureLevelForm?.get('productBrandName')?.value?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'section'\">\r\n <div id=\"section-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" id=\"section-body-block\">\r\n <!---------------------------------------------------------------------->\r\n <!-- <div id=\"body-loader\">\r\n <div class=\"loader\"></div>\r\n </div> -->\r\n <!---------------------------------------------------------------------->\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n <!---------------------------------------------------------------------->\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'shelf'\">\r\n <div id=\"shelf-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n <!---------------------------------------------------------------------->\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\"\r\n *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\" *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\">\r\n <ng-container\r\n *ngFor=\"let b of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\" class=\"separator\"> -\r\n </span>\r\n <span class=\"category\" *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <ng-container\r\n *ngFor=\"let b of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container\r\n *ngFor=\"let c of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container\r\n *ngFor=\"let c of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n <!---------------------------------------------------------------------->\r\n\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'spot'\">\r\n <div class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\"\r\n style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Try Fixture, Section, and Shelf levels</p>\r\n </div>\r\n\r\n <!-- <div id=\"spot-level\" class=\"d-flex justify-content-center\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureWidth?.value }}{{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureLength?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf \">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block \">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-products-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}.custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}.custom-tabs .nav-link.active{background:var(--Primary-50, #eaf8ff)}.nav-item{text-align:center}.nav-item:last-child .nav-link{border:none}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px;border:1px solid white}#fixture-level .body-block{position:relative}#fixture-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(-50%,-50%);transition:all .3s ease;cursor:pointer}#fixture-level .brand,#fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-level .category{margin-top:12px}#section-level .body-block{position:relative}#section-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#section-level .brand,#section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#section-level .separator{margin:0 4px;font-weight:600}#section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#shelf-level .body-block{position:relative}#shelf-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#shelf-level .brand,#shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#shelf-level .separator{margin:0 4px;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }, { kind: "component", type: MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
|
|
666
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InstanceProductsComponent, isStandalone: true, selector: "lib-instance-products", inputs: { fixtureData: "fixtureData", editMode: "editMode", isSubmitted: "isSubmitted", isRollout: "isRollout", revertOnEdit: "revertOnEdit", zoneEditMode: "zoneEditMode" }, outputs: { submitEvent: "submitEvent" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-template-products\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!-- ====================================Left Column==================================== -->\r\n <div class=\"cols col\" style=\"max-width: 380px;\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" [class.disabled-click]=\"!isEditMode || zoneEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let library of ['brand', 'product']\">\r\n <button class=\"nav-link w-100\" [class.active]=\"selectedLibrary === library\"\r\n (click)=\"selectedLibrary = library\" [attr.aria-current]=\"selectedLibrary === library ? 'page' : null\">\r\n {{ library | titlecase }} Library\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"selectedLibrary === 'brand'\">\r\n <div *ngIf=\"selectedLevel !== 'spot'\">\r\n <h2>Add products by brand level</h2>\r\n <p>Place the product brand in the designated placement area.</p>\r\n </div>\r\n <!-- Fixture level within Brand Library -->\r\n <form [formGroup]=\"fixtureLevelForm\" *ngIf=\"selectedLevel === 'fixture'\">\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n [placeholder]=\"'Select brands'\" formControlName=\"productBrandName\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container\r\n *ngIf=\"fixtureLevelForm.get('productBrandName')?.touched && fixtureLevelForm.get('productBrandName')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"fixtureLevelForm.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\" [items]=\"categoriesList\"\r\n [placeholder]=\"'Select categories'\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </form>\r\n\r\n <!-- Section level within Brand Library -->\r\n <form [formGroup]=\"sectionLevelForm\" *ngIf=\"selectedLevel === 'section'\">\r\n <div formArrayName=\"section\" class=\"array-wrapper\">\r\n <div *ngFor=\"let section of sectionArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">SECTION {{ i + 1 }}</h6>\r\n <svg [class.disabled-click]=\"!isEditMode || zoneEditMode\" *ngIf=\"i !== 0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeSection(i)\" class=\"cursor-pointer\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zone\" class=\"form-label mb-1\">Section label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"label\" formControlName=\"zone\" />\r\n\r\n <ng-container *ngIf=\"section.get('zone')?.touched && section.get('zone')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('required')\"> Section name is\r\n required. </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('whitespace')\">\r\n Section name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('notUnique')\"> Duplicate section name.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"shelves\" class=\"form-label mb-1\">Pick the shelf(s) for section {{ i + 1 }}</label>\r\n <multiselect-chip-dropdown [items]=\"shelvesList\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n formControlName=\"shelves\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <ng-container *ngIf=\"section.get('shelves')?.touched && section.get('shelves')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('shelves')?.hasError('required')\"> Pick the shelf(s)\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"section.get('productBrandName')?.touched && section.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('section' + i) ?? []\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 d-flex justify-content-end mt-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <span [ngbTooltip]=\"\r\n isAllShelvesUsedInSections\r\n ? 'All shelves are assigned. No shelves available for new sections.'\r\n : 'You cannot create more sections than the total shelves available.'\r\n \" [disableTooltip]=\"\r\n sectionArray.length < (fixtureTemplateDetails?.shelfConfig?.length ?? 0) && !isAllShelvesUsedInSections\r\n \">\r\n <button [disabled]=\"\r\n sectionArray.length >= (fixtureTemplateDetails?.shelfConfig?.length ?? 0) || isAllShelvesUsedInSections\r\n \" class=\"btn btn-outline text-end\" (click)=\"addSection()\">\r\n Add section\r\n </button>\r\n </span>\r\n </div>\r\n </form>\r\n\r\n <!-- Shelf level within Brand Library -->\r\n <form [formGroup]=\"shelfLevelForm\" *ngIf=\"selectedLevel === 'shelf'\">\r\n <div formArrayName=\"shelf\" class=\"array-wrapper\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <h6 class=\"shelf-title\">SHELF {{ i + 1 }}</h6>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"shelf.get('productBrandName')?.touched && shelf.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('shelf' + i) ?? []\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!-- Spot level within Brand Library -->\r\n <!-- <form [formGroup]=\"spotLevelForm\" *ngIf=\"selectedLevel === 'spot'\">Spot level Form</form> -->\r\n <div *ngIf=\"selectedLevel === 'spot'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\" style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Coming soon for all levels -->\r\n <div *ngIf=\"selectedLibrary === 'product'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center mt-5\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Start adding product from brand library</p>\r\n </div>\r\n </div>\r\n\r\n <!-- =======================================Right Column =======================================-->\r\n <div class=\"cols col\">\r\n <h6>Product brand placements</h6>\r\n\r\n <ul class=\"nav nav-tabs custom-tabs d-flex mt-4\" [class.disabled-click]=\"!isEditMode || zoneEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let level of ['fixture', 'section', 'shelf', 'spot']\">\r\n <button class=\"nav-link w-100\" [class.active]=\"selectedLevel === level\" (click)=\"setTab(level)\"\r\n [attr.aria-current]=\"selectedLevel === level ? 'page' : null\">\r\n {{ level | titlecase }} level\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'fixture'\">\r\n <div id=\"fixture-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div id=\"brand-category\" class=\"brand-category\"\r\n *ngIf=\"fixtureLevelForm?.get('productBrandName')?.value?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'section'\">\r\n <div id=\"section-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" id=\"section-body-block\">\r\n <!---------------------------------------------------------------------->\r\n <!-- <div id=\"body-loader\">\r\n <div class=\"loader\"></div>\r\n </div> -->\r\n <!---------------------------------------------------------------------->\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n <!---------------------------------------------------------------------->\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'shelf'\">\r\n <div id=\"shelf-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n <!---------------------------------------------------------------------->\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\"\r\n *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\" *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\">\r\n <ng-container\r\n *ngFor=\"let b of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\" class=\"separator\"> -\r\n </span>\r\n <span class=\"category\" *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <ng-container\r\n *ngFor=\"let b of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container\r\n *ngFor=\"let c of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container\r\n *ngFor=\"let c of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n <!---------------------------------------------------------------------->\r\n\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'spot'\">\r\n <div class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\"\r\n style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Try Fixture, Section, and Shelf levels</p>\r\n </div>\r\n\r\n <!-- <div id=\"spot-level\" class=\"d-flex justify-content-center\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureWidth?.value }}{{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureLength?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf \">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block \">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-products-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}.custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}.custom-tabs .nav-link.active{background:var(--Primary-50, #eaf8ff)}.nav-item{text-align:center}.nav-item:last-child .nav-link{border:none}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px;border:1px solid white}#fixture-level .body-block{position:relative}#fixture-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(-50%,-50%);transition:all .3s ease;cursor:pointer}#fixture-level .brand,#fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-level .category{margin-top:12px}#section-level .body-block{position:relative}#section-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#section-level .brand,#section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#section-level .separator{margin:0 4px;font-weight:600}#section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#shelf-level .body-block{position:relative}#shelf-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#shelf-level .brand,#shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#shelf-level .separator{margin:0 4px;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }, { kind: "component", type: MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField", "maxSelection", "compact", "extraActionLabel", "extraActionActive"], outputs: ["extraActionClick"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
|
|
667
667
|
}
|
|
668
668
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InstanceProductsComponent, decorators: [{
|
|
669
669
|
type: Component,
|
|
@@ -689,4 +689,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
689
689
|
}], zoneEditMode: [{
|
|
690
690
|
type: Input
|
|
691
691
|
}] } });
|
|
692
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtcHJvZHVjdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbWFuYWdlLXN0b3JlLXBsYW5vL3RlbXBsYXRlLXByb2R1Y3RzL3RlbXBsYXRlLXByb2R1Y3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby90ZW1wbGF0ZS1wcm9kdWN0cy90ZW1wbGF0ZS1wcm9kdWN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFJTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBV3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0UsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDdkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7OztBQWM5RCxNQUFNLE9BQU8seUJBQXlCO0lBaUQxQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFuRFYsUUFBUSxDQUFTO0lBQ2pCLHNC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biAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBGb3JtQXJyYXksXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1zTW9kdWxlLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuaW1wb3J0IHtcclxuICBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzLFxyXG4gIFNlY3Rpb25Db25maWcsXHJcbiAgU2hlbGZDb25maWcsXHJcbn0gZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvZml4dHVyZS10ZW1wbGF0ZS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvcGxhbm8tZGF0YS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJyYW5kRGV0YWlscyB9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL3ZtLWxpYnJhcnkuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFNIRUxGX0NPTE9SUyB9IGZyb20gXCIuLi8uLi8uLi9kYXRhL2ZpeHR1cmUtdGVtcGxhdGUuZGF0YVwiO1xyXG5pbXBvcnQgeyBnZW5lcmFsVmFsaWRhdG9yLCByZ2JUb0hleCB9IGZyb20gXCIuLi8uLi8uLi9mdW5jdGlvbnMvcGxhbm8uZnVuY3Rpb25cIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTXVsdGlzZWxlY3RDaGlwRHJvcGRvd25Db21wb25lbnQgfSBmcm9tIFwiLi4vLi4vbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bi9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBOZ2JUb29sdGlwTW9kdWxlIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1pbnN0YW5jZS1wcm9kdWN0c1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGVtcGxhdGUtcHJvZHVjdHMuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL3RlbXBsYXRlLXByb2R1Y3RzLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNdWx0aXNlbGVjdENoaXBEcm9wZG93bkNvbXBvbmVudCxcclxuICAgIE5nYlRvb2x0aXBNb2R1bGUsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEluc3RhbmNlUHJvZHVjdHNDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25DaGFuZ2VzXHJcbntcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG4gIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM6IEZpeHR1cmVUZW1wbGF0ZURldGFpbHMgfCBudWxsO1xyXG4gIHNlbGVjdGVkTGV2ZWw6IFwiZml4dHVyZVwiIHwgXCJzZWN0aW9uXCIgfCBcInNoZWxmXCIgfCBcInNwb3RcIiB8IHN0cmluZyA9IFwiZml4dHVyZVwiO1xyXG5cclxuICBzZWxlY3RlZExpYnJhcnk6IFwicHJvZHVjdFwiIHwgXCJicmFuZFwiIHwgc3RyaW5nID0gXCJicmFuZFwiO1xyXG5cclxuICBpc1BhZ2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGJyYW5kc0xpc3Q6IEJyYW5kRGV0YWlsc1tdID0gW107XHJcbiAgY2F0ZWdvcmllc0xpc3Q6IERyb3Bkb3duSUZbXSA9IFtdO1xyXG4gIGNhdGVnb3JpZXNMaXN0TWFwOiBNYXA8c3RyaW5nLCBEcm9wZG93bklGW10+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBzaGVsdmVzTGlzdDogRHJvcGRvd25JRltdO1xyXG5cclxuICBmaXh0dXJlTGV2ZWxGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc2VjdGlvbkxldmVsRm9ybTogRm9ybUdyb3VwO1xyXG4gIHNoZWxmTGV2ZWxGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc3BvdExldmVsRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBzaGVsZkNvbG9ycyA9IFNIRUxGX0NPTE9SUztcclxuXHJcbiAgc2VjdGlvbkJ5Wm9uZXM6IHtcclxuICAgIHpvbmU6IHN0cmluZztcclxuICAgIHNlY3Rpb246IHtcclxuICAgICAgYnJhbmRzOiBzdHJpbmdbXTtcclxuICAgICAgY2F0ZWdvcmllczogc3RyaW5nW107XHJcbiAgICAgIHNoZWx2ZXM6IHN0cmluZ1tdO1xyXG4gICAgICBzaGVsZkRpdnM6IChIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQpW107XHJcbiAgICB9O1xyXG4gIH1bXSA9IFtdO1xyXG5cclxuICBpc1ZpZXdwb3J0TG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaXNWaWV3cG9ydEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIEBJbnB1dCgpIGZpeHR1cmVEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgZWRpdE1vZGU6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQE91dHB1dCgpIHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBJbnB1dCgpIGlzUm9sbG91dDogYm9vbGVhbjtcclxuICBASW5wdXQoKSByZXZlcnRPbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB6b25lRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgcHM6IFBsYW5vRGF0YVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiZml4dHVyZURhdGFcIl0pIHtcclxuICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZShhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucHMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGUpID0+ICh0aGlzLmJyYW5kc0xpc3QgPSBlKSk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5wcy5mZXRjaEJyYW5kc0xpc3QodGhpcy5jbGllbnRJZCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzID0gY2hhbmdlc1tcImZpeHR1cmVEYXRhXCJdLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICAgICAgICAgIGlmICghdGhpcy5pc1BhZ2VMb2FkaW5nKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgdGhpcy5zaGVsdmVzTGlzdCA9XHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lm1hcCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYCR7ZT8uc2hlbGZUeXBlPy50b1VwcGVyQ2FzZSgpfSAke2U/LnNoZWxmTnVtYmVyfWAsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogYCR7ZT8uc2hlbGZUeXBlfSAke2U/LnNoZWxmTnVtYmVyfWAsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSkgPz8gW107XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXRUYWJCeUxldmVsKCk7XHJcbiAgICAgICAgICB0aGlzLmluaXRGaXh0dXJlTGV2ZWxGb3JtKCk7XHJcbiAgICAgICAgICB0aGlzLmluaXRTZWN0aW9uTGV2ZWxGb3JtKCk7XHJcbiAgICAgICAgICB0aGlzLmluaXRTaGVsZkxldmVsRm9ybSgpO1xyXG4gICAgICAgICAgdGhpcy5pbml0U3BvdExldmVsRm9ybSgpO1xyXG4gICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbXCJlZGl0TW9kZVwiXSkge1xyXG4gICAgICB0aGlzLmlzRWRpdE1vZGUgPSBjaGFuZ2VzW1wiZWRpdE1vZGVcIl0uY3VycmVudFZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMuc2VjdGlvbkxldmVsRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB0aGlzLnNoZWxmTGV2ZWxGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMuc3BvdExldmVsRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzW1wiaXNTdWJtaXR0ZWRcIl0pIHtcclxuICAgICAgaWYgKGNoYW5nZXNbXCJpc1N1Ym1pdHRlZFwiXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzVmlld3BvcnRJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzVmlld3BvcnRJbml0aWFsaXplZCA9IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGFiQnlMZXZlbCgpIHtcclxuICAgIGlmICh0aGlzLnpvbmVFZGl0TW9kZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGV2ZWwgPSBcInNlY3Rpb25cIjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoICh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcIkwxXCI6XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExldmVsID0gXCJmaXh0dXJlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJMMlwiOlxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZXZlbCA9IFwic2hlbGZcIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIkwzXCI6XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExldmVsID0gXCJzZWN0aW9uXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJMNFwiOlxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZXZlbCA9IFwic3BvdFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMZXZlbEJ5VGFiKCkge1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcImZpeHR1cmVcIjpcclxuICAgICAgICByZXR1cm4gXCJMMVwiO1xyXG4gICAgICBjYXNlIFwic2VjdGlvblwiOlxyXG4gICAgICAgIHJldHVybiBcIkwzXCI7XHJcbiAgICAgIGNhc2UgXCJzaGVsZlwiOlxyXG4gICAgICAgIHJldHVybiBcIkwyXCI7XHJcbiAgICAgIGNhc2UgXCJzcG90XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiTDRcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRGaXh0dXJlTGV2ZWxGb3JtKCkge1xyXG4gICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFt0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RCcmFuZE5hbWVdLFxyXG4gICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFt0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RCcmFuZE5hbWU/LmZvckVhY2goKGUpID0+IHtcclxuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9XHJcbiAgICAgICAgdGhpcy5icmFuZHNMaXN0XHJcbiAgICAgICAgICAuZmluZCgoYikgPT4gYi5icmFuZE5hbWUgPT09IGUpXHJcbiAgICAgICAgICA/LmNhdGVnb3J5Py5tYXAoKGMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IGMsIHZhbHVlOiBjIH07XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdCA9IFsuLi50aGlzLmNhdGVnb3JpZXNMaXN0LCAuLi5jYXRlZ29yaWVzXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybVxyXG4gICAgICAuZ2V0KFwicHJvZHVjdEJyYW5kTmFtZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodjogc3RyaW5nW10pID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gW107XHJcbiAgICAgICAgdi5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzID1cclxuICAgICAgICAgICAgdGhpcy5icmFuZHNMaXN0XHJcbiAgICAgICAgICAgICAgLmZpbmQoKGIpID0+IGIuYnJhbmROYW1lID09PSBlKVxyXG4gICAgICAgICAgICAgID8uY2F0ZWdvcnk/Lm1hcCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IGMsIHZhbHVlOiBjIH07XHJcbiAgICAgICAgICAgICAgfSkgPz8gW107XHJcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3QsIC4uLmNhdGVnb3JpZXNdO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB2YWxpZENhdGVnb3J5SWRzID0gdGhpcy5jYXRlZ29yaWVzTGlzdD8ubWFwKChjKSA9PiBjLnZhbHVlKSA/PyBbXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2F0U2VsZWN0aW9uID1cclxuICAgICAgICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybT8uZ2V0KFwicHJvZHVjdENhdGVnb3J5XCIpPy52YWx1ZSB8fCBbXTtcclxuICAgICAgICBjb25zdCBuZXdDYXRTZWxlY3Rpb24gPSBjdXJyZW50Q2F0U2VsZWN0aW9uLmZpbHRlcigoaWQ6IGFueSkgPT5cclxuICAgICAgICAgIHZhbGlkQ2F0ZWdvcnlJZHMuaW5jbHVkZXMoaWQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtXHJcbiAgICAgICAgICA/LmdldChcInByb2R1Y3RDYXRlZ29yeVwiKVxyXG4gICAgICAgICAgPy5zZXRWYWx1ZShuZXdDYXRTZWxlY3Rpb24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChjKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSkpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLmZpeHR1cmVMZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdFNlY3Rpb25MZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2VjdGlvbjogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZWN0aW9uR3JvdXBBcnJheSA9IHRoaXMuZ3JvdXBTaGVsdmVzQnlab25lKFxyXG4gICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnID8/IFtdLFxyXG4gICAgKTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXBBcnJheS5mb3JFYWNoKChzLCBpKSA9PiB0aGlzLmFkZFNlY3Rpb24ocywgaSkpO1xyXG5cclxuICAgIGlmIChzZWN0aW9uR3JvdXBBcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5hZGRTZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXMgPSBzZWN0aW9uR3JvdXBBcnJheVxyXG4gICAgICAubWFwKChzZSkgPT4gc2U/LnNoZWx2ZXM/Lm1hcCgocykgPT4gcykpXHJcbiAgICAgIC5mbGF0KCk7XHJcblxyXG4gICAgdGhpcy5zaGVsdmVzTGlzdCA9IHRoaXMuc2hlbHZlc0xpc3QubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICBkaXNhYmxlZDogYWxsU2VjdGlvblNoZWx2ZXM/LmluY2x1ZGVzKGAke2l0ZW0/LnZhbHVlfWApLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWN0aW9uQXJyYXkudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoczogU2VjdGlvbkNvbmZpZ1tdKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXMgPSBzXHJcbiAgICAgICAgICAubWFwKChzZSkgPT4gc2U/LnNoZWx2ZXM/Lm1hcCgocykgPT4gcykpXHJcbiAgICAgICAgICAuZmxhdCgpO1xyXG4gICAgICAgIHRoaXMuc2hlbHZlc0xpc3QgPSB0aGlzLnNoZWx2ZXNMaXN0Lm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IGFsbFNlY3Rpb25TaGVsdmVzPy5pbmNsdWRlcyhgJHtpdGVtPy52YWx1ZX1gKSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQWxsU2hlbHZlc1VzZWRJblNlY3Rpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbHZlc0xpc3QuZmlsdGVyKChzKSA9PiAhcy5kaXNhYmxlZCkubGVuZ3RoIDw9IDA7XHJcbiAgfVxyXG5cclxuICBpbml0U2hlbGZMZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLnNoZWxmTGV2ZWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHNoZWxmOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/LmZvckVhY2goKGUsIGkpID0+XHJcbiAgICAgIHRoaXMuYWRkU2hlbGYoZSwgaSksXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLnNoZWxmTGV2ZWxGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIGluaXRTcG90TGV2ZWxGb3JtKCkge1xyXG4gICAgdGhpcy5zcG90TGV2ZWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJyYW5kOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHByb2R1Y3RDYXRlZ29yeTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHRoaXMuc3BvdExldmVsRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRUYWIodGFiOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMZXZlbCA9IHRhYjtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICB9XHJcblxyXG4gIGdldCBzaGVsZkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGVsZkxldmVsRm9ybS5nZXQoXCJzaGVsZlwiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VjdGlvbkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9uTGV2ZWxGb3JtLmdldChcInNlY3Rpb25cIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgYWRkU2VjdGlvbihcclxuICAgIHNlY3Rpb24/OiBTZWN0aW9uQ29uZmlnLFxyXG4gICAgaTogbnVtYmVyID0gdGhpcy5zZWN0aW9uQXJyYXkuY29udHJvbHMubGVuZ3RoLFxyXG4gICkge1xyXG4gICAgY29uc3Qgc2VjdGlvbkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHpvbmU6IFtzZWN0aW9uPy56b25lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXV0sXHJcbiAgICAgIHNoZWx2ZXM6IFtzZWN0aW9uPy5zaGVsdmVzID8/IFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW3NlY3Rpb24/LnByb2R1Y3RCcmFuZE5hbWVdLFxyXG4gICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtzZWN0aW9uPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gXCJcIl0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlY3Rpb25BcnJheS5wdXNoKHNlY3Rpb25Hcm91cCk7XHJcblxyXG4gICAgY29uc3QgbWFwSWQgPSBgc2VjdGlvbiR7aX1gO1xyXG4gICAgc2VjdGlvbj8ucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPVxyXG4gICAgICAgIHRoaXMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgLmZpbmQoKGIpID0+IGIuYnJhbmROYW1lID09PSBlKVxyXG4gICAgICAgICAgPy5jYXRlZ29yeT8ubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBjLCB2YWx1ZTogYyB9O1xyXG4gICAgICAgICAgfSkgPz8gW107XHJcbiAgICAgIHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuc2V0KG1hcElkLCBbXHJcbiAgICAgICAgLi4uKHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KG1hcElkKSA/PyBbXSksXHJcbiAgICAgICAgLi4uY2F0ZWdvcmllcyxcclxuICAgICAgXSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2VjdGlvbkxpc3RlbmVyKHNlY3Rpb25Hcm91cCwgbWFwSWQpO1xyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY6IFNoZWxmQ29uZmlnLCBpOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW3NoZWxmPy5wcm9kdWN0QnJhbmROYW1lXSxcclxuICAgICAgcHJvZHVjdENhdGVnb3J5OiBbc2hlbGY/LnByb2R1Y3RDYXRlZ29yeSA/PyBcIlwiXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2hlbGZBcnJheS5wdXNoKHNoZWxmR3JvdXApO1xyXG5cclxuICAgIGNvbnN0IG1hcElkID0gYHNoZWxmJHtpfWA7XHJcbiAgICBzaGVsZj8ucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPVxyXG4gICAgICAgIHRoaXMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgLmZpbmQoKGIpID0+IGIuYnJhbmROYW1lID09PSBlKVxyXG4gICAgICAgICAgPy5jYXRlZ29yeT8ubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBjLCB2YWx1ZTogYyB9O1xyXG4gICAgICAgICAgfSkgPz8gW107XHJcbiAgICAgIHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuc2V0KG1hcElkLCBbXHJcbiAgICAgICAgLi4uKHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KG1hcElkKSA/PyBbXSksXHJcbiAgICAgICAgLi4uY2F0ZWdvcmllcyxcclxuICAgICAgXSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2hlbGZMaXN0ZW5lcihzaGVsZkdyb3VwLCBtYXBJZCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gIH1cclxuXHJcbiAgc2V0dXBTaGVsZkxpc3RlbmVyKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgaTogc3RyaW5nKSB7XHJcbiAgICBzaGVsZkdyb3VwXHJcbiAgICAgIC5nZXQoXCJwcm9kdWN0QnJhbmROYW1lXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChicmFuZHMpID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChpLCBbXSk7XHJcbiAgICAgICAgYnJhbmRzLmZvckVhY2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9XHJcbiAgICAgICAgICAgIHRoaXMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgICAgIC5maW5kKChiKSA9PiBiLmJyYW5kTmFtZSA9PT0gZSlcclxuICAgICAgICAgICAgICA/LmNhdGVnb3J5Py5tYXAoKGMpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBjLCB2YWx1ZTogYyB9O1xyXG4gICAgICAgICAgICAgIH0pID8/IFtdO1xyXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5zZXQoaSwgW1xyXG4gICAgICAgICAgICAuLi4odGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5nZXQoaSkgPz8gW10pLFxyXG4gICAgICAgICAgICAuLi5jYXRlZ29yaWVzLFxyXG4gICAgICAgICAgXSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IGNhdGVnb3J5IHNlbGVjdGlvbiBpZiBwcmV2aW91c2x5IHNlbGVjdGVkIGNhdGVnb3JpZXMgYXJlIG5vIGxvbmdlciB2YWxpZFxyXG4gICAgICAgIGNvbnN0IHZhbGlkQ2F0ZWdvcnlJZHMgPVxyXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcD8uZ2V0KGkpPy5tYXAoKGMpID0+IGMudmFsdWUpID8/IFtdO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDYXRTZWxlY3Rpb24gPVxyXG4gICAgICAgICAgc2hlbGZHcm91cC5nZXQoXCJwcm9kdWN0Q2F0ZWdvcnlcIik/LnZhbHVlIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IG5ld0NhdFNlbGVjdGlvbiA9IGN1cnJlbnRDYXRTZWxlY3Rpb24uZmlsdGVyKChpZDogYW55KSA9PlxyXG4gICAgICAgICAgdmFsaWRDYXRlZ29yeUlkcy5pbmNsdWRlcyhpZCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzaGVsZkdyb3VwXHJcbiAgICAgICAgICAuZ2V0KFwicHJvZHVjdENhdGVnb3J5XCIpXHJcbiAgICAgICAgICA/LnNldFZhbHVlKG5ld0NhdFNlbGVjdGlvbiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgc2hlbGZHcm91cFxyXG4gICAgICAuZ2V0KFwicHJvZHVjdENhdGVnb3J5XCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChjKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldHVwU2VjdGlvbkxpc3RlbmVyKHNlY3Rpb25Hcm91cDogRm9ybUdyb3VwLCBpOiBzdHJpbmcpIHtcclxuICAgIHNlY3Rpb25Hcm91cFxyXG4gICAgICAuZ2V0KFwicHJvZHVjdEJyYW5kTmFtZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoYnJhbmRzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5zZXQoaSwgW10pO1xyXG4gICAgICAgIGJyYW5kcy5mb3JFYWNoKChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPVxyXG4gICAgICAgICAgICB0aGlzLmJyYW5kc0xpc3RcclxuICAgICAgICAgICAgICAuZmluZCgoYikgPT4gYi5icmFuZE5hbWUgPT09IGUpXHJcbiAgICAgICAgICAgICAgPy5jYXRlZ29yeT8ubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBsYWJlbDogYywgdmFsdWU6IGMgfTtcclxuICAgICAgICAgICAgICB9KSA/PyBbXTtcclxuICAgICAgICAgIHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuc2V0KGksIFtcclxuICAgICAgICAgICAgLi4uKHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KGkpID8/IFtdKSxcclxuICAgICAgICAgICAgLi4uY2F0ZWdvcmllcyxcclxuICAgICAgICAgIF0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBSZXNldCBjYXRlZ29yeSBzZWxlY3Rpb24gaWYgcHJldmlvdXNseSBzZWxlY3RlZCBjYXRlZ29yaWVzIGFyZSBubyBsb25nZXIgdmFsaWRcclxuICAgICAgICBjb25zdCB2YWxpZENhdGVnb3J5SWRzID1cclxuICAgICAgICAgIHRoaXMuY2F0ZWdvcmllc0xpc3RNYXA/LmdldChpKT8ubWFwKChjKSA9PiBjLnZhbHVlKSA/PyBbXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2F0U2VsZWN0aW9uID1cclxuICAgICAgICAgIHNlY3Rpb25Hcm91cC5nZXQoXCJwcm9kdWN0Q2F0ZWdvcnlcIik/LnZhbHVlIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IG5ld0NhdFNlbGVjdGlvbiA9IGN1cnJlbnRDYXRTZWxlY3Rpb24uZmlsdGVyKChpZDogYW55KSA9PlxyXG4gICAgICAgICAgdmFsaWRDYXRlZ29yeUlkcy5pbmNsdWRlcyhpZCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzZWN0aW9uR3JvdXBcclxuICAgICAgICAgIC5nZXQoXCJwcm9kdWN0Q2F0ZWdvcnlcIilcclxuICAgICAgICAgID8uc2V0VmFsdWUobmV3Q2F0U2VsZWN0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXBcclxuICAgICAgLmdldChcInByb2R1Y3RDYXRlZ29yeVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoYykgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgc2VjdGlvbkdyb3VwXHJcbiAgICAgIC5nZXQoXCJzaGVsdmVzXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChzKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXBcclxuICAgICAgLmdldChcInpvbmVcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTZWN0aW9uKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XHJcbiAgICB0aGlzLnNlY3Rpb25BcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1CeUxldmVsKCkge1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcImZpeHR1cmVcIjpcclxuICAgICAgICByZXR1cm4gdGhpcy5maXh0dXJlTGV2ZWxGb3JtO1xyXG4gICAgICBjYXNlIFwic2VjdGlvblwiOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25MZXZlbEZvcm07XHJcbiAgICAgIGNhc2UgXCJzaGVsZlwiOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNoZWxmTGV2ZWxGb3JtO1xyXG4gICAgICBjYXNlIFwic3BvdFwiOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNwb3RMZXZlbEZvcm07XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZml4dHVyZUxldmVsRm9ybTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZENvbG9yVG9TaGVsdmVzKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbGV2ZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0aGlzLnNlbGVjdGVkTGV2ZWx9LWxldmVsYCk7XHJcbiAgICBpZiAoIWxldmVsKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYm9kaWVzID0gbGV2ZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIuYm9keS1ibG9ja1wiKTtcclxuICAgIGlmICghYm9kaWVzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYm9keUNoaWxkcmVuID0gQXJyYXkuZnJvbShib2RpZXMuY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W107XHJcblxyXG4gICAgY29uc3Qgc2hlbGZEaXZzID0gYm9keUNoaWxkcmVuXHJcblxyXG4gICAgICAubWFwKChkaXYpID0+IHtcclxuICAgICAgICBjb25zdCBsYXN0ID0gZGl2Lmxhc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgcmV0dXJuIGxhc3QgJiYgbGFzdC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZGl2XCJcclxuICAgICAgICAgID8gKGxhc3QgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgICAgICA6IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGQpOiBkIGlzIEhUTUxFbGVtZW50ID0+ICEhZCk7XHJcblxyXG4gICAgaWYgKCFzaGVsZkRpdnMubGVuZ3RoKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpLCAxMDApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcInNlY3Rpb25cIjoge1xyXG4gICAgICAgIHRoaXMuY29uc3RydWN0U2VxdWVudGlhbFNlY3Rpb24oc2hlbGZEaXZzKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbkFycmF5ID1cclxuICAgICAgICAgICh0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LnZhbHVlPy5zZWN0aW9uIGFzIFNlY3Rpb25Db25maWdbXSkgPz8gW107XHJcbiAgICAgICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgIHNlY3Rpb25BcnJheS5mb3JFYWNoKChzZSwgaSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgc2hlbGZJZHMgPVxyXG4gICAgICAgICAgICBzZS5zaGVsdmVzPy5tYXAoKHNoKSA9PiBzaC5yZXBsYWNlKC9cXHMvZywgXCJcIikudG9Mb3dlckNhc2UoKSkgPz8gW107XHJcbiAgICAgICAgICBhbGxTZWN0aW9uU2hlbHZlcy5wdXNoKC4uLnNoZWxmSWRzKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzZWNEaXZzID0gc2hlbGZEaXZzLmZpbHRlcigoaXRlbSkgPT5cclxuICAgICAgICAgICAgc2hlbGZJZHMuaW5jbHVkZXMoaXRlbS5pZCksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgc2VjRGl2cy5mb3JFYWNoKFxyXG4gICAgICAgICAgICAoZCkgPT4gKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZyksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB1bmFzc2lnbmVkU2hlbHZlcyA9IHNoZWxmRGl2cy5maWx0ZXIoXHJcbiAgICAgICAgICAoaXRlbSkgPT4gIWFsbFNlY3Rpb25TaGVsdmVzLmluY2x1ZGVzKGl0ZW0uaWQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdW5hc3NpZ25lZFNoZWx2ZXMuZm9yRWFjaCgoZCkgPT4gKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJ3aGl0ZVwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25Cb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWN0aW9uLWJvZHktYmxvY2tcIik7XHJcbiAgICAgICAgaWYgKHNlY3Rpb25Cb2R5KSB7XHJcbiAgICAgICAgICBsZXQgc2VjdGlvbkdyb3VwSGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWN0aW9uQnlab25lcy5mb3JFYWNoKChzeiwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uSGVpZ2h0ID0gc3ouc2VjdGlvbi5zaGVsZkRpdnMucmVkdWNlKFxyXG4gICAgICAgICAgICAgICAgKGgsIGQpID0+IGggKyAoZD8ub2Zmc2V0SGVpZ2h0ID8/IDApLFxyXG4gICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uV2lkdGggPVxyXG4gICAgICAgICAgICAgICAgc3ouc2VjdGlvbi5zaGVsZkRpdnNbMF0/Lm9mZnNldFdpZHRoID8/IDM0NTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgYmMgPSBzZWN0aW9uQm9keS5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcclxuICAgICAgICAgICAgICAgIGAjYnJhbmQtY2F0ZWdvcnkke2l9YCxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChiYykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VjQmcgPSByZ2JUb0hleChcclxuICAgICAgICAgICAgICAgICAgc3ouc2VjdGlvbi5zaGVsZkRpdnNbMF0/LnN0eWxlLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hlbGZDb2xvcnMuZmluZCgoYykgPT4gYy5iZyA9PT0gc2VjQmcpID8/XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hlbGZDb2xvcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb2xvci5ib3JkZXI7XHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmZmZcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1ggPSAoY3VycmVudFNlY3Rpb25XaWR0aCAtIGJjLm9mZnNldFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1kgPVxyXG4gICAgICAgICAgICAgICAgICAoY3VycmVudFNlY3Rpb25IZWlnaHQgLSBiYy5vZmZzZXRIZWlnaHQpIC8gMiArXHJcbiAgICAgICAgICAgICAgICAgIHNlY3Rpb25Hcm91cEhlaWdodDtcclxuICAgICAgICAgICAgICAgIGJjLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtiY1h9cHgsICR7YmNZfXB4KWA7XHJcblxyXG4gICAgICAgICAgICAgICAgc2VjdGlvbkdyb3VwSGVpZ2h0ICs9IGN1cnJlbnRTZWN0aW9uSGVpZ2h0O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwic2hlbGZcIjpcclxuICAgICAgICBib2R5Q2hpbGRyZW4uZm9yRWFjaCgoZGl2LCBpKSA9PiB7XHJcbiAgICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuXHJcbiAgICAgICAgICBjb25zdCBiYyA9IGRpdi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgI2JyYW5kLWNhdGVnb3J5JHtpfWApO1xyXG4gICAgICAgICAgaWYgKGJjKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJjWCA9IChkaXYub2Zmc2V0V2lkdGggLSBiYy5vZmZzZXRXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgICBjb25zdCBiY1kgPSAoZGl2Lm9mZnNldEhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS5ib3JkZXJDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbaV0uYm9yZGVyO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLnRleHRCZztcclxuICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWH1weCwgJHtiY1l9cHgpYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJmaXh0dXJlXCI6XHJcbiAgICAgIGNhc2UgXCJzcG90XCI6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goXHJcbiAgICAgICAgICAoZCkgPT4gKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1swXS5iZyksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFNlcXVlbnRpYWxTZWN0aW9uKHNoZWxmRGl2czogKEhUTUxFbGVtZW50IHwgbnVsbClbXSkge1xyXG4gICAgY29uc3Qgc2hlbGZDb25maWdzOiBTaGVsZkNvbmZpZ1tdID0gdGhpcy5hcHBseVNlY3Rpb25Db25maWdUb1NoZWx2ZXMoXHJcbiAgICAgIHRoaXMuc2VjdGlvbkxldmVsRm9ybT8udmFsdWU/LnNlY3Rpb24gYXMgU2VjdGlvbkNvbmZpZ1tdLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IG5ld1NlY3Rpb25CeVpvbmVzID0gW107XHJcblxyXG4gICAgbGV0IHBab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcyBvZiBzaGVsZkNvbmZpZ3MpIHtcclxuICAgICAgY29uc3Qgem9uZSA9IHMuem9uZSB8fCBcIlwiO1xyXG4gICAgICBjb25zdCBzaGVsZklkID0gYCR7cy5zaGVsZlR5cGV9JHtzLnNoZWxmTnVtYmVyfWA7XHJcbiAgICAgIGNvbnN0IHNoZWxmRGl2ID0gc2hlbGZEaXZzLmZpbmQoKGQpID0+IGQ/LmlkID09PSBzaGVsZklkKTtcclxuXHJcbiAgICAgIGlmICh6b25lID09PSBcIlwiKSBjb250aW51ZTtcclxuICAgICAgaWYgKHpvbmUgIT09IHBab25lKSB7XHJcbiAgICAgICAgbmV3U2VjdGlvbkJ5Wm9uZXMucHVzaCh7XHJcbiAgICAgICAgICB6b25lLFxyXG4gICAgICAgICAgc2VjdGlvbjoge1xyXG4gICAgICAgICAgICBicmFuZHM6IHMucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogcy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgICAgIHNoZWx2ZXM6IFtzaGVsZklkXSxcclxuICAgICAgICAgICAgc2hlbGZEaXZzOiBbc2hlbGZEaXZdLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBwWm9uZSA9IHpvbmU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IG5ld1NlY3Rpb25CeVpvbmVzW25ld1NlY3Rpb25CeVpvbmVzLmxlbmd0aCAtIDFdLnNlY3Rpb247XHJcbiAgICAgICAgc2VjdGlvbi5zaGVsdmVzLnB1c2goc2hlbGZJZCk7XHJcbiAgICAgICAgc2VjdGlvbi5zaGVsZkRpdnMucHVzaChzaGVsZkRpdik7XHJcblxyXG4gICAgICAgIGlmICghc2VjdGlvbi5icmFuZHMubGVuZ3RoKSBzZWN0aW9uLmJyYW5kcyA9IHM/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW107XHJcbiAgICAgICAgaWYgKCFzZWN0aW9uLmNhdGVnb3JpZXMubGVuZ3RoKVxyXG4gICAgICAgICAgc2VjdGlvbi5jYXRlZ29yaWVzID0gcz8ucHJvZHVjdENhdGVnb3J5ID8/IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWN0aW9uQnlab25lcyA9IFsuLi5uZXdTZWN0aW9uQnlab25lc107XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsbFNoZWxmQWRkVG9TZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbHZlc0xpc3QuZXZlcnkoKHMpID0+IHMuZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGF5bG9hZEJ5TGV2ZWwoc3RhdHVzPzogc3RyaW5nKTogRml4dHVyZVRlbXBsYXRlRGV0YWlscyB8IG51bGwge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybUJ5TGV2ZWwoKTtcclxuICAgIGNvbnN0IGxldmVsID0gdGhpcy5nZXRMZXZlbEJ5VGFiKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBmb3JtLmludmFsaWQgfHxcclxuICAgICAgKHRoaXMuc2VsZWN0ZWRMZXZlbCA9PT0gXCJzZWN0aW9uXCIgJiYgIXRoaXMuaXNBbGxTaGVsZkFkZFRvU2VjdGlvbilcclxuICAgICkge1xyXG4gICAgICBmb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuXHJcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gZm9ybS5pbnZhbGlkXHJcbiAgICAgICAgPyBcIkZvcm0gaXMgaW52YWxpZFwiXHJcbiAgICAgICAgOiBcIkFzc2lnbiBhbGwgc2hlbHZlcyB0byBhIHNlY3Rpb25cIjtcclxuXHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnJvck1zZyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZExldmVsKSB7XHJcbiAgICAgIGNhc2UgXCJmaXh0dXJlXCI6IHtcclxuICAgICAgICBjb25zdCBjb25maWc6IFNoZWxmQ29uZmlnW10gPVxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4ucyxcclxuICAgICAgICAgICAgICB6b25lOiBcIlwiLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAvLyBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFsuLi5mb3JtPy52YWx1ZS5wcm9kdWN0QnJhbmROYW1lXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogWy4uLmZvcm0/LnZhbHVlLnByb2R1Y3RDYXRlZ29yeV0sXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFwic2VjdGlvblwiOiB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnOiBTaGVsZkNvbmZpZ1tdID0gdGhpcy5hcHBseVNlY3Rpb25Db25maWdUb1NoZWx2ZXMoXHJcbiAgICAgICAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LnZhbHVlPy5zZWN0aW9uIGFzIFNlY3Rpb25Db25maWdbXSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMhLFxyXG4gICAgICAgICAgLy8gc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBbXSxcclxuICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFwic2hlbGZcIjoge1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZzogU2hlbGZDb25maWdbXSA9XHJcbiAgICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKHMsIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAuLi5zLFxyXG4gICAgICAgICAgICAgIHpvbmU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogZm9ybT8udmFsdWU/LnNoZWxmW2ldPy5wcm9kdWN0QnJhbmROYW1lID8/IFtdLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogZm9ybT8udmFsdWU/LnNoZWxmW2ldPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAvLyBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgICAgc2hlbGZDb25maWc6IGNvbmZpZyxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgXCJzcG90XCI6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAvLyBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBzdWJtaXRGb3JtKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBwYXlsb2FkOiBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzIHwgbnVsbCA9IHRoaXMuZ2V0UGF5bG9hZEJ5TGV2ZWwoKTtcclxuICAgIGlmICghcGF5bG9hZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJlcSA9IHtcclxuICAgICAgZml4dHVyZUlkOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMuX2lkLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgLi4ucGF5bG9hZCxcclxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgLi4uKHRoaXMuaXNSb2xsb3V0ICYmIHsgaXNNZXJjaEVkaXRlZDogdHJ1ZSB9KSxcclxuICAgICAgfSxcclxuICAgICAgLi4uKCF0aGlzLmZpeHR1cmVEYXRhPy50YXNrVHlwZSAmJiAhdGhpcy5pc1JvbGxvdXRcclxuICAgICAgICA/IHsgZWRpdE1vZGU6IHRoaXMuaXNFZGl0TW9kZSwgcmV2ZXJ0T25FZGl0OiB0aGlzLnJldmVydE9uRWRpdCB9XHJcbiAgICAgICAgOiB7fSksXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVTdG9yZUZpeHR1cmUocmVxKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5pZCkge1xyXG4gICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRml4dHVyZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGVtcGxhdGUgaXMgY3JlYXRlZCA8YSBocmVmPSdtYW5hZ2UvcGxhbm9ncmFtL2ZpeHR1cmUtdGVtcGxhdGUvYmFzaWMtZGV0YWlscz90ZW1wbGF0ZUlkPSR7cmVzLmRhdGEuaWR9JmlzRWRpdD1mYWxzZSc+VmlldzwvYT5gO1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QobWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFwiRml4dHVyZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXCJGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5XCIpXHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpXHJcbiAgICAgICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRydWUpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBncm91cFNoZWx2ZXNCeVpvbmUoaW5wdXQ6IFNoZWxmQ29uZmlnW10pOiBTZWN0aW9uQ29uZmlnW10ge1xyXG4gICAgY29uc3Qgem9uZU1hcDogeyBbem9uZTogc3RyaW5nXTogU2VjdGlvbkNvbmZpZyB9ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0KSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBpdGVtPy56b25lID8/IFwiXCI7XHJcbiAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtpdGVtLnNoZWxmVHlwZX0gJHtpdGVtLnNoZWxmTnVtYmVyfWA7XHJcblxyXG4gICAgICBpZiAoem9uZSA9PT0gXCJcIikgY29udGludWU7XHJcblxyXG4gICAgICBpZiAoIXpvbmVNYXBbem9uZV0pIHtcclxuICAgICAgICB6b25lTWFwW3pvbmVdID0ge1xyXG4gICAgICAgICAgc2hlbHZlczogW10sXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOlxyXG4gICAgICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDNcIlxyXG4gICAgICAgICAgICAgID8gaXRlbS5wcm9kdWN0QnJhbmROYW1lXHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTpcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwzXCJcclxuICAgICAgICAgICAgICA/IGl0ZW0ucHJvZHVjdENhdGVnb3J5XHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgem9uZU1hcFt6b25lXT8uc2hlbHZlcz8ucHVzaChzaGVsZkxhYmVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh6b25lTWFwKTtcclxuICB9XHJcblxyXG4gIGFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyhzZWN0aW9uczogU2VjdGlvbkNvbmZpZ1tdKTogU2hlbGZDb25maWdbXSB7XHJcbiAgICBjb25zdCBzZWN0aW9uTWFwID0gbmV3IE1hcDxcclxuICAgICAgc3RyaW5nLFxyXG4gICAgICBQaWNrPFNlY3Rpb25Db25maWcsIFwiem9uZVwiIHwgXCJwcm9kdWN0QnJhbmROYW1lXCIgfCBcInByb2R1Y3RDYXRlZ29yeVwiPlxyXG4gICAgPigpO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xyXG4gICAgICBmb3IgKGNvbnN0IHNoZWxmTGFiZWwgb2Ygc2VjdGlvbi5zaGVsdmVzISkge1xyXG4gICAgICAgIHNlY3Rpb25NYXAuc2V0KHNoZWxmTGFiZWwsIHtcclxuICAgICAgICAgIHpvbmU6IHNlY3Rpb24uem9uZSxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IHNlY3Rpb24ucHJvZHVjdEJyYW5kTmFtZSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogc2VjdGlvbi5wcm9kdWN0Q2F0ZWdvcnksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBvdmVycmlkZXMgdG8gbWF0Y2hpbmcgc2hlbHZlc1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzaGVsZikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtzaGVsZi5zaGVsZlR5cGV9ICR7c2hlbGYuc2hlbGZOdW1iZXJ9YDtcclxuICAgICAgICBjb25zdCBvdmVycmlkZSA9IHNlY3Rpb25NYXAuZ2V0KHNoZWxmTGFiZWwpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uc2hlbGYsXHJcbiAgICAgICAgICB6b25lOiBvdmVycmlkZT8uem9uZSB8fCBcIlwiLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogb3ZlcnJpZGU/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IG92ZXJyaWRlPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgfSkgPz8gW11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgbGV0IGRhdGEgPVxyXG4gICAgICB0aGlzLnNlbGVjdGVkTGV2ZWwgPT0gXCJmaXh0dXJlXCJcclxuICAgICAgICA/IHRoaXMuZml4dHVyZUxldmVsRm9ybS52YWx1ZVxyXG4gICAgICAgIDogdGhpcy5zZWxlY3RlZExldmVsID09IFwic2VjdGlvblwiXHJcbiAgICAgICAgICA/IHRoaXMuc2VjdGlvbkxldmVsRm9ybT8udmFsdWVcclxuICAgICAgICAgIDogdGhpcy5zZWxlY3RlZExldmVsID09IFwic2hlbGZcIlxyXG4gICAgICAgICAgICA/IHRoaXMuc2hlbGZMZXZlbEZvcm0/LnZhbHVlXHJcbiAgICAgICAgICAgIDogdGhpcy5zcG90TGV2ZWxGb3JtPy52YWx1ZTtcclxuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdChkYXRhKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJmaXh0dXJlLXRlbXBsYXRlLXByb2R1Y3RzXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiPlxyXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1MZWZ0IENvbHVtbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiIHN0eWxlPVwibWF4LXdpZHRoOiAzODBweDtcIj5cclxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIGN1c3RvbS10YWJzIGQtZmxleFwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZSB8fCB6b25lRWRpdE1vZGVcIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBmbGV4LWZpbGxcIiAqbmdGb3I9XCJsZXQgbGlicmFyeSBvZiBbJ2JyYW5kJywgJ3Byb2R1Y3QnXVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1saW5rIHctMTAwXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZExpYnJhcnkgPT09IGxpYnJhcnlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRMaWJyYXJ5ID0gbGlicmFyeVwiIFthdHRyLmFyaWEtY3VycmVudF09XCJzZWxlY3RlZExpYnJhcnkgPT09IGxpYnJhcnkgPyAncGFnZScgOiBudWxsXCI+XHJcbiAgICAgICAgICAgIHt7IGxpYnJhcnkgfCB0aXRsZWNhc2UgfX0gTGlicmFyeVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgPC91bD5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZExpYnJhcnkgPT09ICdicmFuZCdcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCAhPT0gJ3Nwb3QnXCI+XHJcbiAgICAgICAgICA8aDI+QWRkIHByb2R1Y3RzIGJ5IGJyYW5kIGxldmVsPC9oMj5cclxuICAgICAgICAgIDxwPlBsYWNlIHRoZSBwcm9kdWN0IGJyYW5kIGluIHRoZSBkZXNpZ25hdGVkIHBsYWNlbWVudCBhcmVhLjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEZpeHR1cmUgbGV2ZWwgd2l0aGluIEJyYW5kIExpYnJhcnkgIC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZml4dHVyZUxldmVsRm9ybVwiICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ2ZpeHR1cmUnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcm9kdWN0QnJhbmROYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5CcmFuZDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duIFtpdGVtc109XCJicmFuZHNMaXN0XCIgW2lkRmllbGRdPVwiJ2JyYW5kTmFtZSdcIiBbbmFtZUZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBicmFuZHMnXCIgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdEJyYW5kTmFtZVwiXHJcbiAgICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCI+PC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnRvdWNoZWQgJiYgZml4dHVyZUxldmVsRm9ybS5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZml4dHVyZUxldmVsRm9ybS5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgcHJvZHVjdCBicmFuZFxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHJvZHVjdENhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5Qcm9kdWN0IGNhdGVnb3J5PC9sYWJlbD5cclxuICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24gW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtpdGVtc109XCJjYXRlZ29yaWVzTGlzdFwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgY2F0ZWdvcmllcydcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuXHJcbiAgICAgICAgPCEtLSBTZWN0aW9uIGxldmVsIHdpdGhpbiBCcmFuZCBMaWJyYXJ5IC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2VjdGlvbkxldmVsRm9ybVwiICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3NlY3Rpb24nXCI+XHJcbiAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzZWN0aW9uXCIgY2xhc3M9XCJhcnJheS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2Ygc2VjdGlvbkFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXJyYXktY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7ICdib3JkZXItY29sb3InOiBzaGVsZkNvbG9yc1tpXS5iZyB9XCIgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TRUNUSU9OIHt7IGkgKyAxIH19PC9oNj5cclxuICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlIHx8IHpvbmVFZGl0TW9kZVwiICpuZ0lmPVwiaSAhPT0gMFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiAoY2xpY2spPVwicmVtb3ZlU2VjdGlvbihpKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlNlY3Rpb24gbGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImxhYmVsXCIgZm9ybUNvbnRyb2xOYW1lPVwiem9uZVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY3Rpb24uZ2V0KCd6b25lJyk/LnRvdWNoZWQgJiYgc2VjdGlvbi5nZXQoJ3pvbmUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3pvbmUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj4gU2VjdGlvbiBuYW1lIGlzXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQuIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VjdGlvbiBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcignbm90VW5pcXVlJylcIj4gRHVwbGljYXRlIHNlY3Rpb24gbmFtZS5cclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cInpvbmVFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNoZWx2ZXNcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBpY2sgdGhlIHNoZWxmKHMpIGZvciBzZWN0aW9uIHt7IGkgKyAxIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duIFtpdGVtc109XCJzaGVsdmVzTGlzdFwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaGVsdmVzXCIgW3NlYXJjaF09XCJ0cnVlXCI+PC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY3Rpb24uZ2V0KCdzaGVsdmVzJyk/LnRvdWNoZWQgJiYgc2VjdGlvbi5nZXQoJ3NoZWx2ZXMnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3NoZWx2ZXMnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj4gUGljayB0aGUgc2hlbGYocylcclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHJvZHVjdEJyYW5kTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+QnJhbmQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24gW2l0ZW1zXT1cImJyYW5kc0xpc3RcIiBbaWRGaWVsZF09XCInYnJhbmROYW1lJ1wiIFtuYW1lRmllbGRdPVwiJ2JyYW5kTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0QnJhbmROYW1lXCIgW3NlYXJjaF09XCJ0cnVlXCI+PC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udG91Y2hlZCAmJiBzZWN0aW9uLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgcHJvZHVjdCBicmFuZFxyXG4gICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cInpvbmVFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UHJvZHVjdCBjYXRlZ29yeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93biBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNhdGVnb3JpZXNMaXN0TWFwLmdldCgnc2VjdGlvbicgKyBpKSA/PyBbXVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbXQtNFwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJ6b25lRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICBpc0FsbFNoZWx2ZXNVc2VkSW5TZWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgICA/ICdBbGwgc2hlbHZlcyBhcmUgYXNzaWduZWQuIE5vIHNoZWx2ZXMgYXZhaWxhYmxlIGZvciBuZXcgc2VjdGlvbnMuJ1xyXG4gICAgICAgICAgICAgICAgICA6ICdZb3UgY2Fubm90IGNyZWF0ZSBtb3JlIHNlY3Rpb25zIHRoYW4gdGhlIHRvdGFsIHNoZWx2ZXMgYXZhaWxhYmxlLidcclxuICAgICAgICAgICAgICBcIiBbZGlzYWJsZVRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uQXJyYXkubGVuZ3RoIDwgKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgJiYgIWlzQWxsU2hlbHZlc1VzZWRJblNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHNlY3Rpb25BcnJheS5sZW5ndGggPj0gKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgfHwgaXNBbGxTaGVsdmVzVXNlZEluU2VjdGlvbnNcclxuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtZW5kXCIgKGNsaWNrKT1cImFkZFNlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgQWRkIHNlY3Rpb25cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICA8IS0tIFNoZWxmIGxldmVsIHdpdGhpbiBCcmFuZCBMaWJyYXJ5IC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2hlbGZMZXZlbEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzaGVsZidcIj5cclxuICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInNoZWxmXCIgY2xhc3M9XCJhcnJheS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiYXJyYXktY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7ICdib3JkZXItY29sb3InOiBzaGVsZkNvbG9yc1tpXS5iZyB9XCIgLS0+XHJcbiAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TSEVMRiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RCcmFuZE5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkJyYW5kPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duIFtpdGVtc109XCJicmFuZHNMaXN0XCIgW2lkRmllbGRdPVwiJ2JyYW5kTmFtZSdcIiBbbmFtZUZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdEJyYW5kTmFtZVwiIFtzZWFyY2hdPVwidHJ1ZVwiPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInNoZWxmLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy50b3VjaGVkICYmIHNoZWxmLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IHByb2R1Y3QgYnJhbmRcclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UHJvZHVjdCBjYXRlZ29yeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93biBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNhdGVnb3JpZXNMaXN0TWFwLmdldCgnc2hlbGYnICsgaSkgPz8gW11cIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIj48L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICA8IS0tIFNwb3QgbGV2ZWwgd2l0aGluIEJyYW5kIExpYnJhcnkgLS0+XHJcbiAgICAgICAgPCEtLSA8Zm9ybSBbZm9ybUdyb3VwXT1cInNwb3RMZXZlbEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzcG90J1wiPlNwb3QgbGV2ZWwgRm9ybTwvZm9ybT4gLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzcG90J1wiXHJcbiAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiIHN0eWxlPVwiaGVpZ2h0OiA1MHZoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMzcgMzdMMzIuNjUgMzIuNjVNMzUgMjdDMzUgMzEuNDE4MyAzMS40MTgzIDM1IDI3IDM1QzIyLjU4MTcgMzUgMTkgMzEuNDE4MyAxOSAyN0MxOSAyMi41ODE3IDIyLjU4MTcgMTkgMjcgMTlDMzEuNDE4MyAxOSAzNSAyMi41ODE3IDM1IDI3WlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJtdC01IG1iLTJcIj5Db21pbmcgc29vbjwvaDM+XHJcbiAgICAgICAgICA8cD5UaGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSB5ZXQuPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gQ29taW5nIHNvb24gZm9yIGFsbCBsZXZlbHMgLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZExpYnJhcnkgPT09ICdwcm9kdWN0J1wiXHJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gdy0xMDAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXIgbXQtNVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIgLz5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNMzcgMzdMMzIuNjUgMzIuNjVNMzUgMjdDMzUgMzEuNDE4MyAzMS40MTgzIDM1IDI3IDM1QzIyLjU4MTcgMzUgMTkgMzEuNDE4MyAxOSAyN0MxOSAyMi41ODE3IDIyLjU4MTcgMTkgMjcgMTlDMzEuNDE4MyAxOSAzNSAyMi41ODE3IDM1IDI3WlwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aDMgY2xhc3M9XCJtdC01IG1iLTJcIj5Db21pbmcgc29vbjwvaDM+XHJcbiAgICAgICAgPHA+VGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgeWV0LiBTdGFydCBhZGRpbmcgcHJvZHVjdCBmcm9tIGJyYW5kIGxpYnJhcnk8L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1SaWdodCBDb2x1bW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2xcIj5cclxuICAgICAgPGg2PlByb2R1Y3QgYnJhbmQgcGxhY2VtZW50czwvaDY+XHJcblxyXG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgZC1mbGV4IG10LTRcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGUgfHwgem9uZUVkaXRNb2RlXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCIgKm5nRm9yPVwibGV0IGxldmVsIG9mIFsnZml4dHVyZScsICdzZWN0aW9uJywgJ3NoZWxmJywgJ3Nwb3QnXVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1saW5rIHctMTAwXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZExldmVsID09PSBsZXZlbFwiIChjbGljayk9XCJzZXRUYWIobGV2ZWwpXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cInNlbGVjdGVkTGV2ZWwgPT09IGxldmVsID8gJ3BhZ2UnIDogbnVsbFwiPlxyXG4gICAgICAgICAgICB7eyBsZXZlbCB8IHRpdGxlY2FzZSB9fSBsZXZlbFxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgPC91bD5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExldmVsID09PSAnZml4dHVyZSdcIj5cclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1sZXZlbFwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgIDwhLS0gVmVydGljYWwgYXJyb3dzIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgdXBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy52YWx1ZSB9fXt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnVuaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgZG93blwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPCEtLSBIb3Jpem9udGFsIGFycm93cyAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uQXJyb3dzO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhbGwtdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgICA8IS0tIEhlYWRlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBCb2R5IGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCIoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lmxlbmd0aCA/PyAwKSA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJicmFuZC1jYXRlZ29yeVwiIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZT8ubGVuZ3RoXCIgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGIgb2YgZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgZHJhZnQgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2hlbGZDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSd0cmF5Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnRyYXlSb3dzKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52bW9ubHktcGxhY2Vob2xkZXJdPVwiaXRlbS5zaGVsZlR5cGUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3NlY3Rpb24nXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInNlY3Rpb24tbGV2ZWxcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8IS0tIFZlcnRpY2FsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRpbWVuc2lvbkFycm93czsgY29udGV4dDogeyB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FsbC12aWV3cG9ydFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICAgICAgICAgICAgICA8cD57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsIH19PC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEJvZHkgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiBpZD1cInNlY3Rpb24tYm9keS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGlkPVwiYm9keS1sb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWN0aW9uQnlab25lczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidicmFuZC1jYXRlZ29yeScgKyAkaW5kZXhcIiBjbGFzcz1cImJyYW5kLWNhdGVnb3J5XCIgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGRyYWZ0IG1lLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uem9uZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmJyYW5kcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGIgb2YgaXRlbT8uc2VjdGlvbj8uYnJhbmRzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM/Lmxlbmd0aFwiIGNsYXNzPVwic2VwYXJhdG9yXCI+IC0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGMgb2YgaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYiBvZiBpdGVtPy5zZWN0aW9uPy5icmFuZHM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYyBvZiBpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2hlbGZDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBbTk9URV0gYmVsb3cgYmxvY2sgaXMgaWRlbnRpZmllZCBieSB0aGUgZnVuY3Rpb24gdXNpbmcgJ2xhc3RFbGVtZW50JyBnZXR0ZXIgaW4gRE9NIG1hbmlwdWxhdGlvbi4gXHJcbiAgICAgICAgICAgICAgICAgIFNvIGtlZXAgdGhpcyBibG9jayBhbHdheXMgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG5nRm9yIGxvb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIEBpZihpdGVtLnNoZWxmVHlwZSA9PT0ndHJheScpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlICsgKGkgKyAxKVwiIGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS50cmF5Um93cylcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdCBoaWRlLXByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSEgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9jayBzaGVsZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudm1vbmx5LXBsYWNlaG9sZGVyXT1cIml0ZW0uc2hlbGZUeXBlID09PSd2bW9ubHknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdCBoaWRlLXByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBGb290ZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzaGVsZidcIj5cclxuICAgICAgICA8ZGl2IGlkPVwic2hlbGYtbGV2ZWxcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8IS0tIFZlcnRpY2FsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRpbWVuc2lvbkFycm93czsgY29udGV4dDogeyB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FsbC12aWV3cG9ydFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEJvZHkgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cIihmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/IDApID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2hlbGZDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCInYnJhbmQtY2F0ZWdvcnknICsgaVwiIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGIgb2Ygc2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiIGNsYXNzPVwic2VwYXJhdG9yXCI+IC1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYiBvZiBzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2JyYW5kQ2F0ZWdvcnlUb29sdGlwPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+QnJhbmRzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFtOT1RFXSBiZWxvdyBibG9jayBpcyBpZGVudGlmaWVkIGJ5IHRoZSBmdW5jdGlvbiB1c2luZyAnbGFzdEVsZW1lbnQnIGdldHRlciBpbiBET00gbWFuaXB1bGF0aW9uLiBcclxuICAgICAgICAgICAgICAgICAgU28ga2VlcCB0aGlzIGJsb2NrIGFsd2F5cyBhdCB0aGUgYm90dG9tIG9mIHRoaXMgbmdGb3IgbG9vcCAtLT5cclxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSd0cmF5Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnRyYXlSb3dzKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52bW9ubHktcGxhY2Vob2xkZXJdPVwiaXRlbS5zaGVsZlR5cGUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3Nwb3QnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICBzdHlsZT1cImhlaWdodDogNTB2aFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTM3IDM3TDMyLjY1IDMyLjY1TTM1IDI3QzM1IDMxLjQxODMgMzEuNDE4MyAzNSAyNyAzNUMyMi41ODE3IDM1IDE5IDMxLjQxODMgMTkgMjdDMTkgMjIuNTgxNyAyMi41ODE3IDE5IDI3IDE5QzMxLjQxODMgMTkgMzUgMjIuNTgxNyAzNSAyN1pcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibXQtNSBtYi0yXCI+Q29taW5nIHNvb248L2gzPlxyXG4gICAgICAgICAgPHA+VGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgeWV0LiBUcnkgRml4dHVyZSwgU2VjdGlvbiwgYW5kIFNoZWxmIGxldmVsczwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSA8ZGl2IGlkPVwic3BvdC1sZXZlbFwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZSB9fXt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udW5pdCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhbGwtdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhlYWRlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICB7eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCIoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lmxlbmd0aCA/PyAwKSA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSdzaGVsZicpe1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdCBoaWRlLXByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjxzZWN0aW9uIGlkPVwiZml4dHVyZS10ZW1wbGF0ZS1wcm9kdWN0cy1za2VsZXRvblwiICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48IS0tIENvbW1vbiBkaW1lbnNpb24gYXJyb3dzIC0tPlxyXG48bmctdGVtcGxhdGUgI2RpbWVuc2lvbkFycm93cyBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC12YWx1ZT1cInZhbHVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhvcml6b250YWwtZGltZW5zaW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgbGVmdFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgPHNwYW4+e3sgdmFsdWUgfX0ge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy51bml0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgcmlnaHRcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
692
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtcHJvZHVjdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbWFuYWdlLXN0b3JlLXBsYW5vL3RlbXBsYXRlLXByb2R1Y3RzL3RlbXBsYXRlLXByb2R1Y3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby90ZW1wbGF0ZS1wcm9kdWN0cy90ZW1wbGF0ZS1wcm9kdWN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFJTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBV3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0UsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDdkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7OztBQWM5RCxNQUFNLE9BQU8seUJBQXlCO0lBaUQxQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFuRFYsUUFBUSxDQUFTO0lBQ2pCLHNC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biAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBGb3JtQXJyYXksXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1zTW9kdWxlLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuaW1wb3J0IHtcclxuICBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzLFxyXG4gIFNlY3Rpb25Db25maWcsXHJcbiAgU2hlbGZDb25maWcsXHJcbn0gZnJvbSBcIi4uLy4uLy4uL2ludGVyZmFjZXMvZml4dHVyZS10ZW1wbGF0ZS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvcGxhbm8tZGF0YS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJyYW5kRGV0YWlscyB9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL3ZtLWxpYnJhcnkuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFNIRUxGX0NPTE9SUyB9IGZyb20gXCIuLi8uLi8uLi9kYXRhL2ZpeHR1cmUtdGVtcGxhdGUuZGF0YVwiO1xyXG5pbXBvcnQgeyBnZW5lcmFsVmFsaWRhdG9yLCByZ2JUb0hleCB9IGZyb20gXCIuLi8uLi8uLi9mdW5jdGlvbnMvcGxhbm8uZnVuY3Rpb25cIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTXVsdGlzZWxlY3RDaGlwRHJvcGRvd25Db21wb25lbnQgfSBmcm9tIFwiLi4vLi4vbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bi9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBOZ2JUb29sdGlwTW9kdWxlIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1pbnN0YW5jZS1wcm9kdWN0c1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGVtcGxhdGUtcHJvZHVjdHMuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL3RlbXBsYXRlLXByb2R1Y3RzLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBNdWx0aXNlbGVjdENoaXBEcm9wZG93bkNvbXBvbmVudCxcclxuICAgIE5nYlRvb2x0aXBNb2R1bGUsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEluc3RhbmNlUHJvZHVjdHNDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25DaGFuZ2VzXHJcbntcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG4gIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM6IEZpeHR1cmVUZW1wbGF0ZURldGFpbHMgfCBudWxsO1xyXG4gIHNlbGVjdGVkTGV2ZWw6IFwiZml4dHVyZVwiIHwgXCJzZWN0aW9uXCIgfCBcInNoZWxmXCIgfCBcInNwb3RcIiB8IHN0cmluZyA9IFwiZml4dHVyZVwiO1xyXG5cclxuICBzZWxlY3RlZExpYnJhcnk6IFwicHJvZHVjdFwiIHwgXCJicmFuZFwiIHwgc3RyaW5nID0gXCJicmFuZFwiO1xyXG5cclxuICBpc1BhZ2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGJyYW5kc0xpc3Q6IEJyYW5kRGV0YWlsc1tdID0gW107XHJcbiAgY2F0ZWdvcmllc0xpc3Q6IERyb3Bkb3duSUZbXSA9IFtdO1xyXG4gIGNhdGVnb3JpZXNMaXN0TWFwOiBNYXA8c3RyaW5nLCBEcm9wZG93bklGW10+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBzaGVsdmVzTGlzdDogRHJvcGRvd25JRltdO1xyXG5cclxuICBmaXh0dXJlTGV2ZWxGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc2VjdGlvbkxldmVsRm9ybTogRm9ybUdyb3VwO1xyXG4gIHNoZWxmTGV2ZWxGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc3BvdExldmVsRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBzaGVsZkNvbG9ycyA9IFNIRUxGX0NPTE9SUztcclxuXHJcbiAgc2VjdGlvbkJ5Wm9uZXM6IHtcclxuICAgIHpvbmU6IHN0cmluZztcclxuICAgIHNlY3Rpb246IHtcclxuICAgICAgYnJhbmRzOiBzdHJpbmdbXTtcclxuICAgICAgY2F0ZWdvcmllczogc3RyaW5nW107XHJcbiAgICAgIHNoZWx2ZXM6IHN0cmluZ1tdO1xyXG4gICAgICBzaGVsZkRpdnM6IChIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQpW107XHJcbiAgICB9O1xyXG4gIH1bXSA9IFtdO1xyXG5cclxuICBpc1ZpZXdwb3J0TG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaXNWaWV3cG9ydEluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIEBJbnB1dCgpIGZpeHR1cmVEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgZWRpdE1vZGU6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQE91dHB1dCgpIHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIEBJbnB1dCgpIGlzUm9sbG91dDogYm9vbGVhbjtcclxuICBASW5wdXQoKSByZXZlcnRPbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB6b25lRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgcHM6IFBsYW5vRGF0YVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiZml4dHVyZURhdGFcIl0pIHtcclxuICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZShhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucHMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGUpID0+ICh0aGlzLmJyYW5kc0xpc3QgPSBlKSk7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5wcy5mZXRjaEJyYW5kc0xpc3QodGhpcy5jbGllbnRJZCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzID0gY2hhbmdlc1tcImZpeHR1cmVEYXRhXCJdLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICAgICAgICAgIGlmICghdGhpcy5pc1BhZ2VMb2FkaW5nKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgdGhpcy5zaGVsdmVzTGlzdCA9XHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lm1hcCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYCR7ZT8uc2hlbGZUeXBlPy50b1VwcGVyQ2FzZSgpfSAke2U/LnNoZWxmTnVtYmVyfWAsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogYCR7ZT8uc2hlbGZUeXBlfSAke2U/LnNoZWxmTnVtYmVyfWAsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSkgPz8gW107XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXRUYWJCeUxldmVsKCk7XHJcbiAgICAgICAgICB0aGlzLmluaXRGaXh0dXJlTGV2ZWxGb3JtKCk7XHJcbiAgICAgICAgICB0aGlzLmluaXRTZWN0aW9uTGV2ZWxGb3JtKCk7XHJcbiAgICAgICAgICB0aGlzLmluaXRTaGVsZkxldmVsRm9ybSgpO1xyXG4gICAgICAgICAgdGhpcy5pbml0U3BvdExldmVsRm9ybSgpO1xyXG4gICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbXCJlZGl0TW9kZVwiXSkge1xyXG4gICAgICB0aGlzLmlzRWRpdE1vZGUgPSBjaGFuZ2VzW1wiZWRpdE1vZGVcIl0uY3VycmVudFZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMuc2VjdGlvbkxldmVsRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB0aGlzLnNoZWxmTGV2ZWxGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMuc3BvdExldmVsRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzW1wiaXNTdWJtaXR0ZWRcIl0pIHtcclxuICAgICAgaWYgKGNoYW5nZXNbXCJpc1N1Ym1pdHRlZFwiXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzVmlld3BvcnRJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzVmlld3BvcnRJbml0aWFsaXplZCA9IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGFiQnlMZXZlbCgpIHtcclxuICAgIGlmICh0aGlzLnpvbmVFZGl0TW9kZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGV2ZWwgPSBcInNlY3Rpb25cIjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoICh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcIkwxXCI6XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExldmVsID0gXCJmaXh0dXJlXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJMMlwiOlxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZXZlbCA9IFwic2hlbGZcIjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIkwzXCI6XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExldmVsID0gXCJzZWN0aW9uXCI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJMNFwiOlxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZXZlbCA9IFwic3BvdFwiO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMZXZlbEJ5VGFiKCkge1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcImZpeHR1cmVcIjpcclxuICAgICAgICByZXR1cm4gXCJMMVwiO1xyXG4gICAgICBjYXNlIFwic2VjdGlvblwiOlxyXG4gICAgICAgIHJldHVybiBcIkwzXCI7XHJcbiAgICAgIGNhc2UgXCJzaGVsZlwiOlxyXG4gICAgICAgIHJldHVybiBcIkwyXCI7XHJcbiAgICAgIGNhc2UgXCJzcG90XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiTDRcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRGaXh0dXJlTGV2ZWxGb3JtKCkge1xyXG4gICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFt0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RCcmFuZE5hbWVdLFxyXG4gICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFt0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RCcmFuZE5hbWU/LmZvckVhY2goKGUpID0+IHtcclxuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9XHJcbiAgICAgICAgdGhpcy5icmFuZHNMaXN0XHJcbiAgICAgICAgICAuZmluZCgoYikgPT4gYi5icmFuZE5hbWUgPT09IGUpXHJcbiAgICAgICAgICA/LmNhdGVnb3J5Py5tYXAoKGMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IGMsIHZhbHVlOiBjIH07XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdCA9IFsuLi50aGlzLmNhdGVnb3JpZXNMaXN0LCAuLi5jYXRlZ29yaWVzXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybVxyXG4gICAgICAuZ2V0KFwicHJvZHVjdEJyYW5kTmFtZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodjogc3RyaW5nW10pID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gW107XHJcbiAgICAgICAgdi5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzID1cclxuICAgICAgICAgICAgdGhpcy5icmFuZHNMaXN0XHJcbiAgICAgICAgICAgICAgLmZpbmQoKGIpID0+IGIuYnJhbmROYW1lID09PSBlKVxyXG4gICAgICAgICAgICAgID8uY2F0ZWdvcnk/Lm1hcCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IGMsIHZhbHVlOiBjIH07XHJcbiAgICAgICAgICAgICAgfSkgPz8gW107XHJcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3QsIC4uLmNhdGVnb3JpZXNdO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB2YWxpZENhdGVnb3J5SWRzID0gdGhpcy5jYXRlZ29yaWVzTGlzdD8ubWFwKChjKSA9PiBjLnZhbHVlKSA/PyBbXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2F0U2VsZWN0aW9uID1cclxuICAgICAgICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybT8uZ2V0KFwicHJvZHVjdENhdGVnb3J5XCIpPy52YWx1ZSB8fCBbXTtcclxuICAgICAgICBjb25zdCBuZXdDYXRTZWxlY3Rpb24gPSBjdXJyZW50Q2F0U2VsZWN0aW9uLmZpbHRlcigoaWQ6IGFueSkgPT5cclxuICAgICAgICAgIHZhbGlkQ2F0ZWdvcnlJZHMuaW5jbHVkZXMoaWQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtXHJcbiAgICAgICAgICA/LmdldChcInByb2R1Y3RDYXRlZ29yeVwiKVxyXG4gICAgICAgICAgPy5zZXRWYWx1ZShuZXdDYXRTZWxlY3Rpb24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChjKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSkpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLmZpeHR1cmVMZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdFNlY3Rpb25MZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2VjdGlvbjogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZWN0aW9uR3JvdXBBcnJheSA9IHRoaXMuZ3JvdXBTaGVsdmVzQnlab25lKFxyXG4gICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnID8/IFtdLFxyXG4gICAgKTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXBBcnJheS5mb3JFYWNoKChzLCBpKSA9PiB0aGlzLmFkZFNlY3Rpb24ocywgaSkpO1xyXG5cclxuICAgIGlmIChzZWN0aW9uR3JvdXBBcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5hZGRTZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXMgPSBzZWN0aW9uR3JvdXBBcnJheVxyXG4gICAgICAubWFwKChzZSkgPT4gc2U/LnNoZWx2ZXM/Lm1hcCgocykgPT4gcykpXHJcbiAgICAgIC5mbGF0KCk7XHJcblxyXG4gICAgdGhpcy5zaGVsdmVzTGlzdCA9IHRoaXMuc2hlbHZlc0xpc3QubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICBkaXNhYmxlZDogYWxsU2VjdGlvblNoZWx2ZXM/LmluY2x1ZGVzKGAke2l0ZW0/LnZhbHVlfWApLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWN0aW9uQXJyYXkudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoczogU2VjdGlvbkNvbmZpZ1tdKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXMgPSBzXHJcbiAgICAgICAgICAubWFwKChzZSkgPT4gc2U/LnNoZWx2ZXM/Lm1hcCgocykgPT4gcykpXHJcbiAgICAgICAgICAuZmxhdCgpO1xyXG4gICAgICAgIHRoaXMuc2hlbHZlc0xpc3QgPSB0aGlzLnNoZWx2ZXNMaXN0Lm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IGFsbFNlY3Rpb25TaGVsdmVzPy5pbmNsdWRlcyhgJHtpdGVtPy52YWx1ZX1gKSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQWxsU2hlbHZlc1VzZWRJblNlY3Rpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbHZlc0xpc3QuZmlsdGVyKChzKSA9PiAhcy5kaXNhYmxlZCkubGVuZ3RoIDw9IDA7XHJcbiAgfVxyXG5cclxuICBpbml0U2hlbGZMZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLnNoZWxmTGV2ZWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHNoZWxmOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/LmZvckVhY2goKGUsIGkpID0+XHJcbiAgICAgIHRoaXMuYWRkU2hlbGYoZSwgaSksXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLnNoZWxmTGV2ZWxGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIGluaXRTcG90TGV2ZWxGb3JtKCkge1xyXG4gICAgdGhpcy5zcG90TGV2ZWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJyYW5kOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHByb2R1Y3RDYXRlZ29yeTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHRoaXMuc3BvdExldmVsRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRUYWIodGFiOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMZXZlbCA9IHRhYjtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICB9XHJcblxyXG4gIGdldCBzaGVsZkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGVsZkxldmVsRm9ybS5nZXQoXCJzaGVsZlwiKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VjdGlvbkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9uTGV2ZWxGb3JtLmdldChcInNlY3Rpb25cIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgYWRkU2VjdGlvbihcclxuICAgIHNlY3Rpb24/OiBTZWN0aW9uQ29uZmlnLFxyXG4gICAgaTogbnVtYmVyID0gdGhpcy5zZWN0aW9uQXJyYXkuY29udHJvbHMubGVuZ3RoLFxyXG4gICkge1xyXG4gICAgY29uc3Qgc2VjdGlvbkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHpvbmU6IFtzZWN0aW9uPy56b25lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXV0sXHJcbiAgICAgIHNoZWx2ZXM6IFtzZWN0aW9uPy5zaGVsdmVzID8/IFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW3NlY3Rpb24/LnByb2R1Y3RCcmFuZE5hbWVdLFxyXG4gICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtzZWN0aW9uPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gXCJcIl0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlY3Rpb25BcnJheS5wdXNoKHNlY3Rpb25Hcm91cCk7XHJcblxyXG4gICAgY29uc3QgbWFwSWQgPSBgc2VjdGlvbiR7aX1gO1xyXG4gICAgc2VjdGlvbj8ucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPVxyXG4gICAgICAgIHRoaXMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgLmZpbmQoKGIpID0+IGIuYnJhbmROYW1lID09PSBlKVxyXG4gICAgICAgICAgPy5jYXRlZ29yeT8ubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBjLCB2YWx1ZTogYyB9O1xyXG4gICAgICAgICAgfSkgPz8gW107XHJcbiAgICAgIHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuc2V0KG1hcElkLCBbXHJcbiAgICAgICAgLi4uKHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KG1hcElkKSA/PyBbXSksXHJcbiAgICAgICAgLi4uY2F0ZWdvcmllcyxcclxuICAgICAgXSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2VjdGlvbkxpc3RlbmVyKHNlY3Rpb25Hcm91cCwgbWFwSWQpO1xyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY6IFNoZWxmQ29uZmlnLCBpOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW3NoZWxmPy5wcm9kdWN0QnJhbmROYW1lXSxcclxuICAgICAgcHJvZHVjdENhdGVnb3J5OiBbc2hlbGY/LnByb2R1Y3RDYXRlZ29yeSA/PyBcIlwiXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2hlbGZBcnJheS5wdXNoKHNoZWxmR3JvdXApO1xyXG5cclxuICAgIGNvbnN0IG1hcElkID0gYHNoZWxmJHtpfWA7XHJcbiAgICBzaGVsZj8ucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPVxyXG4gICAgICAgIHRoaXMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgLmZpbmQoKGIpID0+IGIuYnJhbmROYW1lID09PSBlKVxyXG4gICAgICAgICAgPy5jYXRlZ29yeT8ubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBjLCB2YWx1ZTogYyB9O1xyXG4gICAgICAgICAgfSkgPz8gW107XHJcbiAgICAgIHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuc2V0KG1hcElkLCBbXHJcbiAgICAgICAgLi4uKHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KG1hcElkKSA/PyBbXSksXHJcbiAgICAgICAgLi4uY2F0ZWdvcmllcyxcclxuICAgICAgXSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2hlbGZMaXN0ZW5lcihzaGVsZkdyb3VwLCBtYXBJZCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gIH1cclxuXHJcbiAgc2V0dXBTaGVsZkxpc3RlbmVyKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgaTogc3RyaW5nKSB7XHJcbiAgICBzaGVsZkdyb3VwXHJcbiAgICAgIC5nZXQoXCJwcm9kdWN0QnJhbmROYW1lXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChicmFuZHMpID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChpLCBbXSk7XHJcbiAgICAgICAgYnJhbmRzLmZvckVhY2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9XHJcbiAgICAgICAgICAgIHRoaXMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgICAgIC5maW5kKChiKSA9PiBiLmJyYW5kTmFtZSA9PT0gZSlcclxuICAgICAgICAgICAgICA/LmNhdGVnb3J5Py5tYXAoKGMpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBjLCB2YWx1ZTogYyB9O1xyXG4gICAgICAgICAgICAgIH0pID8/IFtdO1xyXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5zZXQoaSwgW1xyXG4gICAgICAgICAgICAuLi4odGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5nZXQoaSkgPz8gW10pLFxyXG4gICAgICAgICAgICAuLi5jYXRlZ29yaWVzLFxyXG4gICAgICAgICAgXSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IGNhdGVnb3J5IHNlbGVjdGlvbiBpZiBwcmV2aW91c2x5IHNlbGVjdGVkIGNhdGVnb3JpZXMgYXJlIG5vIGxvbmdlciB2YWxpZFxyXG4gICAgICAgIGNvbnN0IHZhbGlkQ2F0ZWdvcnlJZHMgPVxyXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcD8uZ2V0KGkpPy5tYXAoKGMpID0+IGMudmFsdWUpID8/IFtdO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDYXRTZWxlY3Rpb24gPVxyXG4gICAgICAgICAgc2hlbGZHcm91cC5nZXQoXCJwcm9kdWN0Q2F0ZWdvcnlcIik/LnZhbHVlIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IG5ld0NhdFNlbGVjdGlvbiA9IGN1cnJlbnRDYXRTZWxlY3Rpb24uZmlsdGVyKChpZDogYW55KSA9PlxyXG4gICAgICAgICAgdmFsaWRDYXRlZ29yeUlkcy5pbmNsdWRlcyhpZCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzaGVsZkdyb3VwXHJcbiAgICAgICAgICAuZ2V0KFwicHJvZHVjdENhdGVnb3J5XCIpXHJcbiAgICAgICAgICA/LnNldFZhbHVlKG5ld0NhdFNlbGVjdGlvbiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgc2hlbGZHcm91cFxyXG4gICAgICAuZ2V0KFwicHJvZHVjdENhdGVnb3J5XCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChjKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldHVwU2VjdGlvbkxpc3RlbmVyKHNlY3Rpb25Hcm91cDogRm9ybUdyb3VwLCBpOiBzdHJpbmcpIHtcclxuICAgIHNlY3Rpb25Hcm91cFxyXG4gICAgICAuZ2V0KFwicHJvZHVjdEJyYW5kTmFtZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoYnJhbmRzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5zZXQoaSwgW10pO1xyXG4gICAgICAgIGJyYW5kcy5mb3JFYWNoKChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPVxyXG4gICAgICAgICAgICB0aGlzLmJyYW5kc0xpc3RcclxuICAgICAgICAgICAgICAuZmluZCgoYikgPT4gYi5icmFuZE5hbWUgPT09IGUpXHJcbiAgICAgICAgICAgICAgPy5jYXRlZ29yeT8ubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBsYWJlbDogYywgdmFsdWU6IGMgfTtcclxuICAgICAgICAgICAgICB9KSA/PyBbXTtcclxuICAgICAgICAgIHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuc2V0KGksIFtcclxuICAgICAgICAgICAgLi4uKHRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KGkpID8/IFtdKSxcclxuICAgICAgICAgICAgLi4uY2F0ZWdvcmllcyxcclxuICAgICAgICAgIF0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBSZXNldCBjYXRlZ29yeSBzZWxlY3Rpb24gaWYgcHJldmlvdXNseSBzZWxlY3RlZCBjYXRlZ29yaWVzIGFyZSBubyBsb25nZXIgdmFsaWRcclxuICAgICAgICBjb25zdCB2YWxpZENhdGVnb3J5SWRzID1cclxuICAgICAgICAgIHRoaXMuY2F0ZWdvcmllc0xpc3RNYXA/LmdldChpKT8ubWFwKChjKSA9PiBjLnZhbHVlKSA/PyBbXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2F0U2VsZWN0aW9uID1cclxuICAgICAgICAgIHNlY3Rpb25Hcm91cC5nZXQoXCJwcm9kdWN0Q2F0ZWdvcnlcIik/LnZhbHVlIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IG5ld0NhdFNlbGVjdGlvbiA9IGN1cnJlbnRDYXRTZWxlY3Rpb24uZmlsdGVyKChpZDogYW55KSA9PlxyXG4gICAgICAgICAgdmFsaWRDYXRlZ29yeUlkcy5pbmNsdWRlcyhpZCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBzZWN0aW9uR3JvdXBcclxuICAgICAgICAgIC5nZXQoXCJwcm9kdWN0Q2F0ZWdvcnlcIilcclxuICAgICAgICAgID8uc2V0VmFsdWUobmV3Q2F0U2VsZWN0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXBcclxuICAgICAgLmdldChcInByb2R1Y3RDYXRlZ29yeVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoYykgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgc2VjdGlvbkdyb3VwXHJcbiAgICAgIC5nZXQoXCJzaGVsdmVzXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChzKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXBcclxuICAgICAgLmdldChcInpvbmVcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTZWN0aW9uKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XHJcbiAgICB0aGlzLnNlY3Rpb25BcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1CeUxldmVsKCkge1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcImZpeHR1cmVcIjpcclxuICAgICAgICByZXR1cm4gdGhpcy5maXh0dXJlTGV2ZWxGb3JtO1xyXG4gICAgICBjYXNlIFwic2VjdGlvblwiOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25MZXZlbEZvcm07XHJcbiAgICAgIGNhc2UgXCJzaGVsZlwiOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNoZWxmTGV2ZWxGb3JtO1xyXG4gICAgICBjYXNlIFwic3BvdFwiOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNwb3RMZXZlbEZvcm07XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZml4dHVyZUxldmVsRm9ybTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZENvbG9yVG9TaGVsdmVzKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbGV2ZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0aGlzLnNlbGVjdGVkTGV2ZWx9LWxldmVsYCk7XHJcbiAgICBpZiAoIWxldmVsKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYm9kaWVzID0gbGV2ZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIuYm9keS1ibG9ja1wiKTtcclxuICAgIGlmICghYm9kaWVzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYm9keUNoaWxkcmVuID0gQXJyYXkuZnJvbShib2RpZXMuY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W107XHJcblxyXG4gICAgY29uc3Qgc2hlbGZEaXZzID0gYm9keUNoaWxkcmVuXHJcblxyXG4gICAgICAubWFwKChkaXYpID0+IHtcclxuICAgICAgICBjb25zdCBsYXN0ID0gZGl2Lmxhc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgcmV0dXJuIGxhc3QgJiYgbGFzdC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZGl2XCJcclxuICAgICAgICAgID8gKGxhc3QgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgICAgICA6IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGQpOiBkIGlzIEhUTUxFbGVtZW50ID0+ICEhZCk7XHJcblxyXG4gICAgaWYgKCFzaGVsZkRpdnMubGVuZ3RoKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpLCAxMDApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcInNlY3Rpb25cIjoge1xyXG4gICAgICAgIHRoaXMuY29uc3RydWN0U2VxdWVudGlhbFNlY3Rpb24oc2hlbGZEaXZzKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbkFycmF5ID1cclxuICAgICAgICAgICh0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LnZhbHVlPy5zZWN0aW9uIGFzIFNlY3Rpb25Db25maWdbXSkgPz8gW107XHJcbiAgICAgICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgIHNlY3Rpb25BcnJheS5mb3JFYWNoKChzZSwgaSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgc2hlbGZJZHMgPVxyXG4gICAgICAgICAgICBzZS5zaGVsdmVzPy5tYXAoKHNoKSA9PiBzaC5yZXBsYWNlKC9cXHMvZywgXCJcIikudG9Mb3dlckNhc2UoKSkgPz8gW107XHJcbiAgICAgICAgICBhbGxTZWN0aW9uU2hlbHZlcy5wdXNoKC4uLnNoZWxmSWRzKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzZWNEaXZzID0gc2hlbGZEaXZzLmZpbHRlcigoaXRlbSkgPT5cclxuICAgICAgICAgICAgc2hlbGZJZHMuaW5jbHVkZXMoaXRlbS5pZCksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgc2VjRGl2cy5mb3JFYWNoKFxyXG4gICAgICAgICAgICAoZCkgPT4gKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZyksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB1bmFzc2lnbmVkU2hlbHZlcyA9IHNoZWxmRGl2cy5maWx0ZXIoXHJcbiAgICAgICAgICAoaXRlbSkgPT4gIWFsbFNlY3Rpb25TaGVsdmVzLmluY2x1ZGVzKGl0ZW0uaWQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdW5hc3NpZ25lZFNoZWx2ZXMuZm9yRWFjaCgoZCkgPT4gKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJ3aGl0ZVwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25Cb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWN0aW9uLWJvZHktYmxvY2tcIik7XHJcbiAgICAgICAgaWYgKHNlY3Rpb25Cb2R5KSB7XHJcbiAgICAgICAgICBsZXQgc2VjdGlvbkdyb3VwSGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWN0aW9uQnlab25lcy5mb3JFYWNoKChzeiwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uSGVpZ2h0ID0gc3ouc2VjdGlvbi5zaGVsZkRpdnMucmVkdWNlKFxyXG4gICAgICAgICAgICAgICAgKGgsIGQpID0+IGggKyAoZD8ub2Zmc2V0SGVpZ2h0ID8/IDApLFxyXG4gICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uV2lkdGggPVxyXG4gICAgICAgICAgICAgICAgc3ouc2VjdGlvbi5zaGVsZkRpdnNbMF0/Lm9mZnNldFdpZHRoID8/IDM0NTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgYmMgPSBzZWN0aW9uQm9keS5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcclxuICAgICAgICAgICAgICAgIGAjYnJhbmQtY2F0ZWdvcnkke2l9YCxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChiYykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VjQmcgPSByZ2JUb0hleChcclxuICAgICAgICAgICAgICAgICAgc3ouc2VjdGlvbi5zaGVsZkRpdnNbMF0/LnN0eWxlLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hlbGZDb2xvcnMuZmluZCgoYykgPT4gYy5iZyA9PT0gc2VjQmcpID8/XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hlbGZDb2xvcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb2xvci5ib3JkZXI7XHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmZmZcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1ggPSAoY3VycmVudFNlY3Rpb25XaWR0aCAtIGJjLm9mZnNldFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1kgPVxyXG4gICAgICAgICAgICAgICAgICAoY3VycmVudFNlY3Rpb25IZWlnaHQgLSBiYy5vZmZzZXRIZWlnaHQpIC8gMiArXHJcbiAgICAgICAgICAgICAgICAgIHNlY3Rpb25Hcm91cEhlaWdodDtcclxuICAgICAgICAgICAgICAgIGJjLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtiY1h9cHgsICR7YmNZfXB4KWA7XHJcblxyXG4gICAgICAgICAgICAgICAgc2VjdGlvbkdyb3VwSGVpZ2h0ICs9IGN1cnJlbnRTZWN0aW9uSGVpZ2h0O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwic2hlbGZcIjpcclxuICAgICAgICBib2R5Q2hpbGRyZW4uZm9yRWFjaCgoZGl2LCBpKSA9PiB7XHJcbiAgICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuXHJcbiAgICAgICAgICBjb25zdCBiYyA9IGRpdi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgI2JyYW5kLWNhdGVnb3J5JHtpfWApO1xyXG4gICAgICAgICAgaWYgKGJjKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJjWCA9IChkaXYub2Zmc2V0V2lkdGggLSBiYy5vZmZzZXRXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgICBjb25zdCBiY1kgPSAoZGl2Lm9mZnNldEhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS5ib3JkZXJDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbaV0uYm9yZGVyO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLnRleHRCZztcclxuICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWH1weCwgJHtiY1l9cHgpYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJmaXh0dXJlXCI6XHJcbiAgICAgIGNhc2UgXCJzcG90XCI6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goXHJcbiAgICAgICAgICAoZCkgPT4gKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1swXS5iZyksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFNlcXVlbnRpYWxTZWN0aW9uKHNoZWxmRGl2czogKEhUTUxFbGVtZW50IHwgbnVsbClbXSkge1xyXG4gICAgY29uc3Qgc2hlbGZDb25maWdzOiBTaGVsZkNvbmZpZ1tdID0gdGhpcy5hcHBseVNlY3Rpb25Db25maWdUb1NoZWx2ZXMoXHJcbiAgICAgIHRoaXMuc2VjdGlvbkxldmVsRm9ybT8udmFsdWU/LnNlY3Rpb24gYXMgU2VjdGlvbkNvbmZpZ1tdLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IG5ld1NlY3Rpb25CeVpvbmVzID0gW107XHJcblxyXG4gICAgbGV0IHBab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcyBvZiBzaGVsZkNvbmZpZ3MpIHtcclxuICAgICAgY29uc3Qgem9uZSA9IHMuem9uZSB8fCBcIlwiO1xyXG4gICAgICBjb25zdCBzaGVsZklkID0gYCR7cy5zaGVsZlR5cGV9JHtzLnNoZWxmTnVtYmVyfWA7XHJcbiAgICAgIGNvbnN0IHNoZWxmRGl2ID0gc2hlbGZEaXZzLmZpbmQoKGQpID0+IGQ/LmlkID09PSBzaGVsZklkKTtcclxuXHJcbiAgICAgIGlmICh6b25lID09PSBcIlwiKSBjb250aW51ZTtcclxuICAgICAgaWYgKHpvbmUgIT09IHBab25lKSB7XHJcbiAgICAgICAgbmV3U2VjdGlvbkJ5Wm9uZXMucHVzaCh7XHJcbiAgICAgICAgICB6b25lLFxyXG4gICAgICAgICAgc2VjdGlvbjoge1xyXG4gICAgICAgICAgICBicmFuZHM6IHMucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogcy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgICAgIHNoZWx2ZXM6IFtzaGVsZklkXSxcclxuICAgICAgICAgICAgc2hlbGZEaXZzOiBbc2hlbGZEaXZdLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBwWm9uZSA9IHpvbmU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IG5ld1NlY3Rpb25CeVpvbmVzW25ld1NlY3Rpb25CeVpvbmVzLmxlbmd0aCAtIDFdLnNlY3Rpb247XHJcbiAgICAgICAgc2VjdGlvbi5zaGVsdmVzLnB1c2goc2hlbGZJZCk7XHJcbiAgICAgICAgc2VjdGlvbi5zaGVsZkRpdnMucHVzaChzaGVsZkRpdik7XHJcblxyXG4gICAgICAgIGlmICghc2VjdGlvbi5icmFuZHMubGVuZ3RoKSBzZWN0aW9uLmJyYW5kcyA9IHM/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW107XHJcbiAgICAgICAgaWYgKCFzZWN0aW9uLmNhdGVnb3JpZXMubGVuZ3RoKVxyXG4gICAgICAgICAgc2VjdGlvbi5jYXRlZ29yaWVzID0gcz8ucHJvZHVjdENhdGVnb3J5ID8/IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWN0aW9uQnlab25lcyA9IFsuLi5uZXdTZWN0aW9uQnlab25lc107XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsbFNoZWxmQWRkVG9TZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbHZlc0xpc3QuZXZlcnkoKHMpID0+IHMuZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGF5bG9hZEJ5TGV2ZWwoc3RhdHVzPzogc3RyaW5nKTogRml4dHVyZVRlbXBsYXRlRGV0YWlscyB8IG51bGwge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybUJ5TGV2ZWwoKTtcclxuICAgIGNvbnN0IGxldmVsID0gdGhpcy5nZXRMZXZlbEJ5VGFiKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBmb3JtLmludmFsaWQgfHxcclxuICAgICAgKHRoaXMuc2VsZWN0ZWRMZXZlbCA9PT0gXCJzZWN0aW9uXCIgJiYgIXRoaXMuaXNBbGxTaGVsZkFkZFRvU2VjdGlvbilcclxuICAgICkge1xyXG4gICAgICBmb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuXHJcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gZm9ybS5pbnZhbGlkXHJcbiAgICAgICAgPyBcIkZvcm0gaXMgaW52YWxpZFwiXHJcbiAgICAgICAgOiBcIkFzc2lnbiBhbGwgc2hlbHZlcyB0byBhIHNlY3Rpb25cIjtcclxuXHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnJvck1zZyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZExldmVsKSB7XHJcbiAgICAgIGNhc2UgXCJmaXh0dXJlXCI6IHtcclxuICAgICAgICBjb25zdCBjb25maWc6IFNoZWxmQ29uZmlnW10gPVxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4ucyxcclxuICAgICAgICAgICAgICB6b25lOiBcIlwiLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAvLyBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFsuLi5mb3JtPy52YWx1ZS5wcm9kdWN0QnJhbmROYW1lXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogWy4uLmZvcm0/LnZhbHVlLnByb2R1Y3RDYXRlZ29yeV0sXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFwic2VjdGlvblwiOiB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnOiBTaGVsZkNvbmZpZ1tdID0gdGhpcy5hcHBseVNlY3Rpb25Db25maWdUb1NoZWx2ZXMoXHJcbiAgICAgICAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LnZhbHVlPy5zZWN0aW9uIGFzIFNlY3Rpb25Db25maWdbXSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMhLFxyXG4gICAgICAgICAgLy8gc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBbXSxcclxuICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFwic2hlbGZcIjoge1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZzogU2hlbGZDb25maWdbXSA9XHJcbiAgICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKHMsIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAuLi5zLFxyXG4gICAgICAgICAgICAgIHpvbmU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogZm9ybT8udmFsdWU/LnNoZWxmW2ldPy5wcm9kdWN0QnJhbmROYW1lID8/IFtdLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogZm9ybT8udmFsdWU/LnNoZWxmW2ldPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAvLyBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgICAgc2hlbGZDb25maWc6IGNvbmZpZyxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgXCJzcG90XCI6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAvLyBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBzdWJtaXRGb3JtKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBwYXlsb2FkOiBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzIHwgbnVsbCA9IHRoaXMuZ2V0UGF5bG9hZEJ5TGV2ZWwoKTtcclxuICAgIGlmICghcGF5bG9hZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJlcSA9IHtcclxuICAgICAgZml4dHVyZUlkOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMuX2lkLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgLi4ucGF5bG9hZCxcclxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgLi4uKHRoaXMuaXNSb2xsb3V0ICYmIHsgaXNNZXJjaEVkaXRlZDogdHJ1ZSB9KSxcclxuICAgICAgfSxcclxuICAgICAgLi4uKCF0aGlzLmZpeHR1cmVEYXRhPy50YXNrVHlwZSAmJiAhdGhpcy5pc1JvbGxvdXRcclxuICAgICAgICA/IHsgZWRpdE1vZGU6IHRoaXMuaXNFZGl0TW9kZSwgcmV2ZXJ0T25FZGl0OiB0aGlzLnJldmVydE9uRWRpdCB9XHJcbiAgICAgICAgOiB7fSksXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVTdG9yZUZpeHR1cmUocmVxKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5pZCkge1xyXG4gICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRml4dHVyZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGVtcGxhdGUgaXMgY3JlYXRlZCA8YSBocmVmPSdtYW5hZ2UvcGxhbm9ncmFtL2ZpeHR1cmUtdGVtcGxhdGUvYmFzaWMtZGV0YWlscz90ZW1wbGF0ZUlkPSR7cmVzLmRhdGEuaWR9JmlzRWRpdD1mYWxzZSc+VmlldzwvYT5gO1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QobWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFwiRml4dHVyZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXCJGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5XCIpXHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpXHJcbiAgICAgICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRydWUpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBncm91cFNoZWx2ZXNCeVpvbmUoaW5wdXQ6IFNoZWxmQ29uZmlnW10pOiBTZWN0aW9uQ29uZmlnW10ge1xyXG4gICAgY29uc3Qgem9uZU1hcDogeyBbem9uZTogc3RyaW5nXTogU2VjdGlvbkNvbmZpZyB9ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0KSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBpdGVtPy56b25lID8/IFwiXCI7XHJcbiAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtpdGVtLnNoZWxmVHlwZX0gJHtpdGVtLnNoZWxmTnVtYmVyfWA7XHJcblxyXG4gICAgICBpZiAoem9uZSA9PT0gXCJcIikgY29udGludWU7XHJcblxyXG4gICAgICBpZiAoIXpvbmVNYXBbem9uZV0pIHtcclxuICAgICAgICB6b25lTWFwW3pvbmVdID0ge1xyXG4gICAgICAgICAgc2hlbHZlczogW10sXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOlxyXG4gICAgICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDNcIlxyXG4gICAgICAgICAgICAgID8gaXRlbS5wcm9kdWN0QnJhbmROYW1lXHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTpcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwzXCJcclxuICAgICAgICAgICAgICA/IGl0ZW0ucHJvZHVjdENhdGVnb3J5XHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgem9uZU1hcFt6b25lXT8uc2hlbHZlcz8ucHVzaChzaGVsZkxhYmVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh6b25lTWFwKTtcclxuICB9XHJcblxyXG4gIGFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyhzZWN0aW9uczogU2VjdGlvbkNvbmZpZ1tdKTogU2hlbGZDb25maWdbXSB7XHJcbiAgICBjb25zdCBzZWN0aW9uTWFwID0gbmV3IE1hcDxcclxuICAgICAgc3RyaW5nLFxyXG4gICAgICBQaWNrPFNlY3Rpb25Db25maWcsIFwiem9uZVwiIHwgXCJwcm9kdWN0QnJhbmROYW1lXCIgfCBcInByb2R1Y3RDYXRlZ29yeVwiPlxyXG4gICAgPigpO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xyXG4gICAgICBmb3IgKGNvbnN0IHNoZWxmTGFiZWwgb2Ygc2VjdGlvbi5zaGVsdmVzISkge1xyXG4gICAgICAgIHNlY3Rpb25NYXAuc2V0KHNoZWxmTGFiZWwsIHtcclxuICAgICAgICAgIHpvbmU6IHNlY3Rpb24uem9uZSxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IHNlY3Rpb24ucHJvZHVjdEJyYW5kTmFtZSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogc2VjdGlvbi5wcm9kdWN0Q2F0ZWdvcnksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBvdmVycmlkZXMgdG8gbWF0Y2hpbmcgc2hlbHZlc1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzaGVsZikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtzaGVsZi5zaGVsZlR5cGV9ICR7c2hlbGYuc2hlbGZOdW1iZXJ9YDtcclxuICAgICAgICBjb25zdCBvdmVycmlkZSA9IHNlY3Rpb25NYXAuZ2V0KHNoZWxmTGFiZWwpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uc2hlbGYsXHJcbiAgICAgICAgICB6b25lOiBvdmVycmlkZT8uem9uZSB8fCBcIlwiLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogb3ZlcnJpZGU/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IG92ZXJyaWRlPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgfSkgPz8gW11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgbGV0IGRhdGEgPVxyXG4gICAgICB0aGlzLnNlbGVjdGVkTGV2ZWwgPT0gXCJmaXh0dXJlXCJcclxuICAgICAgICA/IHRoaXMuZml4dHVyZUxldmVsRm9ybS52YWx1ZVxyXG4gICAgICAgIDogdGhpcy5zZWxlY3RlZExldmVsID09IFwic2VjdGlvblwiXHJcbiAgICAgICAgICA/IHRoaXMuc2VjdGlvbkxldmVsRm9ybT8udmFsdWVcclxuICAgICAgICAgIDogdGhpcy5zZWxlY3RlZExldmVsID09IFwic2hlbGZcIlxyXG4gICAgICAgICAgICA/IHRoaXMuc2hlbGZMZXZlbEZvcm0/LnZhbHVlXHJcbiAgICAgICAgICAgIDogdGhpcy5zcG90TGV2ZWxGb3JtPy52YWx1ZTtcclxuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdChkYXRhKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJmaXh0dXJlLXRlbXBsYXRlLXByb2R1Y3RzXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiPlxyXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1MZWZ0IENvbHVtbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiIHN0eWxlPVwibWF4LXdpZHRoOiAzODBweDtcIj5cclxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIGN1c3RvbS10YWJzIGQtZmxleFwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZSB8fCB6b25lRWRpdE1vZGVcIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBmbGV4LWZpbGxcIiAqbmdGb3I9XCJsZXQgbGlicmFyeSBvZiBbJ2JyYW5kJywgJ3Byb2R1Y3QnXVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1saW5rIHctMTAwXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZExpYnJhcnkgPT09IGxpYnJhcnlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRMaWJyYXJ5ID0gbGlicmFyeVwiIFthdHRyLmFyaWEtY3VycmVudF09XCJzZWxlY3RlZExpYnJhcnkgPT09IGxpYnJhcnkgPyAncGFnZScgOiBudWxsXCI+XHJcbiAgICAgICAgICAgIHt7IGxpYnJhcnkgfCB0aXRsZWNhc2UgfX0gTGlicmFyeVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgPC91bD5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZExpYnJhcnkgPT09ICdicmFuZCdcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCAhPT0gJ3Nwb3QnXCI+XHJcbiAgICAgICAgICA8aDI+QWRkIHByb2R1Y3RzIGJ5IGJyYW5kIGxldmVsPC9oMj5cclxuICAgICAgICAgIDxwPlBsYWNlIHRoZSBwcm9kdWN0IGJyYW5kIGluIHRoZSBkZXNpZ25hdGVkIHBsYWNlbWVudCBhcmVhLjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEZpeHR1cmUgbGV2ZWwgd2l0aGluIEJyYW5kIExpYnJhcnkgIC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZml4dHVyZUxldmVsRm9ybVwiICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ2ZpeHR1cmUnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcm9kdWN0QnJhbmROYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5CcmFuZDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duIFtpdGVtc109XCJicmFuZHNMaXN0XCIgW2lkRmllbGRdPVwiJ2JyYW5kTmFtZSdcIiBbbmFtZUZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBicmFuZHMnXCIgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdEJyYW5kTmFtZVwiXHJcbiAgICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCI+PC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnRvdWNoZWQgJiYgZml4dHVyZUxldmVsRm9ybS5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZml4dHVyZUxldmVsRm9ybS5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgcHJvZHVjdCBicmFuZFxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHJvZHVjdENhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5Qcm9kdWN0IGNhdGVnb3J5PC9sYWJlbD5cclxuICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24gW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtpdGVtc109XCJjYXRlZ29yaWVzTGlzdFwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgY2F0ZWdvcmllcydcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuXHJcbiAgICAgICAgPCEtLSBTZWN0aW9uIGxldmVsIHdpdGhpbiBCcmFuZCBMaWJyYXJ5IC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2VjdGlvbkxldmVsRm9ybVwiICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3NlY3Rpb24nXCI+XHJcbiAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzZWN0aW9uXCIgY2xhc3M9XCJhcnJheS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2Ygc2VjdGlvbkFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXJyYXktY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7ICdib3JkZXItY29sb3InOiBzaGVsZkNvbG9yc1tpXS5iZyB9XCIgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TRUNUSU9OIHt7IGkgKyAxIH19PC9oNj5cclxuICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlIHx8IHpvbmVFZGl0TW9kZVwiICpuZ0lmPVwiaSAhPT0gMFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiAoY2xpY2spPVwicmVtb3ZlU2VjdGlvbihpKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlNlY3Rpb24gbGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImxhYmVsXCIgZm9ybUNvbnRyb2xOYW1lPVwiem9uZVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY3Rpb24uZ2V0KCd6b25lJyk/LnRvdWNoZWQgJiYgc2VjdGlvbi5nZXQoJ3pvbmUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3pvbmUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj4gU2VjdGlvbiBuYW1lIGlzXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQuIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VjdGlvbiBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcignbm90VW5pcXVlJylcIj4gRHVwbGljYXRlIHNlY3Rpb24gbmFtZS5cclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cInpvbmVFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNoZWx2ZXNcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBpY2sgdGhlIHNoZWxmKHMpIGZvciBzZWN0aW9uIHt7IGkgKyAxIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duIFtpdGVtc109XCJzaGVsdmVzTGlzdFwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaGVsdmVzXCIgW3NlYXJjaF09XCJ0cnVlXCI+PC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY3Rpb24uZ2V0KCdzaGVsdmVzJyk/LnRvdWNoZWQgJiYgc2VjdGlvbi5nZXQoJ3NoZWx2ZXMnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3NoZWx2ZXMnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj4gUGljayB0aGUgc2hlbGYocylcclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHJvZHVjdEJyYW5kTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+QnJhbmQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24gW2l0ZW1zXT1cImJyYW5kc0xpc3RcIiBbaWRGaWVsZF09XCInYnJhbmROYW1lJ1wiIFtuYW1lRmllbGRdPVwiJ2JyYW5kTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0QnJhbmROYW1lXCIgW3NlYXJjaF09XCJ0cnVlXCI+PC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udG91Y2hlZCAmJiBzZWN0aW9uLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgcHJvZHVjdCBicmFuZFxyXG4gICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cInpvbmVFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UHJvZHVjdCBjYXRlZ29yeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93biBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNhdGVnb3JpZXNMaXN0TWFwLmdldCgnc2VjdGlvbicgKyBpKSA/PyBbXVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbXQtNFwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJ6b25lRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICBpc0FsbFNoZWx2ZXNVc2VkSW5TZWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgICA/ICdBbGwgc2hlbHZlcyBhcmUgYXNzaWduZWQuIE5vIHNoZWx2ZXMgYXZhaWxhYmxlIGZvciBuZXcgc2VjdGlvbnMuJ1xyXG4gICAgICAgICAgICAgICAgICA6ICdZb3UgY2Fubm90IGNyZWF0ZSBtb3JlIHNlY3Rpb25zIHRoYW4gdGhlIHRvdGFsIHNoZWx2ZXMgYXZhaWxhYmxlLidcclxuICAgICAgICAgICAgICBcIiBbZGlzYWJsZVRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uQXJyYXkubGVuZ3RoIDwgKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgJiYgIWlzQWxsU2hlbHZlc1VzZWRJblNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHNlY3Rpb25BcnJheS5sZW5ndGggPj0gKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgfHwgaXNBbGxTaGVsdmVzVXNlZEluU2VjdGlvbnNcclxuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtZW5kXCIgKGNsaWNrKT1cImFkZFNlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgQWRkIHNlY3Rpb25cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICA8IS0tIFNoZWxmIGxldmVsIHdpdGhpbiBCcmFuZCBMaWJyYXJ5IC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2hlbGZMZXZlbEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzaGVsZidcIj5cclxuICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInNoZWxmXCIgY2xhc3M9XCJhcnJheS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiYXJyYXktY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7ICdib3JkZXItY29sb3InOiBzaGVsZkNvbG9yc1tpXS5iZyB9XCIgLS0+XHJcbiAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TSEVMRiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RCcmFuZE5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkJyYW5kPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duIFtpdGVtc109XCJicmFuZHNMaXN0XCIgW2lkRmllbGRdPVwiJ2JyYW5kTmFtZSdcIiBbbmFtZUZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdEJyYW5kTmFtZVwiIFtzZWFyY2hdPVwidHJ1ZVwiPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInNoZWxmLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy50b3VjaGVkICYmIHNoZWxmLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IHByb2R1Y3QgYnJhbmRcclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UHJvZHVjdCBjYXRlZ29yeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93biBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNhdGVnb3JpZXNMaXN0TWFwLmdldCgnc2hlbGYnICsgaSkgPz8gW11cIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIj48L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICA8IS0tIFNwb3QgbGV2ZWwgd2l0aGluIEJyYW5kIExpYnJhcnkgLS0+XHJcbiAgICAgICAgPCEtLSA8Zm9ybSBbZm9ybUdyb3VwXT1cInNwb3RMZXZlbEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzcG90J1wiPlNwb3QgbGV2ZWwgRm9ybTwvZm9ybT4gLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzcG90J1wiXHJcbiAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiIHN0eWxlPVwiaGVpZ2h0OiA1MHZoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMzcgMzdMMzIuNjUgMzIuNjVNMzUgMjdDMzUgMzEuNDE4MyAzMS40MTgzIDM1IDI3IDM1QzIyLjU4MTcgMzUgMTkgMzEuNDE4MyAxOSAyN0MxOSAyMi41ODE3IDIyLjU4MTcgMTkgMjcgMTlDMzEuNDE4MyAxOSAzNSAyMi41ODE3IDM1IDI3WlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJtdC01IG1iLTJcIj5Db21pbmcgc29vbjwvaDM+XHJcbiAgICAgICAgICA8cD5UaGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSB5ZXQuPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gQ29taW5nIHNvb24gZm9yIGFsbCBsZXZlbHMgLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZExpYnJhcnkgPT09ICdwcm9kdWN0J1wiXHJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gdy0xMDAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXIgbXQtNVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIgLz5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNMzcgMzdMMzIuNjUgMzIuNjVNMzUgMjdDMzUgMzEuNDE4MyAzMS40MTgzIDM1IDI3IDM1QzIyLjU4MTcgMzUgMTkgMzEuNDE4MyAxOSAyN0MxOSAyMi41ODE3IDIyLjU4MTcgMTkgMjcgMTlDMzEuNDE4MyAxOSAzNSAyMi41ODE3IDM1IDI3WlwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aDMgY2xhc3M9XCJtdC01IG1iLTJcIj5Db21pbmcgc29vbjwvaDM+XHJcbiAgICAgICAgPHA+VGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgeWV0LiBTdGFydCBhZGRpbmcgcHJvZHVjdCBmcm9tIGJyYW5kIGxpYnJhcnk8L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1SaWdodCBDb2x1bW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2xcIj5cclxuICAgICAgPGg2PlByb2R1Y3QgYnJhbmQgcGxhY2VtZW50czwvaDY+XHJcblxyXG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgZC1mbGV4IG10LTRcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGUgfHwgem9uZUVkaXRNb2RlXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCIgKm5nRm9yPVwibGV0IGxldmVsIG9mIFsnZml4dHVyZScsICdzZWN0aW9uJywgJ3NoZWxmJywgJ3Nwb3QnXVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1saW5rIHctMTAwXCIgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZExldmVsID09PSBsZXZlbFwiIChjbGljayk9XCJzZXRUYWIobGV2ZWwpXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cInNlbGVjdGVkTGV2ZWwgPT09IGxldmVsID8gJ3BhZ2UnIDogbnVsbFwiPlxyXG4gICAgICAgICAgICB7eyBsZXZlbCB8IHRpdGxlY2FzZSB9fSBsZXZlbFxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgPC91bD5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExldmVsID09PSAnZml4dHVyZSdcIj5cclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1sZXZlbFwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgIDwhLS0gVmVydGljYWwgYXJyb3dzIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgdXBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy52YWx1ZSB9fXt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnVuaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgZG93blwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPCEtLSBIb3Jpem9udGFsIGFycm93cyAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uQXJyb3dzO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhbGwtdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgICA8IS0tIEhlYWRlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBCb2R5IGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCIoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lmxlbmd0aCA/PyAwKSA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJicmFuZC1jYXRlZ29yeVwiIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZT8ubGVuZ3RoXCIgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGIgb2YgZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgZHJhZnQgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2hlbGZDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSd0cmF5Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnRyYXlSb3dzKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52bW9ubHktcGxhY2Vob2xkZXJdPVwiaXRlbS5zaGVsZlR5cGUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3NlY3Rpb24nXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInNlY3Rpb24tbGV2ZWxcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8IS0tIFZlcnRpY2FsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRpbWVuc2lvbkFycm93czsgY29udGV4dDogeyB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FsbC12aWV3cG9ydFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICAgICAgICAgICAgICA8cD57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsIH19PC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEJvZHkgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiBpZD1cInNlY3Rpb24tYm9keS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGlkPVwiYm9keS1sb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWN0aW9uQnlab25lczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidicmFuZC1jYXRlZ29yeScgKyAkaW5kZXhcIiBjbGFzcz1cImJyYW5kLWNhdGVnb3J5XCIgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGRyYWZ0IG1lLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uem9uZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmJyYW5kcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGIgb2YgaXRlbT8uc2VjdGlvbj8uYnJhbmRzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM/Lmxlbmd0aFwiIGNsYXNzPVwic2VwYXJhdG9yXCI+IC0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGMgb2YgaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYiBvZiBpdGVtPy5zZWN0aW9uPy5icmFuZHM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYyBvZiBpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2hlbGZDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBbTk9URV0gYmVsb3cgYmxvY2sgaXMgaWRlbnRpZmllZCBieSB0aGUgZnVuY3Rpb24gdXNpbmcgJ2xhc3RFbGVtZW50JyBnZXR0ZXIgaW4gRE9NIG1hbmlwdWxhdGlvbi4gXHJcbiAgICAgICAgICAgICAgICAgIFNvIGtlZXAgdGhpcyBibG9jayBhbHdheXMgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG5nRm9yIGxvb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIEBpZihpdGVtLnNoZWxmVHlwZSA9PT0ndHJheScpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlICsgKGkgKyAxKVwiIGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS50cmF5Um93cylcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdCBoaWRlLXByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSEgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9jayBzaGVsZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudm1vbmx5LXBsYWNlaG9sZGVyXT1cIml0ZW0uc2hlbGZUeXBlID09PSd2bW9ubHknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdCBoaWRlLXByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBGb290ZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzaGVsZidcIj5cclxuICAgICAgICA8ZGl2IGlkPVwic2hlbGYtbGV2ZWxcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8IS0tIFZlcnRpY2FsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRpbWVuc2lvbkFycm93czsgY29udGV4dDogeyB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FsbC12aWV3cG9ydFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEJvZHkgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cIihmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/IDApID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2hlbGZDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCInYnJhbmQtY2F0ZWdvcnknICsgaVwiIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGIgb2Ygc2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiIGNsYXNzPVwic2VwYXJhdG9yXCI+IC1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYiBvZiBzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2JyYW5kQ2F0ZWdvcnlUb29sdGlwPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+QnJhbmRzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFtOT1RFXSBiZWxvdyBibG9jayBpcyBpZGVudGlmaWVkIGJ5IHRoZSBmdW5jdGlvbiB1c2luZyAnbGFzdEVsZW1lbnQnIGdldHRlciBpbiBET00gbWFuaXB1bGF0aW9uLiBcclxuICAgICAgICAgICAgICAgICAgU28ga2VlcCB0aGlzIGJsb2NrIGFsd2F5cyBhdCB0aGUgYm90dG9tIG9mIHRoaXMgbmdGb3IgbG9vcCAtLT5cclxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSd0cmF5Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnRyYXlSb3dzKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52bW9ubHktcGxhY2Vob2xkZXJdPVwiaXRlbS5zaGVsZlR5cGUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3Nwb3QnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICBzdHlsZT1cImhlaWdodDogNTB2aFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTM3IDM3TDMyLjY1IDMyLjY1TTM1IDI3QzM1IDMxLjQxODMgMzEuNDE4MyAzNSAyNyAzNUMyMi41ODE3IDM1IDE5IDMxLjQxODMgMTkgMjdDMTkgMjIuNTgxNyAyMi41ODE3IDE5IDI3IDE5QzMxLjQxODMgMTkgMzUgMjIuNTgxNyAzNSAyN1pcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibXQtNSBtYi0yXCI+Q29taW5nIHNvb248L2gzPlxyXG4gICAgICAgICAgPHA+VGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgeWV0LiBUcnkgRml4dHVyZSwgU2VjdGlvbiwgYW5kIFNoZWxmIGxldmVsczwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSA8ZGl2IGlkPVwic3BvdC1sZXZlbFwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZSB9fXt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udW5pdCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhbGwtdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhlYWRlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICB7eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCIoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lmxlbmd0aCA/PyAwKSA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSdzaGVsZicpe1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdCBoaWRlLXByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0IGhpZGUtcHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjxzZWN0aW9uIGlkPVwiZml4dHVyZS10ZW1wbGF0ZS1wcm9kdWN0cy1za2VsZXRvblwiICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48IS0tIENvbW1vbiBkaW1lbnNpb24gYXJyb3dzIC0tPlxyXG48bmctdGVtcGxhdGUgI2RpbWVuc2lvbkFycm93cyBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC12YWx1ZT1cInZhbHVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhvcml6b250YWwtZGltZW5zaW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgbGVmdFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgPHNwYW4+e3sgdmFsdWUgfX0ge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy51bml0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgcmlnaHRcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|