@lenne.tech/ng-base 15.0.0-beta-3 → 16.0.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/base-components/base-components.module.d.ts +1 -2
- package/base-components/components/checkbox/checkbox.component.d.ts +1 -1
- package/base-components/components/delete-account/delete-account.component.d.ts +1 -1
- package/base-components/components/fab-button/fab-button.component.d.ts +1 -1
- package/base-components/components/input/input.component.d.ts +1 -1
- package/base-components/components/loading-bar/loading-bar.component.d.ts +1 -1
- package/base-components/components/model-form/model-form-base.component.d.ts +1 -1
- package/base-components/components/model-form/model-form.component.d.ts +1 -1
- package/base-components/components/model-form-sub/model-form-sub.component.d.ts +1 -1
- package/base-components/components/model-table/model-table.component.d.ts +1 -1
- package/base-components/components/refence-input/refence-input.component.d.ts +1 -1
- package/base-components/components/select/select.component.d.ts +1 -1
- package/base-components/components/skeleton-loader/skeleton-loader.component.d.ts +1 -1
- package/base-components/components/tags/tags.component.d.ts +1 -1
- package/base-components/components/textarea/textarea.component.d.ts +1 -1
- package/base-components/components/toast/toast.component.d.ts +1 -1
- package/base-components/components/upload-image/upload-image.component.d.ts +1 -1
- package/base-components/directives/context-menu.directive.d.ts +1 -1
- package/base-components/directives/sort.directive.d.ts +1 -1
- package/base-prototype/pages/login/login.component.d.ts +1 -1
- package/base-prototype/pages/profile/profile.component.d.ts +1 -1
- package/base-prototype/pages/set-password/set-password.component.d.ts +1 -1
- package/esm2022/base-cms/base-cms-routing.module.mjs +33 -0
- package/esm2022/base-cms/base-cms.module.mjs +61 -0
- package/esm2022/base-cms/pages/base-cms/base-cms.component.mjs +233 -0
- package/esm2022/base-components/base-components.module.mjs +123 -0
- package/esm2022/base-components/components/breadcrumb/breadcrumb.component.mjs +21 -0
- package/esm2022/base-components/components/change-password/change-password.component.mjs +96 -0
- package/esm2022/base-components/components/checkbox/checkbox.component.mjs +35 -0
- package/esm2022/base-components/components/delete-account/delete-account.component.mjs +61 -0
- package/esm2022/base-components/components/fab-button/fab-button.component.mjs +21 -0
- package/esm2022/base-components/components/input/input.component.mjs +72 -0
- package/esm2022/base-components/components/loading-bar/loading-bar.component.mjs +39 -0
- package/esm2022/base-components/components/model-form/model-form-base.component.mjs +145 -0
- package/esm2022/base-components/components/model-form/model-form.component.mjs +585 -0
- package/esm2022/base-components/components/model-form-sub/model-form-sub.component.mjs +111 -0
- package/esm2022/base-components/components/model-table/model-table.component.mjs +470 -0
- package/esm2022/base-components/components/refence-input/refence-input.component.mjs +273 -0
- package/esm2022/base-components/components/select/select.component.mjs +59 -0
- package/esm2022/base-components/components/skeleton-loader/skeleton-loader.component.mjs +32 -0
- package/esm2022/base-components/components/tags/tags.component.mjs +224 -0
- package/esm2022/base-components/components/textarea/textarea.component.mjs +76 -0
- package/esm2022/base-components/components/toast/toast.component.mjs +70 -0
- package/esm2022/base-components/components/upload-image/upload-image.component.mjs +343 -0
- package/esm2022/base-components/directives/back-button.directive.mjs +25 -0
- package/esm2022/base-components/directives/context-menu.directive.mjs +112 -0
- package/esm2022/base-components/directives/sort.directive.mjs +61 -0
- package/esm2022/base-components/directives/stop-propagation.directive.mjs +24 -0
- package/esm2022/base-components/pipes/ellipses.pipe.mjs +23 -0
- package/esm2022/base-prototype/base-prototype.module.mjs +54 -0
- package/esm2022/base-prototype/pages/email-verification/email-verification.component.mjs +62 -0
- package/esm2022/base-prototype/pages/forgot-password/forgot-password.component.mjs +75 -0
- package/esm2022/base-prototype/pages/login/login.component.mjs +111 -0
- package/esm2022/base-prototype/pages/profile/profile.component.mjs +86 -0
- package/esm2022/base-prototype/pages/register/register.component.mjs +94 -0
- package/esm2022/base-prototype/pages/set-password/set-password.component.mjs +90 -0
- package/esm2022/shared/classes/auth.class.mjs +14 -0
- package/esm2022/shared/classes/basic-user.class.mjs +49 -0
- package/esm2022/shared/classes/graphql-enum.class.mjs +10 -0
- package/esm2022/shared/classes/graphql-meta.class.mjs +345 -0
- package/esm2022/shared/classes/graphql-type.class.mjs +14 -0
- package/esm2022/shared/classes/sort.class.mjs +38 -0
- package/esm2022/shared/services/auth.service.mjs +153 -0
- package/esm2022/shared/services/breadcrumb.service.mjs +70 -0
- package/{esm2020 → esm2022}/shared/services/cms.service.mjs +7 -5
- package/esm2022/shared/services/file.service.mjs +87 -0
- package/esm2022/shared/services/forms.service.mjs +62 -0
- package/esm2022/shared/services/graphql-meta.service.mjs +133 -0
- package/esm2022/shared/services/graphql-plus.service.mjs +94 -0
- package/esm2022/shared/services/graphql.service.mjs +511 -0
- package/esm2022/shared/services/image.service.mjs +103 -0
- package/esm2022/shared/services/loader.service.mjs +79 -0
- package/esm2022/shared/services/navigation.service.mjs +39 -0
- package/esm2022/shared/services/scroll.service.mjs +208 -0
- package/esm2022/shared/services/storage.service.mjs +142 -0
- package/esm2022/shared/services/toast.service.mjs +40 -0
- package/esm2022/shared/services/user.service.mjs +161 -0
- package/esm2022/shared/services/ws.service.mjs +18 -0
- package/esm2022/src/base.module.mjs +98 -0
- package/esm2022/src/directives/lazy-load.directive.mjs +48 -0
- package/esm2022/src/directives/match-height.directive.mjs +92 -0
- package/esm2022/src/directives/resizable.directive.mjs +92 -0
- package/esm2022/src/functions/extract-files.function.mjs +87 -0
- package/esm2022/src/guards/auth.guard.mjs +84 -0
- package/esm2022/src/guards/can-deactivate.guard.mjs +17 -0
- package/esm2022/src/guards/logout.guard.mjs +35 -0
- package/esm2022/src/pipes/date-ago.pipe.mjs +64 -0
- package/esm2022/src/pipes/safe-html.pipe.mjs +23 -0
- package/esm2022/src/services/fullscreen.service.mjs +52 -0
- package/esm2022/src/services/seo.service.mjs +100 -0
- package/esm2022/src/services/theme.service.mjs +45 -0
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs +41 -30
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-components.mjs +419 -298
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-components.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-prototype.mjs +126 -87
- package/{fesm2015 → fesm2022}/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs +164 -113
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base.mjs +108 -88
- package/fesm2022/lenne.tech-ng-base.mjs.map +1 -0
- package/package.json +23 -38
- package/src/directives/lazy-load.directive.d.ts +1 -1
- package/src/directives/match-height.directive.d.ts +1 -1
- package/src/directives/resizable.directive.d.ts +1 -1
- package/src/guards/auth.guard.d.ts +2 -2
- package/src/guards/can-deactivate.guard.d.ts +1 -2
- package/src/guards/logout.guard.d.ts +2 -2
- package/esm2020/base-cms/base-cms-routing.module.mjs +0 -32
- package/esm2020/base-cms/base-cms.module.mjs +0 -59
- package/esm2020/base-cms/pages/base-cms/base-cms.component.mjs +0 -222
- package/esm2020/base-components/base-components.module.mjs +0 -123
- package/esm2020/base-components/components/breadcrumb/breadcrumb.component.mjs +0 -18
- package/esm2020/base-components/components/change-password/change-password.component.mjs +0 -90
- package/esm2020/base-components/components/checkbox/checkbox.component.mjs +0 -31
- package/esm2020/base-components/components/delete-account/delete-account.component.mjs +0 -56
- package/esm2020/base-components/components/fab-button/fab-button.component.mjs +0 -21
- package/esm2020/base-components/components/input/input.component.mjs +0 -67
- package/esm2020/base-components/components/loading-bar/loading-bar.component.mjs +0 -35
- package/esm2020/base-components/components/model-form/model-form-base.component.mjs +0 -136
- package/esm2020/base-components/components/model-form/model-form.component.mjs +0 -564
- package/esm2020/base-components/components/model-form-sub/model-form-sub.component.mjs +0 -102
- package/esm2020/base-components/components/model-table/model-table.component.mjs +0 -456
- package/esm2020/base-components/components/refence-input/refence-input.component.mjs +0 -261
- package/esm2020/base-components/components/select/select.component.mjs +0 -54
- package/esm2020/base-components/components/skeleton-loader/skeleton-loader.component.mjs +0 -32
- package/esm2020/base-components/components/tags/tags.component.mjs +0 -218
- package/esm2020/base-components/components/textarea/textarea.component.mjs +0 -72
- package/esm2020/base-components/components/toast/toast.component.mjs +0 -68
- package/esm2020/base-components/components/upload-image/upload-image.component.mjs +0 -324
- package/esm2020/base-components/directives/back-button.directive.mjs +0 -23
- package/esm2020/base-components/directives/context-menu.directive.mjs +0 -108
- package/esm2020/base-components/directives/sort.directive.mjs +0 -57
- package/esm2020/base-components/directives/stop-propagation.directive.mjs +0 -23
- package/esm2020/base-components/pipes/ellipses.pipe.mjs +0 -22
- package/esm2020/base-prototype/base-prototype.module.mjs +0 -53
- package/esm2020/base-prototype/pages/email-verification/email-verification.component.mjs +0 -55
- package/esm2020/base-prototype/pages/forgot-password/forgot-password.component.mjs +0 -67
- package/esm2020/base-prototype/pages/login/login.component.mjs +0 -102
- package/esm2020/base-prototype/pages/profile/profile.component.mjs +0 -81
- package/esm2020/base-prototype/pages/register/register.component.mjs +0 -86
- package/esm2020/base-prototype/pages/set-password/set-password.component.mjs +0 -82
- package/esm2020/shared/classes/auth.class.mjs +0 -17
- package/esm2020/shared/classes/basic-user.class.mjs +0 -52
- package/esm2020/shared/classes/graphql-enum.class.mjs +0 -9
- package/esm2020/shared/classes/graphql-meta.class.mjs +0 -344
- package/esm2020/shared/classes/graphql-type.class.mjs +0 -17
- package/esm2020/shared/classes/sort.class.mjs +0 -40
- package/esm2020/shared/services/auth.service.mjs +0 -148
- package/esm2020/shared/services/breadcrumb.service.mjs +0 -68
- package/esm2020/shared/services/file.service.mjs +0 -84
- package/esm2020/shared/services/forms.service.mjs +0 -59
- package/esm2020/shared/services/graphql-meta.service.mjs +0 -123
- package/esm2020/shared/services/graphql-plus.service.mjs +0 -89
- package/esm2020/shared/services/graphql.service.mjs +0 -507
- package/esm2020/shared/services/image.service.mjs +0 -102
- package/esm2020/shared/services/loader.service.mjs +0 -79
- package/esm2020/shared/services/navigation.service.mjs +0 -36
- package/esm2020/shared/services/scroll.service.mjs +0 -179
- package/esm2020/shared/services/storage.service.mjs +0 -140
- package/esm2020/shared/services/toast.service.mjs +0 -41
- package/esm2020/shared/services/user.service.mjs +0 -155
- package/esm2020/shared/services/ws.service.mjs +0 -16
- package/esm2020/src/base.module.mjs +0 -97
- package/esm2020/src/directives/lazy-load.directive.mjs +0 -45
- package/esm2020/src/directives/match-height.directive.mjs +0 -84
- package/esm2020/src/directives/resizable.directive.mjs +0 -90
- package/esm2020/src/functions/extract-files.function.mjs +0 -84
- package/esm2020/src/guards/auth.guard.mjs +0 -80
- package/esm2020/src/guards/can-deactivate.guard.mjs +0 -16
- package/esm2020/src/guards/logout.guard.mjs +0 -32
- package/esm2020/src/pipes/date-ago.pipe.mjs +0 -65
- package/esm2020/src/pipes/safe-html.pipe.mjs +0 -21
- package/esm2020/src/services/fullscreen.service.mjs +0 -51
- package/esm2020/src/services/seo.service.mjs +0 -97
- package/esm2020/src/services/theme.service.mjs +0 -43
- package/fesm2015/lenne.tech-ng-base-base-cms.mjs +0 -323
- package/fesm2015/lenne.tech-ng-base-base-cms.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base-base-components.mjs +0 -2866
- package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +0 -496
- package/fesm2015/lenne.tech-ng-base-shared.mjs +0 -2750
- package/fesm2015/lenne.tech-ng-base-shared.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base.mjs +0 -905
- package/fesm2015/lenne.tech-ng-base.mjs.map +0 -1
- package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
- package/fesm2020/lenne.tech-ng-base.mjs.map +0 -1
- /package/{esm2020 → esm2022}/base-cms/interfaces/base-cms-module-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/base-cms/lenne.tech-ng-base-base-cms.mjs +0 -0
- /package/{esm2020 → esm2022}/base-cms/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/base-components/lenne.tech-ng-base-base-components.mjs +0 -0
- /package/{esm2020 → esm2022}/base-components/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/base-prototype/lenne.tech-ng-base-base-prototype.mjs +0 -0
- /package/{esm2020 → esm2022}/base-prototype/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/lenne.tech-ng-base.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/classes/helper.class.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/classes/standard.class.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/decorators/debounce.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/comparison-operator.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/graphql-request-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/logical-operator.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/skeleton-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/sort-order.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/toast-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/functions/ws-client.function.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/base-module-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/breadcrumb.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/can-component-deactivate.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-enum-values.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-field-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-model-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-table-field.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/combined-filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/compress-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cropping-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/field-object.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/field.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/find-args.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-crud-type.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-fields-object.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-plus-options.interfacen.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-type-collection.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/login-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/single-filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/sort-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/time-components.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/toast.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/lenne.tech-ng-base-shared.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/types/graphql-fields.type.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/types/storage.type.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/email.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/match.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/secure-password.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/src/decorators/auto-unsubscribe.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/src/factories/apollo-options.factory.mjs +0 -0
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { BasicUser, fullEmail, GraphQLRequestType, ToastType, } from '@lenne.tech/ng-base/shared';
|
|
3
|
+
import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@lenne.tech/ng-base/shared";
|
|
6
|
+
import * as i2 from "@angular/router";
|
|
7
|
+
import * as i3 from "@angular/forms";
|
|
8
|
+
import * as i4 from "@angular/common";
|
|
9
|
+
import * as i5 from "../model-form-sub/model-form-sub.component";
|
|
10
|
+
import * as i6 from "../fab-button/fab-button.component";
|
|
11
|
+
/**
|
|
12
|
+
* ModelFormComponent
|
|
13
|
+
*
|
|
14
|
+
* Hint for handling extensions of this component in project:
|
|
15
|
+
* If you want to use complete custom services and methods, extend ModelFormBaseComponent instead of ModelFormComponent
|
|
16
|
+
*/
|
|
17
|
+
class ModelFormComponent {
|
|
18
|
+
graphQLMetaService;
|
|
19
|
+
graphQLService;
|
|
20
|
+
formsService;
|
|
21
|
+
authService;
|
|
22
|
+
router;
|
|
23
|
+
route;
|
|
24
|
+
cmsService;
|
|
25
|
+
toastService;
|
|
26
|
+
fileService;
|
|
27
|
+
modelName;
|
|
28
|
+
label;
|
|
29
|
+
id;
|
|
30
|
+
delete = true;
|
|
31
|
+
onlyUpdateMode = false;
|
|
32
|
+
duplicate = false;
|
|
33
|
+
logging = false;
|
|
34
|
+
config;
|
|
35
|
+
showFavButton = true;
|
|
36
|
+
finished = new EventEmitter();
|
|
37
|
+
meta;
|
|
38
|
+
form;
|
|
39
|
+
_loading = false;
|
|
40
|
+
fields;
|
|
41
|
+
operation;
|
|
42
|
+
keys = [];
|
|
43
|
+
user;
|
|
44
|
+
object;
|
|
45
|
+
fabButtons = [];
|
|
46
|
+
fileChanges;
|
|
47
|
+
set loading(value) {
|
|
48
|
+
if (!value) {
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
this._loading = value;
|
|
51
|
+
}, 400);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this._loading = value;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
constructor(graphQLMetaService, graphQLService, formsService, authService, router, route, cmsService, toastService, fileService) {
|
|
58
|
+
this.graphQLMetaService = graphQLMetaService;
|
|
59
|
+
this.graphQLService = graphQLService;
|
|
60
|
+
this.formsService = formsService;
|
|
61
|
+
this.authService = authService;
|
|
62
|
+
this.router = router;
|
|
63
|
+
this.route = route;
|
|
64
|
+
this.cmsService = cmsService;
|
|
65
|
+
this.toastService = toastService;
|
|
66
|
+
this.fileService = fileService;
|
|
67
|
+
}
|
|
68
|
+
ngOnInit() {
|
|
69
|
+
// Set user for roles check
|
|
70
|
+
this.user = BasicUser.map(this.authService.currentUser);
|
|
71
|
+
this.graphQLMetaService.getMeta().subscribe((meta) => {
|
|
72
|
+
this.meta = meta;
|
|
73
|
+
if (this.modelName) {
|
|
74
|
+
this.init();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
this.initFabActions();
|
|
78
|
+
}
|
|
79
|
+
ngOnChanges(changes) {
|
|
80
|
+
// Reinit form for new model or load and patch form with new id
|
|
81
|
+
if (changes['modelName'] || changes['id']) {
|
|
82
|
+
this.init();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* > If the model name and metadata are present, set the operation to update or create, get the fields from the
|
|
87
|
+
* metadata, create the form, and if the value is present, patch the form with the value
|
|
88
|
+
*/
|
|
89
|
+
init(id) {
|
|
90
|
+
if (id) {
|
|
91
|
+
this.id = id;
|
|
92
|
+
}
|
|
93
|
+
if (!this.id && this.onlyUpdateMode) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (this.modelName && this.meta) {
|
|
97
|
+
this.operation = this.id ? 'update' : 'create';
|
|
98
|
+
if (this.logging) {
|
|
99
|
+
console.log('ModelFormComponent::init->operation', this.operation);
|
|
100
|
+
console.log('ModelFormComponent::init->meta.getArgs', this.operation + this.capitalizeFirstLetter(this.modelName));
|
|
101
|
+
}
|
|
102
|
+
this.fields = this.meta.getArgs(this.operation + this.capitalizeFirstLetter(this.modelName), {
|
|
103
|
+
type: GraphQLRequestType.MUTATION,
|
|
104
|
+
}).fields;
|
|
105
|
+
this.fields = this.fields['input'].fields;
|
|
106
|
+
this.keys = Object.keys(this.fields);
|
|
107
|
+
if (this.logging) {
|
|
108
|
+
console.log('ModelFormComponent::init->id', this.id);
|
|
109
|
+
console.log('ModelFormComponent::init->fields', this.fields);
|
|
110
|
+
console.log('ModelFormComponent::init->keys', this.keys);
|
|
111
|
+
}
|
|
112
|
+
this.form = this.createForm(this.fields);
|
|
113
|
+
if (this.id) {
|
|
114
|
+
this.getObjectById(this.id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* It takes a key as an argument, and returns an array of keys from the sub-object
|
|
120
|
+
*/
|
|
121
|
+
getKeysFromSubObject(key) {
|
|
122
|
+
return Object.keys(this.fields[key]);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* It takes an id, and then calls the graphQLService to get the object from the database
|
|
126
|
+
*
|
|
127
|
+
* @param id - The id of the object to be loaded
|
|
128
|
+
*/
|
|
129
|
+
getObjectById(id) {
|
|
130
|
+
if (!id) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (this.logging) {
|
|
134
|
+
console.log('ModelFormComponent::getObjectById->id', id);
|
|
135
|
+
console.log('ModelFormComponent::getObjectById->requestFields', this.createRequestObject(this.fields));
|
|
136
|
+
}
|
|
137
|
+
this.graphQLService
|
|
138
|
+
.graphQl('get' + this.capitalizeFirstLetter(this.modelName), {
|
|
139
|
+
arguments: { id },
|
|
140
|
+
fields: this.createRequestObject(this.fields),
|
|
141
|
+
type: GraphQLRequestType.QUERY,
|
|
142
|
+
})
|
|
143
|
+
.subscribe({
|
|
144
|
+
next: (response) => {
|
|
145
|
+
if (this.logging) {
|
|
146
|
+
console.log('ModelFormComponent::get->value', response);
|
|
147
|
+
}
|
|
148
|
+
this.object = response;
|
|
149
|
+
this.form.patchValue({ ...{}, ...response });
|
|
150
|
+
// Process patchFields for reference input
|
|
151
|
+
for (const [key, value] of Object.entries(this.fields)) {
|
|
152
|
+
if (this.nestedObject(key, this.fields)?.type === 'DateTime' ||
|
|
153
|
+
this.nestedObject(key, this.config)?.type === 'DateTime') {
|
|
154
|
+
this.form.get(key).patchValue(this.formatDate(this.nestedObject(key, response)));
|
|
155
|
+
}
|
|
156
|
+
// If it not an array
|
|
157
|
+
if (this.nestedObject(key, this.config)?.type === 'Reference' &&
|
|
158
|
+
!this.nestedObject(key, this.fields)?.isList) {
|
|
159
|
+
if (this.form.get(key)) {
|
|
160
|
+
this.form
|
|
161
|
+
.get(key)
|
|
162
|
+
.patchValue(response[this.nestedObject(key, this.config)?.patchField
|
|
163
|
+
? this.nestedObject(key, this.config)?.patchField
|
|
164
|
+
: key]?.id);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// If value is an array
|
|
168
|
+
if (this.nestedObject(key, this.config)?.type === 'Reference' &&
|
|
169
|
+
this.nestedObject(key, this.fields)?.isList) {
|
|
170
|
+
if (this.form.get(key)) {
|
|
171
|
+
this.form
|
|
172
|
+
.get(key)
|
|
173
|
+
.patchValue(response[this.nestedObject(key, this.config)?.patchField
|
|
174
|
+
? this.nestedObject(key, this.config)?.patchField
|
|
175
|
+
: key]?.map((e) => e?.id));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (this.logging) {
|
|
180
|
+
console.log('ModelFormComponent::getObjectById->patchedForm', this.form);
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
error: (err) => {
|
|
184
|
+
console.error('Error on load object', err);
|
|
185
|
+
this.finished.emit(null);
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* It takes a GraphQL type collection and returns an array of strings and objects
|
|
191
|
+
*
|
|
192
|
+
* @param fields - IGraphQLTypeCollection - This is the object that is returned from the
|
|
193
|
+
* introspection query.
|
|
194
|
+
* @returns An array of strings and objects.
|
|
195
|
+
*/
|
|
196
|
+
createRequestObject(fields) {
|
|
197
|
+
const requestFields = [];
|
|
198
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
199
|
+
if (this.config[key]?.exclude !== undefined && this.config[key]?.exclude) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (Object.keys(fields[key]?.fields)?.length === 0) {
|
|
203
|
+
if (this.config[key]?.type !== 'Reference') {
|
|
204
|
+
requestFields.push(key);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
requestFields.push({ [this.config[key]?.patchField ? this.config[key]?.patchField : key]: ['id'] });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const subkeys = this.createRequestObject(fields[key].fields);
|
|
212
|
+
const resultObject = {};
|
|
213
|
+
resultObject[key] = subkeys;
|
|
214
|
+
requestFields.push(resultObject);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (this.logging) {
|
|
218
|
+
console.log('ModelFormComponent::createRequestObject->requestFields', requestFields);
|
|
219
|
+
}
|
|
220
|
+
return requestFields;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* It takes a collection of GraphQL types and creates a form group with a form control for each type
|
|
224
|
+
*
|
|
225
|
+
* @param fields - IGraphQLTypeCollection
|
|
226
|
+
* @param parents
|
|
227
|
+
*/
|
|
228
|
+
createForm(fields, parents = []) {
|
|
229
|
+
const group = {};
|
|
230
|
+
let internParents = [...[], ...parents];
|
|
231
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
232
|
+
if (Object.keys(value?.fields)?.length === 0) {
|
|
233
|
+
group[key] = new UntypedFormControl(null, this.processValidators(this.nestedObject(internParents.length ? internParents.join('.') + '.' + key : key, this.config), value));
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
internParents.push(key);
|
|
237
|
+
group[key] = this.createForm(fields[key].fields, internParents);
|
|
238
|
+
internParents = [];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (this.logging) {
|
|
242
|
+
console.log('ModelFormComponent::createForm->group', group);
|
|
243
|
+
}
|
|
244
|
+
return new UntypedFormGroup(group);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Process form validators for control
|
|
248
|
+
*/
|
|
249
|
+
processValidators(config, value) {
|
|
250
|
+
const validators = [];
|
|
251
|
+
if (config) {
|
|
252
|
+
if (config?.required !== undefined ? config?.required : value.isRequired) {
|
|
253
|
+
validators.push(Validators.required);
|
|
254
|
+
}
|
|
255
|
+
if (config?.type === 'Email') {
|
|
256
|
+
validators.push(fullEmail());
|
|
257
|
+
}
|
|
258
|
+
if (config?.type === 'Password') {
|
|
259
|
+
validators.push(Validators.minLength(6));
|
|
260
|
+
}
|
|
261
|
+
if (typeof config?.min === 'number') {
|
|
262
|
+
validators.push(Validators.min(config.min));
|
|
263
|
+
}
|
|
264
|
+
if (typeof config?.max === 'number') {
|
|
265
|
+
validators.push(Validators.max(config.max));
|
|
266
|
+
}
|
|
267
|
+
if (Array.isArray(config?.validators)) {
|
|
268
|
+
validators.push(...config?.validators);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return validators;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* It calls the graphQLService to delete the object with the id of the object that is currently being edited
|
|
275
|
+
*/
|
|
276
|
+
deleteObject() {
|
|
277
|
+
this.cmsService.deleteObject(this.id, this.modelName).then(() => {
|
|
278
|
+
this.toastService.show({
|
|
279
|
+
id: this.modelName + '-success',
|
|
280
|
+
type: ToastType.SUCCESS,
|
|
281
|
+
title: 'Erfolgreich',
|
|
282
|
+
description: this.label + ' wurde erfolgreich gelöscht.',
|
|
283
|
+
});
|
|
284
|
+
this.finished.emit(null);
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* It sends a GraphQL mutation to the server to duplicate the object
|
|
289
|
+
*/
|
|
290
|
+
async duplicateObject() {
|
|
291
|
+
this.cmsService.duplicateObject(this.id, this.modelName).then(async (value) => {
|
|
292
|
+
if (value?.id) {
|
|
293
|
+
await this.router.navigate(['../'], { relativeTo: this.route });
|
|
294
|
+
this.toastService.show({
|
|
295
|
+
id: this.modelName + '-success',
|
|
296
|
+
type: ToastType.SUCCESS,
|
|
297
|
+
title: 'Erfolgreich',
|
|
298
|
+
description: this.label + ' wurde erfolgreich dupliziert.',
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
this.finished.emit(null);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* It takes a string, capitalizes the first letter, and returns the modified string
|
|
308
|
+
*
|
|
309
|
+
* @param value - The string to capitalize.
|
|
310
|
+
* @returns The first letter of the string is being capitalized and the rest of the string is being returned.
|
|
311
|
+
*/
|
|
312
|
+
capitalizeFirstLetter(value) {
|
|
313
|
+
return this.cmsService.capitalizeFirstLetter(value);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* It takes an AbstractControl and returns a FormControl
|
|
317
|
+
*
|
|
318
|
+
* @param control - AbstractControl | null | undefined
|
|
319
|
+
* @returns A FormControl
|
|
320
|
+
*/
|
|
321
|
+
transformToControl(control) {
|
|
322
|
+
return control;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* It takes the key of the form control that has changed, gets the value of that form control, creates an object with the
|
|
326
|
+
* key and value, and then sends that object to the GraphQL server to update the database
|
|
327
|
+
*/
|
|
328
|
+
imageChanged(key) {
|
|
329
|
+
const data = {};
|
|
330
|
+
data[key] = this.form.get(key).value;
|
|
331
|
+
if (this.logging) {
|
|
332
|
+
console.log('ModelFormComponent::imageChanged->body', data);
|
|
333
|
+
}
|
|
334
|
+
if (this.id) {
|
|
335
|
+
try {
|
|
336
|
+
this.graphQLService
|
|
337
|
+
.graphQl('update' + this.capitalizeFirstLetter(this.modelName), {
|
|
338
|
+
arguments: { id: this.id, input: data },
|
|
339
|
+
fields: ['id'],
|
|
340
|
+
type: GraphQLRequestType.MUTATION,
|
|
341
|
+
})
|
|
342
|
+
.subscribe({
|
|
343
|
+
next: (value) => {
|
|
344
|
+
if (this.logging) {
|
|
345
|
+
console.log('ModelFormComponent::imageChanged->success', value);
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
catch (e) {
|
|
351
|
+
if (this.logging) {
|
|
352
|
+
console.log('ModelFormComponent::imageChanged->error', e);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* It takes the form, validates it, and then sends it to the GraphQL server
|
|
359
|
+
*
|
|
360
|
+
* @returns The id of the newly created or updated object.
|
|
361
|
+
*/
|
|
362
|
+
submit(secret = false) {
|
|
363
|
+
return new Promise(async (resolve, reject) => {
|
|
364
|
+
if (!secret) {
|
|
365
|
+
this.loading = true;
|
|
366
|
+
}
|
|
367
|
+
if (this.form.invalid && !secret) {
|
|
368
|
+
this.formsService.validateAllFormFields(this.form);
|
|
369
|
+
this.formsService.scrollToInvalidControl(this.form);
|
|
370
|
+
this.loading = false;
|
|
371
|
+
resolve(null);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
if (this.operation === 'update' && !this.id) {
|
|
375
|
+
console.error('ID is missing for update!');
|
|
376
|
+
this.loading = false;
|
|
377
|
+
resolve(null);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (this.logging) {
|
|
381
|
+
console.log('ModelFormComponent::submit->formValue', this.form.value);
|
|
382
|
+
}
|
|
383
|
+
// Prepare data for server request
|
|
384
|
+
let data = Object.assign({}, this.form.value);
|
|
385
|
+
data = this.prepareDataForRequest(this.config, this.fields, data);
|
|
386
|
+
if (this.logging) {
|
|
387
|
+
console.log('ModelFormComponent::submit->valueToGraphql', data);
|
|
388
|
+
console.log('ModelFormComponent::submit->fileChanges', this.fileChanges);
|
|
389
|
+
}
|
|
390
|
+
if (this.fileChanges?.length) {
|
|
391
|
+
for (const fileChange of this.fileChanges) {
|
|
392
|
+
const key = fileChange.field;
|
|
393
|
+
const config = this.nestedObject(key, this.config);
|
|
394
|
+
if (fileChange.file) {
|
|
395
|
+
// Upload
|
|
396
|
+
const value = this.form.get(key).value;
|
|
397
|
+
// Check if file is an ID or a base64 string
|
|
398
|
+
if (typeof value === 'string') {
|
|
399
|
+
// Delete if ID
|
|
400
|
+
if (!this.form.get(key).value?.startsWith('data:')) {
|
|
401
|
+
const deleteResult = await this.fileService.delete(this.nestedObject(key, this.config)?.url, this.nestedObject(key, this.config)?.deletePath || '/files/', this.nestedObject(key, this.object));
|
|
402
|
+
if (deleteResult) {
|
|
403
|
+
this.nestedObject(key, data, '');
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
const uploadResult = await this.fileService.upload(this.nestedObject(key, this.config)?.url, this.nestedObject(key, this.config)?.uploadPath || '/files/upload', fileChange.file);
|
|
407
|
+
if (uploadResult?.id) {
|
|
408
|
+
this.nestedObject(key, data, uploadResult.id);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else if (config?.imageMode && config?.imageMode !== 'file') {
|
|
412
|
+
// Delete
|
|
413
|
+
const result = await this.fileService.delete(config?.url, this.nestedObject(key, this.config)?.deletePath || '/files/', this.nestedObject(key, this.object));
|
|
414
|
+
if (result) {
|
|
415
|
+
this.nestedObject(key, data, '');
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
this.graphQLService
|
|
422
|
+
.graphQl(this.operation + this.capitalizeFirstLetter(this.modelName), {
|
|
423
|
+
arguments: this.operation === 'update' ? { id: this.id, input: data } : { input: data },
|
|
424
|
+
fields: ['id'],
|
|
425
|
+
type: GraphQLRequestType.MUTATION,
|
|
426
|
+
})
|
|
427
|
+
.subscribe({
|
|
428
|
+
next: (value) => {
|
|
429
|
+
if (!secret) {
|
|
430
|
+
this.loading = false;
|
|
431
|
+
this.finished.emit(null);
|
|
432
|
+
this.toastService.show({
|
|
433
|
+
id: this.modelName + '-success',
|
|
434
|
+
type: ToastType.SUCCESS,
|
|
435
|
+
title: 'Erfolgreich',
|
|
436
|
+
description: this.label + ' wurde erfolgreich ' + (this.operation === 'create' ? 'erstellt.' : 'aktualisiert.'),
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
resolve(value);
|
|
440
|
+
},
|
|
441
|
+
error: (err) => {
|
|
442
|
+
if (!secret) {
|
|
443
|
+
console.error('Failed on ' + this.operation, err);
|
|
444
|
+
this.loading = false;
|
|
445
|
+
this.toastService.show({
|
|
446
|
+
id: this.modelName + '-success',
|
|
447
|
+
type: ToastType.ERROR,
|
|
448
|
+
description: 'Beim ' +
|
|
449
|
+
(this.operation === 'create' ? 'erstellen' : 'aktualisieren') +
|
|
450
|
+
' von ' +
|
|
451
|
+
this.label +
|
|
452
|
+
' ist etwas schiefgelaufen.',
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
reject();
|
|
456
|
+
},
|
|
457
|
+
});
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Prepare data for server
|
|
462
|
+
*/
|
|
463
|
+
prepareDataForRequest(config, fieldsConfig, data) {
|
|
464
|
+
if (!data) {
|
|
465
|
+
return data;
|
|
466
|
+
}
|
|
467
|
+
for (const [key, value] of Object.entries(data)) {
|
|
468
|
+
if ((this.fields[key]?.type === 'DateTime' || this.config[key]?.type === 'DateTime') && value === '') {
|
|
469
|
+
data[key] = null;
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
if ((config[key]?.roles ? !this.user.hasAllRoles(config[key]?.roles) : false) || config[key]?.exclude) {
|
|
473
|
+
delete data[key];
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
if (value && typeof value === 'object' && !Array.isArray(value) && this.fields[key]?.type !== 'Upload') {
|
|
477
|
+
data[key] = Object.keys(data[key])
|
|
478
|
+
.filter((k) => data[key][k] != null)
|
|
479
|
+
.reduce((a, k) => ({ ...a, [k]: data[key][k] }), {});
|
|
480
|
+
if (Object.keys(data[key])?.length === 0) {
|
|
481
|
+
if (this.logging) {
|
|
482
|
+
console.log('Object is empty from result');
|
|
483
|
+
}
|
|
484
|
+
data[key] = null;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// Set type for graphql method
|
|
488
|
+
if (fieldsConfig[key]?.type === 'Float') {
|
|
489
|
+
if (value) {
|
|
490
|
+
data[key] = Number(value);
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
data[key] = null;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if (fieldsConfig[key]?.fields && Object.keys(fieldsConfig[key]?.fields).length > 0) {
|
|
497
|
+
data[key] = this.prepareDataForRequest(config[key]?.fields, fieldsConfig[key]?.fields, data[key]);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return data;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Init fab buttons for mobile devices
|
|
504
|
+
*/
|
|
505
|
+
initFabActions() {
|
|
506
|
+
const saveEvent = new EventEmitter();
|
|
507
|
+
this.fabButtons.push({ icon: 'bi-check-lg', color: 'var(--bs-success)', event: saveEvent });
|
|
508
|
+
saveEvent.subscribe(() => this.submit(false));
|
|
509
|
+
if (this.duplicate && this.operation === 'update') {
|
|
510
|
+
const event = new EventEmitter();
|
|
511
|
+
this.fabButtons.push({ icon: 'bi-back', color: 'var(--bs-info)', event });
|
|
512
|
+
event.subscribe(() => this.duplicateObject());
|
|
513
|
+
}
|
|
514
|
+
if (this.operation === 'update' && this.delete) {
|
|
515
|
+
const event = new EventEmitter();
|
|
516
|
+
this.fabButtons.push({ icon: 'bi-trash3', color: 'var(--bs-danger)', event });
|
|
517
|
+
event.subscribe(() => this.deleteObject());
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Set file changes for process
|
|
522
|
+
*/
|
|
523
|
+
processFileChanges(event) {
|
|
524
|
+
const index = this.fileChanges?.findIndex((e) => e.field === event.field);
|
|
525
|
+
if (index !== undefined && index !== -1) {
|
|
526
|
+
this.fileChanges[index] = event;
|
|
527
|
+
}
|
|
528
|
+
else if (this.fileChanges) {
|
|
529
|
+
this.fileChanges.push(event);
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
this.fileChanges = [event];
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
formatDate(date) {
|
|
536
|
+
if (!date) {
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
const newDate = new Date(date);
|
|
540
|
+
return newDate.toISOString().substring(0, 16);
|
|
541
|
+
}
|
|
542
|
+
nestedObject(key, nestedObject, value) {
|
|
543
|
+
const props = key.split('.');
|
|
544
|
+
let result = nestedObject;
|
|
545
|
+
for (let i = 0; i < props.length; i++) {
|
|
546
|
+
if (value && i === props.length - 1) {
|
|
547
|
+
result[props[i]] = value;
|
|
548
|
+
return result[props[i]];
|
|
549
|
+
}
|
|
550
|
+
result =
|
|
551
|
+
result[props[i]]?.fields && Object.keys(result[props[i]]?.fields)?.length > 0
|
|
552
|
+
? result[props[i]]?.fields
|
|
553
|
+
: result[props[i]];
|
|
554
|
+
}
|
|
555
|
+
return result;
|
|
556
|
+
}
|
|
557
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelFormComponent, deps: [{ token: i1.GraphQLMetaService }, { token: i1.GraphQLService }, { token: i1.FormsService }, { token: i1.AuthService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i1.CmsService }, { token: i1.ToastService }, { token: i1.FileService }], target: i0.ɵɵFactoryTarget.Component });
|
|
558
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: ModelFormComponent, selector: "base-model-form", inputs: { modelName: "modelName", label: "label", id: "id", delete: "delete", onlyUpdateMode: "onlyUpdateMode", duplicate: "duplicate", logging: "logging", config: "config", showFavButton: "showFavButton" }, outputs: { finished: "finished" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"w-100\" *ngIf=\"form\">\n <div class=\"d-flex flex-row justify-content-between mt-3\">\n <div class=\"responsive-back d-flex d-lg-none\">\n <i class=\"bi bi-arrow-left\" routerLink=\"../\"></i>\n </div>\n <h2 class=\"mb-0\">\n {{ label ? label : capitalizeFirstLetter(modelName) }} {{ operation === 'update' ? 'bearbeiten' : 'erstellen' }}\n </h2>\n\n <div class=\"d-none d-lg-flex flex-row align-items-center justify-content-end\">\n <button class=\"btn btn-outline-primary me-2\" *ngIf=\"id && duplicate && !_loading\" (click)=\"duplicateObject()\">\n Duplizieren\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"form\">\n <base-model-form-sub\n [id]=\"id\"\n [fields]=\"fields\"\n [config]=\"config\"\n [form]=\"form\"\n (imageChanged)=\"imageChanged($event)\"\n (fileChanged)=\"processFileChanges($event)\"\n ></base-model-form-sub>\n\n <div class=\"d-none d-lg-flex mt-4\" [ngClass]=\"id && delete ? 'justify-content-between' : 'justify-content-end'\">\n <div *ngIf=\"id && delete\">\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteObject()\">L\u00F6schen</button>\n </div>\n <div>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n </form>\n</div>\n\n<div class=\"d-block d-lg-none responsive-action-button\" *ngIf=\"showFavButton\">\n <base-fab-button [buttons]=\"fabButtons\"></base-fab-button>\n</div>\n", styles: [".responsive-back{display:flex;align-items:center;margin-right:6px}.responsive-back .bi-arrow-left{font-size:28px}h2{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.responsive-action-button{position:fixed;bottom:15px;right:15px;z-index:100}\n"], dependencies: [{ kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i5.ModelFormSubComponent, selector: "base-model-form-sub", inputs: ["id", "parentKey", "fields", "form", "config"], outputs: ["imageChanged", "fileChanged"] }, { kind: "component", type: i6.FabButtonComponent, selector: "base-fab-button", inputs: ["fabIcon", "buttons"] }] });
|
|
559
|
+
}
|
|
560
|
+
export { ModelFormComponent };
|
|
561
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelFormComponent, decorators: [{
|
|
562
|
+
type: Component,
|
|
563
|
+
args: [{ selector: 'base-model-form', template: "<div class=\"w-100\" *ngIf=\"form\">\n <div class=\"d-flex flex-row justify-content-between mt-3\">\n <div class=\"responsive-back d-flex d-lg-none\">\n <i class=\"bi bi-arrow-left\" routerLink=\"../\"></i>\n </div>\n <h2 class=\"mb-0\">\n {{ label ? label : capitalizeFirstLetter(modelName) }} {{ operation === 'update' ? 'bearbeiten' : 'erstellen' }}\n </h2>\n\n <div class=\"d-none d-lg-flex flex-row align-items-center justify-content-end\">\n <button class=\"btn btn-outline-primary me-2\" *ngIf=\"id && duplicate && !_loading\" (click)=\"duplicateObject()\">\n Duplizieren\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"form\">\n <base-model-form-sub\n [id]=\"id\"\n [fields]=\"fields\"\n [config]=\"config\"\n [form]=\"form\"\n (imageChanged)=\"imageChanged($event)\"\n (fileChanged)=\"processFileChanges($event)\"\n ></base-model-form-sub>\n\n <div class=\"d-none d-lg-flex mt-4\" [ngClass]=\"id && delete ? 'justify-content-between' : 'justify-content-end'\">\n <div *ngIf=\"id && delete\">\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteObject()\">L\u00F6schen</button>\n </div>\n <div>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n </form>\n</div>\n\n<div class=\"d-block d-lg-none responsive-action-button\" *ngIf=\"showFavButton\">\n <base-fab-button [buttons]=\"fabButtons\"></base-fab-button>\n</div>\n", styles: [".responsive-back{display:flex;align-items:center;margin-right:6px}.responsive-back .bi-arrow-left{font-size:28px}h2{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.responsive-action-button{position:fixed;bottom:15px;right:15px;z-index:100}\n"] }]
|
|
564
|
+
}], ctorParameters: function () { return [{ type: i1.GraphQLMetaService }, { type: i1.GraphQLService }, { type: i1.FormsService }, { type: i1.AuthService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i1.CmsService }, { type: i1.ToastService }, { type: i1.FileService }]; }, propDecorators: { modelName: [{
|
|
565
|
+
type: Input
|
|
566
|
+
}], label: [{
|
|
567
|
+
type: Input
|
|
568
|
+
}], id: [{
|
|
569
|
+
type: Input
|
|
570
|
+
}], delete: [{
|
|
571
|
+
type: Input
|
|
572
|
+
}], onlyUpdateMode: [{
|
|
573
|
+
type: Input
|
|
574
|
+
}], duplicate: [{
|
|
575
|
+
type: Input
|
|
576
|
+
}], logging: [{
|
|
577
|
+
type: Input
|
|
578
|
+
}], config: [{
|
|
579
|
+
type: Input
|
|
580
|
+
}], showFavButton: [{
|
|
581
|
+
type: Input
|
|
582
|
+
}], finished: [{
|
|
583
|
+
type: Output
|
|
584
|
+
}] } });
|
|
585
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL21vZGVsLWZvcm0vbW9kZWwtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL21vZGVsLWZvcm0vbW9kZWwtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUVMLFNBQVMsRUFLVCxTQUFTLEVBR1Qsa0JBQWtCLEVBS2xCLFNBQVMsR0FDVixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBbUIsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBSW5HOzs7OztHQUtHO0FBQ0gsTUFLYSxrQkFBa0I7SUFtQ25CO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTFDRCxTQUFTLENBQVM7SUFDbEIsS0FBSyxDQUFTO0lBQ2QsRUFBRSxDQUFnQjtJQUNsQixNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2QsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsTUFBTSxDQUFvQztJQUMxQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBRXBCLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBRXhDLElBQUksQ0FBYztJQUNsQixJQUFJLENBQW1CO0lBQ3ZCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsTUFBTSxD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QUFkLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBdXRoU2VydmljZSxcbiAgQmFzaWNVc2VyLFxuICBDTVNGaWVsZENvbmZpZyxcbiAgQ21zU2VydmljZSxcbiAgRmlsZVNlcnZpY2UsXG4gIEZvcm1zU2VydmljZSxcbiAgZnVsbEVtYWlsLFxuICBHcmFwaFFMTWV0YSxcbiAgR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICBHcmFwaFFMUmVxdWVzdFR5cGUsXG4gIEdyYXBoUUxTZXJ2aWNlLFxuICBHcmFwaFFMVHlwZSxcbiAgSUdyYXBoUUxUeXBlQ29sbGVjdGlvbixcbiAgVG9hc3RTZXJ2aWNlLFxuICBUb2FzdFR5cGUsXG59IGZyb20gJ0BsZW5uZS50ZWNoL25nLWJhc2Uvc2hhcmVkJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi9mYWItYnV0dG9uL2ZhYi1idXR0b24uY29tcG9uZW50JztcblxuLyoqXG4gKiBNb2RlbEZvcm1Db21wb25lbnRcbiAqXG4gKiBIaW50IGZvciBoYW5kbGluZyBleHRlbnNpb25zIG9mIHRoaXMgY29tcG9uZW50IGluIHByb2plY3Q6XG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgY29tcGxldGUgY3VzdG9tIHNlcnZpY2VzIGFuZCBtZXRob2RzLCBleHRlbmQgTW9kZWxGb3JtQmFzZUNvbXBvbmVudCBpbnN0ZWFkIG9mIE1vZGVsRm9ybUNvbXBvbmVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdiYXNlLW1vZGVsLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9kZWwtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21vZGVsLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9kZWxGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBtb2RlbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgaWQ6IHN0cmluZyB8IG51bGw7XG4gIEBJbnB1dCgpIGRlbGV0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIG9ubHlVcGRhdGVNb2RlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGR1cGxpY2F0ZSA9IGZhbHNlO1xuICBASW5wdXQoKSBsb2dnaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBDTVNGaWVsZENvbmZpZyB9O1xuICBASW5wdXQoKSBzaG93RmF2QnV0dG9uID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgZmluaXNoZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgbWV0YTogR3JhcGhRTE1ldGE7XG4gIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIF9sb2FkaW5nID0gZmFsc2U7XG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgR3JhcGhRTFR5cGU+O1xuICBvcGVyYXRpb246IHN0cmluZztcbiAga2V5czogc3RyaW5nW10gPSBbXTtcbiAgdXNlcjogQmFzaWNVc2VyO1xuICBvYmplY3Q6IGFueTtcbiAgZmFiQnV0dG9uczogQnV0dG9uW10gPSBbXTtcbiAgZmlsZUNoYW5nZXM6IFt7IGZpZWxkOiBzdHJpbmc7IGZpbGU6IEZpbGUgfCBudWxsIH1dO1xuXG4gIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmcgPSB2YWx1ZTtcbiAgICAgIH0sIDQwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdyYXBoUUxNZXRhU2VydmljZTogR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JhcGhRTFNlcnZpY2U6IEdyYXBoUUxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybXNTZXJ2aWNlOiBGb3Jtc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGNtc1NlcnZpY2U6IENtc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIGZpbGVTZXJ2aWNlOiBGaWxlU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gU2V0IHVzZXIgZm9yIHJvbGVzIGNoZWNrXG4gICAgdGhpcy51c2VyID0gQmFzaWNVc2VyLm1hcCh0aGlzLmF1dGhTZXJ2aWNlLmN1cnJlbnRVc2VyKTtcblxuICAgIHRoaXMuZ3JhcGhRTE1ldGFTZXJ2aWNlLmdldE1ldGEoKS5zdWJzY3JpYmUoKG1ldGEpID0+IHtcbiAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgIGlmICh0aGlzLm1vZGVsTmFtZSkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuaW5pdEZhYkFjdGlvbnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyBSZWluaXQgZm9ybSBmb3IgbmV3IG1vZGVsIG9yIGxvYWQgYW5kIHBhdGNoIGZvcm0gd2l0aCBuZXcgaWRcbiAgICBpZiAoY2hhbmdlc1snbW9kZWxOYW1lJ10gfHwgY2hhbmdlc1snaWQnXSkge1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqID4gSWYgdGhlIG1vZGVsIG5hbWUgYW5kIG1ldGFkYXRhIGFyZSBwcmVzZW50LCBzZXQgdGhlIG9wZXJhdGlvbiB0byB1cGRhdGUgb3IgY3JlYXRlLCBnZXQgdGhlIGZpZWxkcyBmcm9tIHRoZVxuICAgKiBtZXRhZGF0YSwgY3JlYXRlIHRoZSBmb3JtLCBhbmQgaWYgdGhlIHZhbHVlIGlzIHByZXNlbnQsIHBhdGNoIHRoZSBmb3JtIHdpdGggdGhlIHZhbHVlXG4gICAqL1xuICBpbml0KGlkPzogc3RyaW5nKSB7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmlkID0gaWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlkICYmIHRoaXMub25seVVwZGF0ZU1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbE5hbWUgJiYgdGhpcy5tZXRhKSB7XG4gICAgICB0aGlzLm9wZXJhdGlvbiA9IHRoaXMuaWQgPyAndXBkYXRlJyA6ICdjcmVhdGUnO1xuXG4gICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmluaXQtPm9wZXJhdGlvbicsIHRoaXMub3BlcmF0aW9uKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgJ01vZGVsRm9ybUNvbXBvbmVudDo6aW5pdC0+bWV0YS5nZXRBcmdzJyxcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbiArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMubW9kZWxOYW1lKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpZWxkcyA9IHRoaXMubWV0YS5nZXRBcmdzKHRoaXMub3BlcmF0aW9uICsgdGhpcy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodGhpcy5tb2RlbE5hbWUpLCB7XG4gICAgICAgIHR5cGU6IEdyYXBoUUxSZXF1ZXN0VHlwZS5NVVRBVElPTixcbiAgICAgIH0pLmZpZWxkcztcbiAgICAgIHRoaXMuZmllbGRzID0gdGhpcy5maWVsZHNbJ2lucHV0J10uZmllbGRzIGFzIGFueTtcbiAgICAgIHRoaXMua2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZmllbGRzKTtcblxuICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50Ojppbml0LT5pZCcsIHRoaXMuaWQpO1xuICAgICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50Ojppbml0LT5maWVsZHMnLCB0aGlzLmZpZWxkcyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmluaXQtPmtleXMnLCB0aGlzLmtleXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZvcm0gPSB0aGlzLmNyZWF0ZUZvcm0odGhpcy5maWVsZHMpO1xuXG4gICAgICBpZiAodGhpcy5pZCkge1xuICAgICAgICB0aGlzLmdldE9iamVjdEJ5SWQodGhpcy5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0IHRha2VzIGEga2V5IGFzIGFuIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBrZXlzIGZyb20gdGhlIHN1Yi1vYmplY3RcbiAgICovXG4gIGdldEtleXNGcm9tU3ViT2JqZWN0KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmllbGRzW2tleV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHRha2VzIGFuIGlkLCBhbmQgdGhlbiBjYWxscyB0aGUgZ3JhcGhRTFNlcnZpY2UgdG8gZ2V0IHRoZSBvYmplY3QgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBvYmplY3QgdG8gYmUgbG9hZGVkXG4gICAqL1xuICBnZXRPYmplY3RCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6Z2V0T2JqZWN0QnlJZC0+aWQnLCBpZCk7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50OjpnZXRPYmplY3RCeUlkLT5yZXF1ZXN0RmllbGRzJywgdGhpcy5jcmVhdGVSZXF1ZXN0T2JqZWN0KHRoaXMuZmllbGRzKSk7XG4gICAgfVxuXG4gICAgdGhpcy5ncmFwaFFMU2VydmljZVxuICAgICAgLmdyYXBoUWwoJ2dldCcgKyB0aGlzLmNhcGl0YWxpemVGaXJzdExldHRlcih0aGlzLm1vZGVsTmFtZSksIHtcbiAgICAgICAgYXJndW1lbnRzOiB7IGlkIH0sXG4gICAgICAgIGZpZWxkczogdGhpcy5jcmVhdGVSZXF1ZXN0T2JqZWN0KHRoaXMuZmllbGRzKSxcbiAgICAgICAgdHlwZTogR3JhcGhRTFJlcXVlc3RUeXBlLlFVRVJZLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50OjpnZXQtPnZhbHVlJywgcmVzcG9uc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMub2JqZWN0ID0gcmVzcG9uc2U7XG4gICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyAuLi57fSwgLi4ucmVzcG9uc2UgfSk7XG5cbiAgICAgICAgICAvLyBQcm9jZXNzIHBhdGNoRmllbGRzIGZvciByZWZlcmVuY2UgaW5wdXRcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpZWxkcykpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmZpZWxkcyk/LnR5cGUgPT09ICdEYXRlVGltZScgfHxcbiAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmNvbmZpZyk/LnR5cGUgPT09ICdEYXRlVGltZSdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KGtleSkucGF0Y2hWYWx1ZSh0aGlzLmZvcm1hdERhdGUodGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCByZXNwb25zZSkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgaXQgbm90IGFuIGFycmF5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy50eXBlID09PSAnUmVmZXJlbmNlJyAmJlxuICAgICAgICAgICAgICAhdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmZpZWxkcyk/LmlzTGlzdFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uZ2V0KGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1cbiAgICAgICAgICAgICAgICAgIC5nZXQoa2V5KVxuICAgICAgICAgICAgICAgICAgLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlW1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy5wYXRjaEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy5wYXRjaEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGtleVxuICAgICAgICAgICAgICAgICAgICBdPy5pZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB2YWx1ZSBpcyBhbiBhcnJheVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuY29uZmlnKT8udHlwZSA9PT0gJ1JlZmVyZW5jZScgJiZcbiAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLmZpZWxkcyk/LmlzTGlzdFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uZ2V0KGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1cbiAgICAgICAgICAgICAgICAgIC5nZXQoa2V5KVxuICAgICAgICAgICAgICAgICAgLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlW1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy5wYXRjaEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy5wYXRjaEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGtleVxuICAgICAgICAgICAgICAgICAgICBdPy5tYXAoKGUpID0+IGU/LmlkKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmdldE9iamVjdEJ5SWQtPnBhdGNoZWRGb3JtJywgdGhpcy5mb3JtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb24gbG9hZCBvYmplY3QnLCBlcnIpO1xuICAgICAgICAgIHRoaXMuZmluaXNoZWQuZW1pdChudWxsKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHRha2VzIGEgR3JhcGhRTCB0eXBlIGNvbGxlY3Rpb24gYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBhbmQgb2JqZWN0c1xuICAgKlxuICAgKiBAcGFyYW0gZmllbGRzIC0gSUdyYXBoUUxUeXBlQ29sbGVjdGlvbiAtIFRoaXMgaXMgdGhlIG9iamVjdCB0aGF0IGlzIHJldHVybmVkIGZyb20gdGhlXG4gICAqIGludHJvc3BlY3Rpb24gcXVlcnkuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MgYW5kIG9iamVjdHMuXG4gICAqL1xuICBjcmVhdGVSZXF1ZXN0T2JqZWN0KGZpZWxkczogSUdyYXBoUUxUeXBlQ29sbGVjdGlvbikge1xuICAgIGNvbnN0IHJlcXVlc3RGaWVsZHM6IGFueSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmllbGRzKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnW2tleV0/LmV4Y2x1ZGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbmZpZ1trZXldPy5leGNsdWRlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoZmllbGRzW2tleV0/LmZpZWxkcyk/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWdba2V5XT8udHlwZSAhPT0gJ1JlZmVyZW5jZScpIHtcbiAgICAgICAgICByZXF1ZXN0RmllbGRzLnB1c2goa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXF1ZXN0RmllbGRzLnB1c2goeyBbdGhpcy5jb25maWdba2V5XT8ucGF0Y2hGaWVsZCA/IHRoaXMuY29uZmlnW2tleV0/LnBhdGNoRmllbGQgOiBrZXldOiBbJ2lkJ10gfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN1YmtleXMgPSB0aGlzLmNyZWF0ZVJlcXVlc3RPYmplY3QoZmllbGRzW2tleV0uZmllbGRzIGFzIElHcmFwaFFMVHlwZUNvbGxlY3Rpb24pO1xuICAgICAgICBjb25zdCByZXN1bHRPYmplY3QgPSB7fTtcbiAgICAgICAgcmVzdWx0T2JqZWN0W2tleV0gPSBzdWJrZXlzO1xuICAgICAgICByZXF1ZXN0RmllbGRzLnB1c2gocmVzdWx0T2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50OjpjcmVhdGVSZXF1ZXN0T2JqZWN0LT5yZXF1ZXN0RmllbGRzJywgcmVxdWVzdEZpZWxkcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RGaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogSXQgdGFrZXMgYSBjb2xsZWN0aW9uIG9mIEdyYXBoUUwgdHlwZXMgYW5kIGNyZWF0ZXMgYSBmb3JtIGdyb3VwIHdpdGggYSBmb3JtIGNvbnRyb2wgZm9yIGVhY2ggdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gZmllbGRzIC0gSUdyYXBoUUxUeXBlQ29sbGVjdGlvblxuICAgKiBAcGFyYW0gcGFyZW50c1xuICAgKi9cbiAgY3JlYXRlRm9ybShmaWVsZHM6IElHcmFwaFFMVHlwZUNvbGxlY3Rpb24sIHBhcmVudHM6IGFueVtdID0gW10pIHtcbiAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgbGV0IGludGVyblBhcmVudHMgPSBbLi4uW10sIC4uLnBhcmVudHNdO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmllbGRzKSkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlPy5maWVsZHMpPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZ3JvdXBba2V5XSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB0aGlzLnByb2Nlc3NWYWxpZGF0b3JzKFxuICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3QoaW50ZXJuUGFyZW50cy5sZW5ndGggPyBpbnRlcm5QYXJlbnRzLmpvaW4oJy4nKSArICcuJyArIGtleSA6IGtleSwgdGhpcy5jb25maWcpLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5QYXJlbnRzLnB1c2goa2V5KTtcbiAgICAgICAgZ3JvdXBba2V5XSA9IHRoaXMuY3JlYXRlRm9ybShmaWVsZHNba2V5XS5maWVsZHMgYXMgSUdyYXBoUUxUeXBlQ29sbGVjdGlvbiwgaW50ZXJuUGFyZW50cyk7XG4gICAgICAgIGludGVyblBhcmVudHMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50OjpjcmVhdGVGb3JtLT5ncm91cCcsIGdyb3VwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFVudHlwZWRGb3JtR3JvdXAoZ3JvdXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgZm9ybSB2YWxpZGF0b3JzIGZvciBjb250cm9sXG4gICAqL1xuICBwcm9jZXNzVmFsaWRhdG9ycyhjb25maWc6IGFueSwgdmFsdWU6IElHcmFwaFFMVHlwZUNvbGxlY3Rpb24gfCBHcmFwaFFMVHlwZSkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcblxuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGlmIChjb25maWc/LnJlcXVpcmVkICE9PSB1bmRlZmluZWQgPyBjb25maWc/LnJlcXVpcmVkIDogdmFsdWUuaXNSZXF1aXJlZCkge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWc/LnR5cGUgPT09ICdFbWFpbCcpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKGZ1bGxFbWFpbCgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZz8udHlwZSA9PT0gJ1Bhc3N3b3JkJykge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoNikpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZz8ubWluID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4oY29uZmlnLm1pbikpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZz8ubWF4ID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXgoY29uZmlnLm1heCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWc/LnZhbGlkYXRvcnMpKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCguLi5jb25maWc/LnZhbGlkYXRvcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IGNhbGxzIHRoZSBncmFwaFFMU2VydmljZSB0byBkZWxldGUgdGhlIG9iamVjdCB3aXRoIHRoZSBpZCBvZiB0aGUgb2JqZWN0IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGVkaXRlZFxuICAgKi9cbiAgZGVsZXRlT2JqZWN0KCkge1xuICAgIHRoaXMuY21zU2VydmljZS5kZWxldGVPYmplY3QodGhpcy5pZCwgdGhpcy5tb2RlbE5hbWUpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgIGlkOiB0aGlzLm1vZGVsTmFtZSArICctc3VjY2VzcycsXG4gICAgICAgIHR5cGU6IFRvYXN0VHlwZS5TVUNDRVNTLFxuICAgICAgICB0aXRsZTogJ0VyZm9sZ3JlaWNoJyxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMubGFiZWwgKyAnIHd1cmRlIGVyZm9sZ3JlaWNoIGdlbMO2c2NodC4nLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbmlzaGVkLmVtaXQobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgc2VuZHMgYSBHcmFwaFFMIG11dGF0aW9uIHRvIHRoZSBzZXJ2ZXIgdG8gZHVwbGljYXRlIHRoZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGR1cGxpY2F0ZU9iamVjdCgpIHtcbiAgICB0aGlzLmNtc1NlcnZpY2UuZHVwbGljYXRlT2JqZWN0KHRoaXMuaWQsIHRoaXMubW9kZWxOYW1lKS50aGVuKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlPy5pZCkge1xuICAgICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uLyddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgIGlkOiB0aGlzLm1vZGVsTmFtZSArICctc3VjY2VzcycsXG4gICAgICAgICAgdHlwZTogVG9hc3RUeXBlLlNVQ0NFU1MsXG4gICAgICAgICAgdGl0bGU6ICdFcmZvbGdyZWljaCcsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMubGFiZWwgKyAnIHd1cmRlIGVyZm9sZ3JlaWNoIGR1cGxpemllcnQuJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbmlzaGVkLmVtaXQobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgdGFrZXMgYSBzdHJpbmcsIGNhcGl0YWxpemVzIHRoZSBmaXJzdCBsZXR0ZXIsIGFuZCByZXR1cm5zIHRoZSBtb2RpZmllZCBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgKiBAcmV0dXJucyBUaGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBzdHJpbmcgaXMgYmVpbmcgY2FwaXRhbGl6ZWQgYW5kIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgaXMgYmVpbmcgcmV0dXJuZWQuXG4gICAqL1xuICBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNtc1NlcnZpY2UuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyBhbiBBYnN0cmFjdENvbnRyb2wgYW5kIHJldHVybnMgYSBGb3JtQ29udHJvbFxuICAgKlxuICAgKiBAcGFyYW0gY29udHJvbCAtIEFic3RyYWN0Q29udHJvbCB8IG51bGwgfCB1bmRlZmluZWRcbiAgICogQHJldHVybnMgQSBGb3JtQ29udHJvbFxuICAgKi9cbiAgdHJhbnNmb3JtVG9Db250cm9sKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29udHJvbCBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICAvKipcbiAgICogSXQgdGFrZXMgdGhlIGtleSBvZiB0aGUgZm9ybSBjb250cm9sIHRoYXQgaGFzIGNoYW5nZWQsIGdldHMgdGhlIHZhbHVlIG9mIHRoYXQgZm9ybSBjb250cm9sLCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgKiBrZXkgYW5kIHZhbHVlLCBhbmQgdGhlbiBzZW5kcyB0aGF0IG9iamVjdCB0byB0aGUgR3JhcGhRTCBzZXJ2ZXIgdG8gdXBkYXRlIHRoZSBkYXRhYmFzZVxuICAgKi9cbiAgaW1hZ2VDaGFuZ2VkKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIGRhdGFba2V5XSA9IHRoaXMuZm9ybS5nZXQoa2V5KS52YWx1ZTtcblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmltYWdlQ2hhbmdlZC0+Ym9keScsIGRhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmdyYXBoUUxTZXJ2aWNlXG4gICAgICAgICAgLmdyYXBoUWwoJ3VwZGF0ZScgKyB0aGlzLmNhcGl0YWxpemVGaXJzdExldHRlcih0aGlzLm1vZGVsTmFtZSksIHtcbiAgICAgICAgICAgIGFyZ3VtZW50czogeyBpZDogdGhpcy5pZCwgaW5wdXQ6IGRhdGEgfSxcbiAgICAgICAgICAgIGZpZWxkczogWydpZCddLFxuICAgICAgICAgICAgdHlwZTogR3JhcGhRTFJlcXVlc3RUeXBlLk1VVEFUSU9OLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmltYWdlQ2hhbmdlZC0+c3VjY2VzcycsIHZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OmltYWdlQ2hhbmdlZC0+ZXJyb3InLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyB0aGUgZm9ybSwgdmFsaWRhdGVzIGl0LCBhbmQgdGhlbiBzZW5kcyBpdCB0byB0aGUgR3JhcGhRTCBzZXJ2ZXJcbiAgICpcbiAgICogQHJldHVybnMgVGhlIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIG9yIHVwZGF0ZWQgb2JqZWN0LlxuICAgKi9cbiAgc3VibWl0KHNlY3JldCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghc2VjcmV0KSB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCAmJiAhc2VjcmV0KSB7XG4gICAgICAgIHRoaXMuZm9ybXNTZXJ2aWNlLnZhbGlkYXRlQWxsRm9ybUZpZWxkcyh0aGlzLmZvcm0gYXMgYW55KTtcbiAgICAgICAgdGhpcy5mb3Jtc1NlcnZpY2Uuc2Nyb2xsVG9JbnZhbGlkQ29udHJvbCh0aGlzLmZvcm0pO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcGVyYXRpb24gPT09ICd1cGRhdGUnICYmICF0aGlzLmlkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0lEIGlzIG1pc3NpbmcgZm9yIHVwZGF0ZSEnKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICBjb25zb2xlLmxvZygnTW9kZWxGb3JtQ29tcG9uZW50OjpzdWJtaXQtPmZvcm1WYWx1ZScsIHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXBhcmUgZGF0YSBmb3Igc2VydmVyIHJlcXVlc3RcbiAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5mb3JtLnZhbHVlKTtcbiAgICAgIGRhdGEgPSB0aGlzLnByZXBhcmVEYXRhRm9yUmVxdWVzdCh0aGlzLmNvbmZpZywgdGhpcy5maWVsZHMsIGRhdGEpO1xuXG4gICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbEZvcm1Db21wb25lbnQ6OnN1Ym1pdC0+dmFsdWVUb0dyYXBocWwnLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5sb2coJ01vZGVsRm9ybUNvbXBvbmVudDo6c3VibWl0LT5maWxlQ2hhbmdlcycsIHRoaXMuZmlsZUNoYW5nZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5maWxlQ2hhbmdlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZUNoYW5nZSBvZiB0aGlzLmZpbGVDaGFuZ2VzKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gZmlsZUNoYW5nZS5maWVsZDtcbiAgICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuY29uZmlnKTtcblxuICAgICAgICAgIGlmIChmaWxlQ2hhbmdlLmZpbGUpIHtcbiAgICAgICAgICAgIC8vIFVwbG9hZFxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGtleSkudmFsdWU7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGZpbGUgaXMgYW4gSUQgb3IgYSBiYXNlNjQgc3RyaW5nXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAvLyBEZWxldGUgaWYgSURcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm0uZ2V0KGtleSkudmFsdWU/LnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxldGVSZXN1bHQgPSBhd2FpdCB0aGlzLmZpbGVTZXJ2aWNlLmRlbGV0ZShcbiAgICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy51cmwsXG4gICAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuY29uZmlnKT8uZGVsZXRlUGF0aCB8fCAnL2ZpbGVzLycsXG4gICAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMub2JqZWN0KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVsZXRlUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIGRhdGEsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCB1cGxvYWRSZXN1bHQgPSBhd2FpdCB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZChcbiAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuY29uZmlnKT8udXJsLFxuICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgdGhpcy5jb25maWcpPy51cGxvYWRQYXRoIHx8ICcvZmlsZXMvdXBsb2FkJyxcbiAgICAgICAgICAgICAgICBmaWxlQ2hhbmdlLmZpbGVcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAodXBsb2FkUmVzdWx0Py5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkT2JqZWN0KGtleSwgZGF0YSwgdXBsb2FkUmVzdWx0LmlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWc/LmltYWdlTW9kZSAmJiBjb25maWc/LmltYWdlTW9kZSAhPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICAgIC8vIERlbGV0ZVxuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZpbGVTZXJ2aWNlLmRlbGV0ZShcbiAgICAgICAgICAgICAgICBjb25maWc/LnVybCxcbiAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZE9iamVjdChrZXksIHRoaXMuY29uZmlnKT8uZGVsZXRlUGF0aCB8fCAnL2ZpbGVzLycsXG4gICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCB0aGlzLm9iamVjdClcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRPYmplY3Qoa2V5LCBkYXRhLCAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5ncmFwaFFMU2VydmljZVxuICAgICAgICAuZ3JhcGhRbCh0aGlzLm9wZXJhdGlvbiArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMubW9kZWxOYW1lKSwge1xuICAgICAgICAgIGFyZ3VtZW50czogdGhpcy5vcGVyYXRpb24gPT09ICd1cGRhdGUnID8geyBpZDogdGhpcy5pZCwgaW5wdXQ6IGRhdGEgfSA6IHsgaW5wdXQ6IGRhdGEgfSxcbiAgICAgICAgICBmaWVsZHM6IFsnaWQnXSxcbiAgICAgICAgICB0eXBlOiBHcmFwaFFMUmVxdWVzdFR5cGUuTVVUQVRJT04sXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoZWQuZW1pdChudWxsKTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy1zdWNjZXNzJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuU1VDQ0VTUyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0VyZm9sZ3JlaWNoJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWwgKyAnIHd1cmRlIGVyZm9sZ3JlaWNoICcgKyAodGhpcy5vcGVyYXRpb24gPT09ICdjcmVhdGUnID8gJ2Vyc3RlbGx0LicgOiAnYWt0dWFsaXNpZXJ0LicpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIG9uICcgKyB0aGlzLm9wZXJhdGlvbiwgZXJyKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy1zdWNjZXNzJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuRVJST1IsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAnQmVpbSAnICtcbiAgICAgICAgICAgICAgICAgICh0aGlzLm9wZXJhdGlvbiA9PT0gJ2NyZWF0ZScgPyAnZXJzdGVsbGVuJyA6ICdha3R1YWxpc2llcmVuJykgK1xuICAgICAgICAgICAgICAgICAgJyB2b24gJyArXG4gICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsICtcbiAgICAgICAgICAgICAgICAgICcgaXN0IGV0d2FzIHNjaGllZmdlbGF1ZmVuLicsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRhdGEgZm9yIHNlcnZlclxuICAgKi9cbiAgcHJlcGFyZURhdGFGb3JSZXF1ZXN0KGNvbmZpZywgZmllbGRzQ29uZmlnLCBkYXRhKSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgaWYgKCh0aGlzLmZpZWxkc1trZXldPy50eXBlID09PSAnRGF0ZVRpbWUnIHx8IHRoaXMuY29uZmlnW2tleV0/LnR5cGUgPT09ICdEYXRlVGltZScpICYmIHZhbHVlID09PSAnJykge1xuICAgICAgICBkYXRhW2tleV0gPSBudWxsO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChjb25maWdba2V5XT8ucm9sZXMgPyAhdGhpcy51c2VyLmhhc0FsbFJvbGVzKGNvbmZpZ1trZXldPy5yb2xlcykgOiBmYWxzZSkgfHwgY29uZmlnW2tleV0/LmV4Y2x1ZGUpIHtcbiAgICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB0aGlzLmZpZWxkc1trZXldPy50eXBlICE9PSAnVXBsb2FkJykge1xuICAgICAgICBkYXRhW2tleV0gPSBPYmplY3Qua2V5cyhkYXRhW2tleV0pXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gZGF0YVtrZXldW2tdICE9IG51bGwpXG4gICAgICAgICAgLnJlZHVjZSgoYSwgaykgPT4gKHsgLi4uYSwgW2tdOiBkYXRhW2tleV1ba10gfSksIHt9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YVtrZXldKT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ09iamVjdCBpcyBlbXB0eSBmcm9tIHJlc3VsdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhW2tleV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0eXBlIGZvciBncmFwaHFsIG1ldGhvZFxuICAgICAgaWYgKGZpZWxkc0NvbmZpZ1trZXldPy50eXBlID09PSAnRmxvYXQnKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGRhdGFba2V5XSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YVtrZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGRzQ29uZmlnW2tleV0/LmZpZWxkcyAmJiBPYmplY3Qua2V5cyhmaWVsZHNDb25maWdba2V5XT8uZmllbGRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRhdGFba2V5XSA9IHRoaXMucHJlcGFyZURhdGFGb3JSZXF1ZXN0KGNvbmZpZ1trZXldPy5maWVsZHMsIGZpZWxkc0NvbmZpZ1trZXldPy5maWVsZHMsIGRhdGFba2V5XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogSW5pdCBmYWIgYnV0dG9ucyBmb3IgbW9iaWxlIGRldmljZXNcbiAgICovXG4gIGluaXRGYWJBY3Rpb25zKCkge1xuICAgIGNvbnN0IHNhdmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICB0aGlzLmZhYkJ1dHRvbnMucHVzaCh7IGljb246ICdiaS1jaGVjay1sZycsIGNvbG9yOiAndmFyKC0tYnMtc3VjY2VzcyknLCBldmVudDogc2F2ZUV2ZW50IH0pO1xuICAgIHNhdmVFdmVudC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zdWJtaXQoZmFsc2UpKTtcblxuICAgIGlmICh0aGlzLmR1cGxpY2F0ZSAmJiB0aGlzLm9wZXJhdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgICAgdGhpcy5mYWJCdXR0b25zLnB1c2goeyBpY29uOiAnYmktYmFjaycsIGNvbG9yOiAndmFyKC0tYnMtaW5mbyknLCBldmVudCB9KTtcbiAgICAgIGV2ZW50LnN1YnNjcmliZSgoKSA9PiB0aGlzLmR1cGxpY2F0ZU9iamVjdCgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcGVyYXRpb24gPT09ICd1cGRhdGUnICYmIHRoaXMuZGVsZXRlKSB7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICAgIHRoaXMuZmFiQnV0dG9ucy5wdXNoKHsgaWNvbjogJ2JpLXRyYXNoMycsIGNvbG9yOiAndmFyKC0tYnMtZGFuZ2VyKScsIGV2ZW50IH0pO1xuICAgICAgZXZlbnQuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGVsZXRlT2JqZWN0KCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmlsZSBjaGFuZ2VzIGZvciBwcm9jZXNzXG4gICAqL1xuICBwcm9jZXNzRmlsZUNoYW5nZXMoZXZlbnQ6IHsgZmllbGQ6IHN0cmluZzsgZmlsZTogRmlsZSB8IG51bGw7IGJhc2U2NDogc3RyaW5nIHwgbnVsbCB9KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbGVDaGFuZ2VzPy5maW5kSW5kZXgoKGUpID0+IGUuZmllbGQgPT09IGV2ZW50LmZpZWxkKTtcblxuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5maWxlQ2hhbmdlc1tpbmRleF0gPSBldmVudDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmlsZUNoYW5nZXMpIHtcbiAgICAgIHRoaXMuZmlsZUNoYW5nZXMucHVzaChldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsZUNoYW5nZXMgPSBbZXZlbnRdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkYXRlKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIHJldHVybiBuZXdEYXRlLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDE2KTtcbiAgfVxuXG4gIHByaXZhdGUgbmVzdGVkT2JqZWN0KGtleTogc3RyaW5nLCBuZXN0ZWRPYmplY3Q6IGFueSwgdmFsdWU/OiBhbnkpIHtcbiAgICBjb25zdCBwcm9wcyA9IGtleS5zcGxpdCgnLicpO1xuICAgIGxldCByZXN1bHQ6IGFueSA9IG5lc3RlZE9iamVjdDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWx1ZSAmJiBpID09PSBwcm9wcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wc1tpXV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFtwcm9wc1tpXV07XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHJlc3VsdFtwcm9wc1tpXV0/LmZpZWxkcyAmJiBPYmplY3Qua2V5cyhyZXN1bHRbcHJvcHNbaV1dPy5maWVsZHMpPy5sZW5ndGggPiAwXG4gICAgICAgICAgPyByZXN1bHRbcHJvcHNbaV1dPy5maWVsZHNcbiAgICAgICAgICA6IHJlc3VsdFtwcm9wc1tpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInctMTAwXCIgKm5nSWY9XCJmb3JtXCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJyZXNwb25zaXZlLWJhY2sgZC1mbGV4IGQtbGctbm9uZVwiPlxuICAgICAgPGkgY2xhc3M9XCJiaSBiaS1hcnJvdy1sZWZ0XCIgcm91dGVyTGluaz1cIi4uL1wiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8aDIgY2xhc3M9XCJtYi0wXCI+XG4gICAgICB7eyBsYWJlbCA/IGxhYmVsIDogY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG1vZGVsTmFtZSkgfX0ge3sgb3BlcmF0aW9uID09PSAndXBkYXRlJyA/ICdiZWFyYmVpdGVuJyA6ICdlcnN0ZWxsZW4nIH19XG4gICAgPC9oMj5cblxuICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUgZC1sZy1mbGV4IGZsZXgtcm93IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWUtMlwiICpuZ0lmPVwiaWQgJiYgZHVwbGljYXRlICYmICFfbG9hZGluZ1wiIChjbGljayk9XCJkdXBsaWNhdGVPYmplY3QoKVwiPlxuICAgICAgICBEdXBsaXppZXJlblxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhZm9ybS50b3VjaGVkICYmICFmb3JtLmRpcnR5XCJcbiAgICAgICAgKGNsaWNrKT1cInN1Ym1pdChmYWxzZSlcIlxuICAgICAgICAqbmdJZj1cIiFfbG9hZGluZ1wiXG4gICAgICA+XG4gICAgICAgIHt7IG9wZXJhdGlvbiA9PT0gJ2NyZWF0ZScgPyAnRXJzdGVsbGVuJyA6ICdTcGVpY2hlcm4nIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgZGlzYWJsZWQgKm5nSWY9XCJfbG9hZGluZ1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAge3sgb3BlcmF0aW9uID09PSAnY3JlYXRlJyA/ICdFcnN0ZWxsZW4nIDogJ1NwZWljaGVybicgfX0uLi5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8YmFzZS1tb2RlbC1mb3JtLXN1YlxuICAgICAgW2lkXT1cImlkXCJcbiAgICAgIFtmaWVsZHNdPVwiZmllbGRzXCJcbiAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgKGltYWdlQ2hhbmdlZCk9XCJpbWFnZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAoZmlsZUNoYW5nZWQpPVwicHJvY2Vzc0ZpbGVDaGFuZ2VzKCRldmVudClcIlxuICAgID48L2Jhc2UtbW9kZWwtZm9ybS1zdWI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZC1ub25lIGQtbGctZmxleCBtdC00XCIgW25nQ2xhc3NdPVwiaWQgJiYgZGVsZXRlID8gJ2p1c3RpZnktY29udGVudC1iZXR3ZWVuJyA6ICdqdXN0aWZ5LWNvbnRlbnQtZW5kJ1wiPlxuICAgICAgPGRpdiAqbmdJZj1cImlkICYmIGRlbGV0ZVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZU9iamVjdCgpXCI+TMO2c2NoZW48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWZvcm0udG91Y2hlZCAmJiAhZm9ybS5kaXJ0eVwiXG4gICAgICAgICAgKGNsaWNrKT1cInN1Ym1pdChmYWxzZSlcIlxuICAgICAgICAgICpuZ0lmPVwiIV9sb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IG9wZXJhdGlvbiA9PT0gJ2NyZWF0ZScgPyAnRXJzdGVsbGVuJyA6ICdTcGVpY2hlcm4nIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGRpc2FibGVkICpuZ0lmPVwiX2xvYWRpbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICB7eyBvcGVyYXRpb24gPT09ICdjcmVhdGUnID8gJ0Vyc3RlbGxlbicgOiAnU3BlaWNoZXJuJyB9fS4uLlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImQtYmxvY2sgZC1sZy1ub25lIHJlc3BvbnNpdmUtYWN0aW9uLWJ1dHRvblwiICpuZ0lmPVwic2hvd0ZhdkJ1dHRvblwiPlxuICA8YmFzZS1mYWItYnV0dG9uIFtidXR0b25zXT1cImZhYkJ1dHRvbnNcIj48L2Jhc2UtZmFiLWJ1dHRvbj5cbjwvZGl2PlxuIl19
|