@rocketshow/designer 1.40.0 → 1.44.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.
- package/fesm2022/rocketshow-designer.mjs +1389 -1148
- package/fesm2022/rocketshow-designer.mjs.map +1 -1
- package/index.d.ts +1676 -5
- package/package.json +2 -4
- package/rocketshow-designer-1.44.0.tgz +0 -0
- package/esm2022/lib/array-sort-pipe.mjs +0 -30
- package/esm2022/lib/designer.component.mjs +0 -672
- package/esm2022/lib/designer.module.mjs +0 -186
- package/esm2022/lib/designer.service.mjs +0 -14
- package/esm2022/lib/dropzone/dropzone.component.mjs +0 -93
- package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +0 -577
- package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +0 -36
- package/esm2022/lib/effect/effect.component.mjs +0 -174
- package/esm2022/lib/error-dialog/error-dialog.component.mjs +0 -75
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +0 -370
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +0 -147
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +0 -213
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +0 -78
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +0 -119
- package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +0 -191
- package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +0 -162
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +0 -365
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +0 -151
- package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +0 -46
- package/esm2022/lib/fixture/fixture.component.mjs +0 -148
- package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +0 -145
- package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +0 -641
- package/esm2022/lib/intro/intro.component.mjs +0 -95
- package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +0 -66
- package/esm2022/lib/models/cached-fixture-capability.mjs +0 -9
- package/esm2022/lib/models/cached-fixture-channel.mjs +0 -7
- package/esm2022/lib/models/cached-fixture.mjs +0 -6
- package/esm2022/lib/models/color.mjs +0 -8
- package/esm2022/lib/models/composition.mjs +0 -46
- package/esm2022/lib/models/effect-curve-profile-channel.mjs +0 -15
- package/esm2022/lib/models/effect-curve.mjs +0 -69
- package/esm2022/lib/models/effect-pan-tilt.mjs +0 -19
- package/esm2022/lib/models/effect.mjs +0 -12
- package/esm2022/lib/models/fixture-capability-value.mjs +0 -15
- package/esm2022/lib/models/fixture-capability.mjs +0 -127
- package/esm2022/lib/models/fixture-channel-value.mjs +0 -11
- package/esm2022/lib/models/fixture-channel.mjs +0 -24
- package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +0 -27
- package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +0 -12
- package/esm2022/lib/models/fixture-matrix.mjs +0 -25
- package/esm2022/lib/models/fixture-mode-channel.mjs +0 -26
- package/esm2022/lib/models/fixture-mode.mjs +0 -17
- package/esm2022/lib/models/fixture-physical.mjs +0 -14
- package/esm2022/lib/models/fixture-profile.mjs +0 -85
- package/esm2022/lib/models/fixture-wheel-slot.mjs +0 -26
- package/esm2022/lib/models/fixture-wheel.mjs +0 -15
- package/esm2022/lib/models/fixture.mjs +0 -40
- package/esm2022/lib/models/preset-fixture.mjs +0 -10
- package/esm2022/lib/models/preset-region-scene.mjs +0 -8
- package/esm2022/lib/models/preset.mjs +0 -65
- package/esm2022/lib/models/project.mjs +0 -78
- package/esm2022/lib/models/scene-playback-region.mjs +0 -11
- package/esm2022/lib/models/scene.mjs +0 -27
- package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +0 -194
- package/esm2022/lib/preset/preset.component.mjs +0 -131
- package/esm2022/lib/preview/models/color-changer-3d.mjs +0 -52
- package/esm2022/lib/preview/models/fixture-3d.mjs +0 -260
- package/esm2022/lib/preview/models/moving-head-3d.mjs +0 -115
- package/esm2022/lib/preview/preview.component.mjs +0 -216
- package/esm2022/lib/project/project-browser/project-browser.component.mjs +0 -143
- package/esm2022/lib/project/project-import/project-import.component.mjs +0 -107
- package/esm2022/lib/project/project-save/project-save.component.mjs +0 -178
- package/esm2022/lib/project/project-share/project-share.component.mjs +0 -71
- package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +0 -146
- package/esm2022/lib/scene/scene.component.mjs +0 -110
- package/esm2022/lib/services/animation.service.mjs +0 -16
- package/esm2022/lib/services/config.service.mjs +0 -28
- package/esm2022/lib/services/effect.service.mjs +0 -14
- package/esm2022/lib/services/error-dialog.service.mjs +0 -39
- package/esm2022/lib/services/fixture-pool.service.mjs +0 -30
- package/esm2022/lib/services/fixture.service.mjs +0 -699
- package/esm2022/lib/services/hotkey-target-exclude.service.mjs +0 -24
- package/esm2022/lib/services/intro.service.mjs +0 -140
- package/esm2022/lib/services/preset.service.mjs +0 -450
- package/esm2022/lib/services/preview-mesh.service.mjs +0 -57
- package/esm2022/lib/services/preview.service.mjs +0 -481
- package/esm2022/lib/services/project-load.service.mjs +0 -206
- package/esm2022/lib/services/project.service.mjs +0 -93
- package/esm2022/lib/services/scene.service.mjs +0 -164
- package/esm2022/lib/services/timeline.service.mjs +0 -726
- package/esm2022/lib/services/user-ensure-login.service.mjs +0 -38
- package/esm2022/lib/services/user.service.mjs +0 -89
- package/esm2022/lib/services/uuid.service.mjs +0 -23
- package/esm2022/lib/services/warning-dialog.service.mjs +0 -38
- package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +0 -304
- package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +0 -216
- package/esm2022/lib/timeline/timeline.component.mjs +0 -418
- package/esm2022/lib/user/user-login/user-login.component.mjs +0 -144
- package/esm2022/lib/user/user-register/user-register.component.mjs +0 -220
- package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +0 -26
- package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +0 -68
- package/esm2022/public_api.mjs +0 -7
- package/esm2022/rocketshow-designer.mjs +0 -5
- package/lib/array-sort-pipe.d.ts +0 -7
- package/lib/designer.component.d.ts +0 -73
- package/lib/designer.module.d.ts +0 -57
- package/lib/designer.service.d.ts +0 -6
- package/lib/dropzone/dropzone.component.d.ts +0 -24
- package/lib/effect/effect-curve/effect-curve.component.d.ts +0 -59
- package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +0 -15
- package/lib/effect/effect.component.d.ts +0 -22
- package/lib/error-dialog/error-dialog.component.d.ts +0 -17
- package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +0 -41
- package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +0 -26
- package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +0 -34
- package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +0 -15
- package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +0 -18
- package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +0 -31
- package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +0 -25
- package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +0 -32
- package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +0 -14
- package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +0 -14
- package/lib/fixture/fixture.component.d.ts +0 -25
- package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +0 -28
- package/lib/fixture-pool/fixture-pool.component.d.ts +0 -62
- package/lib/intro/intro.component.d.ts +0 -11
- package/lib/master-dimmer/master-dimmer.component.d.ts +0 -15
- package/lib/models/cached-fixture-capability.d.ts +0 -11
- package/lib/models/cached-fixture-channel.d.ts +0 -11
- package/lib/models/cached-fixture.d.ts +0 -11
- package/lib/models/color.d.ts +0 -6
- package/lib/models/composition.d.ts +0 -19
- package/lib/models/effect-curve-profile-channel.d.ts +0 -5
- package/lib/models/effect-curve.d.ts +0 -15
- package/lib/models/effect-pan-tilt.d.ts +0 -6
- package/lib/models/effect.d.ts +0 -6
- package/lib/models/fixture-capability-value.d.ts +0 -10
- package/lib/models/fixture-capability.d.ts +0 -117
- package/lib/models/fixture-channel-value.d.ts +0 -6
- package/lib/models/fixture-channel.d.ts +0 -9
- package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +0 -8
- package/lib/models/fixture-matrix-pixel-group.d.ts +0 -6
- package/lib/models/fixture-matrix.d.ts +0 -6
- package/lib/models/fixture-mode-channel.d.ts +0 -8
- package/lib/models/fixture-mode.d.ts +0 -8
- package/lib/models/fixture-physical.d.ts +0 -4
- package/lib/models/fixture-profile.d.ts +0 -39
- package/lib/models/fixture-wheel-slot.d.ts +0 -17
- package/lib/models/fixture-wheel.d.ts +0 -5
- package/lib/models/fixture.d.ts +0 -23
- package/lib/models/preset-fixture.d.ts +0 -5
- package/lib/models/preset-region-scene.d.ts +0 -9
- package/lib/models/preset.d.ts +0 -20
- package/lib/models/project.d.ts +0 -31
- package/lib/models/scene-playback-region.d.ts +0 -6
- package/lib/models/scene.d.ts +0 -11
- package/lib/preset/preset-settings/preset-settings.component.d.ts +0 -22
- package/lib/preset/preset.component.d.ts +0 -25
- package/lib/preview/models/color-changer-3d.d.ts +0 -16
- package/lib/preview/models/fixture-3d.d.ts +0 -38
- package/lib/preview/models/moving-head-3d.d.ts +0 -23
- package/lib/preview/preview.component.d.ts +0 -38
- package/lib/project/project-browser/project-browser.component.d.ts +0 -27
- package/lib/project/project-import/project-import.component.d.ts +0 -23
- package/lib/project/project-save/project-save.component.d.ts +0 -28
- package/lib/project/project-share/project-share.component.d.ts +0 -16
- package/lib/scene/scene-settings/scene-settings.component.d.ts +0 -20
- package/lib/scene/scene.component.d.ts +0 -22
- package/lib/services/animation.service.d.ts +0 -7
- package/lib/services/config.service.d.ts +0 -20
- package/lib/services/effect.service.d.ts +0 -8
- package/lib/services/error-dialog.service.d.ts +0 -12
- package/lib/services/fixture-pool.service.d.ts +0 -10
- package/lib/services/fixture.service.d.ts +0 -70
- package/lib/services/hotkey-target-exclude.service.d.ts +0 -7
- package/lib/services/intro.service.d.ts +0 -21
- package/lib/services/preset.service.d.ts +0 -64
- package/lib/services/preview-mesh.service.d.ts +0 -14
- package/lib/services/preview.service.d.ts +0 -42
- package/lib/services/project-load.service.d.ts +0 -36
- package/lib/services/project.service.d.ts +0 -26
- package/lib/services/scene.service.d.ts +0 -30
- package/lib/services/timeline.service.d.ts +0 -70
- package/lib/services/user-ensure-login.service.d.ts +0 -14
- package/lib/services/user.service.d.ts +0 -22
- package/lib/services/uuid.service.d.ts +0 -7
- package/lib/services/warning-dialog.service.d.ts +0 -12
- package/lib/timeline/composition-settings/composition-settings.component.d.ts +0 -48
- package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +0 -22
- package/lib/timeline/timeline.component.d.ts +0 -50
- package/lib/user/user-login/user-login.component.d.ts +0 -21
- package/lib/user/user-register/user-register.component.d.ts +0 -26
- package/lib/wait-dialog/wait-dialog.component.d.ts +0 -8
- package/lib/warning-dialog/warning-dialog.component.d.ts +0 -16
- package/public_api.d.ts +0 -3
- package/rocketshow-designer-1.40.0.tgz +0 -0
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BsModalService } from 'ngx-bootstrap/modal';
|
|
3
|
-
import { of, Subject } from 'rxjs';
|
|
4
|
-
import { UserRegisterComponent } from '../user/user-register/user-register.component';
|
|
5
|
-
import { ConfigService } from './config.service';
|
|
6
|
-
import { UserService } from './user.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./user.service";
|
|
9
|
-
import * as i2 from "ngx-bootstrap/modal";
|
|
10
|
-
import * as i3 from "./config.service";
|
|
11
|
-
export class UserEnsureLoginService {
|
|
12
|
-
constructor(userService, modalService, configService) {
|
|
13
|
-
this.userService = userService;
|
|
14
|
-
this.modalService = modalService;
|
|
15
|
-
this.configService = configService;
|
|
16
|
-
}
|
|
17
|
-
// show the login form and log a user in, if required
|
|
18
|
-
login() {
|
|
19
|
-
if (this.userService.isLoggedIn()) {
|
|
20
|
-
return of(null);
|
|
21
|
-
}
|
|
22
|
-
if (!this.configService.loginAvailable) {
|
|
23
|
-
return of(null);
|
|
24
|
-
}
|
|
25
|
-
const subject = new Subject();
|
|
26
|
-
this.modalService.show(UserRegisterComponent, { keyboard: true, ignoreBackdropClick: false, initialState: { subject } });
|
|
27
|
-
return subject;
|
|
28
|
-
}
|
|
29
|
-
static { this.ɵfac = function UserEnsureLoginService_Factory(t) { return new (t || UserEnsureLoginService)(i0.ɵɵinject(i1.UserService), i0.ɵɵinject(i2.BsModalService), i0.ɵɵinject(i3.ConfigService)); }; }
|
|
30
|
-
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: UserEnsureLoginService, factory: UserEnsureLoginService.ɵfac, providedIn: 'root' }); }
|
|
31
|
-
}
|
|
32
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserEnsureLoginService, [{
|
|
33
|
-
type: Injectable,
|
|
34
|
-
args: [{
|
|
35
|
-
providedIn: 'root',
|
|
36
|
-
}]
|
|
37
|
-
}], () => [{ type: i1.UserService }, { type: i2.BsModalService }, { type: i3.ConfigService }], null); })();
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lbnN1cmUtbG9naW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvc2VydmljZXMvdXNlci1lbnN1cmUtbG9naW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUs3QyxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQW9CLFdBQXdCLEVBQVUsWUFBNEIsRUFBVSxhQUE0QjtRQUFwRyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBQUcsQ0FBQztJQUU1SCxxREFBcUQ7SUFDckQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6SCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO3VGQWhCVSxzQkFBc0I7dUVBQXRCLHNCQUFzQixXQUF0QixzQkFBc0IsbUJBRnJCLE1BQU07O2lGQUVQLHNCQUFzQjtjQUhsQyxVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVzZXJSZWdpc3RlckNvbXBvbmVudCB9IGZyb20gJy4uL3VzZXIvdXNlci1yZWdpc3Rlci91c2VyLXJlZ2lzdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4vdXNlci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJFbnN1cmVMb2dpblNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLCBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UpIHt9XG5cbiAgLy8gc2hvdyB0aGUgbG9naW4gZm9ybSBhbmQgbG9nIGEgdXNlciBpbiwgaWYgcmVxdWlyZWRcbiAgbG9naW4oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudXNlclNlcnZpY2UuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ1NlcnZpY2UubG9naW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KFVzZXJSZWdpc3RlckNvbXBvbmVudCwgeyBrZXlib2FyZDogdHJ1ZSwgaWdub3JlQmFja2Ryb3BDbGljazogZmFsc2UsIGluaXRpYWxTdGF0ZTogeyBzdWJqZWN0IH0gfSk7XG4gICAgcmV0dXJuIHN1YmplY3Q7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { map } from 'rxjs/operators';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/common/http";
|
|
6
|
-
export class UserService {
|
|
7
|
-
constructor(http) {
|
|
8
|
-
this.http = http;
|
|
9
|
-
this.loadFromLocalStorage();
|
|
10
|
-
}
|
|
11
|
-
loadFromLocalStorage() {
|
|
12
|
-
this.token = localStorage.getItem('token');
|
|
13
|
-
this.tokenExpiration = undefined;
|
|
14
|
-
if (localStorage.getItem('tokenExpiration')) {
|
|
15
|
-
this.tokenExpiration = new Date(Date.parse(localStorage.getItem('tokenExpiration')));
|
|
16
|
-
}
|
|
17
|
-
this.username = localStorage.getItem('username');
|
|
18
|
-
}
|
|
19
|
-
// register a new user
|
|
20
|
-
register(email, username, password) {
|
|
21
|
-
return this.http.post('register?email=' + email + '&username=' + username + '&password=' + password, null);
|
|
22
|
-
}
|
|
23
|
-
// login a user in the api
|
|
24
|
-
login(email, password) {
|
|
25
|
-
return this.http.post('login?email=' + email + '&password=' + password, null).pipe(map((result) => {
|
|
26
|
-
this.token = result.token;
|
|
27
|
-
this.username = result.username;
|
|
28
|
-
// the token expires one month from now
|
|
29
|
-
this.tokenExpiration = new Date();
|
|
30
|
-
this.tokenExpiration.setDate(this.tokenExpiration.getDate() + 30);
|
|
31
|
-
// store to the local storage
|
|
32
|
-
localStorage.setItem('token', this.token);
|
|
33
|
-
localStorage.setItem('tokenExpiration', JSON.stringify(this.tokenExpiration));
|
|
34
|
-
localStorage.setItem('username', this.username);
|
|
35
|
-
this.loadFromLocalStorage();
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
logout() {
|
|
39
|
-
localStorage.removeItem('token');
|
|
40
|
-
localStorage.removeItem('tokenExpiration');
|
|
41
|
-
localStorage.removeItem('username');
|
|
42
|
-
this.loadFromLocalStorage();
|
|
43
|
-
}
|
|
44
|
-
isLoggedIn() {
|
|
45
|
-
if (!this.token) {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
if (new Date() > this.tokenExpiration) {
|
|
49
|
-
this.logout();
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
getHeaders() {
|
|
55
|
-
if (!this.isLoggedIn()) {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
let headers = new HttpHeaders();
|
|
59
|
-
headers = headers.append('Authorization', this.token);
|
|
60
|
-
return headers;
|
|
61
|
-
}
|
|
62
|
-
setAutoLoadProject(project) {
|
|
63
|
-
localStorage.setItem('projectName', project.name);
|
|
64
|
-
if (project.id) {
|
|
65
|
-
localStorage.setItem('projectId', project.id.toString());
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
localStorage.removeItem('projectId');
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
getAutoLoadProjectId() {
|
|
72
|
-
if (!localStorage.getItem('projectId')) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
return Number.parseInt(localStorage.getItem('projectId'), 10);
|
|
76
|
-
}
|
|
77
|
-
getAutoLoadProjectName() {
|
|
78
|
-
return localStorage.getItem('projectName');
|
|
79
|
-
}
|
|
80
|
-
static { this.ɵfac = function UserService_Factory(t) { return new (t || UserService)(i0.ɵɵinject(i1.HttpClient)); }; }
|
|
81
|
-
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: UserService, factory: UserService.ɵfac, providedIn: 'root' }); }
|
|
82
|
-
}
|
|
83
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserService, [{
|
|
84
|
-
type: Injectable,
|
|
85
|
-
args: [{
|
|
86
|
-
providedIn: 'root',
|
|
87
|
-
}]
|
|
88
|
-
}], () => [{ type: i1.HttpClient }], null); })();
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBTXJDLE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDbEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsUUFBUSxDQUFDLEtBQWEsRUFBRSxRQUFnQixFQUFFLFFBQWdCO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxHQUFHLFlBQVksR0FBRyxRQUFRLEdBQUcsWUFBWSxH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T0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7NEVBOUZVLFdBQVc7dUVBQVgsV0FBVyxXQUFYLFdBQVcsbUJBRlYsTUFBTTs7aUZBRVAsV0FBVztjQUh2QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi9tb2RlbHMvcHJvamVjdCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyU2VydmljZSB7XG4gIC8vIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlblxuICB0b2tlbjogc3RyaW5nO1xuICB0b2tlbkV4cGlyYXRpb246IERhdGU7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XG4gICAgdGhpcy5sb2FkRnJvbUxvY2FsU3RvcmFnZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRnJvbUxvY2FsU3RvcmFnZSgpIHtcbiAgICB0aGlzLnRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJyk7XG4gICAgdGhpcy50b2tlbkV4cGlyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbkV4cGlyYXRpb24nKSkge1xuICAgICAgdGhpcy50b2tlbkV4cGlyYXRpb24gPSBuZXcgRGF0ZShEYXRlLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbkV4cGlyYXRpb24nKSkpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJuYW1lJyk7XG4gIH1cblxuICAvLyByZWdpc3RlciBhIG5ldyB1c2VyXG4gIHJlZ2lzdGVyKGVtYWlsOiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCgncmVnaXN0ZXI/ZW1haWw9JyArIGVtYWlsICsgJyZ1c2VybmFtZT0nICsgdXNlcm5hbWUgKyAnJnBhc3N3b3JkPScgKyBwYXNzd29yZCwgbnVsbCk7XG4gIH1cblxuICAvLyBsb2dpbiBhIHVzZXIgaW4gdGhlIGFwaVxuICBsb2dpbihlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoJ2xvZ2luP2VtYWlsPScgKyBlbWFpbCArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkLCBudWxsKS5waXBlKFxuICAgICAgbWFwKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0gcmVzdWx0LnRva2VuO1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gcmVzdWx0LnVzZXJuYW1lO1xuXG4gICAgICAgIC8vIHRoZSB0b2tlbiBleHBpcmVzIG9uZSBtb250aCBmcm9tIG5vd1xuICAgICAgICB0aGlzLnRva2VuRXhwaXJhdGlvbiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMudG9rZW5FeHBpcmF0aW9uLnNldERhdGUodGhpcy50b2tlbkV4cGlyYXRpb24uZ2V0RGF0ZSgpICsgMzApO1xuXG4gICAgICAgIC8vIHN0b3JlIHRvIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2tlbicsIHRoaXMudG9rZW4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9rZW5FeHBpcmF0aW9uJywgSlNPTi5zdHJpbmdpZnkodGhpcy50b2tlbkV4cGlyYXRpb24pKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3VzZXJuYW1lJywgdGhpcy51c2VybmFtZSk7XG5cbiAgICAgICAgdGhpcy5sb2FkRnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbG9nb3V0KCkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2tlbicpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2tlbkV4cGlyYXRpb24nKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndXNlcm5hbWUnKTtcblxuICAgIHRoaXMubG9hZEZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgfVxuXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnRva2VuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5ldyBEYXRlKCkgPiB0aGlzLnRva2VuRXhwaXJhdGlvbikge1xuICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldEhlYWRlcnMoKTogSHR0cEhlYWRlcnMge1xuICAgIGlmICghdGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgdGhpcy50b2tlbik7XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBzZXRBdXRvTG9hZFByb2plY3QocHJvamVjdDogUHJvamVjdCkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwcm9qZWN0TmFtZScsIHByb2plY3QubmFtZSk7XG4gICAgaWYgKHByb2plY3QuaWQpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwcm9qZWN0SWQnLCBwcm9qZWN0LmlkLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncHJvamVjdElkJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXV0b0xvYWRQcm9qZWN0SWQoKTogbnVtYmVyIHtcbiAgICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwcm9qZWN0SWQnKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Byb2plY3RJZCcpLCAxMCk7XG4gIH1cblxuICBnZXRBdXRvTG9hZFByb2plY3ROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwcm9qZWN0TmFtZScpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class UuidService {
|
|
4
|
-
constructor() { }
|
|
5
|
-
getUuid() {
|
|
6
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
7
|
-
// tslint:disable-next-line:no-bitwise
|
|
8
|
-
const r = (Math.random() * 16) | 0;
|
|
9
|
-
// tslint:disable-next-line:no-bitwise
|
|
10
|
-
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
11
|
-
return v.toString(16);
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
static { this.ɵfac = function UuidService_Factory(t) { return new (t || UuidService)(); }; }
|
|
15
|
-
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: UuidService, factory: UuidService.ɵfac, providedIn: 'root' }); }
|
|
16
|
-
}
|
|
17
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UuidService, [{
|
|
18
|
-
type: Injectable,
|
|
19
|
-
args: [{
|
|
20
|
-
providedIn: 'root',
|
|
21
|
-
}]
|
|
22
|
-
}], () => [], null); })();
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXVpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9zZXJ2aWNlcy91dWlkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLFdBQVc7SUFDdEIsZ0JBQWUsQ0FBQztJQUVoQixPQUFPO1FBQ0wsT0FBTyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDbkUsc0NBQXNDO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQyxzQ0FBc0M7WUFDdEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFFMUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs0RUFiVSxXQUFXO3VFQUFYLFdBQVcsV0FBWCxXQUFXLG1CQUZWLE1BQU07O2lGQUVQLFdBQVc7Y0FIdkIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVXVpZFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZ2V0VXVpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcblxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuXG4gICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
3
|
-
import { BsModalService } from 'ngx-bootstrap/modal';
|
|
4
|
-
import { map, mergeMap } from 'rxjs/operators';
|
|
5
|
-
import { WarningDialogComponent } from '../warning-dialog/warning-dialog.component';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "ngx-bootstrap/modal";
|
|
8
|
-
import * as i2 from "@ngx-translate/core";
|
|
9
|
-
export class WarningDialogService {
|
|
10
|
-
constructor(modalService, translateService) {
|
|
11
|
-
this.modalService = modalService;
|
|
12
|
-
this.translateService = translateService;
|
|
13
|
-
}
|
|
14
|
-
// Show a warning dialog and return true, when the user clicked OK
|
|
15
|
-
show(message) {
|
|
16
|
-
return this.translateService.get(message).pipe(map((result) => {
|
|
17
|
-
return result;
|
|
18
|
-
}), mergeMap((result) => {
|
|
19
|
-
const fileDialog = this.modalService.show(WarningDialogComponent, { keyboard: false, ignoreBackdropClick: true });
|
|
20
|
-
fileDialog.content.message = result;
|
|
21
|
-
return fileDialog.content.onClose.pipe(map((warningResult) => {
|
|
22
|
-
if (warningResult === 1) {
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
return false;
|
|
26
|
-
}));
|
|
27
|
-
}));
|
|
28
|
-
}
|
|
29
|
-
static { this.ɵfac = function WarningDialogService_Factory(t) { return new (t || WarningDialogService)(i0.ɵɵinject(i1.BsModalService), i0.ɵɵinject(i2.TranslateService)); }; }
|
|
30
|
-
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: WarningDialogService, factory: WarningDialogService.ɵfac, providedIn: 'root' }); }
|
|
31
|
-
}
|
|
32
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WarningDialogService, [{
|
|
33
|
-
type: Injectable,
|
|
34
|
-
args: [{
|
|
35
|
-
providedIn: 'root',
|
|
36
|
-
}]
|
|
37
|
-
}], () => [{ type: i1.BsModalService }, { type: i2.TranslateService }], null); })();
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FybmluZy1kaWFsb2cuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvc2VydmljZXMvd2FybmluZy1kaWFsb2cuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7O0FBS3BGLE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsWUFBb0IsWUFBNEIsRUFBVSxnQkFBa0M7UUFBeEUsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFHLENBQUM7SUFFaEcsa0VBQWtFO0lBQ2xFLElBQUksQ0FBQyxPQUFlO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzVDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakgsVUFBVSxDQUFDLE9BQWtDLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUVoRSxPQUFRLFVBQVUsQ0FBQyxPQUFrQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2hFLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO2dCQUNwQixJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztxRkF4QlUsb0JBQW9CO3VFQUFwQixvQkFBb0IsV0FBcEIsb0JBQW9CLG1CQUZuQixNQUFNOztpRkFFUCxvQkFBb0I7Y0FIaEMsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBXYXJuaW5nRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vd2FybmluZy1kaWFsb2cvd2FybmluZy1kaWFsb2cuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFdhcm5pbmdEaWFsb2dTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLCBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHt9XG5cbiAgLy8gU2hvdyBhIHdhcm5pbmcgZGlhbG9nIGFuZCByZXR1cm4gdHJ1ZSwgd2hlbiB0aGUgdXNlciBjbGlja2VkIE9LXG4gIHNob3cobWVzc2FnZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQobWVzc2FnZSkucGlwZShcbiAgICAgIG1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSxcbiAgICAgIG1lcmdlTWFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZURpYWxvZyA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coV2FybmluZ0RpYWxvZ0NvbXBvbmVudCwgeyBrZXlib2FyZDogZmFsc2UsIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWUgfSk7XG4gICAgICAgIChmaWxlRGlhbG9nLmNvbnRlbnQgYXMgV2FybmluZ0RpYWxvZ0NvbXBvbmVudCkubWVzc2FnZSA9IHJlc3VsdDtcblxuICAgICAgICByZXR1cm4gKGZpbGVEaWFsb2cuY29udGVudCBhcyBXYXJuaW5nRGlhbG9nQ29tcG9uZW50KS5vbkNsb3NlLnBpcGUoXG4gICAgICAgICAgbWFwKCh3YXJuaW5nUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAod2FybmluZ1Jlc3VsdCA9PT0gMSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Component, HostListener } from '@angular/core';
|
|
3
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
4
|
-
import { BsModalRef } from 'ngx-bootstrap/modal';
|
|
5
|
-
import { ToastrService } from 'ngx-toastr';
|
|
6
|
-
import { Subject } from 'rxjs';
|
|
7
|
-
import { map } from 'rxjs/operators';
|
|
8
|
-
import { ConfigService } from '../../services/config.service';
|
|
9
|
-
import { ProjectService } from '../../services/project.service';
|
|
10
|
-
import { TimelineService } from '../../services/timeline.service';
|
|
11
|
-
import { WarningDialogService } from '../../services/warning-dialog.service';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "ngx-bootstrap/modal";
|
|
14
|
-
import * as i2 from "../../services/timeline.service";
|
|
15
|
-
import * as i3 from "../../services/config.service";
|
|
16
|
-
import * as i4 from "@ngx-translate/core";
|
|
17
|
-
import * as i5 from "@angular/common/http";
|
|
18
|
-
import * as i6 from "../../services/warning-dialog.service";
|
|
19
|
-
import * as i7 from "ngx-toastr";
|
|
20
|
-
import * as i8 from "../../services/project.service";
|
|
21
|
-
import * as i9 from "@angular/common";
|
|
22
|
-
import * as i10 from "@angular/forms";
|
|
23
|
-
import * as i11 from "ngx-bootstrap/typeahead";
|
|
24
|
-
import * as i12 from "../../dropzone/dropzone.component";
|
|
25
|
-
import * as i13 from "../../array-sort-pipe";
|
|
26
|
-
function CompositionSettingsComponent_div_22_div_4_Template(rf, ctx) { if (rf & 1) {
|
|
27
|
-
i0.ɵɵelementStart(0, "div");
|
|
28
|
-
i0.ɵɵtext(1);
|
|
29
|
-
i0.ɵɵpipe(2, "translate");
|
|
30
|
-
i0.ɵɵelementEnd();
|
|
31
|
-
} if (rf & 2) {
|
|
32
|
-
i0.ɵɵadvance();
|
|
33
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "designer.timeline.composition-no-file-selected"), " ");
|
|
34
|
-
} }
|
|
35
|
-
function CompositionSettingsComponent_div_22_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
-
i0.ɵɵelementStart(0, "div");
|
|
37
|
-
i0.ɵɵtext(1);
|
|
38
|
-
i0.ɵɵelementEnd();
|
|
39
|
-
} if (rf & 2) {
|
|
40
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
41
|
-
i0.ɵɵadvance();
|
|
42
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.composition.audioFileName, " ");
|
|
43
|
-
} }
|
|
44
|
-
function CompositionSettingsComponent_div_22_ul_6_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
-
i0.ɵɵelementStart(0, "ul", 30)(1, "li", 31)(2, "a", 32);
|
|
46
|
-
i0.ɵɵelement(3, "i", 33);
|
|
47
|
-
i0.ɵɵtext(4);
|
|
48
|
-
i0.ɵɵpipe(5, "translate");
|
|
49
|
-
i0.ɵɵelementEnd()();
|
|
50
|
-
i0.ɵɵelementStart(6, "li", 31)(7, "a", 34);
|
|
51
|
-
i0.ɵɵelement(8, "i", 35);
|
|
52
|
-
i0.ɵɵtext(9);
|
|
53
|
-
i0.ɵɵpipe(10, "translate");
|
|
54
|
-
i0.ɵɵelementEnd()()();
|
|
55
|
-
} if (rf & 2) {
|
|
56
|
-
i0.ɵɵadvance(4);
|
|
57
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 2, "designer.timeline.composition-file-upload"), " ");
|
|
58
|
-
i0.ɵɵadvance(5);
|
|
59
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(10, 4, "designer.timeline.composition-file-library"), " ");
|
|
60
|
-
} }
|
|
61
|
-
function CompositionSettingsComponent_div_22_a_16_Template(rf, ctx) { if (rf & 1) {
|
|
62
|
-
const _r3 = i0.ɵɵgetCurrentView();
|
|
63
|
-
i0.ɵɵelementStart(0, "a", 36);
|
|
64
|
-
i0.ɵɵlistener("click", function CompositionSettingsComponent_div_22_a_16_Template_a_click_0_listener() { const existingFile_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.selectExistingFile(existingFile_r4); return i0.ɵɵresetView(false); });
|
|
65
|
-
i0.ɵɵelementStart(1, "div", 15)(2, "div", 37);
|
|
66
|
-
i0.ɵɵtext(3);
|
|
67
|
-
i0.ɵɵelementEnd();
|
|
68
|
-
i0.ɵɵelementStart(4, "div", 38);
|
|
69
|
-
i0.ɵɵlistener("click", function CompositionSettingsComponent_div_22_a_16_Template_div_click_4_listener() { const existingFile_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.deleteFile(existingFile_r4); return i0.ɵɵresetView(false); });
|
|
70
|
-
i0.ɵɵelement(5, "i", 39);
|
|
71
|
-
i0.ɵɵelementEnd()()();
|
|
72
|
-
} if (rf & 2) {
|
|
73
|
-
const existingFile_r4 = ctx.$implicit;
|
|
74
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
75
|
-
i0.ɵɵclassProp("active", ctx_r1.composition.audioFileName == existingFile_r4);
|
|
76
|
-
i0.ɵɵadvance(3);
|
|
77
|
-
i0.ɵɵtextInterpolate1(" ", existingFile_r4, " ");
|
|
78
|
-
} }
|
|
79
|
-
function CompositionSettingsComponent_div_22_Template(rf, ctx) { if (rf & 1) {
|
|
80
|
-
const _r1 = i0.ɵɵgetCurrentView();
|
|
81
|
-
i0.ɵɵelementStart(0, "div", 15)(1, "div", 16)(2, "div", 17)(3, "div", 18);
|
|
82
|
-
i0.ɵɵtemplate(4, CompositionSettingsComponent_div_22_div_4_Template, 3, 3, "div", 19)(5, CompositionSettingsComponent_div_22_div_5_Template, 2, 1, "div", 19);
|
|
83
|
-
i0.ɵɵelementEnd()();
|
|
84
|
-
i0.ɵɵtemplate(6, CompositionSettingsComponent_div_22_ul_6_Template, 11, 6, "ul", 20);
|
|
85
|
-
i0.ɵɵelementStart(7, "div", 21)(8, "div", 22)(9, "app-dropzone", 23);
|
|
86
|
-
i0.ɵɵlistener("error", function CompositionSettingsComponent_div_22_Template_app_dropzone_error_9_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onUploadError($event)); })("success", function CompositionSettingsComponent_div_22_Template_app_dropzone_success_9_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onUploadSuccess($event)); })("queuecomplete", function CompositionSettingsComponent_div_22_Template_app_dropzone_queuecomplete_9_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onQueueComplete($event)); })("addedfile", function CompositionSettingsComponent_div_22_Template_app_dropzone_addedfile_9_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAddedFile($event)); });
|
|
87
|
-
i0.ɵɵelementEnd()();
|
|
88
|
-
i0.ɵɵelementStart(10, "div", 24)(11, "input", 25);
|
|
89
|
-
i0.ɵɵpipe(12, "translate");
|
|
90
|
-
i0.ɵɵlistener("input", function CompositionSettingsComponent_div_22_Template_input_input_11_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.filterExistingFiles($event.target.value)); });
|
|
91
|
-
i0.ɵɵelementEnd();
|
|
92
|
-
i0.ɵɵelementStart(13, "div", 26)(14, "div", 27)(15, "div", 28);
|
|
93
|
-
i0.ɵɵtemplate(16, CompositionSettingsComponent_div_22_a_16_Template, 6, 3, "a", 29);
|
|
94
|
-
i0.ɵɵpipe(17, "sort");
|
|
95
|
-
i0.ɵɵelementEnd()()()()()()();
|
|
96
|
-
} if (rf & 2) {
|
|
97
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
98
|
-
i0.ɵɵadvance(4);
|
|
99
|
-
i0.ɵɵproperty("ngIf", !ctx_r1.composition.audioFileName);
|
|
100
|
-
i0.ɵɵadvance();
|
|
101
|
-
i0.ɵɵproperty("ngIf", ctx_r1.composition.audioFileName);
|
|
102
|
-
i0.ɵɵadvance();
|
|
103
|
-
i0.ɵɵproperty("ngIf", ctx_r1.configService.enableMediaLibrary);
|
|
104
|
-
i0.ɵɵadvance(3);
|
|
105
|
-
i0.ɵɵproperty("url", ctx_r1.getDropzoneUrl())("acceptedFiles", "audio/*");
|
|
106
|
-
i0.ɵɵadvance(2);
|
|
107
|
-
i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(12, 7, "designer.misc.search"));
|
|
108
|
-
i0.ɵɵadvance(5);
|
|
109
|
-
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind2(17, 9, ctx_r1.filteredExistingFiles, "name"));
|
|
110
|
-
} }
|
|
111
|
-
export class CompositionSettingsComponent {
|
|
112
|
-
constructor(bsModalRef, timelineService, configService, translateService, http, warningDialogService, toastrService, projectService) {
|
|
113
|
-
this.bsModalRef = bsModalRef;
|
|
114
|
-
this.timelineService = timelineService;
|
|
115
|
-
this.configService = configService;
|
|
116
|
-
this.translateService = translateService;
|
|
117
|
-
this.http = http;
|
|
118
|
-
this.warningDialogService = warningDialogService;
|
|
119
|
-
this.toastrService = toastrService;
|
|
120
|
-
this.projectService = projectService;
|
|
121
|
-
this.existingCompositionNames = [];
|
|
122
|
-
this.onClose = new Subject();
|
|
123
|
-
this.existingFiles = [];
|
|
124
|
-
this.filteredExistingFiles = [];
|
|
125
|
-
this.uploading = false;
|
|
126
|
-
}
|
|
127
|
-
ngOnInit() {
|
|
128
|
-
this.loadFiles();
|
|
129
|
-
if (this.timelineService.externalCompositionsAvailable) {
|
|
130
|
-
this.timelineService.getExternalCompositionNames().subscribe((compositionNames) => {
|
|
131
|
-
this.existingCompositionNames = compositionNames;
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
getDropzoneUrl() {
|
|
136
|
-
const projectId = this.projectService.project.id ? this.projectService.project.id : '';
|
|
137
|
-
return 'file/upload?compositionUuid=' + this.composition.uuid + '&projectId=' + projectId;
|
|
138
|
-
}
|
|
139
|
-
ok() {
|
|
140
|
-
this.onClose.next(1);
|
|
141
|
-
this.bsModalRef.hide();
|
|
142
|
-
}
|
|
143
|
-
cancel() {
|
|
144
|
-
this.onClose.next(2);
|
|
145
|
-
this.bsModalRef.hide();
|
|
146
|
-
}
|
|
147
|
-
handleKeyboardEvent(event) {
|
|
148
|
-
this.ok();
|
|
149
|
-
}
|
|
150
|
-
getNameFromFile(data) {
|
|
151
|
-
return data.name;
|
|
152
|
-
}
|
|
153
|
-
loadFiles() {
|
|
154
|
-
if (!this.configService.enableMediaLibrary) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
this.http
|
|
158
|
-
.get('file/list')
|
|
159
|
-
.pipe(map((response) => {
|
|
160
|
-
this.existingFiles = [];
|
|
161
|
-
for (const file of response) {
|
|
162
|
-
// only load audio files
|
|
163
|
-
if (file.audioFile) {
|
|
164
|
-
this.existingFiles.push(this.getNameFromFile(file.audioFile));
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
this.filterExistingFiles();
|
|
168
|
-
}))
|
|
169
|
-
.subscribe();
|
|
170
|
-
}
|
|
171
|
-
onUploadError(args) {
|
|
172
|
-
const msg = 'designer.misc.toast-upload-error';
|
|
173
|
-
const title = 'designer.misc.toast-upload-error-title';
|
|
174
|
-
this.translateService.get([msg, title]).subscribe((result) => {
|
|
175
|
-
this.toastrService.error(result[msg] + args[1], result[title], { timeOut: 0, extendedTimeOut: 0, enableHtml: true });
|
|
176
|
-
// Hide the preview element
|
|
177
|
-
args[0].previewElement.hidden = true;
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
onUploadSuccess(args) {
|
|
181
|
-
this.loadFiles();
|
|
182
|
-
// allow to guess the bpm of the newly uploaded file
|
|
183
|
-
this.composition.tempoGuessed = false;
|
|
184
|
-
// hide the preview element
|
|
185
|
-
args[0].previewElement.hidden = true;
|
|
186
|
-
// select this file
|
|
187
|
-
this.composition.audioFileName = args[0].name;
|
|
188
|
-
if (this.configService.enableMediaLibrary) {
|
|
189
|
-
// the file has been uploaded to the media library
|
|
190
|
-
this.composition.audioFileInLibrary = true;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
onQueueComplete(args) {
|
|
194
|
-
this.uploading = false;
|
|
195
|
-
}
|
|
196
|
-
onAddedFile(args) {
|
|
197
|
-
this.uploading = true;
|
|
198
|
-
}
|
|
199
|
-
// Filter the existing files
|
|
200
|
-
filterExistingFiles(searchValue) {
|
|
201
|
-
if (!searchValue) {
|
|
202
|
-
this.filteredExistingFiles = this.existingFiles;
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
this.filteredExistingFiles = [];
|
|
206
|
-
for (const file of this.existingFiles) {
|
|
207
|
-
if (file.toLowerCase().indexOf(searchValue.toLowerCase()) !== -1) {
|
|
208
|
-
this.filteredExistingFiles.push(file);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
selectExistingFile(existingFile) {
|
|
213
|
-
this.composition.audioFileName = existingFile;
|
|
214
|
-
// the file has been selected from the media library
|
|
215
|
-
this.composition.audioFileInLibrary = true;
|
|
216
|
-
}
|
|
217
|
-
deleteFile(existingFile) {
|
|
218
|
-
this.warningDialogService
|
|
219
|
-
.show('designer.timeline.warning-delete-file')
|
|
220
|
-
.pipe(map((result) => {
|
|
221
|
-
if (result) {
|
|
222
|
-
this.http
|
|
223
|
-
.post('file/delete?name=' + existingFile + '&type=AUDIO', undefined)
|
|
224
|
-
.pipe(map((response) => {
|
|
225
|
-
this.loadFiles();
|
|
226
|
-
}))
|
|
227
|
-
.subscribe();
|
|
228
|
-
}
|
|
229
|
-
}))
|
|
230
|
-
.subscribe();
|
|
231
|
-
}
|
|
232
|
-
static { this.ɵfac = function CompositionSettingsComponent_Factory(t) { return new (t || CompositionSettingsComponent)(i0.ɵɵdirectiveInject(i1.BsModalRef), i0.ɵɵdirectiveInject(i2.TimelineService), i0.ɵɵdirectiveInject(i3.ConfigService), i0.ɵɵdirectiveInject(i4.TranslateService), i0.ɵɵdirectiveInject(i5.HttpClient), i0.ɵɵdirectiveInject(i6.WarningDialogService), i0.ɵɵdirectiveInject(i7.ToastrService), i0.ɵɵdirectiveInject(i8.ProjectService)); }; }
|
|
233
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CompositionSettingsComponent, selectors: [["lib-app-composition-settings"]], hostBindings: function CompositionSettingsComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
234
|
-
i0.ɵɵlistener("keydown.enter", function CompositionSettingsComponent_keydown_enter_HostBindingHandler($event) { return ctx.handleKeyboardEvent($event); }, false, i0.ɵɵresolveDocument);
|
|
235
|
-
} }, decls: 30, vars: 21, consts: [[1, "modal-header"], [1, "modal-title", "pull-left"], ["type", "button", "aria-label", "Close", 1, "close", "pull-right", 3, "click"], ["aria-hidden", "true"], [1, "modal-body"], [1, "form-group", "row"], [1, "col-lg-4", "col-form-label"], [1, "col-lg-8", "d-flex"], ["type", "text", 1, "form-control", 3, "ngModelChange", "ngModel", "typeahead"], [1, "custom-select", 3, "ngModelChange", "ngModel"], ["value", "audio"], ["class", "row", 4, "ngIf"], [1, "modal-footer"], ["href", "#", "role", "button", 1, "mr-3", "my-auto", 3, "click"], ["type", "button", 1, "btn", "btn-primary", 3, "click", "disabled"], [1, "row"], [1, "px-3", "w-100"], [1, "card", "border-secondary", "mb-3"], [1, "card-body"], [4, "ngIf"], ["class", "nav nav-tabs mb-3", "id", "myTab", "role", "tablist", 4, "ngIf"], ["id", "myTabContent", 1, "tab-content"], ["id", "upload", "role", "tabpanel", 1, "tab-pane", "fade", "show", "active"], [3, "error", "success", "queuecomplete", "addedfile", "url", "acceptedFiles"], ["id", "media-library", "role", "tabpanel", 1, "tab-pane", "fade"], ["type", "text", "id", "searchFileList", 1, "form-control", "input-block", "mb-3", 3, "input", "placeholder"], [1, "card", "border-secondary", 2, "height", "200px", "overflow-y", "scroll"], [1, "card-body", "p-0"], [1, "list-group", "list-group-flush"], ["class", "list-group-item", "href", "#", 3, "active", "click", 4, "ngFor", "ngForOf"], ["id", "myTab", "role", "tablist", 1, "nav", "nav-tabs", "mb-3"], [1, "nav-item"], ["id", "upload-tab", "data-toggle", "tab", "href", "#upload", "role", "tab", 1, "nav-link", "active"], ["aria-hidden", "true", 1, "fa", "fa-upload"], ["id", "media-library-tab", "data-toggle", "tab", "href", "#media-library", "role", "tab", 1, "nav-link"], ["aria-hidden", "true", 1, "fa", "fa-folder-o"], ["href", "#", 1, "list-group-item", 3, "click"], [1, "col-auto", "my-auto", "flex-grow", "text-break-word"], [1, "col-auto", "my-auto", "pl-0", "text-danger", "float-right", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-trash-o"]], template: function CompositionSettingsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
236
|
-
i0.ɵɵelementStart(0, "div", 0)(1, "h4", 1);
|
|
237
|
-
i0.ɵɵtext(2);
|
|
238
|
-
i0.ɵɵelementEnd();
|
|
239
|
-
i0.ɵɵelementStart(3, "button", 2);
|
|
240
|
-
i0.ɵɵlistener("click", function CompositionSettingsComponent_Template_button_click_3_listener() { return ctx.bsModalRef.hide(); });
|
|
241
|
-
i0.ɵɵelementStart(4, "span", 3);
|
|
242
|
-
i0.ɵɵtext(5, "\u00D7");
|
|
243
|
-
i0.ɵɵelementEnd()()();
|
|
244
|
-
i0.ɵɵelementStart(6, "div", 4)(7, "div", 5)(8, "label", 6);
|
|
245
|
-
i0.ɵɵtext(9);
|
|
246
|
-
i0.ɵɵpipe(10, "translate");
|
|
247
|
-
i0.ɵɵelementEnd();
|
|
248
|
-
i0.ɵɵelementStart(11, "div", 7)(12, "input", 8);
|
|
249
|
-
i0.ɵɵlistener("ngModelChange", function CompositionSettingsComponent_Template_input_ngModelChange_12_listener($event) { return ctx.composition.name = $event; });
|
|
250
|
-
i0.ɵɵelementEnd()()();
|
|
251
|
-
i0.ɵɵelementStart(13, "div", 5)(14, "label", 6);
|
|
252
|
-
i0.ɵɵtext(15);
|
|
253
|
-
i0.ɵɵpipe(16, "translate");
|
|
254
|
-
i0.ɵɵelementEnd();
|
|
255
|
-
i0.ɵɵelementStart(17, "div", 7)(18, "select", 9);
|
|
256
|
-
i0.ɵɵlistener("ngModelChange", function CompositionSettingsComponent_Template_select_ngModelChange_18_listener($event) { return ctx.composition.syncType = $event; });
|
|
257
|
-
i0.ɵɵelementStart(19, "option", 10);
|
|
258
|
-
i0.ɵɵtext(20);
|
|
259
|
-
i0.ɵɵpipe(21, "translate");
|
|
260
|
-
i0.ɵɵelementEnd()()()();
|
|
261
|
-
i0.ɵɵtemplate(22, CompositionSettingsComponent_div_22_Template, 18, 12, "div", 11);
|
|
262
|
-
i0.ɵɵelementEnd();
|
|
263
|
-
i0.ɵɵelementStart(23, "div", 12)(24, "a", 13);
|
|
264
|
-
i0.ɵɵlistener("click", function CompositionSettingsComponent_Template_a_click_24_listener() { ctx.cancel(); return false; });
|
|
265
|
-
i0.ɵɵtext(25);
|
|
266
|
-
i0.ɵɵpipe(26, "translate");
|
|
267
|
-
i0.ɵɵelementEnd();
|
|
268
|
-
i0.ɵɵelementStart(27, "button", 14);
|
|
269
|
-
i0.ɵɵlistener("click", function CompositionSettingsComponent_Template_button_click_27_listener() { return ctx.ok(); });
|
|
270
|
-
i0.ɵɵtext(28);
|
|
271
|
-
i0.ɵɵpipe(29, "translate");
|
|
272
|
-
i0.ɵɵelementEnd()();
|
|
273
|
-
} if (rf & 2) {
|
|
274
|
-
i0.ɵɵadvance(2);
|
|
275
|
-
i0.ɵɵtextInterpolate(ctx.composition.name);
|
|
276
|
-
i0.ɵɵadvance(7);
|
|
277
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(10, 11, "designer.timeline.composition-name"));
|
|
278
|
-
i0.ɵɵadvance(3);
|
|
279
|
-
i0.ɵɵproperty("ngModel", ctx.composition.name)("typeahead", ctx.existingCompositionNames);
|
|
280
|
-
i0.ɵɵadvance(3);
|
|
281
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(16, 13, "designer.timeline.composition-sync-type"));
|
|
282
|
-
i0.ɵɵadvance(3);
|
|
283
|
-
i0.ɵɵproperty("ngModel", ctx.composition.syncType);
|
|
284
|
-
i0.ɵɵadvance(2);
|
|
285
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(21, 15, "designer.timeline.composition-sync-type-audio"));
|
|
286
|
-
i0.ɵɵadvance(2);
|
|
287
|
-
i0.ɵɵproperty("ngIf", ctx.composition.syncType == "audio");
|
|
288
|
-
i0.ɵɵadvance(3);
|
|
289
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 17, "designer.misc.cancel"), " ");
|
|
290
|
-
i0.ɵɵadvance(2);
|
|
291
|
-
i0.ɵɵproperty("disabled", ctx.uploading);
|
|
292
|
-
i0.ɵɵadvance();
|
|
293
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(29, 19, "designer.misc.ok"));
|
|
294
|
-
} }, dependencies: [i9.NgForOf, i9.NgIf, i10.NgSelectOption, i10.ɵNgSelectMultipleOption, i10.DefaultValueAccessor, i10.SelectControlValueAccessor, i10.NgControlStatus, i10.NgModel, i11.TypeaheadDirective, i12.DropzoneComponent, i4.TranslatePipe, i13.ArraySortPipe] }); }
|
|
295
|
-
}
|
|
296
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CompositionSettingsComponent, [{
|
|
297
|
-
type: Component,
|
|
298
|
-
args: [{ selector: 'lib-app-composition-settings', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{ composition.name }}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"bsModalRef.hide()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n</div>\n<div class=\"modal-body\">\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.timeline.composition-name' | translate }}</label>\n <div class=\"col-lg-8 d-flex\">\n <input\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"composition.name\"\n (ngModelChange)=\"composition.name = $event\"\n [typeahead]=\"existingCompositionNames\"\n />\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.timeline.composition-sync-type' | translate }}</label>\n <div class=\"col-lg-8 d-flex\">\n <select class=\"custom-select\" [ngModel]=\"composition.syncType\" (ngModelChange)=\"composition.syncType = $event\">\n <!-- TODO -->\n <!-- <option value=\"none\">{{ 'designer.timeline.composition-sync-type-none' | translate }}</option> -->\n <option value=\"audio\">{{ 'designer.timeline.composition-sync-type-audio' | translate }}</option>\n </select>\n </div>\n </div>\n\n <div *ngIf=\"composition.syncType == 'audio'\" class=\"row\">\n <div class=\"px-3 w-100\">\n <!-- Selected file -->\n <div class=\"card border-secondary mb-3\">\n <div class=\"card-body\">\n <!-- No file selected -->\n <div *ngIf=\"!composition.audioFileName\">\n {{ 'designer.timeline.composition-no-file-selected' | translate }}\n </div>\n\n <!-- A file is selected -->\n <div *ngIf=\"composition.audioFileName\">\n {{ composition.audioFileName }}\n </div>\n </div>\n </div>\n\n <!-- Choose file -->\n <ul *ngIf=\"configService.enableMediaLibrary\" class=\"nav nav-tabs mb-3\" id=\"myTab\" role=\"tablist\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\" id=\"upload-tab\" data-toggle=\"tab\" href=\"#upload\" role=\"tab\">\n <i class=\"fa fa-upload\" aria-hidden=\"true\"></i>\n {{ 'designer.timeline.composition-file-upload' | translate }}\n </a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\" id=\"media-library-tab\" data-toggle=\"tab\" href=\"#media-library\" role=\"tab\">\n <i class=\"fa fa-folder-o\" aria-hidden=\"true\"></i>\n {{ 'designer.timeline.composition-file-library' | translate }}\n </a>\n </li>\n </ul>\n\n <div class=\"tab-content\" id=\"myTabContent\">\n <!-- Upload -->\n <div class=\"tab-pane fade show active\" id=\"upload\" role=\"tabpanel\">\n <app-dropzone\n [url]=\"getDropzoneUrl()\"\n [acceptedFiles]=\"'audio/*'\"\n (error)=\"onUploadError($event)\"\n (success)=\"onUploadSuccess($event)\"\n (queuecomplete)=\"onQueueComplete($event)\"\n (addedfile)=\"onAddedFile($event)\"\n ></app-dropzone>\n </div>\n\n <!-- Media library -->\n <div class=\"tab-pane fade\" id=\"media-library\" role=\"tabpanel\">\n <input\n type=\"text\"\n class=\"form-control input-block mb-3\"\n id=\"searchFileList\"\n placeholder=\"{{ 'designer.misc.search' | translate }}\"\n (input)=\"filterExistingFiles($event.target.value)\"\n />\n\n <div class=\"card border-secondary\" style=\"height: 200px; overflow-y: scroll\">\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\">\n <a\n *ngFor=\"let existingFile of filteredExistingFiles | sort : 'name'\"\n class=\"list-group-item\"\n [class.active]=\"composition.audioFileName == existingFile\"\n href=\"#\"\n (click)=\"selectExistingFile(existingFile); (false)\"\n >\n <div class=\"row\">\n <div class=\"col-auto my-auto flex-grow text-break-word\">\n {{ existingFile }}\n </div>\n\n <div class=\"col-auto my-auto pl-0 text-danger float-right\" (click)=\"deleteFile(existingFile); (false)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </div>\n </div>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal-footer\">\n <a class=\"mr-3 my-auto\" href=\"#\" role=\"button\" (click)=\"cancel(); (false)\">\n {{ 'designer.misc.cancel' | translate }}\n </a>\n <button [disabled]=\"uploading\" type=\"button\" class=\"btn btn-primary\" (click)=\"ok()\">{{ 'designer.misc.ok' | translate }}</button>\n</div>\n" }]
|
|
299
|
-
}], () => [{ type: i1.BsModalRef }, { type: i2.TimelineService }, { type: i3.ConfigService }, { type: i4.TranslateService }, { type: i5.HttpClient }, { type: i6.WarningDialogService }, { type: i7.ToastrService }, { type: i8.ProjectService }], { handleKeyboardEvent: [{
|
|
300
|
-
type: HostListener,
|
|
301
|
-
args: ['document:keydown.enter', ['$event']]
|
|
302
|
-
}] }); })();
|
|
303
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompositionSettingsComponent, { className: "CompositionSettingsComponent" }); })();
|
|
304
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zaXRpb24tc2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi90aW1lbGluZS9jb21wb3NpdGlvbi1zZXR0aW5ncy9jb21wb3NpdGlvbi1zZXR0aW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3RpbWVsaW5lL2NvbXBvc2l0aW9uLXNldHRpbmdzL2NvbXBvc2l0aW9uLXNldHRpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztJQ3lCbkUsMkJBQXdDO0lBQ3RDLFlBQ0Y7O0lBQUEsaUJBQU07O0lBREosY0FDRjtJQURFLHVHQUNGOzs7SUFHQSwyQkFBdUM7SUFD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LFNBQUcsS0FBSyxJQUFFO1lBQ3hFLGFBQ0Y7O1lBQUEsaUJBQUk7WUFDSixtQ0FBb0Y7WUFBZiwwR0FBUyxRQUFJLElBQUM7WUFBQyxhQUFvQzs7WUFDMUgsQUFEMEgsaUJBQVMsRUFDN0g7O1lBdkg4QixlQUFzQjtZQUF0QiwwQ0FBc0I7WUFPZixlQUFzRDtZQUF0RCxrRkFBc0Q7WUFLekYsZUFBNEI7WUFFNUIsQUFGQSw4Q0FBNEIsMkNBRVU7WUFNSCxlQUEyRDtZQUEzRCx1RkFBMkQ7WUFFbEUsZUFBZ0M7WUFBaEMsa0RBQWdDO1lBR3RDLGVBQWlFO1lBQWpFLDZGQUFpRTtZQUt2RixlQUFxQztZQUFyQywwREFBcUM7WUFzRnpDLGVBQ0Y7WUFERSwrRUFDRjtZQUNRLGVBQXNCO1lBQXRCLHdDQUFzQjtZQUFzRCxjQUFvQztZQUFwQyxnRUFBb0M7OztpRkRwRzdHLDRCQUE0QjtjQUx4QyxTQUFTOzJCQUNFLDhCQUE4Qjt5UEF1RHhDLG1CQUFtQjtrQkFEbEIsWUFBWTttQkFBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBbER2Qyw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgRHJvcHpvbmVDb25maWdJbnRlcmZhY2UgfSBmcm9tICduZ3gtZHJvcHpvbmUtd3JhcHBlcic7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb3NpdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wb3NpdGlvbic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGltZWxpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZWxpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBXYXJuaW5nRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3dhcm5pbmctZGlhbG9nLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYXBwLWNvbXBvc2l0aW9uLXNldHRpbmdzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvc2l0aW9uLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9zaXRpb24tc2V0dGluZ3MuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvblNldHRpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29tcG9zaXRpb246IENvbXBvc2l0aW9uO1xuICBleGlzdGluZ0NvbXBvc2l0aW9uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHVibGljIG9uQ2xvc2U6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGRyb3B6b25lQ29uZmlnOiBEcm9wem9uZUNvbmZpZ0ludGVyZmFjZTtcbiAgcHVibGljIHVwbG9hZE1lc3NhZ2U6IHN0cmluZztcblxuICBwdWJsaWMgZXhpc3RpbmdGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGZpbHRlcmVkRXhpc3RpbmdGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgdXBsb2FkaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgcHJpdmF0ZSB0aW1lbGluZVNlcnZpY2U6IFRpbWVsaW5lU2VydmljZSxcbiAgICBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgd2FybmluZ0RpYWxvZ1NlcnZpY2U6IFdhcm5pbmdEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RyU2VydmljZSxcbiAgICBwdWJsaWMgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRGaWxlcygpO1xuXG4gICAgaWYgKHRoaXMudGltZWxpbmVTZXJ2aWNlLmV4dGVybmFsQ29tcG9zaXRpb25zQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLnRpbWVsaW5lU2VydmljZS5nZXRFeHRlcm5hbENvbXBvc2l0aW9uTmFtZXMoKS5zdWJzY3JpYmUoKGNvbXBvc2l0aW9uTmFtZXMpID0+IHtcbiAgICAgICAgdGhpcy5leGlzdGluZ0NvbXBvc2l0aW9uTmFtZXMgPSBjb21wb3NpdGlvbk5hbWVzO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RHJvcHpvbmVVcmwoKSB7XG4gICAgY29uc3QgcHJvamVjdElkID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmlkID8gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmlkIDogJyc7XG4gICAgcmV0dXJuICdmaWxlL3VwbG9hZD9jb21wb3NpdGlvblV1aWQ9JyArIHRoaXMuY29tcG9zaXRpb24udXVpZCArICcmcHJvamVjdElkPScgKyBwcm9qZWN0SWQ7XG4gIH1cblxuICBvaygpIHtcbiAgICB0aGlzLm9uQ2xvc2UubmV4dCgxKTtcbiAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMub25DbG9zZS5uZXh0KDIpO1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogYW55KSB7XG4gICAgdGhpcy5vaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROYW1lRnJvbUZpbGUoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0YS5uYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRmlsZXMoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ1NlcnZpY2UuZW5hYmxlTWVkaWFMaWJyYXJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5odHRwXG4gICAgICAuZ2V0KCdmaWxlL2xpc3QnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IG9iamVjdFtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5leGlzdGluZ0ZpbGVzID0gW107XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgbG9hZCBhdWRpbyBmaWxlc1xuICAgICAgICAgICAgaWYgKChmaWxlIGFzIGFueSkuYXVkaW9GaWxlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXhpc3RpbmdGaWxlcy5wdXNoKHRoaXMuZ2V0TmFtZUZyb21GaWxlKChmaWxlIGFzIGFueSkuYXVkaW9GaWxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5maWx0ZXJFeGlzdGluZ0ZpbGVzKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgb25VcGxvYWRFcnJvcihhcmdzOiBhbnkpIHtcbiAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIubWlzYy50b2FzdC11cGxvYWQtZXJyb3InO1xuICAgIGNvbnN0IHRpdGxlID0gJ2Rlc2lnbmVyLm1pc2MudG9hc3QtdXBsb2FkLWVycm9yLXRpdGxlJztcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSArIGFyZ3NbMV0sIHJlc3VsdFt0aXRsZV0sIHsgdGltZU91dDogMCwgZXh0ZW5kZWRUaW1lT3V0OiAwLCBlbmFibGVIdG1sOiB0cnVlIH0pO1xuICAgICAgLy8gSGlkZSB0aGUgcHJldmlldyBlbGVtZW50XG4gICAgICBhcmdzWzBdLnByZXZpZXdFbGVtZW50LmhpZGRlbiA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25VcGxvYWRTdWNjZXNzKGFyZ3M6IGFueSkge1xuICAgIHRoaXMubG9hZEZpbGVzKCk7XG5cbiAgICAvLyBhbGxvdyB0byBndWVzcyB0aGUgYnBtIG9mIHRoZSBuZXdseSB1cGxvYWRlZCBmaWxlXG4gICAgdGhpcy5jb21wb3NpdGlvbi50ZW1wb0d1ZXNzZWQgPSBmYWxzZTtcblxuICAgIC8vIGhpZGUgdGhlIHByZXZpZXcgZWxlbWVudFxuICAgIGFyZ3NbMF0ucHJldmlld0VsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcblxuICAgIC8vIHNlbGVjdCB0aGlzIGZpbGVcbiAgICB0aGlzLmNvbXBvc2l0aW9uLmF1ZGlvRmlsZU5hbWUgPSBhcmdzWzBdLm5hbWU7XG5cbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmVuYWJsZU1lZGlhTGlicmFyeSkge1xuICAgICAgLy8gdGhlIGZpbGUgaGFzIGJlZW4gdXBsb2FkZWQgdG8gdGhlIG1lZGlhIGxpYnJhcnlcbiAgICAgIHRoaXMuY29tcG9zaXRpb24uYXVkaW9GaWxlSW5MaWJyYXJ5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25RdWV1ZUNvbXBsZXRlKGFyZ3M6IGFueSkge1xuICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgb25BZGRlZEZpbGUoYXJnczogYW55KSB7XG4gICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlO1xuICB9XG5cbiAgLy8gRmlsdGVyIHRoZSBleGlzdGluZyBmaWxlc1xuICBmaWx0ZXJFeGlzdGluZ0ZpbGVzKHNlYXJjaFZhbHVlPzogc3RyaW5nKSB7XG4gICAgaWYgKCFzZWFyY2hWYWx1ZSkge1xuICAgICAgdGhpcy5maWx0ZXJlZEV4aXN0aW5nRmlsZXMgPSB0aGlzLmV4aXN0aW5nRmlsZXM7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJlZEV4aXN0aW5nRmlsZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0aGlzLmV4aXN0aW5nRmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEV4aXN0aW5nRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZWxlY3RFeGlzdGluZ0ZpbGUoZXhpc3RpbmdGaWxlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbXBvc2l0aW9uLmF1ZGlvRmlsZU5hbWUgPSBleGlzdGluZ0ZpbGU7XG5cbiAgICAvLyB0aGUgZmlsZSBoYXMgYmVlbiBzZWxlY3RlZCBmcm9tIHRoZSBtZWRpYSBsaWJyYXJ5XG4gICAgdGhpcy5jb21wb3NpdGlvbi5hdWRpb0ZpbGVJbkxpYnJhcnkgPSB0cnVlO1xuICB9XG5cbiAgZGVsZXRlRmlsZShleGlzdGluZ0ZpbGU6IHN0cmluZykge1xuICAgIHRoaXMud2FybmluZ0RpYWxvZ1NlcnZpY2VcbiAgICAgIC5zaG93KCdkZXNpZ25lci50aW1lbGluZS53YXJuaW5nLWRlbGV0ZS1maWxlJylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAucG9zdCgnZmlsZS9kZWxldGU/bmFtZT0nICsgZXhpc3RpbmdGaWxlICsgJyZ0eXBlPUFVRElPJywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRmlsZXMoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGUgcHVsbC1sZWZ0XCI+e3sgY29tcG9zaXRpb24ubmFtZSB9fTwvaDQ+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2UgcHVsbC1yaWdodFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJic01vZGFsUmVmLmhpZGUoKVwiPlxuICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci50aW1lbGluZS5jb21wb3NpdGlvbi1uYW1lJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1sZy04IGQtZmxleFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBbbmdNb2RlbF09XCJjb21wb3NpdGlvbi5uYW1lXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY29tcG9zaXRpb24ubmFtZSA9ICRldmVudFwiXG4gICAgICAgIFt0eXBlYWhlYWRdPVwiZXhpc3RpbmdDb21wb3NpdGlvbk5hbWVzXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgIDxsYWJlbCBjbGFzcz1cImNvbC1sZy00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ2Rlc2lnbmVyLnRpbWVsaW5lLmNvbXBvc2l0aW9uLXN5bmMtdHlwZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOCBkLWZsZXhcIj5cbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCIgW25nTW9kZWxdPVwiY29tcG9zaXRpb24uc3luY1R5cGVcIiAobmdNb2RlbENoYW5nZSk9XCJjb21wb3NpdGlvbi5zeW5jVHlwZSA9ICRldmVudFwiPlxuICAgICAgICA8IS0tIFRPRE8gLS0+XG4gICAgICAgIDwhLS0gPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIj57eyAnZGVzaWduZXIudGltZWxpbmUuY29tcG9zaXRpb24tc3luYy10eXBlLW5vbmUnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+IC0tPlxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXVkaW9cIj57eyAnZGVzaWduZXIudGltZWxpbmUuY29tcG9zaXRpb24tc3luYy10eXBlLWF1ZGlvJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJjb21wb3NpdGlvbi5zeW5jVHlwZSA9PSAnYXVkaW8nXCIgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHgtMyB3LTEwMFwiPlxuICAgICAgPCEtLSBTZWxlY3RlZCBmaWxlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLXNlY29uZGFyeSBtYi0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICAgICAgICA8IS0tIE5vIGZpbGUgc2VsZWN0ZWQgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb21wb3NpdGlvbi5hdWRpb0ZpbGVOYW1lXCI+XG4gICAgICAgICAgICB7eyAnZGVzaWduZXIudGltZWxpbmUuY29tcG9zaXRpb24tbm8tZmlsZS1zZWxlY3RlZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQSBmaWxlIGlzIHNlbGVjdGVkIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb21wb3NpdGlvbi5hdWRpb0ZpbGVOYW1lXCI+XG4gICAgICAgICAgICB7eyBjb21wb3NpdGlvbi5hdWRpb0ZpbGVOYW1lIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2hvb3NlIGZpbGUgLS0+XG4gICAgICA8dWwgKm5nSWY9XCJjb25maWdTZXJ2aWNlLmVuYWJsZU1lZGlhTGlicmFyeVwiIGNsYXNzPVwibmF2IG5hdi10YWJzIG1iLTNcIiBpZD1cIm15VGFiXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgICAgICA8YSBjbGFzcz1cIm5hdi1saW5rIGFjdGl2ZVwiIGlkPVwidXBsb2FkLXRhYlwiIGRhdGEtdG9nZ2xlPVwidGFiXCIgaHJlZj1cIiN1cGxvYWRcIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXVwbG9hZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIHt7ICdkZXNpZ25lci50aW1lbGluZS5jb21wb3NpdGlvbi1maWxlLXVwbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGlua1wiIGlkPVwibWVkaWEtbGlicmFyeS10YWJcIiBkYXRhLXRvZ2dsZT1cInRhYlwiIGhyZWY9XCIjbWVkaWEtbGlicmFyeVwiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZm9sZGVyLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICB7eyAnZGVzaWduZXIudGltZWxpbmUuY29tcG9zaXRpb24tZmlsZS1saWJyYXJ5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiIGlkPVwibXlUYWJDb250ZW50XCI+XG4gICAgICAgIDwhLS0gVXBsb2FkIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZSBzaG93IGFjdGl2ZVwiIGlkPVwidXBsb2FkXCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICAgICAgPGFwcC1kcm9wem9uZVxuICAgICAgICAgICAgW3VybF09XCJnZXREcm9wem9uZVVybCgpXCJcbiAgICAgICAgICAgIFthY2NlcHRlZEZpbGVzXT1cIidhdWRpby8qJ1wiXG4gICAgICAgICAgICAoZXJyb3IpPVwib25VcGxvYWRFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgICAgIChzdWNjZXNzKT1cIm9uVXBsb2FkU3VjY2VzcygkZXZlbnQpXCJcbiAgICAgICAgICAgIChxdWV1ZWNvbXBsZXRlKT1cIm9uUXVldWVDb21wbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChhZGRlZGZpbGUpPVwib25BZGRlZEZpbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvYXBwLWRyb3B6b25lPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE1lZGlhIGxpYnJhcnkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZSBmYWRlXCIgaWQ9XCJtZWRpYS1saWJyYXJ5XCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1ibG9jayBtYi0zXCJcbiAgICAgICAgICAgIGlkPVwic2VhcmNoRmlsZUxpc3RcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZGVzaWduZXIubWlzYy5zZWFyY2gnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJFeGlzdGluZ0ZpbGVzKCRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLXNlY29uZGFyeVwiIHN0eWxlPVwiaGVpZ2h0OiAyMDBweDsgb3ZlcmZsb3cteTogc2Nyb2xsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBleGlzdGluZ0ZpbGUgb2YgZmlsdGVyZWRFeGlzdGluZ0ZpbGVzIHwgc29ydCA6ICduYW1lJ1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImNvbXBvc2l0aW9uLmF1ZGlvRmlsZU5hbWUgPT0gZXhpc3RpbmdGaWxlXCJcbiAgICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RFeGlzdGluZ0ZpbGUoZXhpc3RpbmdGaWxlKTsgKGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXktYXV0byBmbGV4LWdyb3cgdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZXhpc3RpbmdGaWxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBteS1hdXRvIHBsLTAgdGV4dC1kYW5nZXIgZmxvYXQtcmlnaHRcIiAoY2xpY2spPVwiZGVsZXRlRmlsZShleGlzdGluZ0ZpbGUpOyAoZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgPGEgY2xhc3M9XCJtci0zIG15LWF1dG9cIiBocmVmPVwiI1wiIHJvbGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsKCk7IChmYWxzZSlcIj5cbiAgICB7eyAnZGVzaWduZXIubWlzYy5jYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gIDwvYT5cbiAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwidXBsb2FkaW5nXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9rKClcIj57eyAnZGVzaWduZXIubWlzYy5vaycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbjwvZGl2PlxuIl19
|