@rolatech/angular-course 17.6.3 → 19.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/fesm2022/rolatech-angular-course-course-index.component-Ba8BsDP1.mjs +55 -0
  2. package/fesm2022/rolatech-angular-course-course-index.component-Ba8BsDP1.mjs.map +1 -0
  3. package/fesm2022/rolatech-angular-course.mjs +276 -301
  4. package/fesm2022/rolatech-angular-course.mjs.map +1 -1
  5. package/lib/components/index.d.ts +0 -1
  6. package/package.json +8 -6
  7. package/themes/_default.scss +1 -1
  8. package/esm2022/index.mjs +0 -7
  9. package/esm2022/lib/components/course-action/course-action.component.mjs +0 -29
  10. package/esm2022/lib/components/course-details/course-details.component.mjs +0 -28
  11. package/esm2022/lib/components/course-details-dialog/course-details-dialog.component.mjs +0 -92
  12. package/esm2022/lib/components/course-edit-dialog/course-edit-dialog.component.mjs +0 -233
  13. package/esm2022/lib/components/course-info/course-info.component.mjs +0 -23
  14. package/esm2022/lib/components/course-item/course-item.component.mjs +0 -18
  15. package/esm2022/lib/components/course-media/course-media.component.mjs +0 -34
  16. package/esm2022/lib/components/course-media-owner-renderer/course-media-owner-renderer.component.mjs +0 -20
  17. package/esm2022/lib/components/course-preview/course-preview.component.mjs +0 -11
  18. package/esm2022/lib/components/course-pricing/course-pricing.component.mjs +0 -14
  19. package/esm2022/lib/components/course-pricing-add-dialog/course-pricing-add-dialog.component.mjs +0 -25
  20. package/esm2022/lib/components/course-pricing-dialog/course-pricing-dialog.component.mjs +0 -59
  21. package/esm2022/lib/components/course-schedule/course-schedule.component.mjs +0 -20
  22. package/esm2022/lib/components/course-schedule-add-dialog/course-schedule-add-dialog.component.mjs +0 -26
  23. package/esm2022/lib/components/course-schedule-dialog/course-schedule-dialog.component.mjs +0 -56
  24. package/esm2022/lib/components/course-section-item/course-section-item.component.mjs +0 -52
  25. package/esm2022/lib/components/course-section-lecture-item/course-section-lecture-item.component.mjs +0 -112
  26. package/esm2022/lib/components/course-section-lecture-video-dialog/course-section-lecture-video-dialog.component.mjs +0 -111
  27. package/esm2022/lib/components/course-section-lecture-video-item/course-section-lecture-video-item.component.mjs +0 -11
  28. package/esm2022/lib/components/course-sections/course-sections.component.mjs +0 -28
  29. package/esm2022/lib/components/detail-item/detail-item.component.mjs +0 -72
  30. package/esm2022/lib/components/index.mjs +0 -24
  31. package/esm2022/lib/components/pricing-item/pricing-item.component.mjs +0 -44
  32. package/esm2022/lib/components/schedule-item/schedule-item.component.mjs +0 -127
  33. package/esm2022/lib/interfaces/category.mjs +0 -2
  34. package/esm2022/lib/interfaces/course.mjs +0 -146
  35. package/esm2022/lib/interfaces/index.mjs +0 -2
  36. package/esm2022/lib/interfaces/media.mjs +0 -2
  37. package/esm2022/lib/pages/course/course-category/course-category.component.mjs +0 -74
  38. package/esm2022/lib/pages/course/course-detail/course-detail.component.mjs +0 -148
  39. package/esm2022/lib/pages/course/course-index/course-index.component.mjs +0 -53
  40. package/esm2022/lib/pages/course/course-layout/course-layout.component.mjs +0 -49
  41. package/esm2022/lib/pages/course/course-section-content/course-section-content.component.mjs +0 -133
  42. package/esm2022/lib/pages/course/course.routes.mjs +0 -33
  43. package/esm2022/lib/pages/course-manage/course-manage-content/course-manage-content.component.mjs +0 -12
  44. package/esm2022/lib/pages/course-manage/course-manage-details/course-manage-details.component.mjs +0 -159
  45. package/esm2022/lib/pages/course-manage/course-manage-info/course-manage-info.component.mjs +0 -139
  46. package/esm2022/lib/pages/course-manage/course-manage-layout/course-manage-layout.component.mjs +0 -68
  47. package/esm2022/lib/pages/course-manage/course-manage-media/course-manage-media.component.mjs +0 -137
  48. package/esm2022/lib/pages/course-manage/course-manage-pricing/course-manage-pricing.component.mjs +0 -127
  49. package/esm2022/lib/pages/course-manage/course-manage-schedule/course-manage-schedule.component.mjs +0 -131
  50. package/esm2022/lib/pages/course-manage/course-manage-section/course-manage-section.component.mjs +0 -341
  51. package/esm2022/lib/pages/course-manage/course-manage.routes.mjs +0 -40
  52. package/esm2022/lib/services/booking.service.mjs +0 -24
  53. package/esm2022/lib/services/category.service.mjs +0 -38
  54. package/esm2022/lib/services/course-section.service.mjs +0 -26
  55. package/esm2022/lib/services/course.service.mjs +0 -280
  56. package/esm2022/lib/services/index.mjs +0 -6
  57. package/esm2022/lib/services/instructor.service.mjs +0 -24
  58. package/esm2022/provider.mjs +0 -13
  59. package/esm2022/rolatech-angular-course.mjs +0 -5
  60. package/fesm2022/rolatech-angular-course-course-index.component-Cy7RMzDZ.mjs +0 -78
  61. package/fesm2022/rolatech-angular-course-course-index.component-Cy7RMzDZ.mjs.map +0 -1
  62. package/lib/components/course-item/course-item.component.d.ts +0 -9
@@ -1,341 +0,0 @@
1
- import { Component, inject } from '@angular/core';
2
- import { BaseComponent, ToolbarComponent } from '@rolatech/angular-components';
3
- import { MatIconModule } from '@angular/material/icon';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatProgressBarModule } from '@angular/material/progress-bar';
6
- import { Observable, concatMap, from, take } from 'rxjs';
7
- import { CourseManageContentComponent } from '../course-manage-content/course-manage-content.component';
8
- import { CourseService } from '../../../services';
9
- import { CourseSectionItemComponent, CourseSectionLectureItemComponent, CourseSectionLectureVideoDialogComponent, } from '../../../components';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/material/button";
12
- import * as i2 from "@angular/material/icon";
13
- export class CourseManageSectionComponent extends BaseComponent {
14
- constructor() {
15
- super(...arguments);
16
- this.courseService = inject(CourseService);
17
- this.sections = [];
18
- this.hasUnsaved = false;
19
- this.editId = '';
20
- this.lectureEditId = '';
21
- this.chunkSize = 5 * 1024 * 1024; // 切片大小
22
- this.fileIndex = 0; // 当前正在被遍历的文件下标
23
- }
24
- ngOnInit() {
25
- this.id = this.route.parent?.snapshot.paramMap.get('id');
26
- this.find();
27
- }
28
- find() {
29
- this.courseService.getCourseSection(this.id).subscribe({
30
- next: (res) => {
31
- if (res.data) {
32
- this.sections = res.data;
33
- }
34
- },
35
- });
36
- }
37
- addSection() {
38
- const section = {
39
- title: '',
40
- description: '',
41
- };
42
- this.courseService.addCourseSection(this.id, section).subscribe({
43
- next: (res) => {
44
- this.sections.push(res.data);
45
- this.editId = res.data.id;
46
- },
47
- });
48
- this.hasUnsaved = false;
49
- }
50
- onCancel(event) {
51
- this.sections.pop();
52
- this.hasUnsaved = false;
53
- }
54
- onSectionSave(event) {
55
- const { id } = event;
56
- this.courseService.updateCourseSection(id, event).subscribe({
57
- next: (res) => {
58
- this.hasUnsaved = false;
59
- this.snackBarService.open('保存成功');
60
- },
61
- });
62
- this.hasUnsaved = false;
63
- }
64
- onSectionEdit(event) {
65
- this.editId = event.id;
66
- // this.editIndex = this.sections.find((item: any) => item.id === event.id);
67
- }
68
- onSectionDelete(event) {
69
- const { id } = event;
70
- const options = {
71
- title: '确认删除吗',
72
- message: '删除这个章节吗?',
73
- cancelText: '取消',
74
- confirmText: '确认',
75
- };
76
- this.dialogService.open(options);
77
- this.dialogService.confirmed().subscribe({
78
- next: (res) => {
79
- if (res) {
80
- const data = {
81
- name: res,
82
- };
83
- this.courseService.deleteCourseSection(id).subscribe({
84
- next: (res) => {
85
- this.sections.pop();
86
- this.hasUnsaved = false;
87
- this.snackBarService.open(res.data);
88
- },
89
- error: (error) => {
90
- this.snackBarService.open(error.message);
91
- },
92
- });
93
- }
94
- },
95
- });
96
- }
97
- addLecture(section) {
98
- const lecture = {
99
- title: '',
100
- type: 'VIDEO',
101
- };
102
- this.courseService.addLecture(section.id, lecture).subscribe({
103
- next: (res) => {
104
- this.lectureEditId = res.data.id;
105
- if (section.lectures) {
106
- section.lectures.push(res.data);
107
- }
108
- else {
109
- const lectures = [];
110
- lectures.push(res.data);
111
- section.lectures = lectures;
112
- }
113
- },
114
- });
115
- }
116
- onAddLecture(event) { }
117
- onLectureSave(lecture) {
118
- this.courseService.updateLecture(lecture.id, lecture).subscribe({
119
- next: (res) => {
120
- this.snackBarService.open('保存成功');
121
- },
122
- });
123
- }
124
- onLectureEdit(lecture) { }
125
- onMediaEdit(lecture, video) {
126
- const { id } = lecture;
127
- const options = {
128
- title: lecture.title,
129
- cancelText: '取消',
130
- confirmText: '保存',
131
- data: lecture,
132
- width: '80vw',
133
- height: '100%',
134
- component: CourseSectionLectureVideoDialogComponent,
135
- };
136
- this.dialogService.open(options);
137
- this.dialogService.confirmed().subscribe({
138
- next: (res) => {
139
- if (res) {
140
- // this.courseService.deleteLecture(id).subscribe({
141
- // next: (res) => {},
142
- // error: (error) => {
143
- // this.snackBarService.open(error.message);
144
- // },
145
- // });
146
- }
147
- },
148
- });
149
- }
150
- onLectureDelete(section, lecture) {
151
- const { id } = lecture;
152
- const options = {
153
- title: '确认删除吗',
154
- message: '删除这一小节吗?',
155
- cancelText: '取消',
156
- confirmText: '确认',
157
- };
158
- this.dialogService.open(options);
159
- this.dialogService.confirmed().subscribe({
160
- next: (res) => {
161
- if (res) {
162
- this.courseService.deleteLecture(id).subscribe({
163
- next: (res) => {
164
- const index = section.lectures.findIndex((item) => item.id === id);
165
- section.lectures.splice(index, 1);
166
- this.hasUnsaved = false;
167
- this.snackBarService.open(res.data);
168
- },
169
- error: (error) => {
170
- this.snackBarService.open(error.message);
171
- },
172
- });
173
- }
174
- },
175
- });
176
- }
177
- onMediaUploadInit(lecture, event) {
178
- const file = event.data.target.files[0];
179
- if (!file) {
180
- return;
181
- }
182
- const item = {
183
- url: URL.createObjectURL(file),
184
- };
185
- lecture.item = item;
186
- lecture.isUploading = true;
187
- lecture.item.progress = 0;
188
- const reader = new FileReader();
189
- if (reader.readyState === FileReader.EMPTY) {
190
- reader.onload = async (e) => {
191
- const fileBuffer = e.target.result;
192
- crypto.subtle.digest('SHA-256', fileBuffer).then((res) => {
193
- const hashArray = Array.from(new Uint8Array(res));
194
- const hashHex = hashArray.map((byte) => byte.toString(16).padStart(2, '0')).join('');
195
- const data = { hash: hashHex, filename: file.name, fileType: file.type };
196
- this.courseService.uploadVideoInit(lecture.id, data).subscribe({
197
- next: (res) => {
198
- this.uploadPart(lecture, res.data.uploadId, file);
199
- },
200
- error: (e) => { },
201
- });
202
- });
203
- };
204
- reader.onerror = (error) => { };
205
- reader.readAsArrayBuffer(file);
206
- }
207
- }
208
- uploadFile(lecture, file, index, uploadId) {
209
- const reader = new FileReader();
210
- return new Observable((observer) => {
211
- reader.readAsArrayBuffer(file);
212
- reader.onload = (e) => {
213
- const fileBuffer = e.target.result;
214
- crypto.subtle.digest('SHA-256', fileBuffer).then((res) => {
215
- const hashArray = Array.from(new Uint8Array(res));
216
- const hashHex = hashArray.map((byte) => byte.toString(16).padStart(2, '0')).join('');
217
- const formData = new FormData();
218
- formData.append('file', file);
219
- formData.append('uploadId', uploadId);
220
- formData.append('number', index + 1);
221
- formData.append('hash', hashHex);
222
- this.courseService.uploadVideoPartsToLecture(lecture.id, formData).subscribe({
223
- next: (res) => {
224
- observer.next(res);
225
- observer.complete();
226
- },
227
- error: (e) => {
228
- this.snackBarService.open('上传失败: ' + e.message);
229
- },
230
- });
231
- });
232
- };
233
- reader.onerror = (error) => {
234
- this.snackBarService.open('上传失败: ' + error);
235
- };
236
- });
237
- }
238
- uploadPart(lecture, uploadId, file) {
239
- let uploadedCount = 0;
240
- const fileChunkList = this.createFileChunk(file);
241
- const numberOfChunks = fileChunkList.length;
242
- from(fileChunkList)
243
- .pipe(concatMap((val, index) => this.uploadFile(lecture, val.file, index, uploadId)), take(numberOfChunks))
244
- .subscribe((res) => {
245
- uploadedCount++;
246
- const p = ((uploadedCount / numberOfChunks) * 100).toFixed(0);
247
- lecture.item.progress = parseFloat(p);
248
- if (uploadedCount === numberOfChunks) {
249
- this.completePartUpload(lecture, { uploadId });
250
- }
251
- });
252
- }
253
- completePartUpload(lecture, data) {
254
- data.duration = lecture.item.duration;
255
- this.courseService.completePartUpload(lecture.id, data).subscribe({
256
- next: (res) => {
257
- lecture.isUploading = false;
258
- lecture.item.id = res.data.id;
259
- },
260
- error: (e) => {
261
- this.snackBarService.open('上传失败: ' + e.message);
262
- },
263
- });
264
- }
265
- onMediaUpload(lecture, event) {
266
- const lectureId = event.id;
267
- const file = event.data.target.files[0];
268
- if (!file) {
269
- return;
270
- }
271
- const reader = new FileReader();
272
- reader.readAsDataURL(file);
273
- reader.onload = () => {
274
- const formData = new FormData();
275
- formData.append('file', file);
276
- this.courseService.uploadVideoToLecture(lectureId, formData).subscribe({
277
- next: (res) => {
278
- lecture.isUploading = false;
279
- lecture.item = res.data;
280
- },
281
- error: (e) => {
282
- lecture.isUploading = false;
283
- this.snackBarService.open('上传失败: ' + e.message);
284
- },
285
- });
286
- };
287
- reader.onerror = (error) => { };
288
- }
289
- onMediaDelete(lecture, event) {
290
- // lecture.item = null;
291
- const { id } = event;
292
- const options = {
293
- title: '确认删除吗',
294
- message: '删除这个视频吗?',
295
- cancelText: '取消',
296
- confirmText: '确认',
297
- };
298
- this.dialogService.open(options);
299
- this.dialogService.confirmed().subscribe({
300
- next: (res) => {
301
- if (res) {
302
- this.courseService.deleteLectureVideo(id).subscribe({
303
- next: (res) => {
304
- lecture.item = null;
305
- this.snackBarService.open(res.data);
306
- },
307
- error: (error) => {
308
- this.snackBarService.open(error.message);
309
- },
310
- });
311
- }
312
- },
313
- });
314
- }
315
- createFileChunk(file, size = this.chunkSize) {
316
- const fileChunkList = [];
317
- let count = 0;
318
- while (count < file.size) {
319
- fileChunkList.push({
320
- file: file.slice(count, count + size),
321
- });
322
- count += size;
323
- }
324
- return fileChunkList;
325
- }
326
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CourseManageSectionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
327
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: CourseManageSectionComponent, isStandalone: true, selector: "rolatech-course-manage-section", usesInheritance: true, ngImport: i0, template: "<rolatech-course-manage-content>\n <rolatech-toolbar title=\"\u7AE0\u8282\" class=\"hidden md:block\" divider> </rolatech-toolbar>\n <div>\n <div>\n @for (section of sections; track $index) {\n <div class=\"bg-[--rt-raised-background] p-2 mb-2 rounded-lg\">\n <rolatech-course-section-item\n [section]=\"section\"\n (edit)=\"onSectionEdit($event)\"\n (save)=\"onSectionSave($event)\"\n (delete)=\"onSectionDelete($event)\"\n [editId]=\"editId\"\n >\n <div class=\"bg-[--rt-base-background] md:ml-8 mt-3 rounded-md divide-y divide-dashed\">\n @if (section?.lectures) {\n @for (lecture of section.lectures; track $index) {\n <div>\n <rolatech-course-section-lecture-item\n [lecture]=\"lecture\"\n (save)=\"onLectureSave($event)\"\n (delete)=\"onLectureDelete(section, $event)\"\n (edit)=\"onLectureEdit($event)\"\n (upload)=\"onMediaUploadInit(lecture, $event)\"\n (mediaEdit)=\"onMediaEdit(lecture, $event)\"\n (deleteMedia)=\"onMediaDelete(lecture, $event)\"\n [editId]=\"lectureEditId\"\n ></rolatech-course-section-lecture-item>\n </div>\n }\n }\n <div class=\"p-3\">\n <button mat-flat-button class=\"max-h-8\" (click)=\"addLecture(section)\">\n <mat-icon>add</mat-icon>\n <span>\u589E\u52A0\u5C0F\u8282</span>\n </button>\n </div>\n </div>\n </rolatech-course-section-item>\n </div>\n }\n </div>\n @if (!hasUnsaved) {\n <button mat-stroked-button (click)=\"addSection()\" class=\"mt-3\">\n <mat-icon>add</mat-icon>\n <span>\u589E\u52A0\u7AE0\u8282</span>\n </button>\n }\n </div>\n</rolatech-course-manage-content>\n", styles: [""], dependencies: [{ kind: "component", type: CourseSectionItemComponent, selector: "rolatech-course-section-item", inputs: ["section", "actions", "hasUnsaved", "editId"], outputs: ["sectionChange", "actionsChange", "hasUnsavedChange", "editIdChange", "save", "cancel", "delete", "edit", "addLecture"] }, { kind: "component", type: CourseSectionLectureItemComponent, selector: "rolatech-course-section-lecture-item", inputs: ["progress", "lecture", "actions", "hasUnsaved", "editId"], outputs: ["editIdChange", "save", "cancel", "delete", "edit", "mediaEdit", "thumbnailUpload", "upload", "deleteMedia"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: CourseManageContentComponent, selector: "rolatech-course-manage-content" }] }); }
328
- }
329
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CourseManageSectionComponent, decorators: [{
330
- type: Component,
331
- args: [{ selector: 'rolatech-course-manage-section', standalone: true, imports: [
332
- CourseSectionItemComponent,
333
- CourseSectionLectureItemComponent,
334
- MatButtonModule,
335
- MatIconModule,
336
- MatProgressBarModule,
337
- ToolbarComponent,
338
- CourseManageContentComponent,
339
- ], template: "<rolatech-course-manage-content>\n <rolatech-toolbar title=\"\u7AE0\u8282\" class=\"hidden md:block\" divider> </rolatech-toolbar>\n <div>\n <div>\n @for (section of sections; track $index) {\n <div class=\"bg-[--rt-raised-background] p-2 mb-2 rounded-lg\">\n <rolatech-course-section-item\n [section]=\"section\"\n (edit)=\"onSectionEdit($event)\"\n (save)=\"onSectionSave($event)\"\n (delete)=\"onSectionDelete($event)\"\n [editId]=\"editId\"\n >\n <div class=\"bg-[--rt-base-background] md:ml-8 mt-3 rounded-md divide-y divide-dashed\">\n @if (section?.lectures) {\n @for (lecture of section.lectures; track $index) {\n <div>\n <rolatech-course-section-lecture-item\n [lecture]=\"lecture\"\n (save)=\"onLectureSave($event)\"\n (delete)=\"onLectureDelete(section, $event)\"\n (edit)=\"onLectureEdit($event)\"\n (upload)=\"onMediaUploadInit(lecture, $event)\"\n (mediaEdit)=\"onMediaEdit(lecture, $event)\"\n (deleteMedia)=\"onMediaDelete(lecture, $event)\"\n [editId]=\"lectureEditId\"\n ></rolatech-course-section-lecture-item>\n </div>\n }\n }\n <div class=\"p-3\">\n <button mat-flat-button class=\"max-h-8\" (click)=\"addLecture(section)\">\n <mat-icon>add</mat-icon>\n <span>\u589E\u52A0\u5C0F\u8282</span>\n </button>\n </div>\n </div>\n </rolatech-course-section-item>\n </div>\n }\n </div>\n @if (!hasUnsaved) {\n <button mat-stroked-button (click)=\"addSection()\" class=\"mt-3\">\n <mat-icon>add</mat-icon>\n <span>\u589E\u52A0\u7AE0\u8282</span>\n </button>\n }\n </div>\n</rolatech-course-manage-content>\n" }]
340
- }] });
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLW1hbmFnZS1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9wYWdlcy9jb3Vyc2UtbWFuYWdlL2NvdXJzZS1tYW5hZ2Utc2VjdGlvbi9jb3Vyc2UtbWFuYWdlLXNlY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvdXJzZS9zcmMvbGliL3BhZ2VzL2NvdXJzZS1tYW5hZ2UvY291cnNlLW1hbmFnZS1zZWN0aW9uL2NvdXJzZS1tYW5hZ2Utc2VjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFZLFNBQVMsRUFBRSxJQUFJLEVBQU8sSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLGlDQUFpQyxFQUNqQyx3Q0FBd0MsR0FDekMsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQWtCN0IsTUFBTSxPQUFPLDRCQUE2QixTQUFRLGFBQWE7SUFmL0Q7O1FBZ0JFLGtCQUFhLEdBQUcs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SSxXQUNQO3dCQUNQLDBCQUEwQjt3QkFDMUIsaUNBQWlDO3dCQUNqQyxlQUFlO3dCQUNmLGFBQWE7d0JBQ2Isb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBQ2hCLDRCQUE0QjtxQkFDN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIGNvbmNhdE1hcCwgZnJvbSwgbWFwLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb3Vyc2VNYW5hZ2VDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY291cnNlLW1hbmFnZS1jb250ZW50L2NvdXJzZS1tYW5hZ2UtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291cnNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gIENvdXJzZVNlY3Rpb25JdGVtQ29tcG9uZW50LFxuICBDb3Vyc2VTZWN0aW9uTGVjdHVyZUl0ZW1Db21wb25lbnQsXG4gIENvdXJzZVNlY3Rpb25MZWN0dXJlVmlkZW9EaWFsb2dDb21wb25lbnQsXG59IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgQ291cnNlU2VjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyb2xhdGVjaC1jb3Vyc2UtbWFuYWdlLXNlY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vY291cnNlLW1hbmFnZS1zZWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY291cnNlLW1hbmFnZS1zZWN0aW9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb3Vyc2VTZWN0aW9uSXRlbUNvbXBvbmVudCxcbiAgICBDb3Vyc2VTZWN0aW9uTGVjdHVyZUl0ZW1Db21wb25lbnQsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgVG9vbGJhckNvbXBvbmVudCxcbiAgICBDb3Vyc2VNYW5hZ2VDb250ZW50Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3Vyc2VNYW5hZ2VTZWN0aW9uQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvdXJzZVNlcnZpY2UgPSBpbmplY3QoQ291cnNlU2VydmljZSk7XG4gIHNlY3Rpb25zOiBDb3Vyc2VTZWN0aW9uW10gPSBbXTtcbiAgaGFzVW5zYXZlZCA9IGZhbHNlO1xuICBlZGl0SWQgPSAnJztcbiAgbGVjdHVyZUVkaXRJZCA9ICcnO1xuICBjaHVua1NpemUgPSA1ICogMTAyNCAqIDEwMjQ7IC8vIOWIh+eJh+Wkp+Wwj1xuICBmaWxlSW5kZXggPSAwOyAvLyDlvZPliY3mraPlnKjooqvpgY3ljobnmoTmlofku7bkuIvmoIdcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pZCA9IHRoaXMucm91dGUucGFyZW50Py5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJykgYXMgc3RyaW5nO1xuICAgIHRoaXMuZmluZCgpO1xuICB9XG4gIGZpbmQoKSB7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmdldENvdXJzZVNlY3Rpb24odGhpcy5pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5kYXRhKSB7XG4gICAgICAgICAgdGhpcy5zZWN0aW9ucyA9IHJlcy5kYXRhO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIGFkZFNlY3Rpb24oKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHtcbiAgICAgIHRpdGxlOiAnJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICB9O1xuICAgIHRoaXMuY291cnNlU2VydmljZS5hZGRDb3Vyc2VTZWN0aW9uKHRoaXMuaWQsIHNlY3Rpb24pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zZWN0aW9ucy5wdXNoKHJlcy5kYXRhKTtcbiAgICAgICAgdGhpcy5lZGl0SWQgPSByZXMuZGF0YS5pZDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5oYXNVbnNhdmVkID0gZmFsc2U7XG4gIH1cbiAgb25DYW5jZWwoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuc2VjdGlvbnMucG9wKCk7XG4gICAgdGhpcy5oYXNVbnNhdmVkID0gZmFsc2U7XG4gIH1cbiAgb25TZWN0aW9uU2F2ZShldmVudDogYW55KSB7XG4gICAgY29uc3QgeyBpZCB9ID0gZXZlbnQ7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnVwZGF0ZUNvdXJzZVNlY3Rpb24oaWQsIGV2ZW50KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmhhc1Vuc2F2ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbign5L+d5a2Y5oiQ5YqfJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuaGFzVW5zYXZlZCA9IGZhbHNlO1xuICB9XG4gIG9uU2VjdGlvbkVkaXQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZWRpdElkID0gZXZlbnQuaWQ7XG4gICAgLy8gdGhpcy5lZGl0SW5kZXggPSB0aGlzLnNlY3Rpb25zLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gZXZlbnQuaWQpO1xuICB9XG4gIG9uU2VjdGlvbkRlbGV0ZShldmVudDogYW55KSB7XG4gICAgY29uc3QgeyBpZCB9ID0gZXZlbnQ7XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgdGl0bGU6ICfnoa7orqTliKDpmaTlkJcnLFxuICAgICAgbWVzc2FnZTogJ+WIoOmZpOi/meS4queroOiKguWQlz8nLFxuICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsXG4gICAgICBjb25maXJtVGV4dDogJ+ehruiupCcsXG4gICAgfTtcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihvcHRpb25zKTtcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY29uZmlybWVkKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBuYW1lOiByZXMsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmNvdXJzZVNlcnZpY2UuZGVsZXRlQ291cnNlU2VjdGlvbihpZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZWN0aW9ucy5wb3AoKTtcblxuICAgICAgICAgICAgICB0aGlzLmhhc1Vuc2F2ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbihyZXMuZGF0YSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBhZGRMZWN0dXJlKHNlY3Rpb246IGFueSkge1xuICAgIGNvbnN0IGxlY3R1cmUgPSB7XG4gICAgICB0aXRsZTogJycsXG4gICAgICB0eXBlOiAnVklERU8nLFxuICAgIH07XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmFkZExlY3R1cmUoc2VjdGlvbi5pZCwgbGVjdHVyZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxlY3R1cmVFZGl0SWQgPSByZXMuZGF0YS5pZDtcbiAgICAgICAgaWYgKHNlY3Rpb24ubGVjdHVyZXMpIHtcbiAgICAgICAgICBzZWN0aW9uLmxlY3R1cmVzLnB1c2gocmVzLmRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGxlY3R1cmVzOiBhbnkgPSBbXTtcbiAgICAgICAgICBsZWN0dXJlcy5wdXNoKHJlcy5kYXRhKTtcbiAgICAgICAgICBzZWN0aW9uLmxlY3R1cmVzID0gbGVjdHVyZXM7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgb25BZGRMZWN0dXJlKGV2ZW50OiBhbnkpIHt9XG4gIG9uTGVjdHVyZVNhdmUobGVjdHVyZTogYW55KSB7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnVwZGF0ZUxlY3R1cmUobGVjdHVyZS5pZCwgbGVjdHVyZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCfkv53lrZjmiJDlip8nKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgb25MZWN0dXJlRWRpdChsZWN0dXJlOiBhbnkpIHt9XG4gIG9uTWVkaWFFZGl0KGxlY3R1cmU6IGFueSwgdmlkZW86IGFueSkge1xuICAgIGNvbnN0IHsgaWQgfSA9IGxlY3R1cmU7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHRpdGxlOiBsZWN0dXJlLnRpdGxlLFxuICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsXG4gICAgICBjb25maXJtVGV4dDogJ+S/neWtmCcsXG4gICAgICBkYXRhOiBsZWN0dXJlLFxuICAgICAgd2lkdGg6ICc4MHZ3JyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgY29tcG9uZW50OiBDb3Vyc2VTZWN0aW9uTGVjdHVyZVZpZGVvRGlhbG9nQ29tcG9uZW50LFxuICAgIH07XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4ob3B0aW9ucyk7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbmZpcm1lZCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAvLyB0aGlzLmNvdXJzZVNlcnZpY2UuZGVsZXRlTGVjdHVyZShpZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAvLyAgIG5leHQ6IChyZXMpID0+IHt9LFxuICAgICAgICAgIC8vICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIC8vICAgfSxcbiAgICAgICAgICAvLyB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBvbkxlY3R1cmVEZWxldGUoc2VjdGlvbjogYW55LCBsZWN0dXJlOiBhbnkpIHtcbiAgICBjb25zdCB7IGlkIH0gPSBsZWN0dXJlO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICB0aXRsZTogJ+ehruiupOWIoOmZpOWQlycsXG4gICAgICBtZXNzYWdlOiAn5Yig6Zmk6L+Z5LiA5bCP6IqC5ZCXPycsXG4gICAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJyxcbiAgICAgIGNvbmZpcm1UZXh0OiAn56Gu6K6kJyxcbiAgICB9O1xuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKG9wdGlvbnMpO1xuICAgIHRoaXMuZGlhbG9nU2VydmljZS5jb25maXJtZWQoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmRlbGV0ZUxlY3R1cmUoaWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VjdGlvbi5sZWN0dXJlcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgICBzZWN0aW9uLmxlY3R1cmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgIHRoaXMuaGFzVW5zYXZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKHJlcy5kYXRhKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIG9uTWVkaWFVcGxvYWRJbml0KGxlY3R1cmU6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhLnRhcmdldC5maWxlc1swXTtcblxuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtID0ge1xuICAgICAgdXJsOiBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpLFxuICAgIH07XG4gICAgbGVjdHVyZS5pdGVtID0gaXRlbTtcbiAgICBsZWN0dXJlLmlzVXBsb2FkaW5nID0gdHJ1ZTtcbiAgICBsZWN0dXJlLml0ZW0ucHJvZ3Jlc3MgPSAwO1xuXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBpZiAocmVhZGVyLnJlYWR5U3RhdGUgPT09IEZpbGVSZWFkZXIuRU1QVFkpIHtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgZmlsZUJ1ZmZlcikudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzaEFycmF5ID0gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZXMpKTtcbiAgICAgICAgICBjb25zdCBoYXNoSGV4ID0gaGFzaEFycmF5Lm1hcCgoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgICAgICAgY29uc3QgZGF0YTogYW55ID0geyBoYXNoOiBoYXNoSGV4LCBmaWxlbmFtZTogZmlsZS5uYW1lLCBmaWxlVHlwZTogZmlsZS50eXBlIH07XG4gICAgICAgICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnVwbG9hZFZpZGVvSW5pdChsZWN0dXJlLmlkLCBkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudXBsb2FkUGFydChsZWN0dXJlLCByZXMuZGF0YS51cGxvYWRJZCwgZmlsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlKSA9PiB7fSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHt9O1xuICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xuICAgIH1cbiAgfVxuICB1cGxvYWRGaWxlKGxlY3R1cmU6IGFueSwgZmlsZTogYW55LCBpbmRleDogbnVtYmVyLCB1cGxvYWRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxGb3JtRGF0YT4pID0+IHtcbiAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgIGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgZmlsZUJ1ZmZlcikudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzaEFycmF5ID0gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZXMpKTtcbiAgICAgICAgICBjb25zdCBoYXNoSGV4ID0gaGFzaEFycmF5Lm1hcCgoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgICAgICAgY29uc3QgZm9ybURhdGE6IGFueSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgndXBsb2FkSWQnLCB1cGxvYWRJZCk7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdudW1iZXInLCBpbmRleCArIDEpO1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnaGFzaCcsIGhhc2hIZXgpO1xuXG4gICAgICAgICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnVwbG9hZFZpZGVvUGFydHNUb0xlY3R1cmUobGVjdHVyZS5pZCwgZm9ybURhdGEpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXMpO1xuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCfkuIrkvKDlpLHotKU6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbign5LiK5Lyg5aSx6LSlOiAnICsgZXJyb3IpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICB1cGxvYWRQYXJ0KGxlY3R1cmU6IGFueSwgdXBsb2FkSWQ6IHN0cmluZywgZmlsZTogYW55KSB7XG4gICAgbGV0IHVwbG9hZGVkQ291bnQgPSAwO1xuICAgIGNvbnN0IGZpbGVDaHVua0xpc3QgPSB0aGlzLmNyZWF0ZUZpbGVDaHVuayhmaWxlKTtcbiAgICBjb25zdCBudW1iZXJPZkNodW5rcyA9IGZpbGVDaHVua0xpc3QubGVuZ3RoO1xuICAgIGZyb20oZmlsZUNodW5rTGlzdClcbiAgICAgIC5waXBlKFxuICAgICAgICBjb25jYXRNYXAoKHZhbDogYW55LCBpbmRleCkgPT4gdGhpcy51cGxvYWRGaWxlKGxlY3R1cmUsIHZhbC5maWxlLCBpbmRleCwgdXBsb2FkSWQpKSxcbiAgICAgICAgdGFrZShudW1iZXJPZkNodW5rcyksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdXBsb2FkZWRDb3VudCsrO1xuICAgICAgICBjb25zdCBwID0gKCh1cGxvYWRlZENvdW50IC8gbnVtYmVyT2ZDaHVua3MpICogMTAwKS50b0ZpeGVkKDApO1xuICAgICAgICBsZWN0dXJlLml0ZW0ucHJvZ3Jlc3MgPSBwYXJzZUZsb2F0KHApO1xuICAgICAgICBpZiAodXBsb2FkZWRDb3VudCA9PT0gbnVtYmVyT2ZDaHVua3MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlUGFydFVwbG9hZChsZWN0dXJlLCB7IHVwbG9hZElkIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuICBjb21wbGV0ZVBhcnRVcGxvYWQobGVjdHVyZTogYW55LCBkYXRhOiBhbnkpIHtcbiAgICBkYXRhLmR1cmF0aW9uID0gbGVjdHVyZS5pdGVtLmR1cmF0aW9uO1xuICAgIHRoaXMuY291cnNlU2VydmljZS5jb21wbGV0ZVBhcnRVcGxvYWQobGVjdHVyZS5pZCwgZGF0YSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBsZWN0dXJlLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGxlY3R1cmUuaXRlbS5pZCA9IHJlcy5kYXRhLmlkO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCfkuIrkvKDlpLHotKU6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uTWVkaWFVcGxvYWQobGVjdHVyZTogYW55LCBldmVudDogYW55KSB7XG4gICAgY29uc3QgbGVjdHVyZUlkID0gZXZlbnQuaWQ7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGEudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSk7XG4gICAgICB0aGlzLmNvdXJzZVNlcnZpY2UudXBsb2FkVmlkZW9Ub0xlY3R1cmUobGVjdHVyZUlkLCBmb3JtRGF0YSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgbGVjdHVyZS5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIGxlY3R1cmUuaXRlbSA9IHJlcy5kYXRhO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgICBsZWN0dXJlLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbign5LiK5Lyg5aSx6LSlOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHt9O1xuICB9XG4gIG9uTWVkaWFEZWxldGUobGVjdHVyZTogYW55LCBldmVudDogYW55KSB7XG4gICAgLy8gbGVjdHVyZS5pdGVtID0gbnVsbDtcbiAgICBjb25zdCB7IGlkIH0gPSBldmVudDtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgdGl0bGU6ICfnoa7orqTliKDpmaTlkJcnLFxuICAgICAgbWVzc2FnZTogJ+WIoOmZpOi/meS4quinhumikeWQlz8nLFxuICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsXG4gICAgICBjb25maXJtVGV4dDogJ+ehruiupCcsXG4gICAgfTtcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihvcHRpb25zKTtcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY29uZmlybWVkKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIHRoaXMuY291cnNlU2VydmljZS5kZWxldGVMZWN0dXJlVmlkZW8oaWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGxlY3R1cmUuaXRlbSA9IG51bGw7XG4gICAgICAgICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4ocmVzLmRhdGEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgY3JlYXRlRmlsZUNodW5rKGZpbGU6IGFueSwgc2l6ZSA9IHRoaXMuY2h1bmtTaXplKSB7XG4gICAgY29uc3QgZmlsZUNodW5rTGlzdDogYW55ID0gW107XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICB3aGlsZSAoY291bnQgPCBmaWxlLnNpemUpIHtcbiAgICAgIGZpbGVDaHVua0xpc3QucHVzaCh7XG4gICAgICAgIGZpbGU6IGZpbGUuc2xpY2UoY291bnQsIGNvdW50ICsgc2l6ZSksXG4gICAgICB9KTtcbiAgICAgIGNvdW50ICs9IHNpemU7XG4gICAgfVxuICAgIHJldHVybiBmaWxlQ2h1bmtMaXN0O1xuICB9XG59XG4iLCI8cm9sYXRlY2gtY291cnNlLW1hbmFnZS1jb250ZW50PlxuICA8cm9sYXRlY2gtdG9vbGJhciB0aXRsZT1cIueroOiKglwiIGNsYXNzPVwiaGlkZGVuIG1kOmJsb2NrXCIgZGl2aWRlcj4gPC9yb2xhdGVjaC10b29sYmFyPlxuICA8ZGl2PlxuICAgIDxkaXY+XG4gICAgICBAZm9yIChzZWN0aW9uIG9mIHNlY3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImJnLVstLXJ0LXJhaXNlZC1iYWNrZ3JvdW5kXSBwLTIgbWItMiByb3VuZGVkLWxnXCI+XG4gICAgICAgICAgPHJvbGF0ZWNoLWNvdXJzZS1zZWN0aW9uLWl0ZW1cbiAgICAgICAgICAgIFtzZWN0aW9uXT1cInNlY3Rpb25cIlxuICAgICAgICAgICAgKGVkaXQpPVwib25TZWN0aW9uRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzYXZlKT1cIm9uU2VjdGlvblNhdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZGVsZXRlKT1cIm9uU2VjdGlvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtlZGl0SWRdPVwiZWRpdElkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctWy0tcnQtYmFzZS1iYWNrZ3JvdW5kXSBtZDptbC04IG10LTMgcm91bmRlZC1tZCBkaXZpZGUteSBkaXZpZGUtZGFzaGVkXCI+XG4gICAgICAgICAgICAgIEBpZiAoc2VjdGlvbj8ubGVjdHVyZXMpIHtcbiAgICAgICAgICAgICAgICBAZm9yIChsZWN0dXJlIG9mIHNlY3Rpb24ubGVjdHVyZXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPHJvbGF0ZWNoLWNvdXJzZS1zZWN0aW9uLWxlY3R1cmUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgIFtsZWN0dXJlXT1cImxlY3R1cmVcIlxuICAgICAgICAgICAgICAgICAgICAgIChzYXZlKT1cIm9uTGVjdHVyZVNhdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZSk9XCJvbkxlY3R1cmVEZWxldGUoc2VjdGlvbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGVkaXQpPVwib25MZWN0dXJlRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkKT1cIm9uTWVkaWFVcGxvYWRJbml0KGxlY3R1cmUsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChtZWRpYUVkaXQpPVwib25NZWRpYUVkaXQobGVjdHVyZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZU1lZGlhKT1cIm9uTWVkaWFEZWxldGUobGVjdHVyZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2VkaXRJZF09XCJsZWN0dXJlRWRpdElkXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcm9sYXRlY2gtY291cnNlLXNlY3Rpb24tbGVjdHVyZS1pdGVtPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cIm1heC1oLThcIiAoY2xpY2spPVwiYWRkTGVjdHVyZShzZWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj7lop7liqDlsI/oioI8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9yb2xhdGVjaC1jb3Vyc2Utc2VjdGlvbi1pdGVtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKCFoYXNVbnNhdmVkKSB7XG4gICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwiYWRkU2VjdGlvbigpXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj7lop7liqDnq6DoioI8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvZGl2PlxuPC9yb2xhdGVjaC1jb3Vyc2UtbWFuYWdlLWNvbnRlbnQ+XG4iXX0=
@@ -1,40 +0,0 @@
1
- import { CourseManageDetailsComponent } from './course-manage-details/course-manage-details.component';
2
- import { CourseManageScheduleComponent } from './course-manage-schedule/course-manage-schedule.component';
3
- import { CourseManagePricingComponent } from './course-manage-pricing/course-manage-pricing.component';
4
- import { CourseManageInfoComponent } from './course-manage-info/course-manage-info.component';
5
- import { CourseManageMediaComponent } from './course-manage-media/course-manage-media.component';
6
- import { CourseManageSectionComponent } from './course-manage-section/course-manage-section.component';
7
- import { CourseManageLayoutComponent } from './course-manage-layout/course-manage-layout.component';
8
- export const courseManageRoutes = [
9
- {
10
- path: '',
11
- component: CourseManageLayoutComponent,
12
- children: [
13
- {
14
- path: 'info',
15
- component: CourseManageInfoComponent,
16
- },
17
- {
18
- path: 'media',
19
- component: CourseManageMediaComponent,
20
- },
21
- {
22
- path: 'details',
23
- component: CourseManageDetailsComponent,
24
- },
25
- {
26
- path: 'pricing',
27
- component: CourseManagePricingComponent,
28
- },
29
- {
30
- path: 'schedule',
31
- component: CourseManageScheduleComponent,
32
- },
33
- {
34
- path: 'section',
35
- component: CourseManageSectionComponent,
36
- },
37
- ],
38
- },
39
- ];
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLW1hbmFnZS5yb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlLW1hbmFnZS9jb3Vyc2UtbWFuYWdlLnJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUN2RyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUVqRyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUVwRyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBVztJQUN4QztRQUNFLElBQUksRUFBRSxFQUFFO1FBQ1IsU0FBUyxFQUFFLDJCQUEyQjtRQUN0QyxRQUFRLEVBQUU7WUFDUjtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixTQUFTLEVBQUUseUJBQXlCO2FBQ3JDO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsU0FBUyxFQUFFLDBCQUEwQjthQUN0QztZQUNEO2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLFNBQVMsRUFBRSw0QkFBNEI7YUFDeEM7WUFDRDtnQkFDRSxJQUFJLEVBQUUsU0FBUztnQkFDZixTQUFTLEVBQUUsNEJBQTRCO2FBQ3hDO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFNBQVMsRUFBRSw2QkFBNkI7YUFDekM7WUFDRDtnQkFDRSxJQUFJLEVBQUUsU0FBUztnQkFDZixTQUFTLEVBQUUsNEJBQTRCO2FBQ3hDO1NBQ0Y7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3Vyc2VNYW5hZ2VEZXRhaWxzQ29tcG9uZW50IH0gZnJvbSAnLi9jb3Vyc2UtbWFuYWdlLWRldGFpbHMvY291cnNlLW1hbmFnZS1kZXRhaWxzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VNYW5hZ2VTY2hlZHVsZUNvbXBvbmVudCB9IGZyb20gJy4vY291cnNlLW1hbmFnZS1zY2hlZHVsZS9jb3Vyc2UtbWFuYWdlLXNjaGVkdWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VNYW5hZ2VQcmljaW5nQ29tcG9uZW50IH0gZnJvbSAnLi9jb3Vyc2UtbWFuYWdlLXByaWNpbmcvY291cnNlLW1hbmFnZS1wcmljaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VNYW5hZ2VJbmZvQ29tcG9uZW50IH0gZnJvbSAnLi9jb3Vyc2UtbWFuYWdlLWluZm8vY291cnNlLW1hbmFnZS1pbmZvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VNYW5hZ2VNZWRpYUNvbXBvbmVudCB9IGZyb20gJy4vY291cnNlLW1hbmFnZS1tZWRpYS9jb3Vyc2UtbWFuYWdlLW1lZGlhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSb3V0ZXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ291cnNlTWFuYWdlU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY291cnNlLW1hbmFnZS1zZWN0aW9uL2NvdXJzZS1tYW5hZ2Utc2VjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291cnNlTWFuYWdlTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9jb3Vyc2UtbWFuYWdlLWxheW91dC9jb3Vyc2UtbWFuYWdlLWxheW91dC5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgY291cnNlTWFuYWdlUm91dGVzOiBSb3V0ZXMgPSBbXG4gIHtcbiAgICBwYXRoOiAnJyxcbiAgICBjb21wb25lbnQ6IENvdXJzZU1hbmFnZUxheW91dENvbXBvbmVudCxcbiAgICBjaGlsZHJlbjogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnaW5mbycsXG4gICAgICAgIGNvbXBvbmVudDogQ291cnNlTWFuYWdlSW5mb0NvbXBvbmVudCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdtZWRpYScsXG4gICAgICAgIGNvbXBvbmVudDogQ291cnNlTWFuYWdlTWVkaWFDb21wb25lbnQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYXRoOiAnZGV0YWlscycsXG4gICAgICAgIGNvbXBvbmVudDogQ291cnNlTWFuYWdlRGV0YWlsc0NvbXBvbmVudCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdwcmljaW5nJyxcbiAgICAgICAgY29tcG9uZW50OiBDb3Vyc2VNYW5hZ2VQcmljaW5nQ29tcG9uZW50LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGF0aDogJ3NjaGVkdWxlJyxcbiAgICAgICAgY29tcG9uZW50OiBDb3Vyc2VNYW5hZ2VTY2hlZHVsZUNvbXBvbmVudCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdzZWN0aW9uJyxcbiAgICAgICAgY29tcG9uZW50OiBDb3Vyc2VNYW5hZ2VTZWN0aW9uQ29tcG9uZW50LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXTtcbiJdfQ==
@@ -1,24 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BaseService } from '@rolatech/angular-services';
3
- import * as i0 from "@angular/core";
4
- export class BookingService extends BaseService {
5
- init() {
6
- this.endpoint = 'partners/bookings';
7
- super.init();
8
- }
9
- items(options) {
10
- return this.http.get(`${this.actionUrl}/items`, {
11
- params: options,
12
- withCredentials: true,
13
- });
14
- }
15
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: BookingService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
16
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: BookingService, providedIn: 'root' }); }
17
- }
18
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: BookingService, decorators: [{
19
- type: Injectable,
20
- args: [{
21
- providedIn: 'root',
22
- }]
23
- }] });
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2luZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvdXJzZS9zcmMvbGliL3NlcnZpY2VzL2Jvb2tpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFNekQsTUFBTSxPQUFPLGNBQWUsU0FBUSxXQUFXO0lBQ3BDLElBQUk7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLG1CQUFtQixDQUFDO1FBQ3BDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFDRCxLQUFLLENBQUMsT0FBWTtRQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsUUFBUSxFQUFFO1lBQ25ELE1BQU0sRUFBRSxPQUFPO1lBQ2YsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FWVSxjQUFjO2tIQUFkLGNBQWMsY0FGYixNQUFNOzsyRkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItc2VydmljZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQm9va2luZ1NlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG4gIG92ZXJyaWRlIGluaXQoKSB7XG4gICAgdGhpcy5lbmRwb2ludCA9ICdwYXJ0bmVycy9ib29raW5ncyc7XG4gICAgc3VwZXIuaW5pdCgpO1xuICB9XG4gIGl0ZW1zKG9wdGlvbnM6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHt0aGlzLmFjdGlvblVybH0vaXRlbXNgLCB7XG4gICAgICBwYXJhbXM6IG9wdGlvbnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,38 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BaseService } from '@rolatech/angular-services';
3
- import * as i0 from "@angular/core";
4
- export class CategoryService extends BaseService {
5
- init() {
6
- this.endpoint = 'categories';
7
- super.init();
8
- }
9
- uploadMedia(id, data) {
10
- return this.http.post(`${this.actionUrl}/${id}/media`, data, {
11
- withCredentials: true,
12
- });
13
- }
14
- deleteMedia(id, mediaId) {
15
- return this.http.delete(`${this.actionUrl}/${id}/media/${mediaId}`, {
16
- withCredentials: true,
17
- });
18
- }
19
- importFromExcel(data) {
20
- return this.http.post(`${this.actionUrl}/excel`, data, {
21
- withCredentials: true,
22
- });
23
- }
24
- createFromExcel(data) {
25
- return this.http.post(`${this.actionUrl}/list`, data, {
26
- withCredentials: true,
27
- });
28
- }
29
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CategoryService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
30
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CategoryService, providedIn: 'root' }); }
31
- }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CategoryService, decorators: [{
33
- type: Injectable,
34
- args: [{
35
- providedIn: 'root',
36
- }]
37
- }] });
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9zZXJ2aWNlcy9jYXRlZ29yeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUt6RCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBQ3JDLElBQUk7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQztRQUM3QixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZixDQUFDO0lBQ0QsV0FBVyxDQUFDLEVBQVUsRUFBRSxJQUFjO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUNoRSxlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsV0FBVyxDQUFDLEVBQVUsRUFBRSxPQUFlO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsVUFBVSxPQUFPLEVBQUUsRUFBRTtZQUN2RSxlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsZUFBZSxDQUFDLElBQWM7UUFDNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBTSxHQUFHLElBQUksQ0FBQyxTQUFTLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFDMUQsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGVBQWUsQ0FBQyxJQUFTO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxPQUFPLEVBQUUsSUFBSSxFQUFFO1lBQ3pELGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBeEJVLGVBQWU7a0hBQWYsZUFBZSxjQUZkLE1BQU07OzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2UgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1zZXJ2aWNlcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDYXRlZ29yeVNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG4gIG92ZXJyaWRlIGluaXQoKSB7XG4gICAgdGhpcy5lbmRwb2ludCA9ICdjYXRlZ29yaWVzJztcbiAgICBzdXBlci5pbml0KCk7XG4gIH1cbiAgdXBsb2FkTWVkaWEoaWQ6IHN0cmluZywgZGF0YTogRm9ybURhdGEpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke3RoaXMuYWN0aW9uVXJsfS8ke2lkfS9tZWRpYWAsIGRhdGEsIHtcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICBkZWxldGVNZWRpYShpZDogc3RyaW5nLCBtZWRpYUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPGFueT4oYCR7dGhpcy5hY3Rpb25Vcmx9LyR7aWR9L21lZGlhLyR7bWVkaWFJZH1gLCB7XG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgaW1wb3J0RnJvbUV4Y2VsKGRhdGE6IEZvcm1EYXRhKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihgJHt0aGlzLmFjdGlvblVybH0vZXhjZWxgLCBkYXRhLCB7XG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgY3JlYXRlRnJvbUV4Y2VsKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7dGhpcy5hY3Rpb25Vcmx9L2xpc3RgLCBkYXRhLCB7XG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,26 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BaseService } from '@rolatech/angular-services';
3
- import * as i0 from "@angular/core";
4
- export class CourseSectionService extends BaseService {
5
- init() {
6
- this.endpoint = 'courses';
7
- super.init();
8
- }
9
- findSections(id) {
10
- return this.http.get(`${this.actionUrl}/${id}/sections`);
11
- }
12
- canBePreviewed(videoId, data) {
13
- return this.http.post(`${this.actionUrl}/sections/lectures/videos/${videoId}/preview`, data, {
14
- withCredentials: true,
15
- });
16
- }
17
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CourseSectionService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
18
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CourseSectionService, providedIn: 'root' }); }
19
- }
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CourseSectionService, decorators: [{
21
- type: Injectable,
22
- args: [{
23
- providedIn: 'root',
24
- }]
25
- }] });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLXNlY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9zZXJ2aWNlcy9jb3Vyc2Utc2VjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQU16RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsV0FBVztJQUMxQyxJQUFJO1FBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDMUIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUNELFlBQVksQ0FBQyxFQUFVO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNELGNBQWMsQ0FBQyxPQUFZLEVBQUUsSUFBUztRQUNwQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsNkJBQTZCLE9BQU8sVUFBVSxFQUFFLElBQUksRUFBRTtZQUMzRixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDOzhHQVpVLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlU2VydmljZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLXNlcnZpY2VzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENvdXJzZVNlY3Rpb25TZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2Uge1xuICBvdmVycmlkZSBpbml0KCkge1xuICAgIHRoaXMuZW5kcG9pbnQgPSAnY291cnNlcyc7XG4gICAgc3VwZXIuaW5pdCgpO1xuICB9XG4gIGZpbmRTZWN0aW9ucyhpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGAke3RoaXMuYWN0aW9uVXJsfS8ke2lkfS9zZWN0aW9uc2ApO1xuICB9XG4gIGNhbkJlUHJldmlld2VkKHZpZGVvSWQ6IGFueSwgZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5hY3Rpb25Vcmx9L3NlY3Rpb25zL2xlY3R1cmVzL3ZpZGVvcy8ke3ZpZGVvSWR9L3ByZXZpZXdgLCBkYXRhLCB7XG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==