@lenne.tech/ng-base 15.0.0-beta-3 → 16.1.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 +92 -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 +421 -300
- package/fesm2022/lenne.tech-ng-base-base-components.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-prototype.mjs +127 -88
- package/fesm2022/lenne.tech-ng-base-base-prototype.mjs.map +1 -0
- 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 +153 -126
- 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 +4 -3
- 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-base-prototype.mjs.map +0 -1
- 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-components.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,345 @@
|
|
|
1
|
+
import { GraphQLEnumType, GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLScalarType, } from 'graphql';
|
|
2
|
+
import { Helper } from './helper.class';
|
|
3
|
+
import { GraphQLType } from './graphql-type.class';
|
|
4
|
+
/**
|
|
5
|
+
* GraphQL meta
|
|
6
|
+
*/
|
|
7
|
+
export class GraphQLMeta {
|
|
8
|
+
schema;
|
|
9
|
+
// Frozen caches
|
|
10
|
+
args = {};
|
|
11
|
+
fields = {};
|
|
12
|
+
/**
|
|
13
|
+
* Integrate schema
|
|
14
|
+
*/
|
|
15
|
+
constructor(schema) {
|
|
16
|
+
this.schema = schema;
|
|
17
|
+
if (!schema) {
|
|
18
|
+
throw Error('Missing schema');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get an object with GraphQLRequestType (operation type) as keys and method (fields) names as value
|
|
23
|
+
*/
|
|
24
|
+
getMethodNames() {
|
|
25
|
+
return {
|
|
26
|
+
query: Object.keys(this.schema.getQueryType()?.getFields() || {}),
|
|
27
|
+
mutation: Object.keys(this.schema.getMutationType()?.getFields() || {}),
|
|
28
|
+
subscription: Object.keys(this.schema.getSubscriptionType()?.getFields() || {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get GraphQLRequestTypes (operation types) via method (field) name
|
|
33
|
+
*/
|
|
34
|
+
getRequestTypesViaMethod(methodName) {
|
|
35
|
+
const result = [];
|
|
36
|
+
const methodNames = this.getMethodNames();
|
|
37
|
+
for (const [key, value] of Object.entries(methodNames)) {
|
|
38
|
+
if (value.includes(methodName)) {
|
|
39
|
+
result.push(key);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* We're going to get the query and mutation types from the schema, then we're going to loop through the fields of each
|
|
46
|
+
* type and check if the field name starts with `find`, `create`, `update`, or `delete`. If it does, we're going to add
|
|
47
|
+
* the model name to the `possibleTypes` array
|
|
48
|
+
*
|
|
49
|
+
* @returns An array of objects with the name of the model, and the CRUD operations that are available for that model.
|
|
50
|
+
*/
|
|
51
|
+
getTypes(logging = false) {
|
|
52
|
+
const possibleTypes = [];
|
|
53
|
+
const mutationType = this.schema.getMutationType();
|
|
54
|
+
const queryType = this.schema.getQueryType();
|
|
55
|
+
if (logging) {
|
|
56
|
+
console.log('GraphQLMeta::getTypes->queryTypeFields', queryType.getFields());
|
|
57
|
+
}
|
|
58
|
+
for (const [key, value] of Object.entries(queryType.getFields())) {
|
|
59
|
+
if (key.startsWith('find')) {
|
|
60
|
+
possibleTypes.push({
|
|
61
|
+
name: key.split('find').pop().slice(0, -1),
|
|
62
|
+
create: false,
|
|
63
|
+
update: false,
|
|
64
|
+
delete: false,
|
|
65
|
+
duplicate: false,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (logging) {
|
|
70
|
+
console.log('GraphQLMeta::getTypes->mutationTypeFields', mutationType.getFields());
|
|
71
|
+
console.log('GraphQLMeta::getTypes->possibleTypes', possibleTypes);
|
|
72
|
+
}
|
|
73
|
+
for (const [key, value] of Object.entries(mutationType.getFields())) {
|
|
74
|
+
if (key.startsWith('create')) {
|
|
75
|
+
const model = key.split('create').pop();
|
|
76
|
+
if (possibleTypes.find((e) => e.name === model)) {
|
|
77
|
+
possibleTypes.find((item) => item.name === model).create = true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (key.startsWith('update')) {
|
|
81
|
+
const model = key.split('update').pop();
|
|
82
|
+
if (possibleTypes.find((e) => e.name === model)) {
|
|
83
|
+
possibleTypes.find((item) => item.name === model).update = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (key.startsWith('delete')) {
|
|
87
|
+
const model = key.split('delete').pop();
|
|
88
|
+
if (possibleTypes.find((e) => e.name === model)) {
|
|
89
|
+
possibleTypes.find((item) => item.name === model).delete = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (key.startsWith('duplicate')) {
|
|
93
|
+
const model = key.split('duplicate').pop();
|
|
94
|
+
if (possibleTypes.find((e) => e.name === model)) {
|
|
95
|
+
possibleTypes.find((item) => item.name === model).duplicate = true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (logging) {
|
|
100
|
+
console.log('GraphQLMeta::getTypes->possibleTypes', possibleTypes);
|
|
101
|
+
console.log('GraphQLMeta::getTypes->filteredPossibleTypes', possibleTypes.filter((e) => e.create || e.update));
|
|
102
|
+
}
|
|
103
|
+
return possibleTypes.filter((e) => e.create || e.update);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get arguments of GraphQL function
|
|
107
|
+
*/
|
|
108
|
+
getArgs(functionName, options = {}) {
|
|
109
|
+
const { cache, freeze, type } = {
|
|
110
|
+
cache: true,
|
|
111
|
+
freeze: true,
|
|
112
|
+
type: undefined,
|
|
113
|
+
...options,
|
|
114
|
+
};
|
|
115
|
+
// Get cache
|
|
116
|
+
if (cache && freeze) {
|
|
117
|
+
const args = this.args[functionName + type];
|
|
118
|
+
if (args) {
|
|
119
|
+
return args;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const func = this.getFunction(functionName, { type });
|
|
123
|
+
const result = new GraphQLType();
|
|
124
|
+
if (func?.args) {
|
|
125
|
+
func.args.forEach((item) => {
|
|
126
|
+
result.fields[item.name] = this.getDeepType(item.type);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Set cache
|
|
130
|
+
if (freeze) {
|
|
131
|
+
this.args[functionName + type] = Helper.deepFreeze(result);
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get fields of GraphQL function
|
|
137
|
+
*/
|
|
138
|
+
getFields(functionName, options = {}) {
|
|
139
|
+
const { cache, freeze, type } = {
|
|
140
|
+
cache: true,
|
|
141
|
+
freeze: true,
|
|
142
|
+
type: undefined,
|
|
143
|
+
...options,
|
|
144
|
+
};
|
|
145
|
+
// Get cache
|
|
146
|
+
if (cache && freeze) {
|
|
147
|
+
const args = this.fields[functionName + type];
|
|
148
|
+
if (args) {
|
|
149
|
+
return args;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const func = this.getFunction(functionName, options);
|
|
153
|
+
const result = this.getDeepType(func.type);
|
|
154
|
+
// Set cache
|
|
155
|
+
if (freeze) {
|
|
156
|
+
this.fields[functionName + type] = Helper.deepFreeze(result);
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get GraphQL function
|
|
162
|
+
*/
|
|
163
|
+
getFunction(name, options = {}) {
|
|
164
|
+
// Set config
|
|
165
|
+
const config = {
|
|
166
|
+
...options,
|
|
167
|
+
};
|
|
168
|
+
// Init possible functions
|
|
169
|
+
let functions = {};
|
|
170
|
+
// If function type is set
|
|
171
|
+
if (config.type) {
|
|
172
|
+
const graphQLType = config.type.charAt(0).toUpperCase() + config.type.slice(1);
|
|
173
|
+
const type = this.schema.getType(graphQLType);
|
|
174
|
+
if (type) {
|
|
175
|
+
functions = type.getFields();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// If function type is not set
|
|
179
|
+
else {
|
|
180
|
+
['Subscription', 'Mutation', 'Query'].forEach((item) => {
|
|
181
|
+
const type = this.schema.getType(item);
|
|
182
|
+
if (type) {
|
|
183
|
+
functions = {
|
|
184
|
+
...functions,
|
|
185
|
+
...(type.getFields() || {}),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// Get function via name
|
|
191
|
+
return functions[name];
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get type
|
|
195
|
+
*/
|
|
196
|
+
getType(name) {
|
|
197
|
+
return this.schema.getType(name);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get (deep) type name
|
|
201
|
+
*/
|
|
202
|
+
getTypeName(type) {
|
|
203
|
+
if (type instanceof GraphQLInputObjectType ||
|
|
204
|
+
type instanceof GraphQLScalarType ||
|
|
205
|
+
type instanceof GraphQLEnumType) {
|
|
206
|
+
return type.name;
|
|
207
|
+
}
|
|
208
|
+
else if (type.type) {
|
|
209
|
+
return this.getTypeName(type.type);
|
|
210
|
+
}
|
|
211
|
+
else if (type.ofType) {
|
|
212
|
+
return this.getTypeName(type.ofType);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
return type.name;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get deep type data
|
|
220
|
+
*/
|
|
221
|
+
getDeepType(type, prepared = {}, setMetaData = false) {
|
|
222
|
+
// Check type
|
|
223
|
+
if (!type) {
|
|
224
|
+
return type;
|
|
225
|
+
}
|
|
226
|
+
// Infinite regress protection
|
|
227
|
+
const typeName = this.getTypeName(type);
|
|
228
|
+
const graphQLType = GraphQLType.map({
|
|
229
|
+
type: this.getTypeName(type),
|
|
230
|
+
});
|
|
231
|
+
// Check prepared
|
|
232
|
+
if (typeof type === 'object') {
|
|
233
|
+
const preparedType = prepared[typeName];
|
|
234
|
+
// Work with cached type
|
|
235
|
+
if (preparedType) {
|
|
236
|
+
// Create a new object to protect own isXXX information
|
|
237
|
+
const clone = Object.assign({}, preparedType);
|
|
238
|
+
// But use fields as reference to get future changes via prepared caching
|
|
239
|
+
clone.fields = preparedType.fields;
|
|
240
|
+
// Disable meta flags for sub objects
|
|
241
|
+
if (type?.type instanceof GraphQLInputObjectType ||
|
|
242
|
+
(type?.type instanceof GraphQLNonNull && type?.type?.ofType instanceof GraphQLInputObjectType && setMetaData)) {
|
|
243
|
+
setMetaData = false;
|
|
244
|
+
}
|
|
245
|
+
// Check for meta flags
|
|
246
|
+
if (type.type && setMetaData) {
|
|
247
|
+
if (type.type instanceof GraphQLNonNull) {
|
|
248
|
+
clone.isRequired = true;
|
|
249
|
+
if (type.type.ofType instanceof GraphQLList) {
|
|
250
|
+
clone.isList = true;
|
|
251
|
+
clone.isItemRequired = type.type.ofType.ofType instanceof GraphQLNonNull;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
clone.isList = false;
|
|
255
|
+
clone.isItemRequired = false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
clone.isRequired = false;
|
|
260
|
+
// List first
|
|
261
|
+
if (type.type instanceof GraphQLList) {
|
|
262
|
+
clone.isList = true;
|
|
263
|
+
clone.isItemRequired = type.ofType instanceof GraphQLNonNull;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
clone.isList = false;
|
|
267
|
+
clone.isItemRequired = false;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return clone;
|
|
272
|
+
}
|
|
273
|
+
// Set prepared cache for GraphQL types
|
|
274
|
+
// (type names start with uppercase letters as opposed to property names that start with lowercase letters)
|
|
275
|
+
if (type.name && type.name[0].toUpperCase() === type.name[0] && !prepared[type.name]) {
|
|
276
|
+
prepared[type.name] = graphQLType;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Search deeper
|
|
280
|
+
if (type.ofType) {
|
|
281
|
+
const ofTypeResult = this.getDeepType(type.ofType, prepared, setMetaData);
|
|
282
|
+
Object.assign(graphQLType, ofTypeResult);
|
|
283
|
+
return graphQLType;
|
|
284
|
+
}
|
|
285
|
+
// Process fields
|
|
286
|
+
if (type._fields) {
|
|
287
|
+
const fields = {};
|
|
288
|
+
for (const [key, value] of Object.entries(type._fields)) {
|
|
289
|
+
fields[key] = this.getDeepType(value, prepared, true);
|
|
290
|
+
}
|
|
291
|
+
// Assign and not replace to preserve updates in the cache
|
|
292
|
+
Object.assign(graphQLType.fields, fields);
|
|
293
|
+
return graphQLType;
|
|
294
|
+
}
|
|
295
|
+
// Process type
|
|
296
|
+
if (type.type) {
|
|
297
|
+
const typeResult = this.getDeepType(type.type, prepared, setMetaData);
|
|
298
|
+
// Disable meta flags for sub objects
|
|
299
|
+
if (type?.type instanceof GraphQLInputObjectType ||
|
|
300
|
+
(type?.type instanceof GraphQLNonNull && type?.type?.ofType instanceof GraphQLInputObjectType && setMetaData)) {
|
|
301
|
+
setMetaData = false;
|
|
302
|
+
}
|
|
303
|
+
// Check for meta flags
|
|
304
|
+
if (setMetaData) {
|
|
305
|
+
if (type.type instanceof GraphQLNonNull) {
|
|
306
|
+
typeResult.isRequired = true;
|
|
307
|
+
if (type.type.ofType instanceof GraphQLList) {
|
|
308
|
+
typeResult.isList = true;
|
|
309
|
+
typeResult.isItemRequired = type.type.ofType.ofType instanceof GraphQLNonNull;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
typeResult.isList = false;
|
|
313
|
+
typeResult.isItemRequired = false;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
typeResult.isRequired = false;
|
|
318
|
+
// List first
|
|
319
|
+
if (type.type instanceof GraphQLList) {
|
|
320
|
+
typeResult.isList = true;
|
|
321
|
+
typeResult.isItemRequired = type.ofType instanceof GraphQLNonNull;
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
typeResult.isList = false;
|
|
325
|
+
typeResult.isItemRequired = false;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
Object.assign(graphQLType, typeResult);
|
|
330
|
+
return graphQLType;
|
|
331
|
+
}
|
|
332
|
+
// Set enum values
|
|
333
|
+
if (!!type._values) {
|
|
334
|
+
graphQLType.isEnum = true;
|
|
335
|
+
for (const [key, value] of Object.entries(type._nameLookup)) {
|
|
336
|
+
if (!value.isDeprecated) {
|
|
337
|
+
graphQLType.validEnums.push(key);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Finish
|
|
342
|
+
return graphQLType;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC1tZXRhLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zaGFyZWQvY2xhc3Nlcy9ncmFwaHFsLW1ldGEuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsV0FBVyxFQUVYLGNBQWMsRUFDZCxpQkFBaUIsR0FFbEIsTUFBTSxTQUFTLENBQUM7QUFFakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUduRDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBUUE7SUFQdEIsZ0JBQWdCO0lBQ04sSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDL0IsTUFBTSxHQUF3QixFQUFFLENBQUM7SUFFM0M7O09BRUc7SUFDSCxZQUFzQixNQUFxQjtRQUFyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU87WUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNqRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN2RSxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ2hG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QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2xCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQzFCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDM0QsSUFBSSxDQUFFLEtBQWEsQ0FBQyxZQUFZLEVBQUU7b0JBQ2hDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNsQzthQUNGO1NBQ0Y7UUFFRCxTQUFTO1FBQ1QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JhcGhRTEVudW1UeXBlLFxuICBHcmFwaFFMSW5wdXRPYmplY3RUeXBlLFxuICBHcmFwaFFMTGlzdCxcbiAgR3JhcGhRTE5hbWVkVHlwZSxcbiAgR3JhcGhRTE5vbk51bGwsXG4gIEdyYXBoUUxTY2FsYXJUeXBlLFxuICBHcmFwaFFMU2NoZW1hLFxufSBmcm9tICdncmFwaHFsJztcbmltcG9ydCB7IEdyYXBoUUxSZXF1ZXN0VHlwZSB9IGZyb20gJy4uL2VudW1zL2dyYXBocWwtcmVxdWVzdC10eXBlLmVudW0nO1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnLi9oZWxwZXIuY2xhc3MnO1xuaW1wb3J0IHsgR3JhcGhRTFR5cGUgfSBmcm9tICcuL2dyYXBocWwtdHlwZS5jbGFzcyc7XG5pbXBvcnQgeyBHcmFwaHFsQ3J1ZFR5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBocWwtY3J1ZC10eXBlLmludGVyZmFjZSc7XG5cbi8qKlxuICogR3JhcGhRTCBtZXRhXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaFFMTWV0YSB7XG4gIC8vIEZyb3plbiBjYWNoZXNcbiAgcHJvdGVjdGVkIGFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHJvdGVjdGVkIGZpZWxkczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBJbnRlZ3JhdGUgc2NoZW1hXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc2NoZW1hOiBHcmFwaFFMU2NoZW1hKSB7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHNjaGVtYScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gb2JqZWN0IHdpdGggR3JhcGhRTFJlcXVlc3RUeXBlIChvcGVyYXRpb24gdHlwZSkgYXMga2V5cyBhbmQgbWV0aG9kIChmaWVsZHMpIG5hbWVzIGFzIHZhbHVlXG4gICAqL1xuICBnZXRNZXRob2ROYW1lcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICAgIHJldHVybiB7XG4gICAgICBxdWVyeTogT2JqZWN0LmtleXModGhpcy5zY2hlbWEuZ2V0UXVlcnlUeXBlKCk/LmdldEZpZWxkcygpIHx8IHt9KSxcbiAgICAgIG11dGF0aW9uOiBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYS5nZXRNdXRhdGlvblR5cGUoKT8uZ2V0RmllbGRzKCkgfHwge30pLFxuICAgICAgc3Vic2NyaXB0aW9uOiBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYS5nZXRTdWJzY3JpcHRpb25UeXBlKCk/LmdldEZpZWxkcygpIHx8IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHcmFwaFFMUmVxdWVzdFR5cGVzIChvcGVyYXRpb24gdHlwZXMpIHZpYSBtZXRob2QgKGZpZWxkKSBuYW1lXG4gICAqL1xuICBnZXRSZXF1ZXN0VHlwZXNWaWFNZXRob2QobWV0aG9kTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IG1ldGhvZE5hbWVzID0gdGhpcy5nZXRNZXRob2ROYW1lcygpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGhvZE5hbWVzKSkge1xuICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogV2UncmUgZ29pbmcgdG8gZ2V0IHRoZSBxdWVyeSBhbmQgbXV0YXRpb24gdHlwZXMgZnJvbSB0aGUgc2NoZW1hLCB0aGVuIHdlJ3JlIGdvaW5nIHRvIGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIG9mIGVhY2hcbiAgICogdHlwZSBhbmQgY2hlY2sgaWYgdGhlIGZpZWxkIG5hbWUgc3RhcnRzIHdpdGggYGZpbmRgLCBgY3JlYXRlYCwgYHVwZGF0ZWAsIG9yIGBkZWxldGVgLiBJZiBpdCBkb2VzLCB3ZSdyZSBnb2luZyB0byBhZGRcbiAgICogdGhlIG1vZGVsIG5hbWUgdG8gdGhlIGBwb3NzaWJsZVR5cGVzYCBhcnJheVxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBvYmplY3RzIHdpdGggdGhlIG5hbWUgb2YgdGhlIG1vZGVsLCBhbmQgdGhlIENSVUQgb3BlcmF0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoYXQgbW9kZWwuXG4gICAqL1xuICBnZXRUeXBlcyhsb2dnaW5nID0gZmFsc2UpOiBHcmFwaHFsQ3J1ZFR5cGVbXSB7XG4gICAgY29uc3QgcG9zc2libGVUeXBlczogR3JhcGhxbENydWRUeXBlW10gPSBbXSBhcyBhbnk7XG4gICAgY29uc3QgbXV0YXRpb25UeXBlID0gdGhpcy5zY2hlbWEuZ2V0TXV0YXRpb25UeXBlKCk7XG4gICAgY29uc3QgcXVlcnlUeXBlID0gdGhpcy5zY2hlbWEuZ2V0UXVlcnlUeXBlKCk7XG5cbiAgICBpZiAobG9nZ2luZykge1xuICAgICAgY29uc29sZS5sb2coJ0dyYXBoUUxNZXRhOjpnZXRUeXBlcy0+cXVlcnlUeXBlRmllbGRzJywgcXVlcnlUeXBlLmdldEZpZWxkcygpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeVR5cGUuZ2V0RmllbGRzKCkpKSB7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ2ZpbmQnKSkge1xuICAgICAgICBwb3NzaWJsZVR5cGVzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGtleS5zcGxpdCgnZmluZCcpLnBvcCgpLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICBjcmVhdGU6IGZhbHNlLFxuICAgICAgICAgIHVwZGF0ZTogZmFsc2UsXG4gICAgICAgICAgZGVsZXRlOiBmYWxzZSxcbiAgICAgICAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9nZ2luZykge1xuICAgICAgY29uc29sZS5sb2coJ0dyYXBoUUxNZXRhOjpnZXRUeXBlcy0+bXV0YXRpb25UeXBlRmllbGRzJywgbXV0YXRpb25UeXBlLmdldEZpZWxkcygpKTtcbiAgICAgIGNvbnNvbGUubG9nKCdHcmFwaFFMTWV0YTo6Z2V0VHlwZXMtPnBvc3NpYmxlVHlwZXMnLCBwb3NzaWJsZVR5cGVzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtdXRhdGlvblR5cGUuZ2V0RmllbGRzKCkpKSB7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ2NyZWF0ZScpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0ga2V5LnNwbGl0KCdjcmVhdGUnKS5wb3AoKTtcbiAgICAgICAgaWYgKHBvc3NpYmxlVHlwZXMuZmluZCgoZSkgPT4gZS5uYW1lID09PSBtb2RlbCkpIHtcbiAgICAgICAgICBwb3NzaWJsZVR5cGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gbW9kZWwpLmNyZWF0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCd1cGRhdGUnKSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IGtleS5zcGxpdCgndXBkYXRlJykucG9wKCk7XG4gICAgICAgIGlmIChwb3NzaWJsZVR5cGVzLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gbW9kZWwpKSB7XG4gICAgICAgICAgcG9zc2libGVUeXBlcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG1vZGVsKS51cGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnZGVsZXRlJykpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBrZXkuc3BsaXQoJ2RlbGV0ZScpLnBvcCgpO1xuICAgICAgICBpZiAocG9zc2libGVUeXBlcy5maW5kKChlKSA9PiBlLm5hbWUgPT09IG1vZGVsKSkge1xuICAgICAgICAgIHBvc3NpYmxlVHlwZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBtb2RlbCkuZGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ2R1cGxpY2F0ZScpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0ga2V5LnNwbGl0KCdkdXBsaWNhdGUnKS5wb3AoKTtcbiAgICAgICAgaWYgKHBvc3NpYmxlVHlwZXMuZmluZCgoZSkgPT4gZS5uYW1lID09PSBtb2RlbCkpIHtcbiAgICAgICAgICBwb3NzaWJsZVR5cGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gbW9kZWwpLmR1cGxpY2F0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9nZ2luZykge1xuICAgICAgY29uc29sZS5sb2coJ0dyYXBoUUxNZXRhOjpnZXRUeXBlcy0+cG9zc2libGVUeXBlcycsIHBvc3NpYmxlVHlwZXMpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdHcmFwaFFMTWV0YTo6Z2V0VHlwZXMtPmZpbHRlcmVkUG9zc2libGVUeXBlcycsXG4gICAgICAgIHBvc3NpYmxlVHlwZXMuZmlsdGVyKChlKSA9PiBlLmNyZWF0ZSB8fCBlLnVwZGF0ZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlVHlwZXMuZmlsdGVyKChlKSA9PiBlLmNyZWF0ZSB8fCBlLnVwZGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFyZ3VtZW50cyBvZiBHcmFwaFFMIGZ1bmN0aW9uXG4gICAqL1xuICBnZXRBcmdzKFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY2FjaGU/OiBib29sZWFuOyBmcmVlemU/OiBib29sZWFuOyB0eXBlPzogR3JhcGhRTFJlcXVlc3RUeXBlIH0gPSB7fVxuICApOiBHcmFwaFFMVHlwZSB7XG4gICAgY29uc3QgeyBjYWNoZSwgZnJlZXplLCB0eXBlIH0gPSB7XG4gICAgICBjYWNoZTogdHJ1ZSxcbiAgICAgIGZyZWV6ZTogdHJ1ZSxcbiAgICAgIHR5cGU6IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIEdldCBjYWNoZVxuICAgIGlmIChjYWNoZSAmJiBmcmVlemUpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmFyZ3NbZnVuY3Rpb25OYW1lICsgdHlwZV07XG4gICAgICBpZiAoYXJncykge1xuICAgICAgICByZXR1cm4gYXJncztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmdW5jID0gdGhpcy5nZXRGdW5jdGlvbihmdW5jdGlvbk5hbWUsIHsgdHlwZSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgR3JhcGhRTFR5cGUoKTtcbiAgICBpZiAoZnVuYz8uYXJncykge1xuICAgICAgZnVuYy5hcmdzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgcmVzdWx0LmZpZWxkc1tpdGVtLm5hbWVdID0gdGhpcy5nZXREZWVwVHlwZShpdGVtLnR5cGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGNhY2hlXG4gICAgaWYgKGZyZWV6ZSkge1xuICAgICAgdGhpcy5hcmdzW2Z1bmN0aW9uTmFtZSArIHR5cGVdID0gSGVscGVyLmRlZXBGcmVlemUocmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWVsZHMgb2YgR3JhcGhRTCBmdW5jdGlvblxuICAgKi9cbiAgZ2V0RmllbGRzKFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY2FjaGU/OiBib29sZWFuOyBmcmVlemU/OiBib29sZWFuOyB0eXBlPzogR3JhcGhRTFJlcXVlc3RUeXBlIH0gPSB7fVxuICApOiBHcmFwaFFMVHlwZSB7XG4gICAgY29uc3QgeyBjYWNoZSwgZnJlZXplLCB0eXBlIH0gPSB7XG4gICAgICBjYWNoZTogdHJ1ZSxcbiAgICAgIGZyZWV6ZTogdHJ1ZSxcbiAgICAgIHR5cGU6IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIEdldCBjYWNoZVxuICAgIGlmIChjYWNoZSAmJiBmcmVlemUpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZpZWxkc1tmdW5jdGlvbk5hbWUgKyB0eXBlXTtcbiAgICAgIGlmIChhcmdzKSB7XG4gICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZ1bmMgPSB0aGlzLmdldEZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREZWVwVHlwZShmdW5jLnR5cGUpO1xuXG4gICAgLy8gU2V0IGNhY2hlXG4gICAgaWYgKGZyZWV6ZSkge1xuICAgICAgdGhpcy5maWVsZHNbZnVuY3Rpb25OYW1lICsgdHlwZV0gPSBIZWxwZXIuZGVlcEZyZWV6ZShyZXN1bHQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEdyYXBoUUwgZnVuY3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCBnZXRGdW5jdGlvbihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IHsgdHlwZT86IEdyYXBoUUxSZXF1ZXN0VHlwZSB9ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAvLyBTZXQgY29uZmlnXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8gSW5pdCBwb3NzaWJsZSBmdW5jdGlvbnNcbiAgICBsZXQgZnVuY3Rpb25zID0ge307XG5cbiAgICAvLyBJZiBmdW5jdGlvbiB0eXBlIGlzIHNldFxuICAgIGlmIChjb25maWcudHlwZSkge1xuICAgICAgY29uc3QgZ3JhcGhRTFR5cGUgPSBjb25maWcudHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGNvbmZpZy50eXBlLnNsaWNlKDEpO1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMuc2NoZW1hLmdldFR5cGUoZ3JhcGhRTFR5cGUpO1xuICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgZnVuY3Rpb25zID0gKHR5cGUgYXMgYW55KS5nZXRGaWVsZHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBmdW5jdGlvbiB0eXBlIGlzIG5vdCBzZXRcbiAgICBlbHNlIHtcbiAgICAgIFsnU3Vic2NyaXB0aW9uJywgJ011dGF0aW9uJywgJ1F1ZXJ5J10uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB0eXBlOiBhbnkgPSB0aGlzLnNjaGVtYS5nZXRUeXBlKGl0ZW0pO1xuICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgIGZ1bmN0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLmZ1bmN0aW9ucyxcbiAgICAgICAgICAgIC4uLih0eXBlLmdldEZpZWxkcygpIHx8IHt9KSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZnVuY3Rpb24gdmlhIG5hbWVcbiAgICByZXR1cm4gZnVuY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0eXBlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VHlwZShuYW1lOiBzdHJpbmcpOiBHcmFwaFFMTmFtZWRUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmdldFR5cGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IChkZWVwKSB0eXBlIG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBnZXRUeXBlTmFtZSh0eXBlOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlIGluc3RhbmNlb2YgR3JhcGhRTElucHV0T2JqZWN0VHlwZSB8fFxuICAgICAgdHlwZSBpbnN0YW5jZW9mIEdyYXBoUUxTY2FsYXJUeXBlIHx8XG4gICAgICB0eXBlIGluc3RhbmNlb2YgR3JhcGhRTEVudW1UeXBlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHlwZS5uYW1lO1xuICAgIH0gZWxzZSBpZiAodHlwZS50eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUeXBlTmFtZSh0eXBlLnR5cGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5vZlR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFR5cGVOYW1lKHR5cGUub2ZUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHR5cGUubmFtZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRlZXAgdHlwZSBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RGVlcFR5cGUodHlwZTogYW55LCBwcmVwYXJlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBzZXRNZXRhRGF0YSA9IGZhbHNlKTogR3JhcGhRTFR5cGUge1xuICAgIC8vIENoZWNrIHR5cGVcbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIC8vIEluZmluaXRlIHJlZ3Jlc3MgcHJvdGVjdGlvblxuICAgIGNvbnN0IHR5cGVOYW1lID0gdGhpcy5nZXRUeXBlTmFtZSh0eXBlKTtcbiAgICBjb25zdCBncmFwaFFMVHlwZSA9IEdyYXBoUUxUeXBlLm1hcCh7XG4gICAgICB0eXBlOiB0aGlzLmdldFR5cGVOYW1lKHR5cGUpLFxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgcHJlcGFyZWRcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBwcmVwYXJlZFR5cGUgPSBwcmVwYXJlZFt0eXBlTmFtZV07XG5cbiAgICAgIC8vIFdvcmsgd2l0aCBjYWNoZWQgdHlwZVxuICAgICAgaWYgKHByZXBhcmVkVHlwZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHRvIHByb3RlY3Qgb3duIGlzWFhYIGluZm9ybWF0aW9uXG4gICAgICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgcHJlcGFyZWRUeXBlKTtcblxuICAgICAgICAvLyBCdXQgdXNlIGZpZWxkcyBhcyByZWZlcmVuY2UgdG8gZ2V0IGZ1dHVyZSBjaGFuZ2VzIHZpYSBwcmVwYXJlZCBjYWNoaW5nXG4gICAgICAgIGNsb25lLmZpZWxkcyA9IHByZXBhcmVkVHlwZS5maWVsZHM7XG5cbiAgICAgICAgLy8gRGlzYWJsZSBtZXRhIGZsYWdzIGZvciBzdWIgb2JqZWN0c1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZT8udHlwZSBpbnN0YW5jZW9mIEdyYXBoUUxJbnB1dE9iamVjdFR5cGUgfHxcbiAgICAgICAgICAodHlwZT8udHlwZSBpbnN0YW5jZW9mIEdyYXBoUUxOb25OdWxsICYmIHR5cGU/LnR5cGU/Lm9mVHlwZSBpbnN0YW5jZW9mIEdyYXBoUUxJbnB1dE9iamVjdFR5cGUgJiYgc2V0TWV0YURhdGEpXG4gICAgICAgICkge1xuICAgICAgICAgIHNldE1ldGFEYXRhID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgbWV0YSBmbGFnc1xuICAgICAgICBpZiAodHlwZS50eXBlICYmIHNldE1ldGFEYXRhKSB7XG4gICAgICAgICAgaWYgKHR5cGUudHlwZSBpbnN0YW5jZW9mIEdyYXBoUUxOb25OdWxsKSB7XG4gICAgICAgICAgICBjbG9uZS5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlLnR5cGUub2ZUeXBlIGluc3RhbmNlb2YgR3JhcGhRTExpc3QpIHtcbiAgICAgICAgICAgICAgY2xvbmUuaXNMaXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY2xvbmUuaXNJdGVtUmVxdWlyZWQgPSB0eXBlLnR5cGUub2ZUeXBlLm9mVHlwZSBpbnN0YW5jZW9mIEdyYXBoUUxOb25OdWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2xvbmUuaXNMaXN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNsb25lLmlzSXRlbVJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsb25lLmlzUmVxdWlyZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gTGlzdCBmaXJzdFxuICAgICAgICAgICAgaWYgKHR5cGUudHlwZSBpbnN0YW5jZW9mIEdyYXBoUUxMaXN0KSB7XG4gICAgICAgICAgICAgIGNsb25lLmlzTGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgIGNsb25lLmlzSXRlbVJlcXVpcmVkID0gdHlwZS5vZlR5cGUgaW5zdGFuY2VvZiBHcmFwaFFMTm9uTnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNsb25lLmlzTGlzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICBjbG9uZS5pc0l0ZW1SZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHByZXBhcmVkIGNhY2hlIGZvciBHcmFwaFFMIHR5cGVzXG4gICAgICAvLyAodHlwZSBuYW1lcyBzdGFydCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzIGFzIG9wcG9zZWQgdG8gcHJvcGVydHkgbmFtZXMgdGhhdCBzdGFydCB3aXRoIGxvd2VyY2FzZSBsZXR0ZXJzKVxuICAgICAgaWYgKHR5cGUubmFtZSAmJiB0eXBlLm5hbWVbMF0udG9VcHBlckNhc2UoKSA9PT0gdHlwZS5uYW1lWzBdICYmICFwcmVwYXJlZFt0eXBlLm5hbWVdKSB7XG4gICAgICAgIHByZXBhcmVkW3R5cGUubmFtZV0gPSBncmFwaFFMVHlwZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZGVlcGVyXG4gICAgaWYgKHR5cGUub2ZUeXBlKSB7XG4gICAgICBjb25zdCBvZlR5cGVSZXN1bHQgPSB0aGlzLmdldERlZXBUeXBlKHR5cGUub2ZUeXBlLCBwcmVwYXJlZCwgc2V0TWV0YURhdGEpO1xuICAgICAgT2JqZWN0LmFzc2lnbihncmFwaFFMVHlwZSwgb2ZUeXBlUmVzdWx0KTtcbiAgICAgIHJldHVybiBncmFwaFFMVHlwZTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGZpZWxkc1xuICAgIGlmICh0eXBlLl9maWVsZHMpIHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModHlwZS5fZmllbGRzKSkge1xuICAgICAgICBmaWVsZHNba2V5XSA9IHRoaXMuZ2V0RGVlcFR5cGUodmFsdWUsIHByZXBhcmVkLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXNzaWduIGFuZCBub3QgcmVwbGFjZSB0byBwcmVzZXJ2ZSB1cGRhdGVzIGluIHRoZSBjYWNoZVxuICAgICAgT2JqZWN0LmFzc2lnbihncmFwaFFMVHlwZS5maWVsZHMsIGZpZWxkcyk7XG4gICAgICByZXR1cm4gZ3JhcGhRTFR5cGU7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyB0eXBlXG4gICAgaWYgKHR5cGUudHlwZSkge1xuICAgICAgY29uc3QgdHlwZVJlc3VsdCA9IHRoaXMuZ2V0RGVlcFR5cGUodHlwZS50eXBlLCBwcmVwYXJlZCwgc2V0TWV0YURhdGEpO1xuXG4gICAgICAvLyBEaXNhYmxlIG1ldGEgZmxhZ3MgZm9yIHN1YiBvYmplY3RzXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGU/LnR5cGUgaW5zdGFuY2VvZiBHcmFwaFFMSW5wdXRPYmplY3RUeXBlIHx8XG4gICAgICAgICh0eXBlPy50eXBlIGluc3RhbmNlb2YgR3JhcGhRTE5vbk51bGwgJiYgdHlwZT8udHlwZT8ub2ZUeXBlIGluc3RhbmNlb2YgR3JhcGhRTElucHV0T2JqZWN0VHlwZSAmJiBzZXRNZXRhRGF0YSlcbiAgICAgICkge1xuICAgICAgICBzZXRNZXRhRGF0YSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgbWV0YSBmbGFnc1xuICAgICAgaWYgKHNldE1ldGFEYXRhKSB7XG4gICAgICAgIGlmICh0eXBlLnR5cGUgaW5zdGFuY2VvZiBHcmFwaFFMTm9uTnVsbCkge1xuICAgICAgICAgIHR5cGVSZXN1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHR5cGUudHlwZS5vZlR5cGUgaW5zdGFuY2VvZiBHcmFwaFFMTGlzdCkge1xuICAgICAgICAgICAgdHlwZVJlc3VsdC5pc0xpc3QgPSB0cnVlO1xuICAgICAgICAgICAgdHlwZVJlc3VsdC5pc0l0ZW1SZXF1aXJlZCA9IHR5cGUudHlwZS5vZlR5cGUub2ZUeXBlIGluc3RhbmNlb2YgR3JhcGhRTE5vbk51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGVSZXN1bHQuaXNMaXN0ID0gZmFsc2U7XG4gICAgICAgICAgICB0eXBlUmVzdWx0LmlzSXRlbVJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHR5cGVSZXN1bHQuaXNSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gTGlzdCBmaXJzdFxuICAgICAgICAgIGlmICh0eXBlLnR5cGUgaW5zdGFuY2VvZiBHcmFwaFFMTGlzdCkge1xuICAgICAgICAgICAgdHlwZVJlc3VsdC5pc0xpc3QgPSB0cnVlO1xuICAgICAgICAgICAgdHlwZVJlc3VsdC5pc0l0ZW1SZXF1aXJlZCA9IHR5cGUub2ZUeXBlIGluc3RhbmNlb2YgR3JhcGhRTE5vbk51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGVSZXN1bHQuaXNMaXN0ID0gZmFsc2U7XG4gICAgICAgICAgICB0eXBlUmVzdWx0LmlzSXRlbVJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5hc3NpZ24oZ3JhcGhRTFR5cGUsIHR5cGVSZXN1bHQpO1xuICAgICAgcmV0dXJuIGdyYXBoUUxUeXBlO1xuICAgIH1cblxuICAgIC8vIFNldCBlbnVtIHZhbHVlc1xuICAgIGlmICghIXR5cGUuX3ZhbHVlcykge1xuICAgICAgZ3JhcGhRTFR5cGUuaXNFbnVtID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHR5cGUuX25hbWVMb29rdXApKSB7XG4gICAgICAgIGlmICghKHZhbHVlIGFzIGFueSkuaXNEZXByZWNhdGVkKSB7XG4gICAgICAgICAgZ3JhcGhRTFR5cGUudmFsaWRFbnVtcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaW5pc2hcbiAgICByZXR1cm4gZ3JhcGhRTFR5cGU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Standard } from './standard.class';
|
|
2
|
+
/**
|
|
3
|
+
* GraphQL type
|
|
4
|
+
*/
|
|
5
|
+
export class GraphQLType extends Standard {
|
|
6
|
+
type = '';
|
|
7
|
+
fields = {};
|
|
8
|
+
isRequired = false;
|
|
9
|
+
isItemRequired = false;
|
|
10
|
+
isList = false;
|
|
11
|
+
isEnum = false;
|
|
12
|
+
validEnums = [];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC10eXBlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zaGFyZWQvY2xhc3Nlcy9ncmFwaHFsLXR5cGUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVksU0FBUSxRQUFRO0lBQ3ZDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDVixNQUFNLEdBQWdDLEVBQUUsQ0FBQztJQUN6QyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNmLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixVQUFVLEdBQWEsRUFBRSxDQUFDO0NBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhbmRhcmQgfSBmcm9tICcuL3N0YW5kYXJkLmNsYXNzJztcblxuLyoqXG4gKiBHcmFwaFFMIHR5cGVcbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoUUxUeXBlIGV4dGVuZHMgU3RhbmRhcmQge1xuICB0eXBlID0gJyc7XG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgR3JhcGhRTFR5cGU+ID0ge307XG4gIGlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgaXNJdGVtUmVxdWlyZWQgPSBmYWxzZTtcbiAgaXNMaXN0ID0gZmFsc2U7XG4gIGlzRW51bSA9IGZhbHNlO1xuICB2YWxpZEVudW1zOiBzdHJpbmdbXSA9IFtdO1xufVxuIl19
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export class Sort {
|
|
2
|
+
sortOrder = 1;
|
|
3
|
+
collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
|
|
4
|
+
/**
|
|
5
|
+
* Sorts clicked column
|
|
6
|
+
*/
|
|
7
|
+
startSort(property, order, type = '') {
|
|
8
|
+
if (order === 'desc') {
|
|
9
|
+
this.sortOrder = -1;
|
|
10
|
+
}
|
|
11
|
+
return (a, b) => {
|
|
12
|
+
if (type === 'date') {
|
|
13
|
+
return this.sortDate(new Date(a.latestStep[property]), new Date(b.latestStep[property]));
|
|
14
|
+
}
|
|
15
|
+
else if (type === 'position') {
|
|
16
|
+
return this.collator.compare(a.position.Value[property], b.position.Value[property]) * this.sortOrder;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return this.collator.compare(a[property], b[property]) * this.sortOrder;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Sorts dates
|
|
25
|
+
*/
|
|
26
|
+
sortDate(a, b) {
|
|
27
|
+
if (a < b) {
|
|
28
|
+
return -1 * this.sortOrder;
|
|
29
|
+
}
|
|
30
|
+
else if (a > b) {
|
|
31
|
+
return 1 * this.sortOrder;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return 0 * this.sortOrder;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc2hhcmVkL2NsYXNzZXMvc29ydC5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sSUFBSTtJQUNQLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDdEIsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRWhGOztPQUVHO0lBQ0ksU0FBUyxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3pELElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRTtZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNkLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxRjtpQkFBTSxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ3ZHO2lCQUFNO2dCQUNMLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDekU7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxRQUFRLENBQUMsQ0FBTyxFQUFFLENBQU87UUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQzVCO2FBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDM0I7YUFBTTtZQUNMLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDM0I7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU29ydCB7XG4gIHByaXZhdGUgc29ydE9yZGVyID0gMTtcbiAgY29sbGF0b3IgPSBuZXcgSW50bC5Db2xsYXRvcih1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6ICdiYXNlJyB9KTtcblxuICAvKipcbiAgICogU29ydHMgY2xpY2tlZCBjb2x1bW5cbiAgICovXG4gIHB1YmxpYyBzdGFydFNvcnQocHJvcGVydHk6IHN0cmluZywgb3JkZXI6IHN0cmluZywgdHlwZSA9ICcnKSB7XG4gICAgaWYgKG9yZGVyID09PSAnZGVzYycpIHtcbiAgICAgIHRoaXMuc29ydE9yZGVyID0gLTE7XG4gICAgfVxuICAgIHJldHVybiAoYSwgYikgPT4ge1xuICAgICAgaWYgKHR5cGUgPT09ICdkYXRlJykge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGF0ZShuZXcgRGF0ZShhLmxhdGVzdFN0ZXBbcHJvcGVydHldKSwgbmV3IERhdGUoYi5sYXRlc3RTdGVwW3Byb3BlcnR5XSkpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncG9zaXRpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxhdG9yLmNvbXBhcmUoYS5wb3NpdGlvbi5WYWx1ZVtwcm9wZXJ0eV0sIGIucG9zaXRpb24uVmFsdWVbcHJvcGVydHldKSAqIHRoaXMuc29ydE9yZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZShhW3Byb3BlcnR5XSwgYltwcm9wZXJ0eV0pICogdGhpcy5zb3J0T3JkZXI7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyBkYXRlc1xuICAgKi9cbiAgcHJpdmF0ZSBzb3J0RGF0ZShhOiBEYXRlLCBiOiBEYXRlKSB7XG4gICAgaWYgKGEgPCBiKSB7XG4gICAgICByZXR1cm4gLTEgKiB0aGlzLnNvcnRPcmRlcjtcbiAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICByZXR1cm4gMSAqIHRoaXMuc29ydE9yZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMCAqIHRoaXMuc29ydE9yZGVyO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Observable } from 'rxjs';
|
|
3
|
+
import { GraphQLService } from './graphql.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./storage.service";
|
|
6
|
+
import * as i2 from "./ws.service";
|
|
7
|
+
import * as i3 from "@angular/router";
|
|
8
|
+
/**
|
|
9
|
+
* Authentication service
|
|
10
|
+
*/
|
|
11
|
+
class AuthService {
|
|
12
|
+
storageService;
|
|
13
|
+
wsService;
|
|
14
|
+
injector;
|
|
15
|
+
router;
|
|
16
|
+
// Subjects
|
|
17
|
+
_currentUser = new BehaviorSubject(null);
|
|
18
|
+
_token = new BehaviorSubject(null);
|
|
19
|
+
_refreshToken = new BehaviorSubject(null);
|
|
20
|
+
/**
|
|
21
|
+
* Constructor
|
|
22
|
+
*/
|
|
23
|
+
constructor(storageService, wsService, injector, router) {
|
|
24
|
+
this.storageService = storageService;
|
|
25
|
+
this.wsService = wsService;
|
|
26
|
+
this.injector = injector;
|
|
27
|
+
this.router = router;
|
|
28
|
+
this.loadFromStorage();
|
|
29
|
+
}
|
|
30
|
+
requestNewToken() {
|
|
31
|
+
return new Observable((subscriber) => {
|
|
32
|
+
this.injector
|
|
33
|
+
.get(GraphQLService)
|
|
34
|
+
.graphQl('refreshToken', {
|
|
35
|
+
fields: ['token', 'refreshToken'],
|
|
36
|
+
})
|
|
37
|
+
.subscribe({
|
|
38
|
+
next: (response) => {
|
|
39
|
+
this.token = response.token;
|
|
40
|
+
this.refreshToken = response.refreshToken;
|
|
41
|
+
subscriber.next(response);
|
|
42
|
+
subscriber.complete();
|
|
43
|
+
},
|
|
44
|
+
error: (err) => {
|
|
45
|
+
subscriber.error(err);
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
loadFromStorage() {
|
|
51
|
+
if (localStorage) {
|
|
52
|
+
this.token = this.storageService.load('token');
|
|
53
|
+
this.refreshToken = this.storageService.load('refreshToken');
|
|
54
|
+
this.currentUser = this.storageService.load('currentUser');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Logout
|
|
59
|
+
*/
|
|
60
|
+
logout(redirect = true) {
|
|
61
|
+
return new Observable((subscriber) => {
|
|
62
|
+
this.injector
|
|
63
|
+
.get(GraphQLService)
|
|
64
|
+
.graphQl('logout', {
|
|
65
|
+
fields: [],
|
|
66
|
+
})
|
|
67
|
+
.subscribe({
|
|
68
|
+
next: () => {
|
|
69
|
+
this.clearSession(redirect);
|
|
70
|
+
subscriber.next(true);
|
|
71
|
+
subscriber.complete();
|
|
72
|
+
},
|
|
73
|
+
error: (err) => {
|
|
74
|
+
subscriber.error(err);
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
clearSession(redirect = true) {
|
|
80
|
+
this.storageService.remove(['token', 'refreshToken', 'currentUser']);
|
|
81
|
+
this.currentUser = null;
|
|
82
|
+
this.token = null;
|
|
83
|
+
this.refreshToken = null;
|
|
84
|
+
if (redirect) {
|
|
85
|
+
this.router.navigate(['/auth']);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// #################################################################
|
|
89
|
+
// Current User
|
|
90
|
+
// #################################################################
|
|
91
|
+
get currentUser() {
|
|
92
|
+
if (!localStorage) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
return this._currentUser.value;
|
|
96
|
+
}
|
|
97
|
+
set currentUser(user) {
|
|
98
|
+
this._currentUser.next(user);
|
|
99
|
+
this.storageService.save('currentUser', user);
|
|
100
|
+
}
|
|
101
|
+
get currentUserObservable() {
|
|
102
|
+
return this._currentUser.asObservable();
|
|
103
|
+
}
|
|
104
|
+
// #################################################################
|
|
105
|
+
// Token
|
|
106
|
+
// #################################################################
|
|
107
|
+
get token() {
|
|
108
|
+
if (!localStorage) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
return this._token.value;
|
|
112
|
+
}
|
|
113
|
+
set token(token) {
|
|
114
|
+
this._token.next(token);
|
|
115
|
+
this.storageService.save('token', token);
|
|
116
|
+
this.wsService.reconnect();
|
|
117
|
+
}
|
|
118
|
+
get tokenObservable() {
|
|
119
|
+
if (!this._token.value) {
|
|
120
|
+
this.loadFromStorage();
|
|
121
|
+
}
|
|
122
|
+
return this._token.asObservable();
|
|
123
|
+
}
|
|
124
|
+
// #################################################################
|
|
125
|
+
// refreshToken
|
|
126
|
+
// #################################################################
|
|
127
|
+
get refreshToken() {
|
|
128
|
+
if (!localStorage) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
return this._refreshToken.value;
|
|
132
|
+
}
|
|
133
|
+
set refreshToken(refreshToken) {
|
|
134
|
+
this._refreshToken.next(refreshToken);
|
|
135
|
+
this.storageService.save('refreshToken', refreshToken);
|
|
136
|
+
}
|
|
137
|
+
get refreshTokenObservable() {
|
|
138
|
+
if (!this._refreshToken.value) {
|
|
139
|
+
this.loadFromStorage();
|
|
140
|
+
}
|
|
141
|
+
return this._refreshToken.asObservable();
|
|
142
|
+
}
|
|
143
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AuthService, deps: [{ token: i1.StorageService }, { token: i2.WsService }, { token: i0.Injector }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
144
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AuthService, providedIn: 'root' });
|
|
145
|
+
}
|
|
146
|
+
export { AuthService };
|
|
147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AuthService, decorators: [{
|
|
148
|
+
type: Injectable,
|
|
149
|
+
args: [{
|
|
150
|
+
providedIn: 'root',
|
|
151
|
+
}]
|
|
152
|
+
}], ctorParameters: function () { return [{ type: i1.StorageService }, { type: i2.WsService }, { type: i0.Injector }, { type: i3.Router }]; } });
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zaGFyZWQvc2VydmljZXMvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7OztBQUduRDs7R0FFRztBQUNILE1BR2EsV0FBVztJQVVaO0lBQ0E7SUFDQTtJQUNBO0lBWlYsV0FBVztJQUNILFlBQVksR0FBK0IsSUFBSSxlQUFlLENBQVksSUFBSSxDQUFDLENBQUM7SUFDaEYsTUFBTSxHQUE0QixJQUFJLGVBQWUsQ0FBUyxJQUFJLENBQUMsQ0FBQztJQUNwRSxhQUFhLEdBQTRCLElBQUksZUFBZSxDQUFTLElBQUksQ0FBQyxDQUFDO0lBRW5GOztPQUVHO0lBQ0gsWUFDVSxjQUE4QixFQUM5QixTQUFvQixFQUNwQixRQUFrQixFQUNsQixNQUFjO1FBSGQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRXRCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxVQUFVLENBQTBDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDNUUsSUFBSSxDQUFDLFFBQVE7aUJBQ1YsR0FBRyxDQUFDLGNBQWMsQ0FBQztpQkFDbkIsT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQzthQUNsQyxDQUFDO2lCQUNELFNBQVMsQ0FBQztn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LE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDO3VHQXZKVSxXQUFXOzJHQUFYLFdBQVcsY0FGVixNQUFNOztTQUVQLFdBQVc7MkZBQVgsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCYXNpY1VzZXIgfSBmcm9tICcuLi9jbGFzc2VzL2Jhc2ljLXVzZXIuY2xhc3MnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBXc1NlcnZpY2UgfSBmcm9tICcuL3dzLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JhcGhRTFNlcnZpY2UgfSBmcm9tICcuL2dyYXBocWwuc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG4vKipcbiAqIEF1dGhlbnRpY2F0aW9uIHNlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgLy8gU3ViamVjdHNcbiAgcHJpdmF0ZSBfY3VycmVudFVzZXI6IEJlaGF2aW9yU3ViamVjdDxCYXNpY1VzZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCYXNpY1VzZXI+KG51bGwpO1xuICBwcml2YXRlIF90b2tlbjogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG4gIHByaXZhdGUgX3JlZnJlc2hUb2tlbjogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHdzU2VydmljZTogV3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7XG4gICAgdGhpcy5sb2FkRnJvbVN0b3JhZ2UoKTtcbiAgfVxuXG4gIHJlcXVlc3ROZXdUb2tlbigpOiBPYnNlcnZhYmxlPHsgdG9rZW46IHN0cmluZzsgcmVmcmVzaFRva2VuOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTx7IHRva2VuOiBzdHJpbmc7IHJlZnJlc2hUb2tlbjogc3RyaW5nIH0+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICB0aGlzLmluamVjdG9yXG4gICAgICAgIC5nZXQoR3JhcGhRTFNlcnZpY2UpXG4gICAgICAgIC5ncmFwaFFsKCdyZWZyZXNoVG9rZW4nLCB7XG4gICAgICAgICAgZmllbGRzOiBbJ3Rva2VuJywgJ3JlZnJlc2hUb2tlbiddLFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSByZXNwb25zZS50b2tlbjtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVzcG9uc2UucmVmcmVzaFRva2VuO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBsb2FkRnJvbVN0b3JhZ2UoKSB7XG4gICAgaWYgKGxvY2FsU3RvcmFnZSkge1xuICAgICAgdGhpcy50b2tlbiA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgndG9rZW4nKSBhcyBzdHJpbmc7XG4gICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncmVmcmVzaFRva2VuJykgYXMgc3RyaW5nO1xuICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgnY3VycmVudFVzZXInKSBhcyBCYXNpY1VzZXI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dFxuICAgKi9cbiAgcHVibGljIGxvZ291dChyZWRpcmVjdCA9IHRydWUpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIHRoaXMuaW5qZWN0b3JcbiAgICAgICAgLmdldChHcmFwaFFMU2VydmljZSlcbiAgICAgICAgLmdyYXBoUWwoJ2xvZ291dCcsIHtcbiAgICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2Vzc2lvbihyZWRpcmVjdCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJTZXNzaW9uKHJlZGlyZWN0ID0gdHJ1ZSkge1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKFsndG9rZW4nLCAncmVmcmVzaFRva2VuJywgJ2N1cnJlbnRVc2VyJ10pO1xuICAgIHRoaXMuY3VycmVudFVzZXIgPSBudWxsO1xuICAgIHRoaXMudG9rZW4gPSBudWxsO1xuICAgIHRoaXMucmVmcmVzaFRva2VuID0gbnVsbDtcblxuICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYXV0aCddKTtcbiAgICB9XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICAvLyBDdXJyZW50IFVzZXJcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuICBnZXQgY3VycmVudFVzZXIoKTogQmFzaWNVc2VyIHtcbiAgICBpZiAoIWxvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFVzZXIudmFsdWU7XG4gIH1cblxuICBzZXQgY3VycmVudFVzZXIodXNlcjogQmFzaWNVc2VyKSB7XG4gICAgdGhpcy5fY3VycmVudFVzZXIubmV4dCh1c2VyKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoJ2N1cnJlbnRVc2VyJywgdXNlcik7XG4gIH1cblxuICBnZXQgY3VycmVudFVzZXJPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8QmFzaWNVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRVc2VyLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gVG9rZW5cbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuICBnZXQgdG9rZW4oKTogc3RyaW5nIHtcbiAgICBpZiAoIWxvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdG9rZW4udmFsdWU7XG4gIH1cblxuICBzZXQgdG9rZW4odG9rZW46IHN0cmluZykge1xuICAgIHRoaXMuX3Rva2VuLm5leHQodG9rZW4pO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSgndG9rZW4nLCB0b2tlbik7XG4gICAgdGhpcy53c1NlcnZpY2UucmVjb25uZWN0KCk7XG4gIH1cblxuICBnZXQgdG9rZW5PYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl90b2tlbi52YWx1ZSkge1xuICAgICAgdGhpcy5sb2FkRnJvbVN0b3JhZ2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdG9rZW4uYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICAvLyByZWZyZXNoVG9rZW5cbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuICBnZXQgcmVmcmVzaFRva2VuKCk6IHN0cmluZyB7XG4gICAgaWYgKCFsb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlZnJlc2hUb2tlbi52YWx1ZTtcbiAgfVxuXG4gIHNldCByZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4ubmV4dChyZWZyZXNoVG9rZW4pO1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSgncmVmcmVzaFRva2VuJywgcmVmcmVzaFRva2VuKTtcbiAgfVxuXG4gIGdldCByZWZyZXNoVG9rZW5PYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9yZWZyZXNoVG9rZW4udmFsdWUpIHtcbiAgICAgIHRoaXMubG9hZEZyb21TdG9yYWdlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlZnJlc2hUb2tlbi5hc09ic2VydmFibGUoKTtcbiAgfVxufVxuIl19
|