cloud-ide-layout 1.0.7 → 1.0.9
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/README.md +34 -448
- package/fesm2022/{cloud-ide-layout-cloud-ide-layout-D3xzVSNA.mjs → cloud-ide-layout-cloud-ide-layout-DLceZY3Y.mjs} +335 -343
- package/fesm2022/{cloud-ide-layout-cloud-ide-layout-D3xzVSNA.mjs.map → cloud-ide-layout-cloud-ide-layout-DLceZY3Y.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-BSUFE_o2.mjs → cloud-ide-layout-drawer-theme.component-Bn5--C_Q.mjs} +69 -67
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-BSUFE_o2.mjs.map → cloud-ide-layout-drawer-theme.component-Bn5--C_Q.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-Dr4MO4MB.mjs → cloud-ide-layout-home-wrapper.component-Bo-4LNLx.mjs} +56 -51
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-Dr4MO4MB.mjs.map → cloud-ide-layout-home-wrapper.component-Bo-4LNLx.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BWx03JYS.mjs → cloud-ide-layout-sidedrawer-notes.component-BmadMzdl.mjs} +28 -32
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BWx03JYS.mjs.map → cloud-ide-layout-sidedrawer-notes.component-BmadMzdl.mjs.map} +1 -1
- package/fesm2022/cloud-ide-layout.mjs +1 -1
- package/index.d.ts +579 -3
- package/package.json +4 -6
- package/esm2022/cloud-ide-layout.mjs +0 -5
- package/esm2022/lib/cloud-ide-layout.component.mjs +0 -16
- package/esm2022/lib/cloud-ide-layout.routes.mjs +0 -28
- package/esm2022/lib/cloud-ide-layout.service.mjs +0 -14
- package/esm2022/lib/layout/console/console-wrapper/console-wrapper.component.mjs +0 -11
- package/esm2022/lib/layout/console/console.service.mjs +0 -28
- package/esm2022/lib/layout/footer/footer-wrapper/footer-wrapper.component.mjs +0 -20
- package/esm2022/lib/layout/footer/footer.service.mjs +0 -28
- package/esm2022/lib/layout/header/header-wrapper/header-wrapper.component.mjs +0 -84
- package/esm2022/lib/layout/header/header.service.mjs +0 -28
- package/esm2022/lib/layout/home/home-wrapper/home-wrapper.component.mjs +0 -198
- package/esm2022/lib/layout/layout/layout-wrapper/layout-wrapper.component.mjs +0 -28
- package/esm2022/lib/layout/request/request-wrapper/request-wrapper.component.mjs +0 -60
- package/esm2022/lib/layout/request/request.service.mjs +0 -235
- package/esm2022/lib/layout/request/tab-content/tab-content.component.mjs +0 -84
- package/esm2022/lib/layout/shared/shared-wrapper/shared-wrapper.component.mjs +0 -49
- package/esm2022/lib/layout/shared/shared.service.mjs +0 -508
- package/esm2022/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.mjs +0 -488
- package/esm2022/lib/layout/sidebar/sidebar.service.mjs +0 -35
- package/esm2022/lib/layout/sidedrawer/cide-lyt-drawer-base.class.mjs +0 -40
- package/esm2022/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.mjs +0 -296
- package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.mjs +0 -175
- package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.mjs +0 -51
- package/esm2022/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.mjs +0 -257
- package/esm2022/lib/layout/sidedrawer/sidedrawer.service.mjs +0 -70
- package/esm2022/lib/services/app-state/app-state-helper.service.mjs +0 -222
- package/esm2022/lib/services/app-state/app-state.service.mjs +0 -256
- package/esm2022/lib/services/app-state/index.mjs +0 -3
- package/esm2022/lib/services/cache-manager/cache-manager.service.mjs +0 -112
- package/esm2022/lib/services/file-manager/file-manager.service.mjs +0 -21
- package/esm2022/lib/services/tab-state.service.mjs +0 -128
- package/esm2022/lib/services/theme/theme.service.mjs +0 -151
- package/esm2022/lib/services/user-status/user-status.service.mjs +0 -135
- package/esm2022/lib/utils/custom-route-reuse-strategy.mjs +0 -61
- package/esm2022/lib/utils/index.mjs +0 -2
- package/esm2022/public-api.mjs +0 -18
- package/lib/cloud-ide-layout.component.d.ts +0 -5
- package/lib/cloud-ide-layout.routes.d.ts +0 -3
- package/lib/cloud-ide-layout.service.d.ts +0 -6
- package/lib/layout/console/console-wrapper/console-wrapper.component.d.ts +0 -5
- package/lib/layout/console/console.service.d.ts +0 -9
- package/lib/layout/footer/footer-wrapper/footer-wrapper.component.d.ts +0 -9
- package/lib/layout/footer/footer.service.d.ts +0 -9
- package/lib/layout/header/header-wrapper/header-wrapper.component.d.ts +0 -25
- package/lib/layout/header/header.service.d.ts +0 -9
- package/lib/layout/home/home-wrapper/home-wrapper.component.d.ts +0 -94
- package/lib/layout/layout/layout-wrapper/layout-wrapper.component.d.ts +0 -5
- package/lib/layout/request/request-wrapper/request-wrapper.component.d.ts +0 -14
- package/lib/layout/request/request.service.d.ts +0 -60
- package/lib/layout/request/tab-content/tab-content.component.d.ts +0 -19
- package/lib/layout/shared/shared-wrapper/shared-wrapper.component.d.ts +0 -17
- package/lib/layout/shared/shared.service.d.ts +0 -114
- package/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.d.ts +0 -140
- package/lib/layout/sidebar/sidebar.service.d.ts +0 -12
- package/lib/layout/sidedrawer/cide-lyt-drawer-base.class.d.ts +0 -16
- package/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.d.ts +0 -71
- package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.d.ts +0 -48
- package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.d.ts +0 -13
- package/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.d.ts +0 -30
- package/lib/layout/sidedrawer/sidedrawer.service.d.ts +0 -30
- package/lib/services/app-state/app-state-helper.service.d.ts +0 -150
- package/lib/services/app-state/app-state.service.d.ts +0 -85
- package/lib/services/app-state/index.d.ts +0 -3
- package/lib/services/cache-manager/cache-manager.service.d.ts +0 -64
- package/lib/services/file-manager/file-manager.service.d.ts +0 -9
- package/lib/services/tab-state.service.d.ts +0 -79
- package/lib/services/theme/theme.service.d.ts +0 -71
- package/lib/services/user-status/user-status.service.d.ts +0 -57
- package/lib/utils/custom-route-reuse-strategy.d.ts +0 -15
- package/lib/utils/index.d.ts +0 -1
- package/public-api.d.ts +0 -12
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, inject, signal } from '@angular/core';
|
|
3
|
-
import { ReactiveFormsModule, FormBuilder } from '@angular/forms';
|
|
4
|
-
import { CideLytDrawerNotesService } from './sidedrawer-notes.service';
|
|
5
|
-
import { CideInputComponent } from 'cloud-ide-element';
|
|
6
|
-
import { CideEleButtonComponent } from 'cloud-ide-element';
|
|
7
|
-
import { CideTextareaComponent } from 'cloud-ide-element';
|
|
8
|
-
import { AppStateHelperService } from '../../../services/app-state/app-state-helper.service';
|
|
9
|
-
import { CideLytDrawerBase } from '../cide-lyt-drawer-base.class';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@angular/common";
|
|
12
|
-
import * as i2 from "@angular/forms";
|
|
13
|
-
export class CideLytSidedrawerNotesComponent extends CideLytDrawerBase {
|
|
14
|
-
constructor() {
|
|
15
|
-
super(...arguments);
|
|
16
|
-
this.notesSignal = signal([]);
|
|
17
|
-
this.notes = this.notesSignal.asReadonly();
|
|
18
|
-
this.isFormVisible = false;
|
|
19
|
-
this.isEditing = false;
|
|
20
|
-
this.editingNoteId = null;
|
|
21
|
-
this.hoveredNoteIndex = null;
|
|
22
|
-
this.notesService = inject(CideLytDrawerNotesService);
|
|
23
|
-
this.fb = inject(FormBuilder);
|
|
24
|
-
this.appState = inject(AppStateHelperService);
|
|
25
|
-
}
|
|
26
|
-
ngOnInit() {
|
|
27
|
-
super.ngOnInit();
|
|
28
|
-
this.initForm();
|
|
29
|
-
this.notesService.getNotes().subscribe({
|
|
30
|
-
next: (notes) => {
|
|
31
|
-
this.notesSignal.set(notes);
|
|
32
|
-
},
|
|
33
|
-
error: (error) => {
|
|
34
|
-
console.error('Error loading notes:', error);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
afterContextInit() {
|
|
39
|
-
// Any additional setup after context is ready can go here
|
|
40
|
-
}
|
|
41
|
-
initForm() {
|
|
42
|
-
this.noteForm = this.fb.group({
|
|
43
|
-
sypn_title: [''],
|
|
44
|
-
sypn_desc: [''],
|
|
45
|
-
sypn_is_page_specific: [true],
|
|
46
|
-
sypn_is_user_specific: [true],
|
|
47
|
-
sypn_is_entity_specific: [false],
|
|
48
|
-
sypn_is_theme_specific: [false]
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
showAddForm() {
|
|
52
|
-
this.isFormVisible = true;
|
|
53
|
-
}
|
|
54
|
-
hideAddForm() {
|
|
55
|
-
this.isFormVisible = false;
|
|
56
|
-
this.isEditing = false;
|
|
57
|
-
this.editingNoteId = null;
|
|
58
|
-
}
|
|
59
|
-
startEdit(note) {
|
|
60
|
-
this.isEditing = true;
|
|
61
|
-
this.editingNoteId = note._id || '';
|
|
62
|
-
this.noteForm.patchValue({
|
|
63
|
-
sypn_title: note.sypn_title || '',
|
|
64
|
-
sypn_desc: note.sypn_desc || '',
|
|
65
|
-
sypn_is_page_specific: note.sypn_is_page_specific || false,
|
|
66
|
-
sypn_is_user_specific: note.sypn_is_user_specific || false,
|
|
67
|
-
sypn_is_entity_specific: note.sypn_is_entity_specific || false,
|
|
68
|
-
sypn_is_theme_specific: note.sypn_is_theme_specific || false
|
|
69
|
-
});
|
|
70
|
-
this.isFormVisible = true;
|
|
71
|
-
}
|
|
72
|
-
cancelEdit() {
|
|
73
|
-
this.isEditing = false;
|
|
74
|
-
this.editingNoteId = null;
|
|
75
|
-
this.resetForm();
|
|
76
|
-
this.isFormVisible = false;
|
|
77
|
-
}
|
|
78
|
-
onNoteHover(index) {
|
|
79
|
-
this.hoveredNoteIndex = index;
|
|
80
|
-
}
|
|
81
|
-
onNoteLeave() {
|
|
82
|
-
this.hoveredNoteIndex = null;
|
|
83
|
-
}
|
|
84
|
-
onSubmit() {
|
|
85
|
-
if (this.noteForm.invalid || !this.noteForm.get('sypn_title')?.value?.trim()) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
const formValue = this.noteForm.value;
|
|
89
|
-
if (this.isEditing && this.editingNoteId) {
|
|
90
|
-
console.log('formValue', this.appState.currentUser());
|
|
91
|
-
const noteToUpdate = {
|
|
92
|
-
_id: this.editingNoteId,
|
|
93
|
-
sypn_title: formValue.sypn_title,
|
|
94
|
-
sypn_desc: formValue.sypn_desc,
|
|
95
|
-
sypn_page_id_sypg: this.pageId || "",
|
|
96
|
-
sypn_user_id_user: this.appState.currentUser()?._id || "",
|
|
97
|
-
sypn_entity_id_sype: this.appState.getActiveEntityId() || "",
|
|
98
|
-
sypn_page_them_id_sytm: this.themeId || "",
|
|
99
|
-
sypn_is_page_specific: formValue.sypn_is_page_specific,
|
|
100
|
-
sypn_is_user_specific: formValue.sypn_is_user_specific,
|
|
101
|
-
sypn_is_entity_specific: formValue.sypn_is_entity_specific,
|
|
102
|
-
sypn_is_theme_specific: formValue.sypn_is_theme_specific,
|
|
103
|
-
};
|
|
104
|
-
this.notesService.updateNote(noteToUpdate).subscribe({
|
|
105
|
-
next: () => {
|
|
106
|
-
const currentNotes = this.notesSignal();
|
|
107
|
-
const updatedNotes = currentNotes.map((note) => note._id === this.editingNoteId ? noteToUpdate : note);
|
|
108
|
-
this.notesSignal.set(updatedNotes);
|
|
109
|
-
this.resetForm();
|
|
110
|
-
this.isFormVisible = false;
|
|
111
|
-
this.isEditing = false;
|
|
112
|
-
this.editingNoteId = null;
|
|
113
|
-
},
|
|
114
|
-
error: (err) => console.error('Failed to update note', err)
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
const noteToAdd = {
|
|
119
|
-
sypn_title: formValue.sypn_title,
|
|
120
|
-
sypn_desc: formValue.sypn_desc,
|
|
121
|
-
sypn_page_id_sypg: this.pageId || "",
|
|
122
|
-
sypn_user_id_user: this.appState.currentUser()?._id || "",
|
|
123
|
-
sypn_entity_id_sype: this.appState.getActiveEntityId() || "",
|
|
124
|
-
sypn_page_them_id_sytm: this.themeId || "",
|
|
125
|
-
sypn_is_page_specific: formValue.sypn_is_page_specific,
|
|
126
|
-
sypn_is_user_specific: formValue.sypn_is_user_specific,
|
|
127
|
-
sypn_is_entity_specific: formValue.sypn_is_entity_specific,
|
|
128
|
-
sypn_is_theme_specific: formValue.sypn_is_theme_specific,
|
|
129
|
-
};
|
|
130
|
-
this.notesService.addNote(noteToAdd).subscribe({
|
|
131
|
-
next: (response) => {
|
|
132
|
-
const responseData = response;
|
|
133
|
-
const newNoteWithId = {
|
|
134
|
-
...noteToAdd,
|
|
135
|
-
_id: responseData._id || responseData.id || Date.now().toString()
|
|
136
|
-
};
|
|
137
|
-
const currentNotes = this.notesSignal();
|
|
138
|
-
this.notesSignal.set([newNoteWithId, ...currentNotes]);
|
|
139
|
-
this.resetForm();
|
|
140
|
-
this.isFormVisible = false;
|
|
141
|
-
},
|
|
142
|
-
error: (err) => console.error('Failed to add note', err)
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
resetForm() {
|
|
147
|
-
this.noteForm.reset({
|
|
148
|
-
sypn_title: '',
|
|
149
|
-
sypn_desc: '',
|
|
150
|
-
sypn_is_page_specific: true,
|
|
151
|
-
sypn_is_user_specific: true,
|
|
152
|
-
sypn_is_entity_specific: false,
|
|
153
|
-
sypn_is_theme_specific: false
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
getState() {
|
|
157
|
-
return {
|
|
158
|
-
newNoteModel: { ...(this.noteForm?.value ? this.noteForm?.value : {}) },
|
|
159
|
-
isFormVisible: this.isFormVisible,
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
setState(state) {
|
|
163
|
-
if (state) {
|
|
164
|
-
this.noteForm.patchValue(state.newNoteModel);
|
|
165
|
-
this.isFormVisible = state.isFormVisible;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerNotesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
169
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: CideLytSidedrawerNotesComponent, isStandalone: true, selector: "cide-lyt-sidedrawer-notes", usesInheritance: true, ngImport: i0, template: "<div class=\"tw-relative tw-h-full tw-bg-white tw-overflow-hidden tw-flex tw-flex-col\">\n <!-- FIXED HEADER SECTION (ABSOLUTE POSITIONED) -->\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200\">\n <!-- DYNAMIC HEADING -->\n <div class=\"tw-flex tw-justify-between tw-items-center tw-p-2 tw-bg-white tw-border-b tw-border-gray-200\">\n <h6 class=\"tw-font-semibold tw-text-gray-800\">\n {{ isFormVisible ? (isEditing ? 'Edit Note' : 'Add a New Note') : 'Notes' }}\n </h6>\n <button *ngIf=\"!isFormVisible\" (click)=\"showAddForm()\" cideEleButton variant=\"primary\"\n class=\"tw-p-2 !tw-w-7 !tw-px-0 !tw-rounded-full tw-animate-pulse\" title=\"Add New Note\">\n <!-- Using inline SVG for the plus icon for simplicity -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n </button>\n </div>\n\n <!-- ADD NOTE FORM (ANIMATED WRAPPER) -->\n <div class=\"tw-transition-all tw-duration-300 tw-ease-in-out tw-animate-fade-in\" [class.tw-opacity-100]=\"isFormVisible\"\n [class.tw-opacity-0]=\"!isFormVisible\" [class.tw-max-h-0]=\"!isFormVisible\">\n <form [formGroup]=\"noteForm\" (ngSubmit)=\"onSubmit()\" class=\"tw-p-3 tw-space-y-4\" *ngIf=\"isFormVisible\">\n <!-- Title Input -->\n <cide-ele-input name=\"sypn_title\" formControlName=\"sypn_title\" placeholder=\"Note Title\" label=\"Note Title\"\n [required]=\"true\" [type]=\"'text'\" class=\"tw-w-full tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-input>\n\n <!-- Description Textarea -->\n <cide-ele-textarea placeholder=\"What's on your mind? (Optional)\" id=\"sypn_desc\" formControlName=\"sypn_desc\"\n rows=\"4\" label=\"Description\" class=\"tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-textarea>\n\n <!-- Toggle Switches -->\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_page_specific\" label=\"Page Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_user_specific\" label=\"User Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_entity_specific\" label=\"Entity Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_theme_specific\" label=\"Theme Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-space-x-3 tw-pt-4\">\n <button cideEleButton size=\"xs\" variant=\"primary\" type=\"submit\" [disabled]=\"noteForm.invalid\">\n {{ isEditing ? 'Update Note' : 'Add Note' }}\n </button>\n <button cideEleButton size=\"xs\" variant=\"secondary\" type=\"button\"\n (click)=\"isEditing ? cancelEdit() : hideAddForm()\">\n {{ isEditing ? 'Cancel Edit' : 'Cancel' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- SCROLLABLE NOTES SECTION (BELOW FIXED HEADER) -->\n <div class=\"tw-overflow-y-auto tw-scroll-smooth notes-scroll-container\">\n <!-- Modern Angular v20 pattern: Use Signals directly -->\n <div class=\"\" *ngIf=\"notes() as notes; else loading\">\n <!-- Show notes if the array is not empty -->\n <div *ngIf=\"notes.length > 0; else noNotes\">\n <div *ngFor=\"let note of notes; let i = index\"\n class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-p-4 tw-shadow-sm hover:tw-shadow-md tw-transition-all tw-duration-300 tw-ease-in-out tw-relative tw-transform hover:tw-translate-y-[-2px] hover:tw-shadow-lg\"\n (mouseenter)=\"onNoteHover(i)\" (mouseleave)=\"onNoteLeave()\">\n <!-- Edit Button (visible on hover) -->\n <button (click)=\"startEdit(note)\" [class.tw-opacity-100]=\"hoveredNoteIndex === i\"\n [class.tw-opacity-0]=\"hoveredNoteIndex !== i\"\n class=\"tw-absolute tw-top-2 tw-right-2 tw-transition-all tw-duration-200 tw-p-1 tw-rounded tw-bg-gray-100 hover:tw-bg-gray-200 hover:tw-scale-110 tw-z-10\"\n title=\"Edit Note\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\n <path d=\"m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\n </svg>\n </button>\n\n <h6 class=\"tw-font-medium tw-text-gray-900 tw-mb-2 tw-pr-8\">{{ note.sypn_title }}</h6>\n <p class=\"tw-text-gray-600 tw-text-sm tw-mb-3\">{{ note.sypn_desc }}</p>\n <div class=\"tw-flex tw-flex-wrap tw-gap-2\">\n <span *ngIf=\"note.sypn_is_page_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-blue-100 tw-text-blue-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-blue-200\">Page Specific</span>\n <span *ngIf=\"note.sypn_is_user_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-green-200\">User Specific</span>\n <span *ngIf=\"note.sypn_is_entity_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-purple-100 tw-text-purple-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-purple-200\">Entity\n Specific</span>\n <span *ngIf=\"note.sypn_is_theme_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-orange-100 tw-text-orange-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-orange-200\">Theme\n Specific</span>\n </div>\n <!-- <p class=\"note-date\">{{ note.createdAt | date:'short' }}</p> -->\n </div>\n </div>\n </div>\n\n <!-- Template to show when there are no notes -->\n <ng-template #noNotes>\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8 tw-text-center\">\n <div class=\"tw-w-12 tw-h-12 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mb-4 tw-animate-bounce\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"tw-text-gray-400\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14,2 14,8 20,8\"></polyline>\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line>\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\n <polyline points=\"10,9 9,9 8,9\"></polyline>\n </svg>\n </div>\n <p class=\"tw-text-gray-500 tw-mb-2\">No notes found.</p>\n <p class=\"tw-text-sm tw-text-gray-400\">Click the '+' to add one!</p>\n </div>\n </ng-template>\n\n <!-- Template to show while notes are loading -->\n <ng-template #loading>\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8\">\n <div class=\"tw-w-8 tw-h-8 tw-border-4 tw-border-blue-200 tw-border-t-blue-600 tw-rounded-full tw-animate-spin tw-mb-4\"></div>\n <p class=\"tw-text-gray-500 tw-text-sm\">Loading notes...</p>\n </div>\n </ng-template>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }] }); }
|
|
170
|
-
}
|
|
171
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerNotesComponent, decorators: [{
|
|
172
|
-
type: Component,
|
|
173
|
-
args: [{ selector: 'cide-lyt-sidedrawer-notes', standalone: true, imports: [CommonModule, ReactiveFormsModule, CideInputComponent, CideEleButtonComponent, CideTextareaComponent], template: "<div class=\"tw-relative tw-h-full tw-bg-white tw-overflow-hidden tw-flex tw-flex-col\">\n <!-- FIXED HEADER SECTION (ABSOLUTE POSITIONED) -->\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200\">\n <!-- DYNAMIC HEADING -->\n <div class=\"tw-flex tw-justify-between tw-items-center tw-p-2 tw-bg-white tw-border-b tw-border-gray-200\">\n <h6 class=\"tw-font-semibold tw-text-gray-800\">\n {{ isFormVisible ? (isEditing ? 'Edit Note' : 'Add a New Note') : 'Notes' }}\n </h6>\n <button *ngIf=\"!isFormVisible\" (click)=\"showAddForm()\" cideEleButton variant=\"primary\"\n class=\"tw-p-2 !tw-w-7 !tw-px-0 !tw-rounded-full tw-animate-pulse\" title=\"Add New Note\">\n <!-- Using inline SVG for the plus icon for simplicity -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n </button>\n </div>\n\n <!-- ADD NOTE FORM (ANIMATED WRAPPER) -->\n <div class=\"tw-transition-all tw-duration-300 tw-ease-in-out tw-animate-fade-in\" [class.tw-opacity-100]=\"isFormVisible\"\n [class.tw-opacity-0]=\"!isFormVisible\" [class.tw-max-h-0]=\"!isFormVisible\">\n <form [formGroup]=\"noteForm\" (ngSubmit)=\"onSubmit()\" class=\"tw-p-3 tw-space-y-4\" *ngIf=\"isFormVisible\">\n <!-- Title Input -->\n <cide-ele-input name=\"sypn_title\" formControlName=\"sypn_title\" placeholder=\"Note Title\" label=\"Note Title\"\n [required]=\"true\" [type]=\"'text'\" class=\"tw-w-full tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-input>\n\n <!-- Description Textarea -->\n <cide-ele-textarea placeholder=\"What's on your mind? (Optional)\" id=\"sypn_desc\" formControlName=\"sypn_desc\"\n rows=\"4\" label=\"Description\" class=\"tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-textarea>\n\n <!-- Toggle Switches -->\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_page_specific\" label=\"Page Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_user_specific\" label=\"User Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_entity_specific\" label=\"Entity Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_theme_specific\" label=\"Theme Specific\"\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-space-x-3 tw-pt-4\">\n <button cideEleButton size=\"xs\" variant=\"primary\" type=\"submit\" [disabled]=\"noteForm.invalid\">\n {{ isEditing ? 'Update Note' : 'Add Note' }}\n </button>\n <button cideEleButton size=\"xs\" variant=\"secondary\" type=\"button\"\n (click)=\"isEditing ? cancelEdit() : hideAddForm()\">\n {{ isEditing ? 'Cancel Edit' : 'Cancel' }}\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- SCROLLABLE NOTES SECTION (BELOW FIXED HEADER) -->\n <div class=\"tw-overflow-y-auto tw-scroll-smooth notes-scroll-container\">\n <!-- Modern Angular v20 pattern: Use Signals directly -->\n <div class=\"\" *ngIf=\"notes() as notes; else loading\">\n <!-- Show notes if the array is not empty -->\n <div *ngIf=\"notes.length > 0; else noNotes\">\n <div *ngFor=\"let note of notes; let i = index\"\n class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-p-4 tw-shadow-sm hover:tw-shadow-md tw-transition-all tw-duration-300 tw-ease-in-out tw-relative tw-transform hover:tw-translate-y-[-2px] hover:tw-shadow-lg\"\n (mouseenter)=\"onNoteHover(i)\" (mouseleave)=\"onNoteLeave()\">\n <!-- Edit Button (visible on hover) -->\n <button (click)=\"startEdit(note)\" [class.tw-opacity-100]=\"hoveredNoteIndex === i\"\n [class.tw-opacity-0]=\"hoveredNoteIndex !== i\"\n class=\"tw-absolute tw-top-2 tw-right-2 tw-transition-all tw-duration-200 tw-p-1 tw-rounded tw-bg-gray-100 hover:tw-bg-gray-200 hover:tw-scale-110 tw-z-10\"\n title=\"Edit Note\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\n <path d=\"m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\n </svg>\n </button>\n\n <h6 class=\"tw-font-medium tw-text-gray-900 tw-mb-2 tw-pr-8\">{{ note.sypn_title }}</h6>\n <p class=\"tw-text-gray-600 tw-text-sm tw-mb-3\">{{ note.sypn_desc }}</p>\n <div class=\"tw-flex tw-flex-wrap tw-gap-2\">\n <span *ngIf=\"note.sypn_is_page_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-blue-100 tw-text-blue-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-blue-200\">Page Specific</span>\n <span *ngIf=\"note.sypn_is_user_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-green-200\">User Specific</span>\n <span *ngIf=\"note.sypn_is_entity_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-purple-100 tw-text-purple-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-purple-200\">Entity\n Specific</span>\n <span *ngIf=\"note.sypn_is_theme_specific\"\n class=\"tw-px-2 tw-py-1 tw-bg-orange-100 tw-text-orange-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-orange-200\">Theme\n Specific</span>\n </div>\n <!-- <p class=\"note-date\">{{ note.createdAt | date:'short' }}</p> -->\n </div>\n </div>\n </div>\n\n <!-- Template to show when there are no notes -->\n <ng-template #noNotes>\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8 tw-text-center\">\n <div class=\"tw-w-12 tw-h-12 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mb-4 tw-animate-bounce\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"tw-text-gray-400\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n <polyline points=\"14,2 14,8 20,8\"></polyline>\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line>\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\n <polyline points=\"10,9 9,9 8,9\"></polyline>\n </svg>\n </div>\n <p class=\"tw-text-gray-500 tw-mb-2\">No notes found.</p>\n <p class=\"tw-text-sm tw-text-gray-400\">Click the '+' to add one!</p>\n </div>\n </ng-template>\n\n <!-- Template to show while notes are loading -->\n <ng-template #loading>\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8\">\n <div class=\"tw-w-8 tw-h-8 tw-border-4 tw-border-blue-200 tw-border-t-blue-600 tw-rounded-full tw-animate-spin tw-mb-4\"></div>\n <p class=\"tw-text-gray-500 tw-text-sm\">Loading notes...</p>\n </div>\n </ng-template>\n </div>\n</div>" }]
|
|
174
|
-
}] });
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWRyYXdlci1ub3Rlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtbGF5b3V0L3NyYy9saWIvbGF5b3V0L3NpZGVkcmF3ZXIvc2lkZWRyYXdlci1ub3Rlcy9zaWRlZHJhd2VyLW5vdGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1sYXlvdXQvc3JjL2xpYi9sYXlvdXQvc2lkZWRyYXdlci9zaWRlZHJhd2VyLW5vdGVzL3NpZGVkcmF3ZXItbm90ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDN0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7QUF3QmxFLE1BQU0sT0FBTywrQkFBZ0MsU0FBUSxpQkFBaUI7SUFQdEU7O1FBUVUsZ0JBQVcsR0FBRyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUM7UUFDOUMsVUFBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMs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RUFBRSxLQUFLO1lBQzlCLHNCQUFzQixFQUFFLEtBQUs7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPO1lBQ0wsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdkUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQTBCO1FBQ3hDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDOzhHQXRLVSwrQkFBK0I7a0dBQS9CLCtCQUErQiw0R0NqQzVDLGlnUUErSE0seUREbEdNLFlBQVksK1BBQUUsbUJBQW1CLDA1QkFBRSxrQkFBa0IsMGJBQUUsc0JBQXNCLGtYQUFFLHFCQUFxQjs7MkZBSW5HLCtCQUErQjtrQkFQM0MsU0FBUzsrQkFDRSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENpZGVMeXREcmF3ZXJOb3Rlc1NlcnZpY2UgfSBmcm9tICcuL3NpZGVkcmF3ZXItbm90ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBJQ29yZVN5cG4gfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcbmltcG9ydCB7IENpZGVJbnB1dENvbXBvbmVudCB9IGZyb20gJ2Nsb3VkLWlkZS1lbGVtZW50JztcbmltcG9ydCB7IENpZGVFbGVCdXR0b25Db21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBDaWRlVGV4dGFyZWFDb21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBBcHBTdGF0ZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hcHAtc3RhdGUvYXBwLXN0YXRlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IENpZGVMeXREcmF3ZXJCYXNlIH0gZnJvbSAnLi4vY2lkZS1seXQtZHJhd2VyLWJhc2UuY2xhc3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ld05vdGVNb2RlbCB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGlzUGFnZVNwZWNpZmljOiBib29sZWFuO1xuICBpc1VzZXJTcGVjaWZpYzogYm9vbGVhbjtcbiAgaXNFbnRpdHlTcGVjaWZpYzogYm9vbGVhbjtcbiAgaXNUaGVtZVNwZWNpZmljOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGVzQ29tcG9uZW50U3RhdGUge1xuICBuZXdOb3RlTW9kZWw6IE5ld05vdGVNb2RlbDtcbiAgaXNGb3JtVmlzaWJsZTogYm9vbGVhbjtcbiAgc2Nyb2xsVG9wOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NpZGUtbHl0LXNpZGVkcmF3ZXItbm90ZXMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDaWRlSW5wdXRDb21wb25lbnQsIENpZGVFbGVCdXR0b25Db21wb25lbnQsIENpZGVUZXh0YXJlYUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlZHJhd2VyLW5vdGVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3NpZGVkcmF3ZXItbm90ZXMuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgQ2lkZUx5dFNpZGVkcmF3ZXJOb3Rlc0NvbXBvbmVudCBleHRlbmRzIENpZGVMeXREcmF3ZXJCYXNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBub3Rlc1NpZ25hbCA9IHNpZ25hbDxJQ29yZVN5cG5bXT4oW10pO1xuICBub3RlcyA9IHRoaXMubm90ZXNTaWduYWwuYXNSZWFkb25seSgpO1xuICBpc0Zvcm1WaXNpYmxlID0gZmFsc2U7XG4gIGlzRWRpdGluZyA9IGZhbHNlO1xuICBlZGl0aW5nTm90ZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgaG92ZXJlZE5vdGVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIG5vdGVGb3JtITogRm9ybUdyb3VwO1xuICBwcml2YXRlIG5vdGVzU2VydmljZSA9IGluamVjdChDaWRlTHl0RHJhd2VyTm90ZXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgYXBwU3RhdGUgPSBpbmplY3QoQXBwU3RhdGVIZWxwZXJTZXJ2aWNlKTtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICB0aGlzLm5vdGVzU2VydmljZS5nZXROb3RlcygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobm90ZXMpID0+IHtcbiAgICAgICAgdGhpcy5ub3Rlc1NpZ25hbC5zZXQobm90ZXMpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBub3RlczonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWZ0ZXJDb250ZXh0SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBBbnkgYWRkaXRpb25hbCBzZXR1cCBhZnRlciBjb250ZXh0IGlzIHJlYWR5IGNhbiBnbyBoZXJlXG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMubm90ZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHN5cG5fdGl0bGU6IFsnJ10sXG4gICAgICBzeXBuX2Rlc2M6IFsnJ10sXG4gICAgICBzeXBuX2lzX3BhZ2Vfc3BlY2lmaWM6IFt0cnVlXSxcbiAgICAgIHN5cG5faXNfdXNlcl9zcGVjaWZpYzogW3RydWVdLFxuICAgICAgc3lwbl9pc19lbnRpdHlfc3BlY2lmaWM6IFtmYWxzZV0sXG4gICAgICBzeXBuX2lzX3RoZW1lX3NwZWNpZmljOiBbZmFsc2VdXG4gICAgfSk7XG4gIH1cblxuICBzaG93QWRkRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9ybVZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgaGlkZUFkZEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Zvcm1WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVkaXRpbmdOb3RlSWQgPSBudWxsO1xuICB9XG5cbiAgc3RhcnRFZGl0KG5vdGU6IElDb3JlU3lwbik6IHZvaWQge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRpbmdOb3RlSWQgPSBub3RlLl9pZCB8fCAnJztcbiAgICB0aGlzLm5vdGVGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgc3lwbl90aXRsZTogbm90ZS5zeXBuX3RpdGxlIHx8ICcnLFxuICAgICAgc3lwbl9kZXNjOiBub3RlLnN5cG5fZGVzYyB8fCAnJyxcbiAgICAgIHN5cG5faXNfcGFnZV9zcGVjaWZpYzogbm90ZS5zeXBuX2lzX3BhZ2Vfc3BlY2lmaWMgfHwgZmFsc2UsXG4gICAgICBzeXBuX2lzX3VzZXJfc3BlY2lmaWM6IG5vdGUuc3lwbl9pc191c2VyX3NwZWNpZmljIHx8IGZhbHNlLFxuICAgICAgc3lwbl9pc19lbnRpdHlfc3BlY2lmaWM6IG5vdGUuc3lwbl9pc19lbnRpdHlfc3BlY2lmaWMgfHwgZmFsc2UsXG4gICAgICBzeXBuX2lzX3RoZW1lX3NwZWNpZmljOiBub3RlLnN5cG5faXNfdGhlbWVfc3BlY2lmaWMgfHwgZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmlzRm9ybVZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgY2FuY2VsRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ05vdGVJZCA9IG51bGw7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmlzRm9ybVZpc2libGUgPSBmYWxzZTtcbiAgfVxuXG4gIG9uTm90ZUhvdmVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhvdmVyZWROb3RlSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIG9uTm90ZUxlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuaG92ZXJlZE5vdGVJbmRleCA9IG51bGw7XG4gIH1cblxuICBvblN1Ym1pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ub3RlRm9ybS5pbnZhbGlkIHx8ICF0aGlzLm5vdGVGb3JtLmdldCgnc3lwbl90aXRsZScpPy52YWx1ZT8udHJpbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMubm90ZUZvcm0udmFsdWU7XG4gICAgaWYgKHRoaXMuaXNFZGl0aW5nICYmIHRoaXMuZWRpdGluZ05vdGVJZCkge1xuICAgICAgY29uc29sZS5sb2coJ2Zvcm1WYWx1ZScsIHRoaXMuYXBwU3RhdGUuY3VycmVudFVzZXIoKSk7XG4gICAgICBjb25zdCBub3RlVG9VcGRhdGU6IElDb3JlU3lwbiA9IHtcbiAgICAgICAgX2lkOiB0aGlzLmVkaXRpbmdOb3RlSWQsXG4gICAgICAgIHN5cG5fdGl0bGU6IGZvcm1WYWx1ZS5zeXBuX3RpdGxlLFxuICAgICAgICBzeXBuX2Rlc2M6IGZvcm1WYWx1ZS5zeXBuX2Rlc2MsXG4gICAgICAgIHN5cG5fcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCB8fCBcIlwiLFxuICAgICAgICBzeXBuX3VzZXJfaWRfdXNlcjogdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlcigpPy5faWQgfHwgXCJcIixcbiAgICAgICAgc3lwbl9lbnRpdHlfaWRfc3lwZTogdGhpcy5hcHBTdGF0ZS5nZXRBY3RpdmVFbnRpdHlJZCgpIHx8IFwiXCIsXG4gICAgICAgIHN5cG5fcGFnZV90aGVtX2lkX3N5dG06IHRoaXMudGhlbWVJZCB8fCBcIlwiLFxuICAgICAgICBzeXBuX2lzX3BhZ2Vfc3BlY2lmaWM6IGZvcm1WYWx1ZS5zeXBuX2lzX3BhZ2Vfc3BlY2lmaWMsXG4gICAgICAgIHN5cG5faXNfdXNlcl9zcGVjaWZpYzogZm9ybVZhbHVlLnN5cG5faXNfdXNlcl9zcGVjaWZpYyxcbiAgICAgICAgc3lwbl9pc19lbnRpdHlfc3BlY2lmaWM6IGZvcm1WYWx1ZS5zeXBuX2lzX2VudGl0eV9zcGVjaWZpYyxcbiAgICAgICAgc3lwbl9pc190aGVtZV9zcGVjaWZpYzogZm9ybVZhbHVlLnN5cG5faXNfdGhlbWVfc3BlY2lmaWMsXG4gICAgICB9O1xuICAgICAgdGhpcy5ub3Rlc1NlcnZpY2UudXBkYXRlTm90ZShub3RlVG9VcGRhdGUpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Tm90ZXMgPSB0aGlzLm5vdGVzU2lnbmFsKCk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZE5vdGVzID0gY3VycmVudE5vdGVzLm1hcCgobm90ZTogSUNvcmVTeXBuKSA9PlxuICAgICAgICAgICAgbm90ZS5faWQgPT09IHRoaXMuZWRpdGluZ05vdGVJZCA/IG5vdGVUb1VwZGF0ZSA6IG5vdGVcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubm90ZXNTaWduYWwuc2V0KHVwZGF0ZWROb3Rlcyk7XG4gICAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgICB0aGlzLmlzRm9ybVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZWRpdGluZ05vdGVJZCA9IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIG5vdGUnLCBlcnIpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm90ZVRvQWRkOiBJQ29yZVN5cG4gPSB7XG4gICAgICAgIHN5cG5fdGl0bGU6IGZvcm1WYWx1ZS5zeXBuX3RpdGxlLFxuICAgICAgICBzeXBuX2Rlc2M6IGZvcm1WYWx1ZS5zeXBuX2Rlc2MsXG4gICAgICAgIHN5cG5fcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCB8fCBcIlwiLFxuICAgICAgICBzeXBuX3VzZXJfaWRfdXNlcjogdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlcigpPy5faWQgfHwgXCJcIixcbiAgICAgICAgc3lwbl9lbnRpdHlfaWRfc3lwZTogdGhpcy5hcHBTdGF0ZS5nZXRBY3RpdmVFbnRpdHlJZCgpIHx8IFwiXCIsXG4gICAgICAgIHN5cG5fcGFnZV90aGVtX2lkX3N5dG06IHRoaXMudGhlbWVJZCB8fCBcIlwiLFxuICAgICAgICBzeXBuX2lzX3BhZ2Vfc3BlY2lmaWM6IGZvcm1WYWx1ZS5zeXBuX2lzX3BhZ2Vfc3BlY2lmaWMsXG4gICAgICAgIHN5cG5faXNfdXNlcl9zcGVjaWZpYzogZm9ybVZhbHVlLnN5cG5faXNfdXNlcl9zcGVjaWZpYyxcbiAgICAgICAgc3lwbl9pc19lbnRpdHlfc3BlY2lmaWM6IGZvcm1WYWx1ZS5zeXBuX2lzX2VudGl0eV9zcGVjaWZpYyxcbiAgICAgICAgc3lwbl9pc190aGVtZV9zcGVjaWZpYzogZm9ybVZhbHVlLnN5cG5faXNfdGhlbWVfc3BlY2lmaWMsXG4gICAgICB9O1xuICAgICAgdGhpcy5ub3Rlc1NlcnZpY2UuYWRkTm90ZShub3RlVG9BZGQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlIGFzIHsgX2lkPzogc3RyaW5nOyBpZD86IHN0cmluZyB9O1xuICAgICAgICAgIGNvbnN0IG5ld05vdGVXaXRoSWQ6IElDb3JlU3lwbiA9IHtcbiAgICAgICAgICAgIC4uLm5vdGVUb0FkZCxcbiAgICAgICAgICAgIF9pZDogcmVzcG9uc2VEYXRhLl9pZCB8fCByZXNwb25zZURhdGEuaWQgfHwgRGF0ZS5ub3coKS50b1N0cmluZygpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Tm90ZXMgPSB0aGlzLm5vdGVzU2lnbmFsKCk7XG4gICAgICAgICAgdGhpcy5ub3Rlc1NpZ25hbC5zZXQoW25ld05vdGVXaXRoSWQsIC4uLmN1cnJlbnROb3Rlc10pO1xuICAgICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgICAgdGhpcy5pc0Zvcm1WaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYWRkIG5vdGUnLCBlcnIpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGVGb3JtLnJlc2V0KHtcbiAgICAgIHN5cG5fdGl0bGU6ICcnLFxuICAgICAgc3lwbl9kZXNjOiAnJyxcbiAgICAgIHN5cG5faXNfcGFnZV9zcGVjaWZpYzogdHJ1ZSxcbiAgICAgIHN5cG5faXNfdXNlcl9zcGVjaWZpYzogdHJ1ZSxcbiAgICAgIHN5cG5faXNfZW50aXR5X3NwZWNpZmljOiBmYWxzZSxcbiAgICAgIHN5cG5faXNfdGhlbWVfc3BlY2lmaWM6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ld05vdGVNb2RlbDogeyAuLi4odGhpcy5ub3RlRm9ybT8udmFsdWUgPyB0aGlzLm5vdGVGb3JtPy52YWx1ZSA6IHt9KSB9LFxuICAgICAgaXNGb3JtVmlzaWJsZTogdGhpcy5pc0Zvcm1WaXNpYmxlLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc2V0U3RhdGUoc3RhdGU6IE5vdGVzQ29tcG9uZW50U3RhdGUpIHtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHRoaXMubm90ZUZvcm0ucGF0Y2hWYWx1ZShzdGF0ZS5uZXdOb3RlTW9kZWwpO1xuICAgICAgdGhpcy5pc0Zvcm1WaXNpYmxlID0gc3RhdGUuaXNGb3JtVmlzaWJsZTtcbiAgICB9XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwidHctcmVsYXRpdmUgdHctaC1mdWxsIHR3LWJnLXdoaXRlIHR3LW92ZXJmbG93LWhpZGRlbiB0dy1mbGV4IHR3LWZsZXgtY29sXCI+XG4gIDwhLS0gRklYRUQgSEVBREVSIFNFQ1RJT04gKEFCU09MVVRFIFBPU0lUSU9ORUQpIC0tPlxuICA8ZGl2IGNsYXNzPVwidHctYmctd2hpdGUgdHctYm9yZGVyLWIgdHctYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPCEtLSBEWU5BTUlDIEhFQURJTkcgLS0+XG4gICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctanVzdGlmeS1iZXR3ZWVuIHR3LWl0ZW1zLWNlbnRlciB0dy1wLTIgdHctYmctd2hpdGUgdHctYm9yZGVyLWIgdHctYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICA8aDYgY2xhc3M9XCJ0dy1mb250LXNlbWlib2xkIHR3LXRleHQtZ3JheS04MDBcIj5cbiAgICAgICAge3sgaXNGb3JtVmlzaWJsZSA/IChpc0VkaXRpbmcgPyAnRWRpdCBOb3RlJyA6ICdBZGQgYSBOZXcgTm90ZScpIDogJ05vdGVzJyB9fVxuICAgICAgPC9oNj5cbiAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNGb3JtVmlzaWJsZVwiIChjbGljayk9XCJzaG93QWRkRm9ybSgpXCIgY2lkZUVsZUJ1dHRvbiB2YXJpYW50PVwicHJpbWFyeVwiXG4gICAgICAgIGNsYXNzPVwidHctcC0yICF0dy13LTcgIXR3LXB4LTAgIXR3LXJvdW5kZWQtZnVsbCB0dy1hbmltYXRlLXB1bHNlXCIgdGl0bGU9XCJBZGQgTmV3IE5vdGVcIj5cbiAgICAgICAgPCEtLSBVc2luZyBpbmxpbmUgU1ZHIGZvciB0aGUgcGx1cyBpY29uIGZvciBzaW1wbGljaXR5IC0tPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgICAgICAgICA8bGluZSB4MT1cIjEyXCIgeTE9XCI1XCIgeDI9XCIxMlwiIHkyPVwiMTlcIj48L2xpbmU+XG4gICAgICAgICAgPGxpbmUgeDE9XCI1XCIgeTE9XCIxMlwiIHgyPVwiMTlcIiB5Mj1cIjEyXCI+PC9saW5lPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBREQgTk9URSBGT1JNIChBTklNQVRFRCBXUkFQUEVSKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwidHctdHJhbnNpdGlvbi1hbGwgdHctZHVyYXRpb24tMzAwIHR3LWVhc2UtaW4tb3V0IHR3LWFuaW1hdGUtZmFkZS1pblwiIFtjbGFzcy50dy1vcGFjaXR5LTEwMF09XCJpc0Zvcm1WaXNpYmxlXCJcbiAgICAgIFtjbGFzcy50dy1vcGFjaXR5LTBdPVwiIWlzRm9ybVZpc2libGVcIiBbY2xhc3MudHctbWF4LWgtMF09XCIhaXNGb3JtVmlzaWJsZVwiPlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJub3RlRm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgY2xhc3M9XCJ0dy1wLTMgdHctc3BhY2UteS00XCIgKm5nSWY9XCJpc0Zvcm1WaXNpYmxlXCI+XG4gICAgICAgIDwhLS0gVGl0bGUgSW5wdXQgLS0+XG4gICAgICAgIDxjaWRlLWVsZS1pbnB1dCBuYW1lPVwic3lwbl90aXRsZVwiIGZvcm1Db250cm9sTmFtZT1cInN5cG5fdGl0bGVcIiBwbGFjZWhvbGRlcj1cIk5vdGUgVGl0bGVcIiBsYWJlbD1cIk5vdGUgVGl0bGVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCIgW3R5cGVdPVwiJ3RleHQnXCIgY2xhc3M9XCJ0dy13LWZ1bGwgdHctdHJhbnNpdGlvbi1hbGwgdHctZHVyYXRpb24tMjAwIGZvY3VzOnR3LXNjYWxlLVsxLjAyXVwiPjwvY2lkZS1lbGUtaW5wdXQ+XG5cbiAgICAgICAgPCEtLSBEZXNjcmlwdGlvbiBUZXh0YXJlYSAtLT5cbiAgICAgICAgPGNpZGUtZWxlLXRleHRhcmVhIHBsYWNlaG9sZGVyPVwiV2hhdCdzIG9uIHlvdXIgbWluZD8gKE9wdGlvbmFsKVwiIGlkPVwic3lwbl9kZXNjXCIgZm9ybUNvbnRyb2xOYW1lPVwic3lwbl9kZXNjXCJcbiAgICAgICAgICByb3dzPVwiNFwiIGxhYmVsPVwiRGVzY3JpcHRpb25cIiBjbGFzcz1cInR3LXRyYW5zaXRpb24tYWxsIHR3LWR1cmF0aW9uLTIwMCBmb2N1czp0dy1zY2FsZS1bMS4wMl1cIj48L2NpZGUtZWxlLXRleHRhcmVhPlxuXG4gICAgICAgIDwhLS0gVG9nZ2xlIFN3aXRjaGVzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctZ3JpZCB0dy1ncmlkLWNvbHMtMiB0dy1nYXAtNFwiPlxuICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBbdHlwZV09XCInY2hlY2tib3gnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3lwbl9pc19wYWdlX3NwZWNpZmljXCIgbGFiZWw9XCJQYWdlIFNwZWNpZmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteC0yXCI+PC9jaWRlLWVsZS1pbnB1dD5cblxuICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBbdHlwZV09XCInY2hlY2tib3gnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3lwbl9pc191c2VyX3NwZWNpZmljXCIgbGFiZWw9XCJVc2VyIFNwZWNpZmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteC0yXCI+PC9jaWRlLWVsZS1pbnB1dD5cblxuICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBbdHlwZV09XCInY2hlY2tib3gnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3lwbl9pc19lbnRpdHlfc3BlY2lmaWNcIiBsYWJlbD1cIkVudGl0eSBTcGVjaWZpY1wiXG4gICAgICAgICAgICBjbGFzcz1cInR3LWZsZXggdHctaXRlbXMtY2VudGVyIHR3LXNwYWNlLXgtMlwiPjwvY2lkZS1lbGUtaW5wdXQ+XG5cbiAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgW3R5cGVdPVwiJ2NoZWNrYm94J1wiIGZvcm1Db250cm9sTmFtZT1cInN5cG5faXNfdGhlbWVfc3BlY2lmaWNcIiBsYWJlbD1cIlRoZW1lIFNwZWNpZmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteC0yXCI+PC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctc3BhY2UteC0zIHR3LXB0LTRcIj5cbiAgICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b24gc2l6ZT1cInhzXCIgdmFyaWFudD1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cIm5vdGVGb3JtLmludmFsaWRcIj5cbiAgICAgICAgICAgIHt7IGlzRWRpdGluZyA/ICdVcGRhdGUgTm90ZScgOiAnQWRkIE5vdGUnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjaWRlRWxlQnV0dG9uIHNpemU9XCJ4c1wiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpc0VkaXRpbmcgPyBjYW5jZWxFZGl0KCkgOiBoaWRlQWRkRm9ybSgpXCI+XG4gICAgICAgICAgICB7eyBpc0VkaXRpbmcgPyAnQ2FuY2VsIEVkaXQnIDogJ0NhbmNlbCcgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU0NST0xMQUJMRSBOT1RFUyBTRUNUSU9OIChCRUxPVyBGSVhFRCBIRUFERVIpIC0tPlxuICA8ZGl2IGNsYXNzPVwidHctb3ZlcmZsb3cteS1hdXRvIHR3LXNjcm9sbC1zbW9vdGggbm90ZXMtc2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgIDwhLS0gTW9kZXJuIEFuZ3VsYXIgdjIwIHBhdHRlcm46IFVzZSBTaWduYWxzIGRpcmVjdGx5IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJcIiAqbmdJZj1cIm5vdGVzKCkgYXMgbm90ZXM7IGVsc2UgbG9hZGluZ1wiPlxuICAgICAgPCEtLSBTaG93IG5vdGVzIGlmIHRoZSBhcnJheSBpcyBub3QgZW1wdHkgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwibm90ZXMubGVuZ3RoID4gMDsgZWxzZSBub05vdGVzXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG5vdGUgb2Ygbm90ZXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwidHctYmctd2hpdGUgdHctYm9yZGVyLWIgdHctYm9yZGVyLWdyYXktMjAwIHR3LXAtNCB0dy1zaGFkb3ctc20gaG92ZXI6dHctc2hhZG93LW1kIHR3LXRyYW5zaXRpb24tYWxsIHR3LWR1cmF0aW9uLTMwMCB0dy1lYXNlLWluLW91dCB0dy1yZWxhdGl2ZSB0dy10cmFuc2Zvcm0gaG92ZXI6dHctdHJhbnNsYXRlLXktWy0ycHhdIGhvdmVyOnR3LXNoYWRvdy1sZ1wiXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Ob3RlSG92ZXIoaSlcIiAobW91c2VsZWF2ZSk9XCJvbk5vdGVMZWF2ZSgpXCI+XG4gICAgICAgICAgPCEtLSBFZGl0IEJ1dHRvbiAodmlzaWJsZSBvbiBob3ZlcikgLS0+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic3RhcnRFZGl0KG5vdGUpXCIgW2NsYXNzLnR3LW9wYWNpdHktMTAwXT1cImhvdmVyZWROb3RlSW5kZXggPT09IGlcIlxuICAgICAgICAgICAgW2NsYXNzLnR3LW9wYWNpdHktMF09XCJob3ZlcmVkTm90ZUluZGV4ICE9PSBpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgdHctdG9wLTIgdHctcmlnaHQtMiB0dy10cmFuc2l0aW9uLWFsbCB0dy1kdXJhdGlvbi0yMDAgdHctcC0xIHR3LXJvdW5kZWQgdHctYmctZ3JheS0xMDAgaG92ZXI6dHctYmctZ3JheS0yMDAgaG92ZXI6dHctc2NhbGUtMTEwIHR3LXotMTBcIlxuICAgICAgICAgICAgdGl0bGU9XCJFZGl0IE5vdGVcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMSA0SDRhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJ2LTdcIj48L3BhdGg+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJtMTguNSAyLjUgMyAzTDEyIDE1bC00IDEgMS00IDkuNS05LjV6XCI+PC9wYXRoPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8aDYgY2xhc3M9XCJ0dy1mb250LW1lZGl1bSB0dy10ZXh0LWdyYXktOTAwIHR3LW1iLTIgdHctcHItOFwiPnt7IG5vdGUuc3lwbl90aXRsZSB9fTwvaDY+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LWdyYXktNjAwIHR3LXRleHQtc20gdHctbWItM1wiPnt7IG5vdGUuc3lwbl9kZXNjIH19PC9wPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtd3JhcCB0dy1nYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJub3RlLnN5cG5faXNfcGFnZV9zcGVjaWZpY1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwidHctcHgtMiB0dy1weS0xIHR3LWJnLWJsdWUtMTAwIHR3LXRleHQtYmx1ZS04MDAgdHctdGV4dC14cyB0dy1yb3VuZGVkLWZ1bGwgdHctdHJhbnNpdGlvbi1hbGwgdHctZHVyYXRpb24tMjAwIGhvdmVyOnR3LXNjYWxlLTEwNSBob3Zlcjp0dy1iZy1ibHVlLTIwMFwiPlBhZ2UgU3BlY2lmaWM8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm5vdGUuc3lwbl9pc191c2VyX3NwZWNpZmljXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1weC0yIHR3LXB5LTEgdHctYmctZ3JlZW4tMTAwIHR3LXRleHQtZ3JlZW4tODAwIHR3LXRleHQteHMgdHctcm91bmRlZC1mdWxsIHR3LXRyYW5zaXRpb24tYWxsIHR3LWR1cmF0aW9uLTIwMCBob3Zlcjp0dy1zY2FsZS0xMDUgaG92ZXI6dHctYmctZ3JlZW4tMjAwXCI+VXNlciBTcGVjaWZpYzwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibm90ZS5zeXBuX2lzX2VudGl0eV9zcGVjaWZpY1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwidHctcHgtMiB0dy1weS0xIHR3LWJnLXB1cnBsZS0xMDAgdHctdGV4dC1wdXJwbGUtODAwIHR3LXRleHQteHMgdHctcm91bmRlZC1mdWxsIHR3LXRyYW5zaXRpb24tYWxsIHR3LWR1cmF0aW9uLTIwMCBob3Zlcjp0dy1zY2FsZS0xMDUgaG92ZXI6dHctYmctcHVycGxlLTIwMFwiPkVudGl0eVxuICAgICAgICAgICAgICBTcGVjaWZpYzwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibm90ZS5zeXBuX2lzX3RoZW1lX3NwZWNpZmljXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1weC0yIHR3LXB5LTEgdHctYmctb3JhbmdlLTEwMCB0dy10ZXh0LW9yYW5nZS04MDAgdHctdGV4dC14cyB0dy1yb3VuZGVkLWZ1bGwgdHctdHJhbnNpdGlvbi1hbGwgdHctZHVyYXRpb24tMjAwIGhvdmVyOnR3LXNjYWxlLTEwNSBob3Zlcjp0dy1iZy1vcmFuZ2UtMjAwXCI+VGhlbWVcbiAgICAgICAgICAgICAgU3BlY2lmaWM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8cCBjbGFzcz1cIm5vdGUtZGF0ZVwiPnt7IG5vdGUuY3JlYXRlZEF0IHwgZGF0ZTonc2hvcnQnIH19PC9wPiAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGVtcGxhdGUgdG8gc2hvdyB3aGVuIHRoZXJlIGFyZSBubyBub3RlcyAtLT5cbiAgICA8bmctdGVtcGxhdGUgI25vTm90ZXM+XG4gICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1mbGV4LWNvbCB0dy1pdGVtcy1jZW50ZXIgdHctanVzdGlmeS1jZW50ZXIgdHctcC04IHR3LXRleHQtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy13LTEyIHR3LWgtMTIgdHctYmctZ3JheS0xMDAgdHctcm91bmRlZC1mdWxsIHR3LWZsZXggdHctaXRlbXMtY2VudGVyIHR3LWp1c3RpZnktY2VudGVyIHR3LW1iLTQgdHctYW5pbWF0ZS1ib3VuY2VcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICBjbGFzcz1cInR3LXRleHQtZ3JheS00MDBcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6XCI+PC9wYXRoPlxuICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjE0LDIgMTQsOCAyMCw4XCI+PC9wb2x5bGluZT5cbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjEzXCIgeDI9XCI4XCIgeTI9XCIxM1wiPjwvbGluZT5cbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjE3XCIgeDI9XCI4XCIgeTI9XCIxN1wiPjwvbGluZT5cbiAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxMCw5IDksOSA4LDlcIj48L3BvbHlsaW5lPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LWdyYXktNTAwIHR3LW1iLTJcIj5ObyBub3RlcyBmb3VuZC48L3A+XG4gICAgICAgIDxwIGNsYXNzPVwidHctdGV4dC1zbSB0dy10ZXh0LWdyYXktNDAwXCI+Q2xpY2sgdGhlICcrJyB0byBhZGQgb25lITwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFRlbXBsYXRlIHRvIHNob3cgd2hpbGUgbm90ZXMgYXJlIGxvYWRpbmcgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctZmxleC1jb2wgdHctaXRlbXMtY2VudGVyIHR3LWp1c3RpZnktY2VudGVyIHR3LXAtOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctdy04IHR3LWgtOCB0dy1ib3JkZXItNCB0dy1ib3JkZXItYmx1ZS0yMDAgdHctYm9yZGVyLXQtYmx1ZS02MDAgdHctcm91bmRlZC1mdWxsIHR3LWFuaW1hdGUtc3BpbiB0dy1tYi00XCI+PC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwidHctdGV4dC1ncmF5LTUwMCB0dy10ZXh0LXNtXCI+TG9hZGluZyBub3Rlcy4uLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Injectable, inject } from '@angular/core';
|
|
3
|
-
import { cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';
|
|
4
|
-
import { of } from 'rxjs';
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class CideLytDrawerNotesService {
|
|
8
|
-
constructor() {
|
|
9
|
-
// Modern Angular v20 dependency injection pattern
|
|
10
|
-
this.http = inject(HttpClient);
|
|
11
|
-
// Modern Angular v20 pattern: Use constructor for initialization only
|
|
12
|
-
}
|
|
13
|
-
getNotes() {
|
|
14
|
-
const url = cidePath.join([
|
|
15
|
-
hostManagerRoutesUrl.cideSuiteHost,
|
|
16
|
-
coreRoutesUrl.module,
|
|
17
|
-
coreRoutesUrl.systemPageNotesManager
|
|
18
|
-
]);
|
|
19
|
-
return this.http.get(url).pipe(map((res) => res.data || []));
|
|
20
|
-
}
|
|
21
|
-
addNote(note) {
|
|
22
|
-
const url = cidePath.join([
|
|
23
|
-
hostManagerRoutesUrl.cideSuiteHost,
|
|
24
|
-
coreRoutesUrl.module,
|
|
25
|
-
coreRoutesUrl.systemPageNotesManager
|
|
26
|
-
]);
|
|
27
|
-
return this.http.post(url, note).pipe(map((res) => res.data));
|
|
28
|
-
}
|
|
29
|
-
updateNote(note) {
|
|
30
|
-
const url = cidePath.join([
|
|
31
|
-
hostManagerRoutesUrl.cideSuiteHost,
|
|
32
|
-
coreRoutesUrl.module,
|
|
33
|
-
coreRoutesUrl.systemPageNotesManager
|
|
34
|
-
]);
|
|
35
|
-
return this.http.post(url, note).pipe(map((res) => res.data));
|
|
36
|
-
}
|
|
37
|
-
deleteNote(noteId) {
|
|
38
|
-
// Mock implementation: simulate deleting a note.
|
|
39
|
-
console.log('Deleting note with ID:', noteId);
|
|
40
|
-
return of({ success: true });
|
|
41
|
-
}
|
|
42
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytDrawerNotesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
43
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytDrawerNotesService, providedIn: 'root' }); }
|
|
44
|
-
}
|
|
45
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytDrawerNotesService, decorators: [{
|
|
46
|
-
type: Injectable,
|
|
47
|
-
args: [{
|
|
48
|
-
providedIn: 'root'
|
|
49
|
-
}]
|
|
50
|
-
}], ctorParameters: () => [] });
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWRyYXdlci1ub3Rlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWxheW91dC9zcmMvbGliL2xheW91dC9zaWRlZHJhd2VyL3NpZGVkcmF3ZXItbm90ZXMvc2lkZWRyYXdlci1ub3Rlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQXlHLFFBQVEsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzTCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLckMsTUFBTSxPQUFPLHlCQUF5QjtJQUlwQztRQUhBLGtEQUFrRDtRQUMxQyxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBR2hDLHNFQUFzRTtJQUN4RSxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDeEIsb0JBQW9CLENBQUMsYUFBYTtZQUNsQyxhQUFhLENBQUMsTUFBTTtZQUNwQixhQUFhLENBQUMsc0JBQXNCO1NBQ3JDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQTJDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQWU7UUFDckIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN4QixvQkFBb0IsQ0FBQyxhQUFhO1lBQ2xDLGFBQWEsQ0FBQyxNQUFNO1lBQ3BCLGFBQWEsQ0FBQyxzQkFBc0I7U0FDckMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBbUQsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxVQUFVLENBQUMsSUFBZTtRQUN4QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3hCLG9CQUFvQixDQUFDLGFBQWE7WUFDbEMsYUFBYSxDQUFDLE1BQU07WUFDcEIsYUFBYSxDQUFDLHNCQUFzQjtTQUNyQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFtRCxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFjO1FBQ3ZCLGlEQUFpRDtRQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQzs4R0F2Q1UseUJBQXlCO2tIQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7MkZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDb3JlU3lwbiwgSVBhZ2VOb3Rlc01hbmFnZXJDcmVhdGVVcGRhdGVDb250cm9sbGVyUmVzcG9vbnNlLCBJUGFnZU5vdGVzTWFuYWdlckxpc3RDb250cm9sbGVyUmVzcG9vbnNlLCBjaWRlUGF0aCwgY29yZVJvdXRlc1VybCwgaG9zdE1hbmFnZXJSb3V0ZXNVcmwgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENpZGVMeXREcmF3ZXJOb3Rlc1NlcnZpY2Uge1xuICAvLyBNb2Rlcm4gQW5ndWxhciB2MjAgZGVwZW5kZW5jeSBpbmplY3Rpb24gcGF0dGVyblxuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gTW9kZXJuIEFuZ3VsYXIgdjIwIHBhdHRlcm46IFVzZSBjb25zdHJ1Y3RvciBmb3IgaW5pdGlhbGl6YXRpb24gb25seVxuICB9XG5cbiAgZ2V0Tm90ZXMoKTogT2JzZXJ2YWJsZTxJQ29yZVN5cG5bXT4ge1xuICAgIGNvbnN0IHVybCA9IGNpZGVQYXRoLmpvaW4oW1xuICAgICAgaG9zdE1hbmFnZXJSb3V0ZXNVcmwuY2lkZVN1aXRlSG9zdCxcbiAgICAgIGNvcmVSb3V0ZXNVcmwubW9kdWxlLFxuICAgICAgY29yZVJvdXRlc1VybC5zeXN0ZW1QYWdlTm90ZXNNYW5hZ2VyXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVBhZ2VOb3Rlc01hbmFnZXJMaXN0Q29udHJvbGxlclJlc3Bvb25zZT4odXJsKS5waXBlKG1hcCgocmVzKSA9PiByZXMuZGF0YSB8fCBbXSkpO1xuICB9XG5cbiAgYWRkTm90ZShub3RlOiBJQ29yZVN5cG4pOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICBjb25zdCB1cmwgPSBjaWRlUGF0aC5qb2luKFtcbiAgICAgIGhvc3RNYW5hZ2VyUm91dGVzVXJsLmNpZGVTdWl0ZUhvc3QsXG4gICAgICBjb3JlUm91dGVzVXJsLm1vZHVsZSxcbiAgICAgIGNvcmVSb3V0ZXNVcmwuc3lzdGVtUGFnZU5vdGVzTWFuYWdlclxuICAgIF0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJUGFnZU5vdGVzTWFuYWdlckNyZWF0ZVVwZGF0ZUNvbnRyb2xsZXJSZXNwb29uc2U+KHVybCwgbm90ZSkucGlwZShtYXAoKHJlcykgPT4gcmVzLmRhdGEpKTtcbiAgfVxuXG4gIHVwZGF0ZU5vdGUobm90ZTogSUNvcmVTeXBuKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgdXJsID0gY2lkZVBhdGguam9pbihbXG4gICAgICBob3N0TWFuYWdlclJvdXRlc1VybC5jaWRlU3VpdGVIb3N0LFxuICAgICAgY29yZVJvdXRlc1VybC5tb2R1bGUsXG4gICAgICBjb3JlUm91dGVzVXJsLnN5c3RlbVBhZ2VOb3Rlc01hbmFnZXJcbiAgICBdKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SVBhZ2VOb3Rlc01hbmFnZXJDcmVhdGVVcGRhdGVDb250cm9sbGVyUmVzcG9vbnNlPih1cmwsIG5vdGUpLnBpcGUobWFwKChyZXMpID0+IHJlcy5kYXRhKSk7XG4gIH1cblxuICBkZWxldGVOb3RlKG5vdGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgLy8gTW9jayBpbXBsZW1lbnRhdGlvbjogc2ltdWxhdGUgZGVsZXRpbmcgYSBub3RlLlxuICAgIGNvbnNvbGUubG9nKCdEZWxldGluZyBub3RlIHdpdGggSUQ6Jywgbm90ZUlkKTtcbiAgICByZXR1cm4gb2YoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICB9XG5cbiAgLy8gQWRkaXRpb25hbCBtZXRob2RzIGZvciB1cGRhdGluZyBhbmQgZGVsZXRpbmcgbm90ZXMgY291bGQgYmUgYWRkZWQgaGVyZS5cbiAgLy8gWW91IG1pZ2h0IGFsc28gaW5jbHVkZSBlcnJvciBoYW5kbGluZyBvciBtb3JlIGNvbXBsZXggZGF0YSBtYW5pcHVsYXRpb24uXG59Il19
|