tango-app-ui-store-builder 1.2.8 → 1.2.10
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/manage-store-plano/manage-store-plano.component.mjs +34 -12
- package/esm2022/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.mjs +90 -8
- package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +3 -3
- package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +19 -3
- package/esm2022/lib/components/plano-tools/allow-edit/allow-edit.component.mjs +14 -4
- package/esm2022/lib/components/plano-tools/delete-floor/delete-floor.component.mjs +252 -0
- package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +8 -3
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +21 -5
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +5 -4
- package/esm2022/lib/components/popups/publish-plano-modal/publish-plano-modal.component.mjs +10 -4
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +9 -2
- package/esm2022/lib/interfaces/planogram.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +12 -3
- package/esm2022/lib/tango-store-builder-routing.module.mjs +6 -1
- package/esm2022/lib/tango-store-builder.module.mjs +4 -1
- package/fesm2022/tango-app-ui-store-builder.mjs +462 -41
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +3 -1
- package/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.d.ts +14 -1
- package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +2 -0
- package/lib/components/plano-tools/allow-edit/allow-edit.component.d.ts +2 -0
- package/lib/components/plano-tools/delete-floor/delete-floor.component.d.ts +85 -0
- package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +2 -0
- package/lib/components/planogram/plano-overview/plano-overview.component.d.ts +1 -0
- package/lib/components/popups/publish-plano-modal/publish-plano-modal.component.d.ts +2 -0
- package/lib/interfaces/planogram.interface.d.ts +1 -0
- package/lib/services/store-builder.service.d.ts +15 -2
- package/lib/tango-store-builder.module.d.ts +59 -58
- package/package.json +1 -1
|
@@ -9,6 +9,7 @@ export class AllowEditComponent {
|
|
|
9
9
|
sbs;
|
|
10
10
|
gs;
|
|
11
11
|
clientId;
|
|
12
|
+
taskType = 'fixture';
|
|
12
13
|
storeOptions = [];
|
|
13
14
|
initialStores = [];
|
|
14
15
|
selectedStores = [];
|
|
@@ -45,6 +46,14 @@ export class AllowEditComponent {
|
|
|
45
46
|
}
|
|
46
47
|
});
|
|
47
48
|
}
|
|
49
|
+
onTaskTypeChange() {
|
|
50
|
+
this.selectedStores = [];
|
|
51
|
+
this.initialStores = [];
|
|
52
|
+
this.fixtureWise = false;
|
|
53
|
+
this.fixtureNumbers = [];
|
|
54
|
+
this.selectedFixtures.clear();
|
|
55
|
+
this.message = '';
|
|
56
|
+
}
|
|
48
57
|
onStoresSelected(stores) {
|
|
49
58
|
this.selectedStores = stores;
|
|
50
59
|
this.fixtureNumbers = [];
|
|
@@ -68,7 +77,7 @@ export class AllowEditComponent {
|
|
|
68
77
|
return;
|
|
69
78
|
let storeName = this.selectedStores[0].label;
|
|
70
79
|
this.isLoading = true;
|
|
71
|
-
this.sbs.getFixtureNumbersByStore(storeName, this.clientId).subscribe({
|
|
80
|
+
this.sbs.getFixtureNumbersByStore(storeName, this.clientId, this.taskType).subscribe({
|
|
72
81
|
next: (res) => {
|
|
73
82
|
this.fixtureNumbers = res?.data || [];
|
|
74
83
|
this.isLoading = false;
|
|
@@ -113,6 +122,7 @@ export class AllowEditComponent {
|
|
|
113
122
|
let payload = {
|
|
114
123
|
storeNames: this.selectedStores.map((s) => s.label),
|
|
115
124
|
clientId: this.clientId,
|
|
125
|
+
taskType: this.taskType,
|
|
116
126
|
};
|
|
117
127
|
if (this.fixtureWise) {
|
|
118
128
|
payload.fixtureNumbers = Array.from(this.selectedFixtures);
|
|
@@ -140,10 +150,10 @@ export class AllowEditComponent {
|
|
|
140
150
|
this.destroy$.complete();
|
|
141
151
|
}
|
|
142
152
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AllowEditComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AllowEditComponent, selector: "lib-allow-edit", ngImport: i0, template: "<section class=\"allow-edit p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n <h5 class=\"mb-3\">Allow Edit Without Removing Response</h5>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Store</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <!-- Fixture Wise Checkbox -->\r\n <div class=\"mb-3 d-flex align-items-center gap-2\">\r\n <input type=\"checkbox\" class=\"form-check-input\" id=\"fixtureWise\"\r\n [(ngModel)]=\"fixtureWise\" (change)=\"onFixtureWiseChange()\"\r\n [disabled]=\"selectedStores.length !== 1\">\r\n <label class=\"form-check-label\" for=\"fixtureWise\">Fixture Wise</label>\r\n @if (selectedStores.length > 1) {\r\n <span class=\"text-muted small\">(Select only one store to enable)</span>\r\n }\r\n </div>\r\n\r\n <!-- Fixture Selection -->\r\n @if (fixtureWise && selectedStores.length === 1) {\r\n <div class=\"mb-3\">\r\n @if (isLoading) {\r\n <div class=\"text-muted\">Loading fixtures...</div>\r\n } @else if (fixtureNumbers.length === 0) {\r\n <div class=\"text-muted\">No fixtures found for this store.</div>\r\n } @else {\r\n <label class=\"form-label\">Select Fixtures</label>\r\n <div class=\"fixture-list\">\r\n <div class=\"fixture-item\" (click)=\"selectAllFixtures()\">\r\n <input type=\"checkbox\" class=\"form-check-input\"\r\n [checked]=\"isAllSelected\" readonly>\r\n <span class=\"fw-semibold\">Select All</span>\r\n </div>\r\n @for (num of fixtureNumbers; track num) {\r\n <div class=\"fixture-item\" (click)=\"toggleFixture(num)\">\r\n <input type=\"checkbox\" class=\"form-check-input\"\r\n [checked]=\"isFixtureSelected(num)\" readonly>\r\n <span>Fixture {{ num }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Submit -->\r\n <button class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n [disabled]=\"isSubmitting || selectedStores.length === 0 || (fixtureWise && (selectedStores.length > 1 || selectedFixtures.size === 0))\">\r\n {{ isSubmitting ? '
|
|
153
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AllowEditComponent, selector: "lib-allow-edit", ngImport: i0, template: "<section class=\"allow-edit p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n <h5 class=\"mb-3\">Allow Edit Without Removing Response</h5>\r\n\r\n <!-- Task Type -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-block\">Task Type</label>\r\n <div class=\"d-flex gap-3\">\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"taskTypeFixture\"\r\n name=\"taskType\" value=\"fixture\"\r\n [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n <label class=\"form-check-label\" for=\"taskTypeFixture\">Fixture Verification</label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"taskTypeZone\"\r\n name=\"taskType\" value=\"zoneVerification\"\r\n [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n <label class=\"form-check-label\" for=\"taskTypeZone\">Zone Verification</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Store</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <!-- Fixture Wise Checkbox -->\r\n <div class=\"mb-3 d-flex align-items-center gap-2\">\r\n <input type=\"checkbox\" class=\"form-check-input\" id=\"fixtureWise\"\r\n [(ngModel)]=\"fixtureWise\" (change)=\"onFixtureWiseChange()\"\r\n [disabled]=\"selectedStores.length !== 1\">\r\n <label class=\"form-check-label\" for=\"fixtureWise\">Fixture Wise</label>\r\n @if (selectedStores.length > 1) {\r\n <span class=\"text-muted small\">(Select only one store to enable)</span>\r\n }\r\n </div>\r\n\r\n <!-- Fixture Selection -->\r\n @if (fixtureWise && selectedStores.length === 1) {\r\n <div class=\"mb-3\">\r\n @if (isLoading) {\r\n <div class=\"text-muted\">Loading fixtures...</div>\r\n } @else if (fixtureNumbers.length === 0) {\r\n <div class=\"text-muted\">No fixtures found for this store.</div>\r\n } @else {\r\n <label class=\"form-label\">Select Fixtures</label>\r\n <div class=\"fixture-list\">\r\n <div class=\"fixture-item\" (click)=\"selectAllFixtures()\">\r\n <input type=\"checkbox\" class=\"form-check-input\"\r\n [checked]=\"isAllSelected\" readonly>\r\n <span class=\"fw-semibold\">Select All</span>\r\n </div>\r\n @for (num of fixtureNumbers; track num) {\r\n <div class=\"fixture-item\" (click)=\"toggleFixture(num)\">\r\n <input type=\"checkbox\" class=\"form-check-input\"\r\n [checked]=\"isFixtureSelected(num)\" readonly>\r\n <span>Fixture {{ num }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Submit -->\r\n <button class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n [disabled]=\"isSubmitting || selectedStores.length === 0 || (fixtureWise && (selectedStores.length > 1 || selectedFixtures.size === 0))\">\r\n {{ isSubmitting ? 'Unlocking...' : 'Unlock Edit' }}\r\n </button>\r\n\r\n <!-- Message -->\r\n @if (message) {\r\n <div class=\"mt-3 alert\" [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\">\r\n {{ message }}\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n", styles: [".allow-edit .fixture-list{border:1px solid #d0d5dd;border-radius:8px;max-height:250px;overflow-y:auto}.allow-edit .fixture-item{display:flex;align-items:center;gap:10px;padding:8px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.allow-edit .fixture-item:hover{background-color:#f9fafb}.allow-edit .fixture-item:not(:last-child){border-bottom:1px solid #f2f4f7}\n"], dependencies: [{ kind: "directive", type: i3.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: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.StoreSelectComponent, selector: "lib-store-select", inputs: ["options", "initialSelected", "singleSelect"], outputs: ["selectedChange"] }] });
|
|
144
154
|
}
|
|
145
155
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AllowEditComponent, decorators: [{
|
|
146
156
|
type: Component,
|
|
147
|
-
args: [{ selector: 'lib-allow-edit', template: "<section class=\"allow-edit p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n <h5 class=\"mb-3\">Allow Edit Without Removing Response</h5>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Store</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <!-- Fixture Wise Checkbox -->\r\n <div class=\"mb-3 d-flex align-items-center gap-2\">\r\n <input type=\"checkbox\" class=\"form-check-input\" id=\"fixtureWise\"\r\n [(ngModel)]=\"fixtureWise\" (change)=\"onFixtureWiseChange()\"\r\n [disabled]=\"selectedStores.length !== 1\">\r\n <label class=\"form-check-label\" for=\"fixtureWise\">Fixture Wise</label>\r\n @if (selectedStores.length > 1) {\r\n <span class=\"text-muted small\">(Select only one store to enable)</span>\r\n }\r\n </div>\r\n\r\n <!-- Fixture Selection -->\r\n @if (fixtureWise && selectedStores.length === 1) {\r\n <div class=\"mb-3\">\r\n @if (isLoading) {\r\n <div class=\"text-muted\">Loading fixtures...</div>\r\n } @else if (fixtureNumbers.length === 0) {\r\n <div class=\"text-muted\">No fixtures found for this store.</div>\r\n } @else {\r\n <label class=\"form-label\">Select Fixtures</label>\r\n <div class=\"fixture-list\">\r\n <div class=\"fixture-item\" (click)=\"selectAllFixtures()\">\r\n <input type=\"checkbox\" class=\"form-check-input\"\r\n [checked]=\"isAllSelected\" readonly>\r\n <span class=\"fw-semibold\">Select All</span>\r\n </div>\r\n @for (num of fixtureNumbers; track num) {\r\n <div class=\"fixture-item\" (click)=\"toggleFixture(num)\">\r\n <input type=\"checkbox\" class=\"form-check-input\"\r\n [checked]=\"isFixtureSelected(num)\" readonly>\r\n <span>Fixture {{ num }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Submit -->\r\n <button class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n [disabled]=\"isSubmitting || selectedStores.length === 0 || (fixtureWise && (selectedStores.length > 1 || selectedFixtures.size === 0))\">\r\n {{ isSubmitting ? '
|
|
157
|
+
args: [{ selector: 'lib-allow-edit', template: "<section class=\"allow-edit p-3\">\r\n <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n <h5 class=\"mb-3\">Allow Edit Without Removing Response</h5>\r\n\r\n <!-- Task Type -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-block\">Task Type</label>\r\n <div class=\"d-flex gap-3\">\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"taskTypeFixture\"\r\n name=\"taskType\" value=\"fixture\"\r\n [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n <label class=\"form-check-label\" for=\"taskTypeFixture\">Fixture Verification</label>\r\n </div>\r\n <div class=\"form-check\">\r\n <input type=\"radio\" class=\"form-check-input\" id=\"taskTypeZone\"\r\n name=\"taskType\" value=\"zoneVerification\"\r\n [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n <label class=\"form-check-label\" for=\"taskTypeZone\">Zone Verification</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Select -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">Store</label>\r\n <lib-store-select\r\n [options]=\"storeOptions\"\r\n [initialSelected]=\"initialStores\"\r\n (selectedChange)=\"onStoresSelected($event)\">\r\n </lib-store-select>\r\n </div>\r\n\r\n <!-- Fixture Wise Checkbox -->\r\n <div class=\"mb-3 d-flex align-items-center gap-2\">\r\n <input type=\"checkbox\" class=\"form-check-input\" id=\"fixtureWise\"\r\n [(ngModel)]=\"fixtureWise\" (change)=\"onFixtureWiseChange()\"\r\n [disabled]=\"selectedStores.length !== 1\">\r\n <label class=\"form-check-label\" for=\"fixtureWise\">Fixture Wise</label>\r\n @if (selectedStores.length > 1) {\r\n <span class=\"text-muted small\">(Select only one store to enable)</span>\r\n }\r\n </div>\r\n\r\n <!-- Fixture Selection -->\r\n @if (fixtureWise && selectedStores.length === 1) {\r\n <div class=\"mb-3\">\r\n @if (isLoading) {\r\n <div class=\"text-muted\">Loading fixtures...</div>\r\n } @else if (fixtureNumbers.length === 0) {\r\n <div class=\"text-muted\">No fixtures found for this store.</div>\r\n } @else {\r\n <label class=\"form-label\">Select Fixtures</label>\r\n <div class=\"fixture-list\">\r\n <div class=\"fixture-item\" (click)=\"selectAllFixtures()\">\r\n <input type=\"checkbox\" class=\"form-check-input\"\r\n [checked]=\"isAllSelected\" readonly>\r\n <span class=\"fw-semibold\">Select All</span>\r\n </div>\r\n @for (num of fixtureNumbers; track num) {\r\n <div class=\"fixture-item\" (click)=\"toggleFixture(num)\">\r\n <input type=\"checkbox\" class=\"form-check-input\"\r\n [checked]=\"isFixtureSelected(num)\" readonly>\r\n <span>Fixture {{ num }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Submit -->\r\n <button class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n [disabled]=\"isSubmitting || selectedStores.length === 0 || (fixtureWise && (selectedStores.length > 1 || selectedFixtures.size === 0))\">\r\n {{ isSubmitting ? 'Unlocking...' : 'Unlock Edit' }}\r\n </button>\r\n\r\n <!-- Message -->\r\n @if (message) {\r\n <div class=\"mt-3 alert\" [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\">\r\n {{ message }}\r\n </div>\r\n }\r\n </div>\r\n</section>\r\n", styles: [".allow-edit .fixture-list{border:1px solid #d0d5dd;border-radius:8px;max-height:250px;overflow-y:auto}.allow-edit .fixture-item{display:flex;align-items:center;gap:10px;padding:8px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.allow-edit .fixture-item:hover{background-color:#f9fafb}.allow-edit .fixture-item:not(:last-child){border-bottom:1px solid #f2f4f7}\n"] }]
|
|
148
158
|
}], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }] });
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb3ctZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9hbGxvdy1lZGl0L2FsbG93LWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvYWxsb3ctZWRpdC9hbGxvdy1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVF0RixNQUFNLE9BQU8sa0JBQWtCO0lBZ0JuQjtJQUNBO0lBaEJWLFFBQVEsQ0FBUztJQUNqQixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxhQUFhLEdBQWtCLEVBQUUsQ0FBQztJQUNsQyxjQUFjLEdBQWtCLEVBQUUsQ0FBQztJQUNuQyxXQUFXLEdBQVksS0FBSyxDQUFDO0lBQzdCLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDOUIsZ0JBQWdCLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDMUMsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUMzQixZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLE9BQU8sR0FBVyxFQUFFLENBQUM7SUFDckIsV0FBVyxHQUF3QixTQUFTLENBQUM7SUFFNUIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFaEQsWUFDVSxHQUF3QixFQUN4QixFQUFzQjtRQUR0QixRQUFHLEdBQUgsR0FBRyxDQUFxQjtRQUN4QixPQUFFLEdBQUYs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QUcsR0FBRyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FySlUsa0JBQWtCOzRGQUFsQixrQkFBa0Isc0RDWC9CLCt2RkFtRUE7OzRGRHhEYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFN0b3JlT3B0aW9uIH0gZnJvbSAnLi4vLi4vY29sbGVjdGlvbi11cGRhdGUtYWkvY29tcG9uZW50cy9zdG9yZS1zZWxlY3Qvc3RvcmUtc2VsZWN0LmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hbGxvdy1lZGl0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWxsb3ctZWRpdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FsbG93LWVkaXQuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQWxsb3dFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgc3RvcmVPcHRpb25zOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgaW5pdGlhbFN0b3JlczogU3RvcmVPcHRpb25bXSA9IFtdO1xyXG4gIHNlbGVjdGVkU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgZml4dHVyZVdpc2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmaXh0dXJlTnVtYmVyczogbnVtYmVyW10gPSBbXTtcclxuICBzZWxlY3RlZEZpeHR1cmVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICBtZXNzYWdlVHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzYnM6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGEuY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIGFzIHN0cmluZ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZFN0b3JlcygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRTdG9yZXMoKSB7XHJcbiAgICB0aGlzLnNicy5nZXRTdG9yZU9yQ2x1c3Rlckxpc3QoeyBzZWFyY2hNb2RlOiAnc3RvcmUnIH0pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcz8uZGF0YSkge1xyXG4gICAgICAgIHRoaXMuc3RvcmVPcHRpb25zID0gcmVzLmRhdGE7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25TdG9yZXNTZWxlY3RlZChzdG9yZXM6IFN0b3JlT3B0aW9uW10pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBzdG9yZXM7XHJcbiAgICB0aGlzLmZpeHR1cmVOdW1iZXJzID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkRml4dHVyZXMuY2xlYXIoKTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICB0aGlzLmZpeHR1cmVXaXNlID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZml4dHVyZVdpc2UpIHtcclxuICAgICAgdGhpcy5sb2FkRml4dHVyZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRml4dHVyZVdpc2VDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmZpeHR1cmVOdW1iZXJzID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkRml4dHVyZXMuY2xlYXIoKTtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVXaXNlICYmIHRoaXMuc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMubG9hZEZpeHR1cmVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkRml4dHVyZXMoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFN0b3Jlcy5sZW5ndGggIT09IDEpIHJldHVybjtcclxuICAgIGxldCBzdG9yZU5hbWUgPSB0aGlzLnNlbGVjdGVkU3RvcmVzWzBdLmxhYmVsO1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zYnMuZ2V0Rml4dHVyZU51bWJlcnNCeVN0b3JlKHN0b3JlTmFtZSwgdGhpcy5jbGllbnRJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlTnVtYmVycyA9IHJlcz8uZGF0YSB8fCBbXTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZU51bWJlcnMgPSBbXTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVGaXh0dXJlKG51bTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpeHR1cmVzLmhhcyhudW0pKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlcy5kZWxldGUobnVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlcy5hZGQobnVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRml4dHVyZVNlbGVjdGVkKG51bTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpeHR1cmVzLmhhcyhudW0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWxsRml4dHVyZXMoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpeHR1cmVzLnNpemUgPT09IHRoaXMuZml4dHVyZU51bWJlcnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlcy5jbGVhcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maXh0dXJlTnVtYmVycy5mb3JFYWNoKChuKSA9PiB0aGlzLnNlbGVjdGVkRml4dHVyZXMuYWRkKG4pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZml4dHVyZU51bWJlcnMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkRml4dHVyZXMuc2l6ZSA9PT0gdGhpcy5maXh0dXJlTnVtYmVycy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKCdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBzdG9yZS4nLCAnZXJyb3InKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZml4dHVyZVdpc2UgJiYgdGhpcy5zZWxlY3RlZEZpeHR1cmVzLnNpemUgPT09IDApIHtcclxuICAgICAgdGhpcy5zaG93TWVzc2FnZSgnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgZml4dHVyZS4nLCAnZXJyb3InKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIHN0b3JlTmFtZXM6IHRoaXMuc2VsZWN0ZWRTdG9yZXMubWFwKChzKSA9PiBzLmxhYmVsKSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuZml4dHVyZVdpc2UpIHtcclxuICAgICAgcGF5bG9hZC5maXh0dXJlTnVtYmVycyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3RlZEZpeHR1cmVzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNicy5hbGxvd0VkaXRXaXRob3V0UmVtb3ZpbmdSZXNwb25zZShwYXlsb2FkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgY291bnQgPSByZXM/LmRhdGE/Lm1vZGlmaWVkQ291bnQgfHwgMDtcclxuICAgICAgICB0aGlzLnNob3dNZXNzYWdlKGBVcGRhdGVkICR7Y291bnR9IHJlY29yZChzKSBzdWNjZXNzZnVsbHkuYCwgJ3N1Y2Nlc3MnKTtcclxuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZShlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdTb21ldGhpbmcgd2VudCB3cm9uZy4nLCAnZXJyb3InKTtcclxuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzaG93TWVzc2FnZShtc2c6IHN0cmluZywgdHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJykge1xyXG4gICAgdGhpcy5tZXNzYWdlID0gbXNnO1xyXG4gICAgdGhpcy5tZXNzYWdlVHlwZSA9IHR5cGU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLm1lc3NhZ2UgPSAnJyksIDUwMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJhbGxvdy1lZGl0IHAtM1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIHAtNFwiIHN0eWxlPVwibWF4LXdpZHRoOiA2MDBweDtcIj5cclxuICAgIDxoNSBjbGFzcz1cIm1iLTNcIj5BbGxvdyBFZGl0IFdpdGhvdXQgUmVtb3ZpbmcgUmVzcG9uc2U8L2g1PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgU2VsZWN0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0b3JlPC9sYWJlbD5cclxuICAgICAgPGxpYi1zdG9yZS1zZWxlY3RcclxuICAgICAgICBbb3B0aW9uc109XCJzdG9yZU9wdGlvbnNcIlxyXG4gICAgICAgIFtpbml0aWFsU2VsZWN0ZWRdPVwiaW5pdGlhbFN0b3Jlc1wiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU3RvcmVzU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8L2xpYi1zdG9yZS1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEZpeHR1cmUgV2lzZSBDaGVja2JveCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIGlkPVwiZml4dHVyZVdpc2VcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwiZml4dHVyZVdpc2VcIiAoY2hhbmdlKT1cIm9uRml4dHVyZVdpc2VDaGFuZ2UoKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cInNlbGVjdGVkU3RvcmVzLmxlbmd0aCAhPT0gMVwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZml4dHVyZVdpc2VcIj5GaXh0dXJlIFdpc2U8L2xhYmVsPlxyXG4gICAgICBAaWYgKHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj4oU2VsZWN0IG9ubHkgb25lIHN0b3JlIHRvIGVuYWJsZSk8L3NwYW4+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRml4dHVyZSBTZWxlY3Rpb24gLS0+XHJcbiAgICBAaWYgKGZpeHR1cmVXaXNlICYmIHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIEBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZFwiPkxvYWRpbmcgZml4dHVyZXMuLi48L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIGlmIChmaXh0dXJlTnVtYmVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+Tm8gZml4dHVyZXMgZm91bmQgZm9yIHRoaXMgc3RvcmUuPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U2VsZWN0IEZpeHR1cmVzPC9sYWJlbD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXh0dXJlLWxpc3RcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpeHR1cmUtaXRlbVwiIChjbGljayk9XCJzZWxlY3RBbGxGaXh0dXJlcygpXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkXCIgcmVhZG9ubHk+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPlNlbGVjdCBBbGw8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBAZm9yIChudW0gb2YgZml4dHVyZU51bWJlcnM7IHRyYWNrIG51bSkge1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXh0dXJlLWl0ZW1cIiAoY2xpY2spPVwidG9nZ2xlRml4dHVyZShudW0pXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNGaXh0dXJlU2VsZWN0ZWQobnVtKVwiIHJlYWRvbmx5PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+Rml4dHVyZSB7eyBudW0gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBTdWJtaXQgLS0+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiaXNTdWJtaXR0aW5nIHx8IHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMCB8fCAoZml4dHVyZVdpc2UgJiYgKHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA+IDEgfHwgc2VsZWN0ZWRGaXh0dXJlcy5zaXplID09PSAwKSlcIj5cclxuICAgICAge3sgaXNTdWJtaXR0aW5nID8gJ1VwZGF0aW5nLi4uJyA6ICdTdWJtaXQnIH19XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8IS0tIE1lc3NhZ2UgLS0+XHJcbiAgICBAaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cIm10LTMgYWxlcnRcIiBbY2xhc3MuYWxlcnQtc3VjY2Vzc109XCJtZXNzYWdlVHlwZSA9PT0gJ3N1Y2Nlc3MnXCJcclxuICAgICAgICBbY2xhc3MuYWxlcnQtZGFuZ2VyXT1cIm1lc3NhZ2VUeXBlID09PSAnZXJyb3InXCI+XHJcbiAgICAgICAge3sgbWVzc2FnZSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG4iXX0=
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb3ctZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFuby10b29scy9hbGxvdy1lZGl0L2FsbG93LWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvYWxsb3ctZWRpdC9hbGxvdy1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVF0RixNQUFNLE9BQU8sa0JBQWtCO0lBaUJuQjtJQUNBO0lBakJWLFFBQVEsQ0FBUztJQUNqQixRQUFRLEdBQW1DLFNBQVMsQ0FBQztJQUNyRCxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxhQUFhLEdBQWtCLEVBQUUsQ0FBQztJQUNsQyxjQUFjLEdBQWtCLEVBQUUsQ0FBQztJQUNuQyxXQUFXLEdBQVksS0FBSyxDQUFDO0lBQzdCLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDOUIsZ0JBQWdCLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDMUMsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUMzQixZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLE9BQU8sR0FBVyxFQUFFLENBQUM7SUFDckIsV0FBVyxHQUF3QixTQUFTLENBQUM7SUFFNUIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFaEQsWUFDVSxHQUF3QixFQUN4QixFQUFzQjtRQUR0QixRQUFHLEdBQUgs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LDBCQUEwQixFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUM1QixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksdUJBQXVCLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzVCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVcsRUFBRSxJQUF5QjtRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7d0dBcktVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLHNEQ1gvQiw0cEhBc0ZBOzs0RkQzRWEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTdG9yZU9wdGlvbiB9IGZyb20gJy4uLy4uL2NvbGxlY3Rpb24tdXBkYXRlLWFpL2NvbXBvbmVudHMvc3RvcmUtc2VsZWN0L3N0b3JlLXNlbGVjdC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWxsb3ctZWRpdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FsbG93LWVkaXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hbGxvdy1lZGl0LmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFsbG93RWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG4gIHRhc2tUeXBlOiAnZml4dHVyZScgfCAnem9uZVZlcmlmaWNhdGlvbicgPSAnZml4dHVyZSc7XHJcbiAgc3RvcmVPcHRpb25zOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgaW5pdGlhbFN0b3JlczogU3RvcmVPcHRpb25bXSA9IFtdO1xyXG4gIHNlbGVjdGVkU3RvcmVzOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgZml4dHVyZVdpc2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmaXh0dXJlTnVtYmVyczogbnVtYmVyW10gPSBbXTtcclxuICBzZWxlY3RlZEZpeHR1cmVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuICBtZXNzYWdlVHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyA9ICdzdWNjZXNzJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzYnM6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGEuY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIGFzIHN0cmluZ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZFN0b3JlcygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRTdG9yZXMoKSB7XHJcbiAgICB0aGlzLnNicy5nZXRTdG9yZU9yQ2x1c3Rlckxpc3QoeyBzZWFyY2hNb2RlOiAnc3RvcmUnIH0pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcz8uZGF0YSkge1xyXG4gICAgICAgIHRoaXMuc3RvcmVPcHRpb25zID0gcmVzLmRhdGE7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25UYXNrVHlwZUNoYW5nZSgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuaW5pdGlhbFN0b3JlcyA9IFtdO1xyXG4gICAgdGhpcy5maXh0dXJlV2lzZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5maXh0dXJlTnVtYmVycyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVzLmNsZWFyKCk7XHJcbiAgICB0aGlzLm1lc3NhZ2UgPSAnJztcclxuICB9XHJcblxyXG4gIG9uU3RvcmVzU2VsZWN0ZWQoc3RvcmVzOiBTdG9yZU9wdGlvbltdKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVzID0gc3RvcmVzO1xyXG4gICAgdGhpcy5maXh0dXJlTnVtYmVycyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVzLmNsZWFyKCk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFN0b3Jlcy5sZW5ndGggIT09IDEpIHtcclxuICAgICAgdGhpcy5maXh0dXJlV2lzZSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmZpeHR1cmVXaXNlKSB7XHJcbiAgICAgIHRoaXMubG9hZEZpeHR1cmVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpeHR1cmVXaXNlQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5maXh0dXJlTnVtYmVycyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVzLmNsZWFyKCk7XHJcbiAgICBpZiAodGhpcy5maXh0dXJlV2lzZSAmJiB0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB0aGlzLmxvYWRGaXh0dXJlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZEZpeHR1cmVzKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTdG9yZXMubGVuZ3RoICE9PSAxKSByZXR1cm47XHJcbiAgICBsZXQgc3RvcmVOYW1lID0gdGhpcy5zZWxlY3RlZFN0b3Jlc1swXS5sYWJlbDtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc2JzLmdldEZpeHR1cmVOdW1iZXJzQnlTdG9yZShzdG9yZU5hbWUsIHRoaXMuY2xpZW50SWQsIHRoaXMudGFza1R5cGUpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZU51bWJlcnMgPSByZXM/LmRhdGEgfHwgW107XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVOdW1iZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRml4dHVyZShudW06IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlcy5oYXMobnVtKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZXMuZGVsZXRlKG51bSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZXMuYWRkKG51bSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0ZpeHR1cmVTZWxlY3RlZChudW06IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaXh0dXJlcy5oYXMobnVtKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEFsbEZpeHR1cmVzKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlcy5zaXplID09PSB0aGlzLmZpeHR1cmVOdW1iZXJzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZXMuY2xlYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZml4dHVyZU51bWJlcnMuZm9yRWFjaCgobikgPT4gdGhpcy5zZWxlY3RlZEZpeHR1cmVzLmFkZChuKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVOdW1iZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3RlZEZpeHR1cmVzLnNpemUgPT09IHRoaXMuZml4dHVyZU51bWJlcnMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5zaG93TWVzc2FnZSgnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgc3RvcmUuJywgJ2Vycm9yJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpeHR1cmVXaXNlICYmIHRoaXMuc2VsZWN0ZWRGaXh0dXJlcy5zaXplID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc2hvd01lc3NhZ2UoJ1BsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIGZpeHR1cmUuJywgJ2Vycm9yJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcGF5bG9hZDoge1xyXG4gICAgICBzdG9yZU5hbWVzOiBzdHJpbmdbXTtcclxuICAgICAgY2xpZW50SWQ6IHN0cmluZztcclxuICAgICAgdGFza1R5cGU6ICdmaXh0dXJlJyB8ICd6b25lVmVyaWZpY2F0aW9uJztcclxuICAgICAgZml4dHVyZU51bWJlcnM/OiBudW1iZXJbXTtcclxuICAgIH0gPSB7XHJcbiAgICAgIHN0b3JlTmFtZXM6IHRoaXMuc2VsZWN0ZWRTdG9yZXMubWFwKChzKSA9PiBzLmxhYmVsKSxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIHRhc2tUeXBlOiB0aGlzLnRhc2tUeXBlLFxyXG4gICAgfTtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVXaXNlKSB7XHJcbiAgICAgIHBheWxvYWQuZml4dHVyZU51bWJlcnMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWRGaXh0dXJlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zYnMuYWxsb3dFZGl0V2l0aG91dFJlbW92aW5nUmVzcG9uc2UocGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gcmVzPy5kYXRhPy5tb2RpZmllZENvdW50IHx8IDA7XHJcbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgVXBkYXRlZCAke2NvdW50fSByZWNvcmQocykgc3VjY2Vzc2Z1bGx5LmAsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJywgJ2Vycm9yJyk7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvd01lc3NhZ2UobXNnOiBzdHJpbmcsIHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicpIHtcclxuICAgIHRoaXMubWVzc2FnZSA9IG1zZztcclxuICAgIHRoaXMubWVzc2FnZVR5cGUgPSB0eXBlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5tZXNzYWdlID0gJycpLCA1MDAwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwiYWxsb3ctZWRpdCBwLTNcIj5cclxuICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTRcIiBzdHlsZT1cIm1heC13aWR0aDogNjAwcHg7XCI+XHJcbiAgICA8aDUgY2xhc3M9XCJtYi0zXCI+QWxsb3cgRWRpdCBXaXRob3V0IFJlbW92aW5nIFJlc3BvbnNlPC9oNT5cclxuXHJcbiAgICA8IS0tIFRhc2sgVHlwZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1ibG9ja1wiPlRhc2sgVHlwZTwvbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIGlkPVwidGFza1R5cGVGaXh0dXJlXCJcclxuICAgICAgICAgICAgbmFtZT1cInRhc2tUeXBlXCIgdmFsdWU9XCJmaXh0dXJlXCJcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YXNrVHlwZVwiIChjaGFuZ2UpPVwib25UYXNrVHlwZUNoYW5nZSgpXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwidGFza1R5cGVGaXh0dXJlXCI+Rml4dHVyZSBWZXJpZmljYXRpb248L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgaWQ9XCJ0YXNrVHlwZVpvbmVcIlxyXG4gICAgICAgICAgICBuYW1lPVwidGFza1R5cGVcIiB2YWx1ZT1cInpvbmVWZXJpZmljYXRpb25cIlxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhc2tUeXBlXCIgKGNoYW5nZSk9XCJvblRhc2tUeXBlQ2hhbmdlKClcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJ0YXNrVHlwZVpvbmVcIj5ab25lIFZlcmlmaWNhdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTdG9yZSBTZWxlY3QgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RvcmU8L2xhYmVsPlxyXG4gICAgICA8bGliLXN0b3JlLXNlbGVjdFxyXG4gICAgICAgIFtvcHRpb25zXT1cInN0b3JlT3B0aW9uc1wiXHJcbiAgICAgICAgW2luaXRpYWxTZWxlY3RlZF09XCJpbml0aWFsU3RvcmVzXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwib25TdG9yZXNTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDwvbGliLXN0b3JlLXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRml4dHVyZSBXaXNlIENoZWNrYm94IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgaWQ9XCJmaXh0dXJlV2lzZVwiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJmaXh0dXJlV2lzZVwiIChjaGFuZ2UpPVwib25GaXh0dXJlV2lzZUNoYW5nZSgpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRTdG9yZXMubGVuZ3RoICE9PSAxXCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmaXh0dXJlV2lzZVwiPkZpeHR1cmUgV2lzZTwvbGFiZWw+XHJcbiAgICAgIEBpZiAoc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPihTZWxlY3Qgb25seSBvbmUgc3RvcmUgdG8gZW5hYmxlKTwvc3Bhbj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGaXh0dXJlIFNlbGVjdGlvbiAtLT5cclxuICAgIEBpZiAoZml4dHVyZVdpc2UgJiYgc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgQGlmIChpc0xvYWRpbmcpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+TG9hZGluZyBmaXh0dXJlcy4uLjwvZGl2PlxyXG4gICAgICAgIH0gQGVsc2UgaWYgKGZpeHR1cmVOdW1iZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWRcIj5ObyBmaXh0dXJlcyBmb3VuZCBmb3IgdGhpcyBzdG9yZS48L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5TZWxlY3QgRml4dHVyZXM8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpeHR1cmUtbGlzdFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4dHVyZS1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdEFsbEZpeHR1cmVzKClcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWRcIiByZWFkb25seT5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+U2VsZWN0IEFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIEBmb3IgKG51bSBvZiBmaXh0dXJlTnVtYmVyczsgdHJhY2sgbnVtKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpeHR1cmUtaXRlbVwiIChjbGljayk9XCJ0b2dnbGVGaXh0dXJlKG51bSlcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0ZpeHR1cmVTZWxlY3RlZChudW0pXCIgcmVhZG9ubHk+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5GaXh0dXJlIHt7IG51bSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIFN1Ym1pdCAtLT5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJpc1N1Ym1pdHRpbmcgfHwgc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAwIHx8IChmaXh0dXJlV2lzZSAmJiAoc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID4gMSB8fCBzZWxlY3RlZEZpeHR1cmVzLnNpemUgPT09IDApKVwiPlxyXG4gICAgICB7eyBpc1N1Ym1pdHRpbmcgPyAnVW5sb2NraW5nLi4uJyA6ICdVbmxvY2sgRWRpdCcgfX1cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gTWVzc2FnZSAtLT5cclxuICAgIEBpZiAobWVzc2FnZSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMyBhbGVydFwiIFtjbGFzcy5hbGVydC1zdWNjZXNzXT1cIm1lc3NhZ2VUeXBlID09PSAnc3VjY2VzcydcIlxyXG4gICAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIj5cclxuICAgICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbiJdfQ==
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { Component } from "@angular/core";
|
|
2
|
+
import { debounceTime, distinctUntilChanged, filter, Subject, takeUntil, } from "rxjs";
|
|
3
|
+
import { DeleteConfirmationComponent } from "../../popups/delete-confirmation/delete-confirmation.component";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../../../services/store-builder.service";
|
|
6
|
+
import * as i2 from "tango-app-ui-global";
|
|
7
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
8
|
+
import * as i4 from "../../reactive-select/reactive-select.component";
|
|
9
|
+
import * as i5 from "@angular/common";
|
|
10
|
+
import * as i6 from "@angular/forms";
|
|
11
|
+
export class DeleteFloorComponent {
|
|
12
|
+
sbs;
|
|
13
|
+
gs;
|
|
14
|
+
modalService;
|
|
15
|
+
clientId;
|
|
16
|
+
storeOptions = [];
|
|
17
|
+
selectedStoreId = null;
|
|
18
|
+
selectedStoreName = null;
|
|
19
|
+
isLoadingStores = false;
|
|
20
|
+
floors = [];
|
|
21
|
+
selectedFloorId = null;
|
|
22
|
+
isLoadingFloors = false;
|
|
23
|
+
impact = null;
|
|
24
|
+
isLoadingImpact = false;
|
|
25
|
+
isSubmitting = false;
|
|
26
|
+
message = "";
|
|
27
|
+
messageType = "success";
|
|
28
|
+
destroy$ = new Subject();
|
|
29
|
+
constructor(sbs, gs, modalService) {
|
|
30
|
+
this.sbs = sbs;
|
|
31
|
+
this.gs = gs;
|
|
32
|
+
this.modalService = modalService;
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
this.gs.dataRangeValue
|
|
36
|
+
.pipe(takeUntil(this.destroy$), debounceTime(200), filter((data) => !!data), distinctUntilChanged())
|
|
37
|
+
.subscribe((data) => {
|
|
38
|
+
if (data?.client) {
|
|
39
|
+
this.clientId = data.client;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const headerData = JSON.parse(localStorage.getItem("header-filters"));
|
|
43
|
+
this.clientId = headerData?.client;
|
|
44
|
+
}
|
|
45
|
+
this.resetAll();
|
|
46
|
+
this.loadStores();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
loadStores() {
|
|
50
|
+
if (!this.clientId)
|
|
51
|
+
return;
|
|
52
|
+
this.isLoadingStores = true;
|
|
53
|
+
this.sbs.getAllStores(this.clientId).subscribe({
|
|
54
|
+
next: (res) => {
|
|
55
|
+
this.storeOptions = (res?.data || []).map((s) => ({
|
|
56
|
+
storeId: s.storeId,
|
|
57
|
+
storeName: s.storeName,
|
|
58
|
+
}));
|
|
59
|
+
this.isLoadingStores = false;
|
|
60
|
+
},
|
|
61
|
+
error: (err) => {
|
|
62
|
+
this.showMessage(err?.error?.message || "Failed to load stores.", "error");
|
|
63
|
+
this.isLoadingStores = false;
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
onStoreSelected(storeId) {
|
|
68
|
+
this.selectedStoreId = storeId;
|
|
69
|
+
const store = this.storeOptions.find((s) => s.storeId === storeId);
|
|
70
|
+
this.selectedStoreName = store?.storeName ?? null;
|
|
71
|
+
this.resetFloorState();
|
|
72
|
+
if (this.selectedStoreId) {
|
|
73
|
+
this.loadFloors();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
resetFloorState() {
|
|
77
|
+
this.floors = [];
|
|
78
|
+
this.selectedFloorId = null;
|
|
79
|
+
this.impact = null;
|
|
80
|
+
}
|
|
81
|
+
resetAll() {
|
|
82
|
+
this.storeOptions = [];
|
|
83
|
+
this.selectedStoreId = null;
|
|
84
|
+
this.selectedStoreName = null;
|
|
85
|
+
this.resetFloorState();
|
|
86
|
+
}
|
|
87
|
+
loadFloors() {
|
|
88
|
+
if (!this.selectedStoreId)
|
|
89
|
+
return;
|
|
90
|
+
this.isLoadingFloors = true;
|
|
91
|
+
this.sbs.getStoreFloorsList(this.selectedStoreId).subscribe({
|
|
92
|
+
next: (res) => {
|
|
93
|
+
const raw = res?.data || [];
|
|
94
|
+
this.floors = raw
|
|
95
|
+
.map((f) => ({
|
|
96
|
+
_id: f._id,
|
|
97
|
+
floorNumber: f.floorNumber,
|
|
98
|
+
floorName: f.floorName,
|
|
99
|
+
displayName: `Floor ${f.floorNumber} — ${f.floorName}`,
|
|
100
|
+
}))
|
|
101
|
+
.sort((a, b) => a.floorNumber - b.floorNumber);
|
|
102
|
+
this.isLoadingFloors = false;
|
|
103
|
+
},
|
|
104
|
+
error: (err) => {
|
|
105
|
+
this.showMessage(err?.error?.message || "Failed to load floors.", "error");
|
|
106
|
+
this.isLoadingFloors = false;
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
onFloorSelected(floorId) {
|
|
111
|
+
this.selectedFloorId = floorId;
|
|
112
|
+
this.impact = null;
|
|
113
|
+
if (floorId) {
|
|
114
|
+
this.loadImpact(floorId);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
loadImpact(floorId) {
|
|
118
|
+
this.isLoadingImpact = true;
|
|
119
|
+
this.sbs.getFloorDeleteImpact({ floorId }).subscribe({
|
|
120
|
+
next: (res) => {
|
|
121
|
+
this.impact = res?.data || null;
|
|
122
|
+
this.isLoadingImpact = false;
|
|
123
|
+
},
|
|
124
|
+
error: (err) => {
|
|
125
|
+
this.showMessage(err?.error?.message || "Failed to load floor details.", "error");
|
|
126
|
+
this.isLoadingImpact = false;
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
formatStatus(status) {
|
|
131
|
+
if (!status)
|
|
132
|
+
return "--";
|
|
133
|
+
const map = {
|
|
134
|
+
draft: "Draft",
|
|
135
|
+
allocationPending: "Allocation Pending",
|
|
136
|
+
completed: "Completed",
|
|
137
|
+
};
|
|
138
|
+
return map[status] || status;
|
|
139
|
+
}
|
|
140
|
+
formatBool(v) {
|
|
141
|
+
return v ? "Yes" : "No";
|
|
142
|
+
}
|
|
143
|
+
get totalCascadeRows() {
|
|
144
|
+
if (!this.impact)
|
|
145
|
+
return 0;
|
|
146
|
+
const c = this.impact.cascade;
|
|
147
|
+
return (c.storefixtures +
|
|
148
|
+
c.fixtureshelves +
|
|
149
|
+
c.planotaskcompliances +
|
|
150
|
+
c.processedtasks +
|
|
151
|
+
c.planoglobalcomments +
|
|
152
|
+
c.planorevisions);
|
|
153
|
+
}
|
|
154
|
+
get canSubmit() {
|
|
155
|
+
return (!!this.selectedFloorId &&
|
|
156
|
+
!!this.impact &&
|
|
157
|
+
!this.isSubmitting &&
|
|
158
|
+
!this.isLoadingImpact);
|
|
159
|
+
}
|
|
160
|
+
async onSubmit() {
|
|
161
|
+
if (!this.canSubmit || !this.impact)
|
|
162
|
+
return;
|
|
163
|
+
const isLast = this.impact.isLastFloor;
|
|
164
|
+
const floor = this.impact.floor;
|
|
165
|
+
const plano = this.impact.planogram;
|
|
166
|
+
const c = this.impact.cascade;
|
|
167
|
+
const summary = [];
|
|
168
|
+
summary.push(`Store: ${plano.storeName ?? "--"}`);
|
|
169
|
+
summary.push(`Floor ${floor.floorNumber} — ${floor.floorName} [${this.formatStatus(floor.status)}]`);
|
|
170
|
+
summary.push(`Cascade: ${c.storefixtures} fixtures, ${c.fixtureshelves} shelves, ${c.planotaskcompliances} compliance, ${c.processedtasks} task(s), ${c.planoglobalcomments} comment(s), ${c.planorevisions} revision(s)`);
|
|
171
|
+
if (isLast) {
|
|
172
|
+
summary.push("This is the ONLY floor in this planogram. Deleting it will REMOVE THE ENTIRE PLANOGRAM. The store entry itself will not be touched.");
|
|
173
|
+
}
|
|
174
|
+
summary.push("This action cannot be undone.");
|
|
175
|
+
const firstTitle = isLast
|
|
176
|
+
? "Delete planogram entirely?"
|
|
177
|
+
: "Delete this floor?";
|
|
178
|
+
const confirmed = await this.confirm(firstTitle, summary.join("\n"));
|
|
179
|
+
if (!confirmed)
|
|
180
|
+
return;
|
|
181
|
+
if (isLast) {
|
|
182
|
+
const doubleConfirmed = await this.confirm("Final confirmation", `You are about to permanently delete the planogram for "${plano.storeName}". This wipes the floor and the planogram metadata. The store is preserved. Proceed?`);
|
|
183
|
+
if (!doubleConfirmed)
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.isSubmitting = true;
|
|
187
|
+
this.sbs
|
|
188
|
+
.deleteFloorCascade({
|
|
189
|
+
floorId: this.selectedFloorId,
|
|
190
|
+
confirmLastFloor: isLast,
|
|
191
|
+
})
|
|
192
|
+
.subscribe({
|
|
193
|
+
next: (res) => {
|
|
194
|
+
const data = res?.data || {};
|
|
195
|
+
const parts = [];
|
|
196
|
+
if (data.planogramDeleted) {
|
|
197
|
+
parts.push("Planogram removed entirely");
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
parts.push("Floor deleted");
|
|
201
|
+
if (data.renumberedFloors?.length) {
|
|
202
|
+
parts.push(`${data.renumberedFloors.length} sibling floor(s) renumbered`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const dc = data.deletedCounts || {};
|
|
206
|
+
parts.push(`Cleaned: ${dc.storefixtures || 0} fixtures, ${dc.fixtureshelves || 0} shelves, ${dc.planotaskcompliances || 0} compliance, ${dc.processedtasks || 0} task(s), ${dc.planoglobalcomments || 0} comment(s), ${dc.planorevisions || 0} revision(s)`);
|
|
207
|
+
this.showMessage(parts.join(". "), "success");
|
|
208
|
+
this.isSubmitting = false;
|
|
209
|
+
this.resetFloorState();
|
|
210
|
+
if (this.selectedStoreId) {
|
|
211
|
+
this.loadFloors();
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
error: (err) => {
|
|
215
|
+
this.showMessage(err?.error?.message || "Failed to delete floor.", "error");
|
|
216
|
+
this.isSubmitting = false;
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
async confirm(title, description) {
|
|
221
|
+
try {
|
|
222
|
+
const ref = this.modalService.open(DeleteConfirmationComponent, {
|
|
223
|
+
centered: true,
|
|
224
|
+
});
|
|
225
|
+
ref.componentInstance.title = title;
|
|
226
|
+
ref.componentInstance.description = description;
|
|
227
|
+
ref.componentInstance.confirmLabel = "Delete";
|
|
228
|
+
ref.componentInstance.confirmClass = "btn-danger";
|
|
229
|
+
const result = await ref.result;
|
|
230
|
+
return result === "ok";
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
showMessage(msg, type) {
|
|
237
|
+
this.message = msg;
|
|
238
|
+
this.messageType = type;
|
|
239
|
+
setTimeout(() => (this.message = ""), 6000);
|
|
240
|
+
}
|
|
241
|
+
ngOnDestroy() {
|
|
242
|
+
this.destroy$.next();
|
|
243
|
+
this.destroy$.complete();
|
|
244
|
+
}
|
|
245
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DeleteFloorComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
246
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DeleteFloorComponent, selector: "lib-delete-floor", ngImport: i0, template: "<section class=\"delete-floor p-3\">\n <div class=\"card p-4\" style=\"max-width: 720px;\">\n <h5 class=\"mb-1\">Delete Floor</h5>\n <p class=\"text-muted small mb-3\">\n Removes a floor and every row that references it \u2014 fixtures, shelves, task\n compliance, processed tasks, comments, and revisions. If this is the only\n floor, the entire planogram is removed. The store entry is never touched.\n </p>\n\n <!-- Store -->\n <div class=\"mb-3\">\n <lib-reactive-select\n label=\"Store\"\n [idField]=\"'storeId'\"\n [nameField]=\"'storeName'\"\n [data]=\"storeOptions\"\n [search]=\"true\"\n [ngModel]=\"selectedStoreId\"\n (ngModelChange)=\"onStoreSelected($event)\">\n </lib-reactive-select>\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\n </div>\n\n <!-- Floor -->\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\n <div class=\"text-muted small\">Loading floors...</div>\n </ng-container>\n <ng-template #floorPicker>\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\n <lib-reactive-select\n label=\"Floor\"\n [idField]=\"'_id'\"\n [nameField]=\"'displayName'\"\n [data]=\"floors\"\n [search]=\"true\"\n [ngModel]=\"selectedFloorId\"\n (ngModelChange)=\"onFloorSelected($event)\">\n </lib-reactive-select>\n </ng-container>\n <ng-template #noFloors>\n <div class=\"text-muted small\">No floors found for this store.</div>\n </ng-template>\n </ng-template>\n </div>\n\n <!-- Status + cascade preview -->\n <ng-container *ngIf=\"selectedFloorId\">\n <ng-container *ngIf=\"isLoadingImpact; else impactBlock\">\n <div class=\"text-muted small\">Loading floor details...</div>\n </ng-container>\n <ng-template #impactBlock>\n <ng-container *ngIf=\"impact\">\n <div class=\"mb-3 p-3 rounded info-block\">\n <div class=\"row gx-3 gy-2 small\">\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Floor status</span>\n <span class=\"fw-semibold\">{{ formatStatus(impact.floor.status) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Planogram status</span>\n <span class=\"fw-semibold\">{{ formatStatus(impact.planogram.status) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Plano approved</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.isPlanoApproved) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Verification done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.verificationStatus) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Merch rollout done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.merchRolloutStatus) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">VM rollout done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.vmRolloutStatus) }}</span>\n </div>\n <div class=\"col-12\">\n <span class=\"text-muted d-block\">Total floors in this planogram</span>\n <span class=\"fw-semibold\">{{ impact.totalFloors }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 p-3 rounded cascade-block\">\n <div class=\"fw-semibold mb-2\">Will delete</div>\n <ul class=\"small mb-0 ps-3\">\n <li>1 floor (storelayouts)</li>\n <li>{{ impact.cascade.storefixtures }} fixture(s) (storefixtures)</li>\n <li>{{ impact.cascade.fixtureshelves }} shelf row(s) (fixtureshelves)</li>\n <li>{{ impact.cascade.planotaskcompliances }} task compliance row(s) (planotaskcompliances)</li>\n <li>{{ impact.cascade.processedtasks }} processed task(s) (processedtasks)</li>\n <li>{{ impact.cascade.planoglobalcomments }} global comment(s) (planoglobalcomments)</li>\n <li>{{ impact.cascade.planorevisions }} revision(s) (planorevisions)</li>\n </ul>\n <div class=\"text-muted small mt-2\">Total downstream rows: {{ totalCascadeRows }}</div>\n </div>\n\n <div class=\"alert alert-warning small\" *ngIf=\"impact.isLastFloor\">\n <strong>This is the only floor in this planogram.</strong>\n Deleting it will also remove the planogram entry \u2014 the plano will\n disappear completely. The store record itself will NOT be deleted.\n </div>\n </ng-container>\n </ng-template>\n </ng-container>\n\n <!-- Submit -->\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\n {{ isSubmitting ? 'Deleting...' : 'Delete Floor' }}\n </button>\n\n <div class=\"mt-3 alert\" *ngIf=\"message\"\n [class.alert-success]=\"messageType === 'success'\"\n [class.alert-danger]=\"messageType === 'error'\"\n style=\"white-space: pre-line;\">\n {{ message }}\n </div>\n </div>\n</section>\n", styles: [".delete-floor .info-block{background-color:#f9fafb;border:1px solid #e4e7ec}.delete-floor .cascade-block{background-color:#fff7ed;border:1px solid #fed7aa}\n"], dependencies: [{ kind: "component", type: i4.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
247
|
+
}
|
|
248
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DeleteFloorComponent, decorators: [{
|
|
249
|
+
type: Component,
|
|
250
|
+
args: [{ selector: "lib-delete-floor", template: "<section class=\"delete-floor p-3\">\n <div class=\"card p-4\" style=\"max-width: 720px;\">\n <h5 class=\"mb-1\">Delete Floor</h5>\n <p class=\"text-muted small mb-3\">\n Removes a floor and every row that references it \u2014 fixtures, shelves, task\n compliance, processed tasks, comments, and revisions. If this is the only\n floor, the entire planogram is removed. The store entry is never touched.\n </p>\n\n <!-- Store -->\n <div class=\"mb-3\">\n <lib-reactive-select\n label=\"Store\"\n [idField]=\"'storeId'\"\n [nameField]=\"'storeName'\"\n [data]=\"storeOptions\"\n [search]=\"true\"\n [ngModel]=\"selectedStoreId\"\n (ngModelChange)=\"onStoreSelected($event)\">\n </lib-reactive-select>\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\n </div>\n\n <!-- Floor -->\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\n <div class=\"text-muted small\">Loading floors...</div>\n </ng-container>\n <ng-template #floorPicker>\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\n <lib-reactive-select\n label=\"Floor\"\n [idField]=\"'_id'\"\n [nameField]=\"'displayName'\"\n [data]=\"floors\"\n [search]=\"true\"\n [ngModel]=\"selectedFloorId\"\n (ngModelChange)=\"onFloorSelected($event)\">\n </lib-reactive-select>\n </ng-container>\n <ng-template #noFloors>\n <div class=\"text-muted small\">No floors found for this store.</div>\n </ng-template>\n </ng-template>\n </div>\n\n <!-- Status + cascade preview -->\n <ng-container *ngIf=\"selectedFloorId\">\n <ng-container *ngIf=\"isLoadingImpact; else impactBlock\">\n <div class=\"text-muted small\">Loading floor details...</div>\n </ng-container>\n <ng-template #impactBlock>\n <ng-container *ngIf=\"impact\">\n <div class=\"mb-3 p-3 rounded info-block\">\n <div class=\"row gx-3 gy-2 small\">\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Floor status</span>\n <span class=\"fw-semibold\">{{ formatStatus(impact.floor.status) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Planogram status</span>\n <span class=\"fw-semibold\">{{ formatStatus(impact.planogram.status) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Plano approved</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.isPlanoApproved) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Verification done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.verificationStatus) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Merch rollout done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.merchRolloutStatus) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">VM rollout done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.vmRolloutStatus) }}</span>\n </div>\n <div class=\"col-12\">\n <span class=\"text-muted d-block\">Total floors in this planogram</span>\n <span class=\"fw-semibold\">{{ impact.totalFloors }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 p-3 rounded cascade-block\">\n <div class=\"fw-semibold mb-2\">Will delete</div>\n <ul class=\"small mb-0 ps-3\">\n <li>1 floor (storelayouts)</li>\n <li>{{ impact.cascade.storefixtures }} fixture(s) (storefixtures)</li>\n <li>{{ impact.cascade.fixtureshelves }} shelf row(s) (fixtureshelves)</li>\n <li>{{ impact.cascade.planotaskcompliances }} task compliance row(s) (planotaskcompliances)</li>\n <li>{{ impact.cascade.processedtasks }} processed task(s) (processedtasks)</li>\n <li>{{ impact.cascade.planoglobalcomments }} global comment(s) (planoglobalcomments)</li>\n <li>{{ impact.cascade.planorevisions }} revision(s) (planorevisions)</li>\n </ul>\n <div class=\"text-muted small mt-2\">Total downstream rows: {{ totalCascadeRows }}</div>\n </div>\n\n <div class=\"alert alert-warning small\" *ngIf=\"impact.isLastFloor\">\n <strong>This is the only floor in this planogram.</strong>\n Deleting it will also remove the planogram entry \u2014 the plano will\n disappear completely. The store record itself will NOT be deleted.\n </div>\n </ng-container>\n </ng-template>\n </ng-container>\n\n <!-- Submit -->\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\n {{ isSubmitting ? 'Deleting...' : 'Delete Floor' }}\n </button>\n\n <div class=\"mt-3 alert\" *ngIf=\"message\"\n [class.alert-success]=\"messageType === 'success'\"\n [class.alert-danger]=\"messageType === 'error'\"\n style=\"white-space: pre-line;\">\n {{ message }}\n </div>\n </div>\n</section>\n", styles: [".delete-floor .info-block{background-color:#f9fafb;border:1px solid #e4e7ec}.delete-floor .cascade-block{background-color:#fff7ed;border:1px solid #fed7aa}\n"] }]
|
|
251
|
+
}], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i3.NgbModal }] });
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWZsb29yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5vLXRvb2xzL2RlbGV0ZS1mbG9vci9kZWxldGUtZmxvb3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvZGVsZXRlLWZsb29yL2RlbGV0ZS1mbG9vci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sT0FBTyxFQUNQLFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdFQUFnRSxDQUFDOzs7Ozs7OztBQW1EN0csTUFBTSxPQUFPLG9CQUFvQjtJQXNCckI7SUFDQTtJQUNBO0lBdkJWLFFBQVEsQ0FBUztJQUVqQixZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxlQUFlLEdBQWtCLElBQUksQ0FBQztJQUN0QyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFFakMsTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDM0IsZUFBZSxHQUFrQixJQUFJLENBQUM7SUFDdEMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUVqQyxNQUFNLEdBQXVCLElBQUksQ0FBQztJQUNsQyxlQUFlLEdBQVksS0FBSyxDQUFDO0lBRWpDLFlBQVksR0FBWSxLQUFLLENBQUM7SUFDOUIsT0FBTyxHQUFXLEVBQUUsQ0FBQztJQUNyQixXQUFXLEdBQXdCLFNBQVMsQ0FBQztJ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TyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7d0dBM1JVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLHdEQzlEakMsNi9LQTBIQTs7NEZENURhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XG5pbXBvcnQge1xuICBkZWJvdW5jZVRpbWUsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL3BvcHVwcy9kZWxldGUtY29uZmlybWF0aW9uL2RlbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50XCI7XG5cbmludGVyZmFjZSBTdG9yZU9wdGlvbiB7XG4gIHN0b3JlSWQ6IHN0cmluZztcbiAgc3RvcmVOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBGbG9vck9wdGlvbiB7XG4gIF9pZDogc3RyaW5nO1xuICBmbG9vck51bWJlcjogbnVtYmVyO1xuICBmbG9vck5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEZsb29ySW1wYWN0IHtcbiAgZmxvb3I6IHtcbiAgICBfaWQ6IHN0cmluZztcbiAgICBmbG9vck51bWJlcjogbnVtYmVyO1xuICAgIGZsb29yTmFtZTogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGlzUGxhbm9BcHByb3ZlZD86IGJvb2xlYW47XG4gICAgdmVyaWZpY2F0aW9uU3RhdHVzPzogYm9vbGVhbjtcbiAgICBtZXJjaFJvbGxvdXRTdGF0dXM/OiBib29sZWFuO1xuICAgIHZtUm9sbG91dFN0YXR1cz86IGJvb2xlYW47XG4gICAgcGxhbm9Qcm9ncmVzcz86IG51bWJlcjtcbiAgfTtcbiAgcGxhbm9ncmFtOiB7XG4gICAgX2lkOiBzdHJpbmc7XG4gICAgc3RvcmVOYW1lOiBzdHJpbmc7XG4gICAgc3RvcmVJZDogc3RyaW5nO1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICBsYXlvdXROYW1lPzogc3RyaW5nO1xuICB9O1xuICB0b3RhbEZsb29yczogbnVtYmVyO1xuICBpc0xhc3RGbG9vcjogYm9vbGVhbjtcbiAgd2lsbERlbGV0ZVBsYW5vZ3JhbTogYm9vbGVhbjtcbiAgY2FzY2FkZToge1xuICAgIHN0b3JlZml4dHVyZXM6IG51bWJlcjtcbiAgICBmaXh0dXJlc2hlbHZlczogbnVtYmVyO1xuICAgIHBsYW5vdGFza2NvbXBsaWFuY2VzOiBudW1iZXI7XG4gICAgcHJvY2Vzc2VkdGFza3M6IG51bWJlcjtcbiAgICBwbGFub2dsb2JhbGNvbW1lbnRzOiBudW1iZXI7XG4gICAgcGxhbm9yZXZpc2lvbnM6IG51bWJlcjtcbiAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImxpYi1kZWxldGUtZmxvb3JcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9kZWxldGUtZmxvb3IuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi9kZWxldGUtZmxvb3IuY29tcG9uZW50LnNjc3NcIixcbn0pXG5leHBvcnQgY2xhc3MgRGVsZXRlRmxvb3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGNsaWVudElkOiBzdHJpbmc7XG5cbiAgc3RvcmVPcHRpb25zOiBTdG9yZU9wdGlvbltdID0gW107XG4gIHNlbGVjdGVkU3RvcmVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkU3RvcmVOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgaXNMb2FkaW5nU3RvcmVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZmxvb3JzOiBGbG9vck9wdGlvbltdID0gW107XG4gIHNlbGVjdGVkRmxvb3JJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlzTG9hZGluZ0Zsb29yczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGltcGFjdDogRmxvb3JJbXBhY3QgfCBudWxsID0gbnVsbDtcbiAgaXNMb2FkaW5nSW1wYWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgaXNTdWJtaXR0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIG1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XG4gIG1lc3NhZ2VUeXBlOiBcInN1Y2Nlc3NcIiB8IFwiZXJyb3JcIiA9IFwic3VjY2Vzc1wiO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2JzOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgZmlsdGVyKChkYXRhKSA9PiAhIWRhdGEpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YS5jbGllbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIGFzIHN0cmluZyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEFsbCgpO1xuICAgICAgICB0aGlzLmxvYWRTdG9yZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbG9hZFN0b3JlcygpIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50SWQpIHJldHVybjtcbiAgICB0aGlzLmlzTG9hZGluZ1N0b3JlcyA9IHRydWU7XG4gICAgdGhpcy5zYnMuZ2V0QWxsU3RvcmVzKHRoaXMuY2xpZW50SWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMgPSAocmVzPy5kYXRhIHx8IFtdKS5tYXAoKHM6IGFueSkgPT4gKHtcbiAgICAgICAgICBzdG9yZUlkOiBzLnN0b3JlSWQsXG4gICAgICAgICAgc3RvcmVOYW1lOiBzLnN0b3JlTmFtZSxcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZ1N0b3JlcyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcbiAgICAgICAgICBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGxvYWQgc3RvcmVzLlwiLFxuICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdTdG9yZXMgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBvblN0b3JlU2VsZWN0ZWQoc3RvcmVJZDogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUlkID0gc3RvcmVJZDtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmVPcHRpb25zLmZpbmQoKHMpID0+IHMuc3RvcmVJZCA9PT0gc3RvcmVJZCk7XG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlTmFtZSA9IHN0b3JlPy5zdG9yZU5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLnJlc2V0Rmxvb3JTdGF0ZSgpO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RvcmVJZCkge1xuICAgICAgdGhpcy5sb2FkRmxvb3JzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZsb29yU3RhdGUoKSB7XG4gICAgdGhpcy5mbG9vcnMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3JJZCA9IG51bGw7XG4gICAgdGhpcy5pbXBhY3QgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEFsbCgpIHtcbiAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUlkID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVOYW1lID0gbnVsbDtcbiAgICB0aGlzLnJlc2V0Rmxvb3JTdGF0ZSgpO1xuICB9XG5cbiAgbG9hZEZsb29ycygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTdG9yZUlkKSByZXR1cm47XG4gICAgdGhpcy5pc0xvYWRpbmdGbG9vcnMgPSB0cnVlO1xuICAgIHRoaXMuc2JzLmdldFN0b3JlRmxvb3JzTGlzdCh0aGlzLnNlbGVjdGVkU3RvcmVJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByYXc6IGFueVtdID0gcmVzPy5kYXRhIHx8IFtdO1xuICAgICAgICB0aGlzLmZsb29ycyA9IHJhd1xuICAgICAgICAgIC5tYXAoKGYpID0+ICh7XG4gICAgICAgICAgICBfaWQ6IGYuX2lkLFxuICAgICAgICAgICAgZmxvb3JOdW1iZXI6IGYuZmxvb3JOdW1iZXIsXG4gICAgICAgICAgICBmbG9vck5hbWU6IGYuZmxvb3JOYW1lLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGBGbG9vciAke2YuZmxvb3JOdW1iZXJ9IOKAlCAke2YuZmxvb3JOYW1lfWAsXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZmxvb3JOdW1iZXIgLSBiLmZsb29yTnVtYmVyKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdGbG9vcnMgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXG4gICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBsb2FkIGZsb29ycy5cIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nRmxvb3JzID0gZmFsc2U7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25GbG9vclNlbGVjdGVkKGZsb29ySWQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3JJZCA9IGZsb29ySWQ7XG4gICAgdGhpcy5pbXBhY3QgPSBudWxsO1xuICAgIGlmIChmbG9vcklkKSB7XG4gICAgICB0aGlzLmxvYWRJbXBhY3QoZmxvb3JJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkSW1wYWN0KGZsb29ySWQ6IHN0cmluZykge1xuICAgIHRoaXMuaXNMb2FkaW5nSW1wYWN0ID0gdHJ1ZTtcbiAgICB0aGlzLnNicy5nZXRGbG9vckRlbGV0ZUltcGFjdCh7IGZsb29ySWQgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmltcGFjdCA9IHJlcz8uZGF0YSB8fCBudWxsO1xuICAgICAgICB0aGlzLmlzTG9hZGluZ0ltcGFjdCA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcbiAgICAgICAgICBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGxvYWQgZmxvb3IgZGV0YWlscy5cIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nSW1wYWN0ID0gZmFsc2U7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZm9ybWF0U3RhdHVzKHN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybiBcIi0tXCI7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgZHJhZnQ6IFwiRHJhZnRcIixcbiAgICAgIGFsbG9jYXRpb25QZW5kaW5nOiBcIkFsbG9jYXRpb24gUGVuZGluZ1wiLFxuICAgICAgY29tcGxldGVkOiBcIkNvbXBsZXRlZFwiLFxuICAgIH07XG4gICAgcmV0dXJuIG1hcFtzdGF0dXNdIHx8IHN0YXR1cztcbiAgfVxuXG4gIGZvcm1hdEJvb2wodjogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHYgPyBcIlllc1wiIDogXCJOb1wiO1xuICB9XG5cbiAgZ2V0IHRvdGFsQ2FzY2FkZVJvd3MoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaW1wYWN0KSByZXR1cm4gMDtcbiAgICBjb25zdCBjID0gdGhpcy5pbXBhY3QuY2FzY2FkZTtcbiAgICByZXR1cm4gKFxuICAgICAgYy5zdG9yZWZpeHR1cmVzICtcbiAgICAgIGMuZml4dHVyZXNoZWx2ZXMgK1xuICAgICAgYy5wbGFub3Rhc2tjb21wbGlhbmNlcyArXG4gICAgICBjLnByb2Nlc3NlZHRhc2tzICtcbiAgICAgIGMucGxhbm9nbG9iYWxjb21tZW50cyArXG4gICAgICBjLnBsYW5vcmV2aXNpb25zXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjYW5TdWJtaXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5zZWxlY3RlZEZsb29ySWQgJiZcbiAgICAgICEhdGhpcy5pbXBhY3QgJiZcbiAgICAgICF0aGlzLmlzU3VibWl0dGluZyAmJlxuICAgICAgIXRoaXMuaXNMb2FkaW5nSW1wYWN0XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG9uU3VibWl0KCkge1xuICAgIGlmICghdGhpcy5jYW5TdWJtaXQgfHwgIXRoaXMuaW1wYWN0KSByZXR1cm47XG5cbiAgICBjb25zdCBpc0xhc3QgPSB0aGlzLmltcGFjdC5pc0xhc3RGbG9vcjtcbiAgICBjb25zdCBmbG9vciA9IHRoaXMuaW1wYWN0LmZsb29yO1xuICAgIGNvbnN0IHBsYW5vID0gdGhpcy5pbXBhY3QucGxhbm9ncmFtO1xuICAgIGNvbnN0IGMgPSB0aGlzLmltcGFjdC5jYXNjYWRlO1xuXG4gICAgY29uc3Qgc3VtbWFyeTogc3RyaW5nW10gPSBbXTtcbiAgICBzdW1tYXJ5LnB1c2goYFN0b3JlOiAke3BsYW5vLnN0b3JlTmFtZSA/PyBcIi0tXCJ9YCk7XG4gICAgc3VtbWFyeS5wdXNoKFxuICAgICAgYEZsb29yICR7Zmxvb3IuZmxvb3JOdW1iZXJ9IOKAlCAke2Zsb29yLmZsb29yTmFtZX0gWyR7dGhpcy5mb3JtYXRTdGF0dXMoZmxvb3Iuc3RhdHVzKX1dYCxcbiAgICApO1xuICAgIHN1bW1hcnkucHVzaChcbiAgICAgIGBDYXNjYWRlOiAke2Muc3RvcmVmaXh0dXJlc30gZml4dHVyZXMsICR7Yy5maXh0dXJlc2hlbHZlc30gc2hlbHZlcywgJHtjLnBsYW5vdGFza2NvbXBsaWFuY2VzfSBjb21wbGlhbmNlLCAke2MucHJvY2Vzc2VkdGFza3N9IHRhc2socyksICR7Yy5wbGFub2dsb2JhbGNvbW1lbnRzfSBjb21tZW50KHMpLCAke2MucGxhbm9yZXZpc2lvbnN9IHJldmlzaW9uKHMpYCxcbiAgICApO1xuICAgIGlmIChpc0xhc3QpIHtcbiAgICAgIHN1bW1hcnkucHVzaChcbiAgICAgICAgXCJUaGlzIGlzIHRoZSBPTkxZIGZsb29yIGluIHRoaXMgcGxhbm9ncmFtLiBEZWxldGluZyBpdCB3aWxsIFJFTU9WRSBUSEUgRU5USVJFIFBMQU5PR1JBTS4gVGhlIHN0b3JlIGVudHJ5IGl0c2VsZiB3aWxsIG5vdCBiZSB0b3VjaGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgc3VtbWFyeS5wdXNoKFwiVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS5cIik7XG5cbiAgICBjb25zdCBmaXJzdFRpdGxlID0gaXNMYXN0XG4gICAgICA/IFwiRGVsZXRlIHBsYW5vZ3JhbSBlbnRpcmVseT9cIlxuICAgICAgOiBcIkRlbGV0ZSB0aGlzIGZsb29yP1wiO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybShmaXJzdFRpdGxlLCBzdW1tYXJ5LmpvaW4oXCJcXG5cIikpO1xuICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgICBpZiAoaXNMYXN0KSB7XG4gICAgICBjb25zdCBkb3VibGVDb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm0oXG4gICAgICAgIFwiRmluYWwgY29uZmlybWF0aW9uXCIsXG4gICAgICAgIGBZb3UgYXJlIGFib3V0IHRvIHBlcm1hbmVudGx5IGRlbGV0ZSB0aGUgcGxhbm9ncmFtIGZvciBcIiR7cGxhbm8uc3RvcmVOYW1lfVwiLiBUaGlzIHdpcGVzIHRoZSBmbG9vciBhbmQgdGhlIHBsYW5vZ3JhbSBtZXRhZGF0YS4gVGhlIHN0b3JlIGlzIHByZXNlcnZlZC4gUHJvY2VlZD9gLFxuICAgICAgKTtcbiAgICAgIGlmICghZG91YmxlQ29uZmlybWVkKSByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2JzXG4gICAgICAuZGVsZXRlRmxvb3JDYXNjYWRlKHtcbiAgICAgICAgZmxvb3JJZDogdGhpcy5zZWxlY3RlZEZsb29ySWQhLFxuICAgICAgICBjb25maXJtTGFzdEZsb29yOiBpc0xhc3QsXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGEgfHwge307XG4gICAgICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgaWYgKGRhdGEucGxhbm9ncmFtRGVsZXRlZCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIlBsYW5vZ3JhbSByZW1vdmVkIGVudGlyZWx5XCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiRmxvb3IgZGVsZXRlZFwiKTtcbiAgICAgICAgICAgIGlmIChkYXRhLnJlbnVtYmVyZWRGbG9vcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKFxuICAgICAgICAgICAgICAgIGAke2RhdGEucmVudW1iZXJlZEZsb29ycy5sZW5ndGh9IHNpYmxpbmcgZmxvb3IocykgcmVudW1iZXJlZGAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRjID0gZGF0YS5kZWxldGVkQ291bnRzIHx8IHt9O1xuICAgICAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgICAgICBgQ2xlYW5lZDogJHtkYy5zdG9yZWZpeHR1cmVzIHx8IDB9IGZpeHR1cmVzLCAke2RjLmZpeHR1cmVzaGVsdmVzIHx8IDB9IHNoZWx2ZXMsICR7ZGMucGxhbm90YXNrY29tcGxpYW5jZXMgfHwgMH0gY29tcGxpYW5jZSwgJHtkYy5wcm9jZXNzZWR0YXNrcyB8fCAwfSB0YXNrKHMpLCAke2RjLnBsYW5vZ2xvYmFsY29tbWVudHMgfHwgMH0gY29tbWVudChzKSwgJHtkYy5wbGFub3JldmlzaW9ucyB8fCAwfSByZXZpc2lvbihzKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKHBhcnRzLmpvaW4oXCIuIFwiKSwgXCJzdWNjZXNzXCIpO1xuICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZXNldEZsb29yU3RhdGUoKTtcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0b3JlSWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZsb29ycygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGRlbGV0ZSBmbG9vci5cIixcbiAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybSh0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSB0aXRsZTtcbiAgICAgIHJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbmZpcm1MYWJlbCA9IFwiRGVsZXRlXCI7XG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlybUNsYXNzID0gXCJidG4tZGFuZ2VyXCI7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWYucmVzdWx0O1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gXCJva1wiO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNob3dNZXNzYWdlKG1zZzogc3RyaW5nLCB0eXBlOiBcInN1Y2Nlc3NcIiB8IFwiZXJyb3JcIikge1xuICAgIHRoaXMubWVzc2FnZSA9IG1zZztcbiAgICB0aGlzLm1lc3NhZ2VUeXBlID0gdHlwZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLm1lc3NhZ2UgPSBcIlwiKSwgNjAwMCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uIGNsYXNzPVwiZGVsZXRlLWZsb29yIHAtM1wiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTRcIiBzdHlsZT1cIm1heC13aWR0aDogNzIwcHg7XCI+XG4gICAgPGg1IGNsYXNzPVwibWItMVwiPkRlbGV0ZSBGbG9vcjwvaDU+XG4gICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG1iLTNcIj5cbiAgICAgIFJlbW92ZXMgYSBmbG9vciBhbmQgZXZlcnkgcm93IHRoYXQgcmVmZXJlbmNlcyBpdCDigJQgZml4dHVyZXMsIHNoZWx2ZXMsIHRhc2tcbiAgICAgIGNvbXBsaWFuY2UsIHByb2Nlc3NlZCB0YXNrcywgY29tbWVudHMsIGFuZCByZXZpc2lvbnMuIElmIHRoaXMgaXMgdGhlIG9ubHlcbiAgICAgIGZsb29yLCB0aGUgZW50aXJlIHBsYW5vZ3JhbSBpcyByZW1vdmVkLiBUaGUgc3RvcmUgZW50cnkgaXMgbmV2ZXIgdG91Y2hlZC5cbiAgICA8L3A+XG5cbiAgICA8IS0tIFN0b3JlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxuICAgICAgICBsYWJlbD1cIlN0b3JlXCJcbiAgICAgICAgW2lkRmllbGRdPVwiJ3N0b3JlSWQnXCJcbiAgICAgICAgW25hbWVGaWVsZF09XCInc3RvcmVOYW1lJ1wiXG4gICAgICAgIFtkYXRhXT1cInN0b3JlT3B0aW9uc1wiXG4gICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkU3RvcmVJZFwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xXCIgKm5nSWY9XCJpc0xvYWRpbmdTdG9yZXNcIj5Mb2FkaW5nIHN0b3Jlcy4uLjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGbG9vciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwic2VsZWN0ZWRTdG9yZUlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nRmxvb3JzOyBlbHNlIGZsb29yUGlja2VyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+TG9hZGluZyBmbG9vcnMuLi48L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNmbG9vclBpY2tlcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZsb29ycy5sZW5ndGggPiAwOyBlbHNlIG5vRmxvb3JzXCI+XG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcbiAgICAgICAgICAgIGxhYmVsPVwiRmxvb3JcIlxuICAgICAgICAgICAgW2lkRmllbGRdPVwiJ19pZCdcIlxuICAgICAgICAgICAgW25hbWVGaWVsZF09XCInZGlzcGxheU5hbWUnXCJcbiAgICAgICAgICAgIFtkYXRhXT1cImZsb29yc1wiXG4gICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGbG9vcklkXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmxvb3JTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNub0Zsb29ycz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPk5vIGZsb29ycyBmb3VuZCBmb3IgdGhpcyBzdG9yZS48L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0YXR1cyArIGNhc2NhZGUgcHJldmlldyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGbG9vcklkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nSW1wYWN0OyBlbHNlIGltcGFjdEJsb2NrXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+TG9hZGluZyBmbG9vciBkZXRhaWxzLi4uPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjaW1wYWN0QmxvY2s+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbXBhY3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBwLTMgcm91bmRlZCBpbmZvLWJsb2NrXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGd4LTMgZ3ktMiBzbWFsbFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgZC1ibG9ja1wiPkZsb29yIHN0YXR1czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgZm9ybWF0U3RhdHVzKGltcGFjdC5mbG9vci5zdGF0dXMpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5QbGFub2dyYW0gc3RhdHVzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBmb3JtYXRTdGF0dXMoaW1wYWN0LnBsYW5vZ3JhbS5zdGF0dXMpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5QbGFubyBhcHByb3ZlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgZm9ybWF0Qm9vbChpbXBhY3QuZmxvb3IuaXNQbGFub0FwcHJvdmVkKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrXCI+VmVyaWZpY2F0aW9uIGRvbmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGZvcm1hdEJvb2woaW1wYWN0LmZsb29yLnZlcmlmaWNhdGlvblN0YXR1cykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgZC1ibG9ja1wiPk1lcmNoIHJvbGxvdXQgZG9uZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgZm9ybWF0Qm9vbChpbXBhY3QuZmxvb3IubWVyY2hSb2xsb3V0U3RhdHVzKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrXCI+Vk0gcm9sbG91dCBkb25lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBmb3JtYXRCb29sKGltcGFjdC5mbG9vci52bVJvbGxvdXRTdGF0dXMpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrXCI+VG90YWwgZmxvb3JzIGluIHRoaXMgcGxhbm9ncmFtPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBpbXBhY3QudG90YWxGbG9vcnMgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBwLTMgcm91bmRlZCBjYXNjYWRlLWJsb2NrXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgbWItMlwiPldpbGwgZGVsZXRlPC9kaXY+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJzbWFsbCBtYi0wIHBzLTNcIj5cbiAgICAgICAgICAgICAgPGxpPjEgZmxvb3IgKHN0b3JlbGF5b3V0cyk8L2xpPlxuICAgICAgICAgICAgICA8bGk+e3sgaW1wYWN0LmNhc2NhZGUuc3RvcmVmaXh0dXJlcyB9fSBmaXh0dXJlKHMpIChzdG9yZWZpeHR1cmVzKTwvbGk+XG4gICAgICAgICAgICAgIDxsaT57eyBpbXBhY3QuY2FzY2FkZS5maXh0dXJlc2hlbHZlcyB9fSBzaGVsZiByb3cocykgKGZpeHR1cmVzaGVsdmVzKTwvbGk+XG4gICAgICAgICAgICAgIDxsaT57eyBpbXBhY3QuY2FzY2FkZS5wbGFub3Rhc2tjb21wbGlhbmNlcyB9fSB0YXNrIGNvbXBsaWFuY2Ugcm93KHMpIChwbGFub3Rhc2tjb21wbGlhbmNlcyk8L2xpPlxuICAgICAgICAgICAgICA8bGk+e3sgaW1wYWN0LmNhc2NhZGUucHJvY2Vzc2VkdGFza3MgfX0gcHJvY2Vzc2VkIHRhc2socykgKHByb2Nlc3NlZHRhc2tzKTwvbGk+XG4gICAgICAgICAgICAgIDxsaT57eyBpbXBhY3QuY2FzY2FkZS5wbGFub2dsb2JhbGNvbW1lbnRzIH19IGdsb2JhbCBjb21tZW50KHMpIChwbGFub2dsb2JhbGNvbW1lbnRzKTwvbGk+XG4gICAgICAgICAgICAgIDxsaT57eyBpbXBhY3QuY2FzY2FkZS5wbGFub3JldmlzaW9ucyB9fSByZXZpc2lvbihzKSAocGxhbm9yZXZpc2lvbnMpPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0yXCI+VG90YWwgZG93bnN0cmVhbSByb3dzOiB7eyB0b3RhbENhc2NhZGVSb3dzIH19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBzbWFsbFwiICpuZ0lmPVwiaW1wYWN0LmlzTGFzdEZsb29yXCI+XG4gICAgICAgICAgICA8c3Ryb25nPlRoaXMgaXMgdGhlIG9ubHkgZmxvb3IgaW4gdGhpcyBwbGFub2dyYW0uPC9zdHJvbmc+XG4gICAgICAgICAgICBEZWxldGluZyBpdCB3aWxsIGFsc28gcmVtb3ZlIHRoZSBwbGFub2dyYW0gZW50cnkg4oCUIHRoZSBwbGFubyB3aWxsXG4gICAgICAgICAgICBkaXNhcHBlYXIgY29tcGxldGVseS4gVGhlIHN0b3JlIHJlY29yZCBpdHNlbGYgd2lsbCBOT1QgYmUgZGVsZXRlZC5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBTdWJtaXQgLS0+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIiBbZGlzYWJsZWRdPVwiIWNhblN1Ym1pdFwiPlxuICAgICAge3sgaXNTdWJtaXR0aW5nID8gJ0RlbGV0aW5nLi4uJyA6ICdEZWxldGUgRmxvb3InIH19XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMyBhbGVydFwiICpuZ0lmPVwibWVzc2FnZVwiXG4gICAgICBbY2xhc3MuYWxlcnQtc3VjY2Vzc109XCJtZXNzYWdlVHlwZSA9PT0gJ3N1Y2Nlc3MnXCJcbiAgICAgIFtjbGFzcy5hbGVydC1kYW5nZXJdPVwibWVzc2FnZVR5cGUgPT09ICdlcnJvcidcIlxuICAgICAgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XCI+XG4gICAgICB7eyBtZXNzYWdlIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zZWN0aW9uPlxuIl19
|
|
@@ -50,10 +50,10 @@ export class ToolsParentComponent {
|
|
|
50
50
|
this.destroy$.complete();
|
|
51
51
|
}
|
|
52
52
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToolsParentComponent, deps: [{ token: i1.NgbModal }, { token: i2.Router }, { token: i3.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
53
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ToolsParentComponent, selector: "lib-tools-parent", ngImport: i0, template: "<div class=\"d-flex mb-3\">\r\n <div class=\"d-flex gap-3\">\r\n\r\n <!-- <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/builder\">\r\n Plano Builder\r\n </button> -->\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/migrate\">\r\n Download Layout Images\r\n </button>\r\n \r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/cad-render\">\r\n Check CAD Output\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/allow-edit\">\r\n Allow Edit\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/delete-task\">\r\n Delete Task\r\n </button>\r\n\r\n <!-- <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/update-fixture-type\">\r\n Update Fixture Type\r\n </button> -->\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/modify-fixture-numbers\">\r\n Modify Fixture Numbers\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/data-export\">\r\n Data Export\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/store-exports\">\r\n MBQ & Order\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/swap-template\">\r\n Template Swap\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/move-bucket\">\r\n Move Store Bucket\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/cad-files\">\r\n CAD Files\r\n </button>\r\n\r\n <button class=\"btn btn-success\" (click)=\"onClickCreateFixtureTemplate()\">\r\n Create Template\r\n </button>\r\n\r\n </div>\r\n</div>\r\n<hr>\r\n<router-outlet></router-outlet>", styles: [""], dependencies: [{ kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
53
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ToolsParentComponent, selector: "lib-tools-parent", ngImport: i0, template: "<div class=\"d-flex mb-3\">\r\n <div class=\"d-flex gap-3\">\r\n\r\n <!-- <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/builder\">\r\n Plano Builder\r\n </button> -->\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/migrate\">\r\n Download Layout Images\r\n </button>\r\n \r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/cad-render\">\r\n Check CAD Output\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/allow-edit\">\r\n Allow Edit\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/delete-task\">\r\n Delete Task\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/delete-floor\">\r\n Delete Floor\r\n </button>\r\n\r\n <!-- <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/update-fixture-type\">\r\n Update Fixture Type\r\n </button> -->\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/modify-fixture-numbers\">\r\n Modify Fixture Numbers\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/data-export\">\r\n Data Export\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/store-exports\">\r\n MBQ & Order\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/swap-template\">\r\n Template Swap\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/move-bucket\">\r\n Move Store Bucket\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/cad-files\">\r\n CAD Files\r\n </button>\r\n\r\n <button class=\"btn btn-success\" (click)=\"onClickCreateFixtureTemplate()\">\r\n Create Template\r\n </button>\r\n\r\n </div>\r\n</div>\r\n<hr>\r\n<router-outlet></router-outlet>", styles: [""], dependencies: [{ kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
54
54
|
}
|
|
55
55
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToolsParentComponent, decorators: [{
|
|
56
56
|
type: Component,
|
|
57
|
-
args: [{ selector: "lib-tools-parent", template: "<div class=\"d-flex mb-3\">\r\n <div class=\"d-flex gap-3\">\r\n\r\n <!-- <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/builder\">\r\n Plano Builder\r\n </button> -->\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/migrate\">\r\n Download Layout Images\r\n </button>\r\n \r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/cad-render\">\r\n Check CAD Output\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/allow-edit\">\r\n Allow Edit\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/delete-task\">\r\n Delete Task\r\n </button>\r\n\r\n <!-- <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/update-fixture-type\">\r\n Update Fixture Type\r\n </button> -->\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/modify-fixture-numbers\">\r\n Modify Fixture Numbers\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/data-export\">\r\n Data Export\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/store-exports\">\r\n MBQ & Order\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/swap-template\">\r\n Template Swap\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/move-bucket\">\r\n Move Store Bucket\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/cad-files\">\r\n CAD Files\r\n </button>\r\n\r\n <button class=\"btn btn-success\" (click)=\"onClickCreateFixtureTemplate()\">\r\n Create Template\r\n </button>\r\n\r\n </div>\r\n</div>\r\n<hr>\r\n<router-outlet></router-outlet>" }]
|
|
57
|
+
args: [{ selector: "lib-tools-parent", template: "<div class=\"d-flex mb-3\">\r\n <div class=\"d-flex gap-3\">\r\n\r\n <!-- <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/builder\">\r\n Plano Builder\r\n </button> -->\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/migrate\">\r\n Download Layout Images\r\n </button>\r\n \r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/cad-render\">\r\n Check CAD Output\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/allow-edit\">\r\n Allow Edit\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/delete-task\">\r\n Delete Task\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/delete-floor\">\r\n Delete Floor\r\n </button>\r\n\r\n <!-- <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/update-fixture-type\">\r\n Update Fixture Type\r\n </button> -->\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/modify-fixture-numbers\">\r\n Modify Fixture Numbers\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/data-export\">\r\n Data Export\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/store-exports\">\r\n MBQ & Order\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/swap-template\">\r\n Template Swap\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/move-bucket\">\r\n Move Store Bucket\r\n </button>\r\n\r\n <button class=\"btn btn-outline\" routerLink=\"/manage/planogram/plano-tools/cad-files\">\r\n CAD Files\r\n </button>\r\n\r\n <button class=\"btn btn-success\" (click)=\"onClickCreateFixtureTemplate()\">\r\n Create Template\r\n </button>\r\n\r\n </div>\r\n</div>\r\n<hr>\r\n<router-outlet></router-outlet>" }]
|
|
58
58
|
}], ctorParameters: () => [{ type: i1.NgbModal }, { type: i2.Router }, { type: i3.GlobalStateService }] });
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHMtcGFyZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5vLXRvb2xzL3Rvb2xzLXBhcmVudC90b29scy1wYXJlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvdG9vbHMtcGFyZW50L3Rvb2xzLXBhcmVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLCtGQUErRixDQUFDO0FBRy9JLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixPQUFPLEVBQ1AsU0FBUyxHQUNWLE1BQU0sTUFBTSxDQUFDOzs7OztBQU9kLE1BQU0sT0FBTyxvQkFBb0I7SUFLckI7SUFDQTtJQUNBO0lBTlYsUUFBUSxDQUFTO0lBRUEsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDaEQsWUFDVSxRQUFrQixFQUNsQixNQUFjLEVBQ2QsRUFBc0I7UUFGdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7SUFDN0IsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWM7YUFDbkIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsdURBQXVEO1FBQ2pGLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxxQ0FBcUM7UUFDeEQsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsNEJBQTRCO1FBQ3RELG9CQUFvQixFQUFFLENBQUMsMkRBQTJEO1NBQ25GO2FBQ0EsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxJQUFJLEVBQUUsTUFBTSxFQUFFO2dCQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksRUFBRSxNQUFNLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0wsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBVyxDQUNqRCxDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxFQUFFLE1BQU0sQ0FBQzthQUNwQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDRCQUE0QjtRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRTtZQUNsRSxRQUFRLEVBQUUsSUFBSTtZQUNkLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BELFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDOUIsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLENBQUMsa0RBQWtELENBQUMsRUFDcEQsRUFBRSxXQUFXLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDMUQsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQWpEVSxvQkFBb0I7NEZBQXBCLG9CQUFvQix3RENsQmpDLDAwRUE4RCtCOzs0RkQ1Q2xCLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IENyZWF0ZUZpeHR1cmVUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9maXh0dXJlLXRlbXBsYXRlLXRhYmxlL3BvcHVwcy9jcmVhdGUtZml4dHVyZS10ZW1wbGF0ZS9jcmVhdGUtZml4dHVyZS10ZW1wbGF0ZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge1xyXG4gIGRlYm91bmNlVGltZSxcclxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcclxuICBmaWx0ZXIsXHJcbiAgU3ViamVjdCxcclxuICB0YWtlVW50aWwsXHJcbn0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi10b29scy1wYXJlbnRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3Rvb2xzLXBhcmVudC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vdG9vbHMtcGFyZW50LmNvbXBvbmVudC5zY3NzXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb29sc1BhcmVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5nYk1vZGFsOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIC8vIFN1YnNjcmlwdGlvbiB3aWxsIGJlIGNhbmNlbGxlZCBvbiBjb21wb25lbnQgZGVzdHJveS5cclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSwgLy8gVG8gYXZvaWQgaW1tZWRpYXRlIGZyZXF1ZW50IGNhbGxzLlxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSwgLy8gRmlsdGVyaW5nIG51bGwvdW5kZWZpbmVkLlxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgLy8gRW1pdHRpbmcgb25seSBkaWZmZXJlbnQgdmFsdWVzLiAoSWdub3JlcyBzYW1lIGNsaWVudElkKS5cclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGlja0NyZWF0ZUZpeHR1cmVUZW1wbGF0ZSgpIHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKENyZWF0ZUZpeHR1cmVUZW1wbGF0ZUNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XHJcbiAgICBtb2RlbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgIFtcIi9tYW5hZ2UvcGxhbm9ncmFtL2ZpeHR1cmUtdGVtcGxhdGUvYmFzaWMtZGV0YWlsc1wiXSxcclxuICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgdGVtcGxhdGVJZDogcmVzdWx0Ll9pZCwgaXNFZGl0OiB0cnVlIH0gfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImQtZmxleCBtYi0zXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4ICBnYXAtM1wiPlxyXG5cclxuICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHMvYnVpbGRlclwiPlxyXG4gICAgICAgICAgICBQbGFubyBCdWlsZGVyXHJcbiAgICAgICAgPC9idXR0b24+IC0tPlxyXG5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvcGxhbm9ncmFtL3BsYW5vLXRvb2xzL21pZ3JhdGVcIj5cclxuICAgICAgICAgICAgRG93bmxvYWQgTGF5b3V0IEltYWdlc1xyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIFxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHMvY2FkLXJlbmRlclwiPlxyXG4gICAgICAgICAgICBDaGVjayBDQUQgT3V0cHV0XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHMvYWxsb3ctZWRpdFwiPlxyXG4gICAgICAgICAgICBBbGxvdyBFZGl0XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHMvZGVsZXRlLXRhc2tcIj5cclxuICAgICAgICAgICAgRGVsZXRlIFRhc2tcclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3BsYW5vZ3JhbS9wbGFuby10b29scy9kZWxldGUtZmxvb3JcIj5cclxuICAgICAgICAgICAgRGVsZXRlIEZsb29yXHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3BsYW5vZ3JhbS9wbGFuby10b29scy91cGRhdGUtZml4dHVyZS10eXBlXCI+XHJcbiAgICAgICAgICAgIFVwZGF0ZSBGaXh0dXJlIFR5cGVcclxuICAgICAgICA8L2J1dHRvbj4gLS0+XHJcblxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHMvbW9kaWZ5LWZpeHR1cmUtbnVtYmVyc1wiPlxyXG4gICAgICAgICAgICBNb2RpZnkgRml4dHVyZSBOdW1iZXJzXHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHMvZGF0YS1leHBvcnRcIj5cclxuICAgICAgICAgICAgRGF0YSBFeHBvcnRcclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3BsYW5vZ3JhbS9wbGFuby10b29scy9zdG9yZS1leHBvcnRzXCI+XHJcbiAgICAgICAgICAgIE1CUSAmIE9yZGVyXHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHMvc3dhcC10ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICBUZW1wbGF0ZSBTd2FwXHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vcGxhbm8tdG9vbHMvbW92ZS1idWNrZXRcIj5cclxuICAgICAgICAgICAgTW92ZSBTdG9yZSBCdWNrZXRcclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3BsYW5vZ3JhbS9wbGFuby10b29scy9jYWQtZmlsZXNcIj5cclxuICAgICAgICAgICAgQ0FEIEZpbGVzXHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiAoY2xpY2spPVwib25DbGlja0NyZWF0ZUZpeHR1cmVUZW1wbGF0ZSgpXCI+XHJcbiAgICAgICAgICAgIENyZWF0ZSBUZW1wbGF0ZVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGhyPlxyXG48cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+Il19
|