@nlabs/metropolisjs 0.1.1 → 0.2.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/.github/copilot-instructions.md +167 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +112 -0
- package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
- package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
- package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
- package/README.md +1343 -0
- package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
- package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
- package/docs/ACTIONS.md +63 -0
- package/docs/COLLECTIONS.md +1038 -0
- package/docs/CONNECTIONS.md +1367 -0
- package/docs/CRUD_INTEGRATION.md +702 -0
- package/examples/connections-usage.tsx +909 -0
- package/examples/content-actions-usage.ts +144 -0
- package/examples/crud-usage.tsx +847 -0
- package/examples/extensibility-usage.tsx +889 -0
- package/examples/factory-pattern-usage.ts +283 -0
- package/examples/i18n-import-examples.ts +86 -0
- package/examples/i18n-namespace-usage.ts +118 -0
- package/examples/i18next-singleton-demo.ts +187 -0
- package/examples/permission-system-usage.tsx +415 -0
- package/examples/project-details.tsx +397 -0
- package/examples/shared-i18n-usage.tsx +203 -0
- package/examples/signup-error-handling.ts +100 -0
- package/examples/translation-types.ts +86 -0
- package/examples/translation-usage.tsx +336 -0
- package/factoryPatternGuide.md +244 -0
- package/index.js +1 -0
- package/jest.config.mjs +28 -0
- package/lex.config.mjs +26 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
- package/lib/actions/appActions/appActions.d.ts +29 -0
- package/lib/actions/appActions/appActions.d.ts.map +1 -0
- package/lib/actions/appActions/appActions.js +159 -0
- package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
- package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
- package/lib/actions/connectionActions/connectionActions.js +131 -0
- package/lib/actions/contentActions/contentActions.d.ts +34 -0
- package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
- package/lib/actions/contentActions/contentActions.js +314 -0
- package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
- package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
- package/lib/actions/conversationActions/conversationActions.js +225 -0
- package/lib/actions/eventActions/eventActions.d.ts +65 -0
- package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
- package/lib/actions/eventActions/eventActions.js +436 -0
- package/lib/actions/groupActions/groupActions.d.ts +30 -0
- package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
- package/lib/actions/groupActions/groupActions.js +229 -0
- package/lib/actions/imageActions/imageActions.d.ts +62 -0
- package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
- package/lib/actions/imageActions/imageActions.js +593 -0
- package/lib/actions/index.d.ts +21 -0
- package/lib/actions/index.d.ts.map +1 -0
- package/lib/actions/index.js +22 -0
- package/lib/actions/locationActions/locationActions.d.ts +60 -0
- package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
- package/lib/actions/locationActions/locationActions.js +388 -0
- package/lib/actions/messageActions/messageActions.d.ts +38 -0
- package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
- package/lib/actions/messageActions/messageActions.js +235 -0
- package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
- package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
- package/lib/actions/permissionActions/permissionActions.js +330 -0
- package/lib/actions/personaActions/personaActions.d.ts +65 -0
- package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
- package/lib/actions/personaActions/personaActions.js +572 -0
- package/lib/actions/postActions/postActions.d.ts +36 -0
- package/lib/actions/postActions/postActions.d.ts.map +1 -0
- package/lib/actions/postActions/postActions.js +447 -0
- package/lib/actions/reactionActions/reactionActions.d.ts +38 -0
- package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
- package/lib/actions/reactionActions/reactionActions.js +413 -0
- package/lib/actions/sseActions/sseActions.d.ts +38 -0
- package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
- package/lib/actions/sseActions/sseActions.js +148 -0
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
- package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
- package/lib/actions/tagActions/tagActions.d.ts +37 -0
- package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
- package/lib/actions/tagActions/tagActions.js +347 -0
- package/lib/actions/translationActions/translationActions.d.ts +38 -0
- package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
- package/lib/actions/translationActions/translationActions.js +189 -0
- package/lib/actions/userActions/userActions.d.ts +78 -0
- package/lib/actions/userActions/userActions.d.ts.map +1 -0
- package/lib/actions/userActions/userActions.js +844 -0
- package/lib/actions/videoActions/videoActions.d.ts +41 -0
- package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
- package/lib/actions/videoActions/videoActions.js +532 -0
- package/lib/actions/websocketActions/websocketActions.d.ts +30 -0
- package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
- package/lib/actions/websocketActions/websocketActions.js +377 -0
- package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
- package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
- package/lib/adapters/appAdapter/appAdapter.js +90 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +21 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -0
- package/lib/adapters/contentAdapter/contentAdapter.d.ts +32 -0
- package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
- package/lib/adapters/contentAdapter/contentAdapter.js +107 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +24 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -0
- package/lib/adapters/eventAdapter/eventAdapter.d.ts +46 -0
- package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
- package/lib/adapters/eventAdapter/eventAdapter.js +162 -0
- package/lib/adapters/fileAdapter/fileAdapter.d.ts +30 -0
- package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
- package/lib/adapters/fileAdapter/fileAdapter.js +118 -0
- package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
- package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
- package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
- package/lib/adapters/imageAdapter/imageAdapter.d.ts +38 -0
- package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
- package/lib/adapters/imageAdapter/imageAdapter.js +134 -0
- package/lib/adapters/index.d.ts +34 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +19 -0
- package/lib/adapters/locationAdapter/locationAdapter.d.ts +28 -0
- package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
- package/lib/adapters/locationAdapter/locationAdapter.js +95 -0
- package/lib/adapters/messageAdapter/messageAdapter.d.ts +31 -0
- package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
- package/lib/adapters/messageAdapter/messageAdapter.js +82 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
- package/lib/adapters/personaAdapter/personaAdapter.d.ts +44 -0
- package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
- package/lib/adapters/personaAdapter/personaAdapter.js +161 -0
- package/lib/adapters/postAdapter/postAdapter.d.ts +33 -0
- package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
- package/lib/adapters/postAdapter/postAdapter.js +115 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +23 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +17 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +24 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -0
- package/lib/adapters/tagAdapter/tagAdapter.d.ts +21 -0
- package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
- package/lib/adapters/tagAdapter/tagAdapter.js +98 -0
- package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
- package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
- package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
- package/lib/adapters/userAdapter/userAdapter.d.ts +67 -0
- package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
- package/lib/adapters/userAdapter/userAdapter.js +302 -0
- package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
- package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
- package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
- package/lib/config/index.d.ts +44 -0
- package/lib/config/index.d.ts.map +1 -0
- package/lib/config/index.js +97 -0
- package/lib/constants/Collections.d.ts +44 -0
- package/lib/constants/Collections.d.ts.map +1 -0
- package/lib/constants/Collections.js +40 -0
- package/lib/constants/MetropolisConstants.d.ts +15 -0
- package/lib/constants/MetropolisConstants.d.ts.map +1 -0
- package/lib/constants/MetropolisConstants.js +15 -0
- package/lib/graphql/message.d.ts +3 -0
- package/lib/graphql/message.d.ts.map +1 -0
- package/lib/graphql/message.js +20 -0
- package/lib/graphql/notification.d.ts +3 -0
- package/lib/graphql/notification.d.ts.map +1 -0
- package/lib/graphql/notification.js +20 -0
- package/lib/graphql/session.d.ts +2 -0
- package/lib/graphql/session.d.ts.map +1 -0
- package/lib/graphql/session.js +17 -0
- package/lib/index.d.ts +52 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +248 -0
- package/lib/stores/appStore.d.ts +23 -0
- package/lib/stores/appStore.d.ts.map +1 -0
- package/lib/stores/appStore.js +23 -0
- package/lib/stores/contentStore.d.ts +36 -0
- package/lib/stores/contentStore.d.ts.map +1 -0
- package/lib/stores/contentStore.js +139 -0
- package/lib/stores/conversationStore.d.ts +38 -0
- package/lib/stores/conversationStore.d.ts.map +1 -0
- package/lib/stores/conversationStore.js +117 -0
- package/lib/stores/eventStore.d.ts +37 -0
- package/lib/stores/eventStore.d.ts.map +1 -0
- package/lib/stores/eventStore.js +47 -0
- package/lib/stores/groupStore.d.ts +37 -0
- package/lib/stores/groupStore.d.ts.map +1 -0
- package/lib/stores/groupStore.js +68 -0
- package/lib/stores/imageStore.d.ts +40 -0
- package/lib/stores/imageStore.d.ts.map +1 -0
- package/lib/stores/imageStore.js +53 -0
- package/lib/stores/index.d.ts +24 -0
- package/lib/stores/index.d.ts.map +1 -0
- package/lib/stores/index.js +24 -0
- package/lib/stores/locationStore.d.ts +34 -0
- package/lib/stores/locationStore.d.ts.map +1 -0
- package/lib/stores/locationStore.js +42 -0
- package/lib/stores/messageStore.d.ts +51 -0
- package/lib/stores/messageStore.d.ts.map +1 -0
- package/lib/stores/messageStore.js +137 -0
- package/lib/stores/notificationStore.d.ts +33 -0
- package/lib/stores/notificationStore.d.ts.map +1 -0
- package/lib/stores/notificationStore.js +55 -0
- package/lib/stores/permissionStore.d.ts +37 -0
- package/lib/stores/permissionStore.d.ts.map +1 -0
- package/lib/stores/permissionStore.js +117 -0
- package/lib/stores/personaStore.d.ts +26 -0
- package/lib/stores/personaStore.d.ts.map +1 -0
- package/lib/stores/personaStore.js +118 -0
- package/lib/stores/postStore.d.ts +34 -0
- package/lib/stores/postStore.d.ts.map +1 -0
- package/lib/stores/postStore.js +53 -0
- package/lib/stores/reactionStore.d.ts +25 -0
- package/lib/stores/reactionStore.d.ts.map +1 -0
- package/lib/stores/reactionStore.js +28 -0
- package/lib/stores/subscriptionStore.d.ts +41 -0
- package/lib/stores/subscriptionStore.d.ts.map +1 -0
- package/lib/stores/subscriptionStore.js +85 -0
- package/lib/stores/tagStore.d.ts +34 -0
- package/lib/stores/tagStore.d.ts.map +1 -0
- package/lib/stores/tagStore.js +87 -0
- package/lib/stores/translationStore.d.ts +42 -0
- package/lib/stores/translationStore.d.ts.map +1 -0
- package/lib/stores/translationStore.js +122 -0
- package/lib/stores/userStore.d.ts +74 -0
- package/lib/stores/userStore.d.ts.map +1 -0
- package/lib/stores/userStore.js +319 -0
- package/lib/stores/videoStore.d.ts +39 -0
- package/lib/stores/videoStore.d.ts.map +1 -0
- package/lib/stores/videoStore.js +132 -0
- package/lib/stores/websocketStore.d.ts +24 -0
- package/lib/stores/websocketStore.d.ts.map +1 -0
- package/lib/stores/websocketStore.js +51 -0
- package/lib/types/apps.types.d.ts +17 -0
- package/lib/types/apps.types.d.ts.map +1 -0
- package/lib/types/apps.types.js +6 -0
- package/lib/types/common.types.d.ts +31 -0
- package/lib/types/common.types.d.ts.map +1 -0
- package/lib/types/common.types.js +6 -0
- package/lib/types/conversations.types.d.ts +17 -0
- package/lib/types/conversations.types.d.ts.map +1 -0
- package/lib/types/conversations.types.js +6 -0
- package/lib/types/edges.types.d.ts +38 -0
- package/lib/types/edges.types.d.ts.map +1 -0
- package/lib/types/edges.types.js +6 -0
- package/lib/types/groups.types.d.ts +19 -0
- package/lib/types/groups.types.d.ts.map +1 -0
- package/lib/types/groups.types.js +6 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +12 -0
- package/lib/types/subscriptions.types.d.ts +32 -0
- package/lib/types/subscriptions.types.d.ts.map +1 -0
- package/lib/types/subscriptions.types.js +6 -0
- package/lib/types/videos.types.d.ts +61 -0
- package/lib/types/videos.types.d.ts.map +1 -0
- package/lib/types/videos.types.js +6 -0
- package/lib/utils/MetropolisProvider.d.ts +58 -0
- package/lib/utils/MetropolisProvider.d.ts.map +1 -0
- package/lib/utils/MetropolisProvider.js +31 -0
- package/lib/utils/actionFactory.d.ts +24 -0
- package/lib/utils/actionFactory.d.ts.map +1 -0
- package/lib/utils/actionFactory.js +95 -0
- package/lib/utils/api.d.ts +44 -0
- package/lib/utils/api.d.ts.map +1 -0
- package/lib/utils/api.js +253 -0
- package/lib/utils/app.d.ts +7 -0
- package/lib/utils/app.d.ts.map +1 -0
- package/lib/utils/app.js +15 -0
- package/lib/utils/baseActionFactory.d.ts +16 -0
- package/lib/utils/baseActionFactory.d.ts.map +1 -0
- package/lib/utils/baseActionFactory.js +72 -0
- package/lib/utils/configUtils.d.ts +11 -0
- package/lib/utils/configUtils.d.ts.map +1 -0
- package/lib/utils/configUtils.js +20 -0
- package/lib/utils/dateUtils.d.ts +3 -0
- package/lib/utils/dateUtils.d.ts.map +1 -0
- package/lib/utils/dateUtils.js +11 -0
- package/lib/utils/file.d.ts +3 -0
- package/lib/utils/file.d.ts.map +1 -0
- package/lib/utils/file.js +156 -0
- package/lib/utils/i18n.d.ts +7 -0
- package/lib/utils/i18n.d.ts.map +1 -0
- package/lib/utils/i18n.js +96 -0
- package/lib/utils/index.d.ts +20 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +26 -0
- package/lib/utils/location.d.ts +10 -0
- package/lib/utils/location.d.ts.map +1 -0
- package/lib/utils/location.js +82 -0
- package/lib/utils/permissionUtils.d.ts +22 -0
- package/lib/utils/permissionUtils.d.ts.map +1 -0
- package/lib/utils/permissionUtils.js +72 -0
- package/lib/utils/requestCache.d.ts +8 -0
- package/lib/utils/requestCache.d.ts.map +1 -0
- package/lib/utils/requestCache.js +53 -0
- package/lib/utils/session.d.ts +14 -0
- package/lib/utils/session.d.ts.map +1 -0
- package/lib/utils/session.js +107 -0
- package/lib/utils/useConversationTyping.d.ts +26 -0
- package/lib/utils/useConversationTyping.d.ts.map +1 -0
- package/lib/utils/useConversationTyping.js +117 -0
- package/lib/utils/useMetropolis.d.ts +67 -0
- package/lib/utils/useMetropolis.d.ts.map +1 -0
- package/lib/utils/useMetropolis.js +311 -0
- package/lib/utils/useTranslations.d.ts +16 -0
- package/lib/utils/useTranslations.d.ts.map +1 -0
- package/lib/utils/useTranslations.js +105 -0
- package/lib/utils/validatorFactory.d.ts +49 -0
- package/lib/utils/validatorFactory.d.ts.map +1 -0
- package/lib/utils/validatorFactory.js +95 -0
- package/package.json +75 -28
- package/temp_signin.ts +73 -0
- package/tsconfig.lint.json +25 -0
- package/tsconfig.test.json +14 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { FluxFramework } from '@nlabs/arkhamjs';
|
|
2
|
+
import type { VideoMultipartUploadType, VideoType, VideoUploadPartInput, VideoUploadPartUrl } from '../../types/videos.types.js';
|
|
3
|
+
import type { ActionRequestOptions } from '../../utils/requestCache.js';
|
|
4
|
+
import type { BaseAdapterOptions } from '../../utils/validatorFactory.js';
|
|
5
|
+
export type VideoAdapterOptions = BaseAdapterOptions;
|
|
6
|
+
export interface VideoActionsOptions {
|
|
7
|
+
readonly videoAdapter?: (input: unknown, options?: VideoAdapterOptions) => any;
|
|
8
|
+
readonly videoAdapterOptions?: VideoAdapterOptions;
|
|
9
|
+
}
|
|
10
|
+
export type VideoApiResultsType = {
|
|
11
|
+
readonly videos: {
|
|
12
|
+
readonly add?: VideoType;
|
|
13
|
+
readonly abortMultipartUpload?: boolean;
|
|
14
|
+
readonly completeMultipartUpload?: VideoType;
|
|
15
|
+
readonly createMultipartUpload?: VideoMultipartUploadType;
|
|
16
|
+
readonly getMultipartUploadPartUrls?: VideoUploadPartUrl[];
|
|
17
|
+
readonly getVideoById?: VideoType;
|
|
18
|
+
readonly getVideoListByItem?: VideoType[];
|
|
19
|
+
readonly getVideoListByReactions?: VideoType[];
|
|
20
|
+
readonly list?: VideoType[];
|
|
21
|
+
readonly remove?: VideoType;
|
|
22
|
+
readonly update?: VideoType;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export interface VideoActions {
|
|
26
|
+
readonly add: (videoData: Partial<VideoType>, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
|
|
27
|
+
readonly abortMultipartUpload: (videoId: string, uploadId: string, requestOptions?: ActionRequestOptions) => Promise<boolean>;
|
|
28
|
+
readonly completeMultipartUpload: (videoId: string, uploadId: string, parts: VideoUploadPartInput[], videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
|
|
29
|
+
readonly createMultipartUpload: (videoData: Partial<VideoType>, partCount: number, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoMultipartUploadType>;
|
|
30
|
+
readonly delete: (videoId: string, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
|
|
31
|
+
readonly getMultipartUploadPartUrls: (videoId: string, uploadId: string, partNumbers: number[], requestOptions?: ActionRequestOptions) => Promise<VideoUploadPartUrl[]>;
|
|
32
|
+
readonly getVideoById: (videoId: string, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
|
|
33
|
+
readonly list: (from?: number, to?: number, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType[]>;
|
|
34
|
+
readonly listByItem: (itemId: string, from?: number, to?: number, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType[]>;
|
|
35
|
+
readonly listByReactions: (reactions: string[], from?: number, to?: number, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType[]>;
|
|
36
|
+
readonly update: (video: Partial<VideoType>, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
|
|
37
|
+
readonly updateVideoAdapter: (adapter: (input: unknown, options?: VideoAdapterOptions) => any) => void;
|
|
38
|
+
readonly updateVideoAdapterOptions: (options: VideoAdapterOptions) => void;
|
|
39
|
+
}
|
|
40
|
+
export declare const createVideoActions: (flux: FluxFramework, options?: VideoActionsOptions) => VideoActions;
|
|
41
|
+
//# sourceMappingURL=videoActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"videoActions.d.ts","sourceRoot":"","sources":["../../../src/actions/videoActions/videoActions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { parseId, parseNum } from '@nlabs/utils';
|
|
5
|
+
import { validateVideoInput } from '../../adapters/videoAdapter/videoAdapter.js';
|
|
6
|
+
import { VIDEO_CONSTANTS } from '../../stores/videoStore.js';
|
|
7
|
+
import { appMutation, appQuery } from '../../utils/api.js';
|
|
8
|
+
import { createBaseActions } from '../../utils/baseActionFactory.js';
|
|
9
|
+
import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
|
|
10
|
+
const DATA_TYPE = 'videos';
|
|
11
|
+
const defaultVideoValidator = (input, options)=>validateVideoInput(input);
|
|
12
|
+
export const createVideoActions = (flux, options)=>{
|
|
13
|
+
const videoBase = createBaseActions(flux, defaultVideoValidator, {
|
|
14
|
+
adapter: options?.videoAdapter,
|
|
15
|
+
adapterOptions: options?.videoAdapterOptions
|
|
16
|
+
});
|
|
17
|
+
const add = async (videoData, videoProps = [], requestOptions = {})=>{
|
|
18
|
+
try {
|
|
19
|
+
const queryVariables = {
|
|
20
|
+
video: {
|
|
21
|
+
type: 'VideoInput!',
|
|
22
|
+
value: videoBase.validator(videoData)
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const onSuccess = async (data)=>{
|
|
26
|
+
const video = data?.videos?.add || {};
|
|
27
|
+
await flux.dispatch({
|
|
28
|
+
type: VIDEO_CONSTANTS.ADD_ITEM_SUCCESS,
|
|
29
|
+
video
|
|
30
|
+
});
|
|
31
|
+
return video;
|
|
32
|
+
};
|
|
33
|
+
return await appMutation(flux, 'add', DATA_TYPE, queryVariables, [
|
|
34
|
+
'videoId',
|
|
35
|
+
...videoProps
|
|
36
|
+
], {
|
|
37
|
+
onSuccess: onSuccess
|
|
38
|
+
});
|
|
39
|
+
} catch (error) {
|
|
40
|
+
flux.dispatch({
|
|
41
|
+
error,
|
|
42
|
+
type: VIDEO_CONSTANTS.ADD_ITEM_ERROR
|
|
43
|
+
});
|
|
44
|
+
throw error;
|
|
45
|
+
} finally{
|
|
46
|
+
await clearCachedRequest(flux, 'video.list');
|
|
47
|
+
await clearCachedRequest(flux, `video.listByItem:${String(videoData?.itemId || '')}`);
|
|
48
|
+
await clearCachedRequest(flux, 'video.listByReactions');
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const getVideoById = async (videoId, videoProps = [], requestOptions = {})=>{
|
|
52
|
+
try {
|
|
53
|
+
const cachedResult = getCachedRequest(flux, `video.getVideoById:${videoId}`, {
|
|
54
|
+
videoId,
|
|
55
|
+
videoProps
|
|
56
|
+
}, requestOptions);
|
|
57
|
+
if (cachedResult !== undefined) {
|
|
58
|
+
return cachedResult;
|
|
59
|
+
}
|
|
60
|
+
const queryVariables = {
|
|
61
|
+
videoId: {
|
|
62
|
+
type: 'ID!',
|
|
63
|
+
value: parseId(videoId)
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const onSuccess = async (data)=>{
|
|
67
|
+
const video = data?.videos?.getVideoById || {};
|
|
68
|
+
await flux.dispatch({
|
|
69
|
+
type: VIDEO_CONSTANTS.GET_ITEM_SUCCESS,
|
|
70
|
+
video
|
|
71
|
+
});
|
|
72
|
+
return video;
|
|
73
|
+
};
|
|
74
|
+
const result = await appQuery(flux, 'getVideoById', DATA_TYPE, queryVariables, [
|
|
75
|
+
'description',
|
|
76
|
+
'duration',
|
|
77
|
+
'format',
|
|
78
|
+
'height',
|
|
79
|
+
'mimeType',
|
|
80
|
+
'name',
|
|
81
|
+
'privacy',
|
|
82
|
+
'size',
|
|
83
|
+
'thumbUrl',
|
|
84
|
+
'url',
|
|
85
|
+
'userId',
|
|
86
|
+
'videoId',
|
|
87
|
+
'width',
|
|
88
|
+
...videoProps
|
|
89
|
+
], {
|
|
90
|
+
onSuccess: onSuccess
|
|
91
|
+
});
|
|
92
|
+
return await setCachedRequest(flux, `video.getVideoById:${videoId}`, {
|
|
93
|
+
videoId,
|
|
94
|
+
videoProps
|
|
95
|
+
}, result, requestOptions);
|
|
96
|
+
} catch (error) {
|
|
97
|
+
flux.dispatch({
|
|
98
|
+
error,
|
|
99
|
+
type: VIDEO_CONSTANTS.GET_ITEM_ERROR
|
|
100
|
+
});
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const createMultipartUpload = async (videoData, partCount, videoProps = [], requestOptions = {})=>{
|
|
105
|
+
try {
|
|
106
|
+
const queryVariables = {
|
|
107
|
+
partCount: {
|
|
108
|
+
type: 'Int!',
|
|
109
|
+
value: parseNum(partCount)
|
|
110
|
+
},
|
|
111
|
+
video: {
|
|
112
|
+
type: 'VideoInput!',
|
|
113
|
+
value: videoBase.validator(videoData)
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const onSuccess = async (data)=>{
|
|
117
|
+
const upload = data?.videos?.createMultipartUpload || {};
|
|
118
|
+
const video = upload?.video || {};
|
|
119
|
+
await flux.dispatch({
|
|
120
|
+
type: VIDEO_CONSTANTS.ADD_ITEM_SUCCESS,
|
|
121
|
+
video
|
|
122
|
+
});
|
|
123
|
+
return upload;
|
|
124
|
+
};
|
|
125
|
+
return await appMutation(flux, 'createMultipartUpload', DATA_TYPE, queryVariables, [
|
|
126
|
+
'bucket',
|
|
127
|
+
'key',
|
|
128
|
+
'partSize',
|
|
129
|
+
'uploadId',
|
|
130
|
+
'videoId',
|
|
131
|
+
'partUrls {partNumber url}',
|
|
132
|
+
`video {videoId ${videoProps.join(' ')}}`
|
|
133
|
+
], {
|
|
134
|
+
onSuccess: onSuccess
|
|
135
|
+
});
|
|
136
|
+
} catch (error) {
|
|
137
|
+
flux.dispatch({
|
|
138
|
+
error,
|
|
139
|
+
type: VIDEO_CONSTANTS.ADD_ITEM_ERROR
|
|
140
|
+
});
|
|
141
|
+
throw error;
|
|
142
|
+
} finally{
|
|
143
|
+
await clearCachedRequest(flux, 'video.list');
|
|
144
|
+
await clearCachedRequest(flux, `video.listByItem:${String(videoData?.itemId || '')}`);
|
|
145
|
+
await clearCachedRequest(flux, 'video.listByReactions');
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
const getMultipartUploadPartUrls = async (videoId, uploadId, partNumbers, requestOptions = {})=>{
|
|
149
|
+
try {
|
|
150
|
+
const queryVariables = {
|
|
151
|
+
partNumbers: {
|
|
152
|
+
type: '[Int!]!',
|
|
153
|
+
value: partNumbers.map((partNumber)=>parseNum(partNumber))
|
|
154
|
+
},
|
|
155
|
+
uploadId: {
|
|
156
|
+
type: 'String!',
|
|
157
|
+
value: uploadId
|
|
158
|
+
},
|
|
159
|
+
videoId: {
|
|
160
|
+
type: 'ID!',
|
|
161
|
+
value: parseId(videoId)
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const onSuccess = async (data)=>data?.videos?.getMultipartUploadPartUrls || [];
|
|
165
|
+
return await appMutation(flux, 'getMultipartUploadPartUrls', DATA_TYPE, queryVariables, [
|
|
166
|
+
'partNumber',
|
|
167
|
+
'url'
|
|
168
|
+
], {
|
|
169
|
+
onSuccess: onSuccess
|
|
170
|
+
});
|
|
171
|
+
} catch (error) {
|
|
172
|
+
flux.dispatch({
|
|
173
|
+
error,
|
|
174
|
+
type: VIDEO_CONSTANTS.UPDATE_ITEM_ERROR
|
|
175
|
+
});
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const completeMultipartUpload = async (videoId, uploadId, parts, videoProps = [], requestOptions = {})=>{
|
|
180
|
+
try {
|
|
181
|
+
const queryVariables = {
|
|
182
|
+
parts: {
|
|
183
|
+
type: '[VideoUploadPartInput!]',
|
|
184
|
+
value: parts
|
|
185
|
+
},
|
|
186
|
+
uploadId: {
|
|
187
|
+
type: 'String!',
|
|
188
|
+
value: uploadId
|
|
189
|
+
},
|
|
190
|
+
videoId: {
|
|
191
|
+
type: 'ID!',
|
|
192
|
+
value: parseId(videoId)
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
const onSuccess = async (data)=>{
|
|
196
|
+
const video = data?.videos?.completeMultipartUpload || {};
|
|
197
|
+
await flux.dispatch({
|
|
198
|
+
type: VIDEO_CONSTANTS.UPDATE_ITEM_SUCCESS,
|
|
199
|
+
video
|
|
200
|
+
});
|
|
201
|
+
await flux.dispatch({
|
|
202
|
+
type: VIDEO_CONSTANTS.PROCESSING_COMPLETE,
|
|
203
|
+
video
|
|
204
|
+
});
|
|
205
|
+
return video;
|
|
206
|
+
};
|
|
207
|
+
return await appMutation(flux, 'completeMultipartUpload', DATA_TYPE, queryVariables, [
|
|
208
|
+
'videoId',
|
|
209
|
+
...videoProps
|
|
210
|
+
], {
|
|
211
|
+
onSuccess: onSuccess
|
|
212
|
+
});
|
|
213
|
+
} catch (error) {
|
|
214
|
+
flux.dispatch({
|
|
215
|
+
error,
|
|
216
|
+
type: VIDEO_CONSTANTS.UPDATE_ITEM_ERROR
|
|
217
|
+
});
|
|
218
|
+
throw error;
|
|
219
|
+
} finally{
|
|
220
|
+
await clearCachedRequest(flux, `video.getVideoById:${videoId}`);
|
|
221
|
+
await clearCachedRequest(flux, 'video.list');
|
|
222
|
+
await clearCachedRequest(flux, 'video.listByReactions');
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
const abortMultipartUpload = async (videoId, uploadId, requestOptions = {})=>{
|
|
226
|
+
try {
|
|
227
|
+
const queryVariables = {
|
|
228
|
+
uploadId: {
|
|
229
|
+
type: 'String!',
|
|
230
|
+
value: uploadId
|
|
231
|
+
},
|
|
232
|
+
videoId: {
|
|
233
|
+
type: 'ID!',
|
|
234
|
+
value: parseId(videoId)
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
const onSuccess = async (data)=>!!data?.videos?.abortMultipartUpload;
|
|
238
|
+
return await appMutation(flux, 'abortMultipartUpload', DATA_TYPE, queryVariables, [], {
|
|
239
|
+
onSuccess: onSuccess
|
|
240
|
+
});
|
|
241
|
+
} catch (error) {
|
|
242
|
+
flux.dispatch({
|
|
243
|
+
error,
|
|
244
|
+
type: VIDEO_CONSTANTS.UPDATE_ITEM_ERROR
|
|
245
|
+
});
|
|
246
|
+
throw error;
|
|
247
|
+
} finally{
|
|
248
|
+
await clearCachedRequest(flux, `video.getVideoById:${videoId}`);
|
|
249
|
+
await clearCachedRequest(flux, 'video.list');
|
|
250
|
+
await clearCachedRequest(flux, 'video.listByReactions');
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
const list = async (from = 0, to = 10, videoProps = [], requestOptions = {})=>{
|
|
254
|
+
try {
|
|
255
|
+
const cachedResult = getCachedRequest(flux, 'video.list', {
|
|
256
|
+
from,
|
|
257
|
+
to,
|
|
258
|
+
videoProps
|
|
259
|
+
}, requestOptions);
|
|
260
|
+
if (cachedResult !== undefined) {
|
|
261
|
+
return cachedResult;
|
|
262
|
+
}
|
|
263
|
+
const queryVariables = {
|
|
264
|
+
from: {
|
|
265
|
+
type: 'Int',
|
|
266
|
+
value: parseNum(from)
|
|
267
|
+
},
|
|
268
|
+
to: {
|
|
269
|
+
type: 'Int',
|
|
270
|
+
value: parseNum(to)
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
const onSuccess = async (data)=>{
|
|
274
|
+
const list = data?.videos?.list || [];
|
|
275
|
+
await flux.dispatch({
|
|
276
|
+
list,
|
|
277
|
+
type: VIDEO_CONSTANTS.GET_LIST_SUCCESS
|
|
278
|
+
});
|
|
279
|
+
return list;
|
|
280
|
+
};
|
|
281
|
+
const result = await appQuery(flux, 'list', DATA_TYPE, queryVariables, [
|
|
282
|
+
'description',
|
|
283
|
+
'duration',
|
|
284
|
+
'format',
|
|
285
|
+
'height',
|
|
286
|
+
'mimeType',
|
|
287
|
+
'name',
|
|
288
|
+
'privacy',
|
|
289
|
+
'size',
|
|
290
|
+
'thumbUrl',
|
|
291
|
+
'url',
|
|
292
|
+
'userId',
|
|
293
|
+
'videoId',
|
|
294
|
+
'width',
|
|
295
|
+
...videoProps
|
|
296
|
+
], {
|
|
297
|
+
onSuccess: onSuccess
|
|
298
|
+
});
|
|
299
|
+
return await setCachedRequest(flux, 'video.list', {
|
|
300
|
+
from,
|
|
301
|
+
to,
|
|
302
|
+
videoProps
|
|
303
|
+
}, result, requestOptions);
|
|
304
|
+
} catch (error) {
|
|
305
|
+
flux.dispatch({
|
|
306
|
+
error,
|
|
307
|
+
type: VIDEO_CONSTANTS.GET_LIST_ERROR
|
|
308
|
+
});
|
|
309
|
+
throw error;
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
const listByItem = async (itemId, from = 0, to = 10, videoProps = [], requestOptions = {})=>{
|
|
313
|
+
try {
|
|
314
|
+
const cachedResult = getCachedRequest(flux, `video.listByItem:${itemId}`, {
|
|
315
|
+
from,
|
|
316
|
+
itemId,
|
|
317
|
+
to,
|
|
318
|
+
videoProps
|
|
319
|
+
}, requestOptions);
|
|
320
|
+
if (cachedResult !== undefined) {
|
|
321
|
+
return cachedResult;
|
|
322
|
+
}
|
|
323
|
+
const queryVariables = {
|
|
324
|
+
from: {
|
|
325
|
+
type: 'Int',
|
|
326
|
+
value: parseNum(from)
|
|
327
|
+
},
|
|
328
|
+
itemId: {
|
|
329
|
+
type: 'ID!',
|
|
330
|
+
value: parseId(itemId)
|
|
331
|
+
},
|
|
332
|
+
to: {
|
|
333
|
+
type: 'Int',
|
|
334
|
+
value: parseNum(to)
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
const onSuccess = async (data)=>{
|
|
338
|
+
const list = data?.videos?.getVideoListByItem || [];
|
|
339
|
+
await flux.dispatch({
|
|
340
|
+
list,
|
|
341
|
+
type: VIDEO_CONSTANTS.GET_LIST_SUCCESS
|
|
342
|
+
});
|
|
343
|
+
return list;
|
|
344
|
+
};
|
|
345
|
+
const result = await appQuery(flux, 'getVideoListByItem', DATA_TYPE, queryVariables, [
|
|
346
|
+
'description',
|
|
347
|
+
'durationMs',
|
|
348
|
+
'fileSize',
|
|
349
|
+
'fileType',
|
|
350
|
+
'height',
|
|
351
|
+
'hlsUrl',
|
|
352
|
+
'playbackFileType',
|
|
353
|
+
'playbackUrl',
|
|
354
|
+
'privacy',
|
|
355
|
+
'thumbUrl',
|
|
356
|
+
'type',
|
|
357
|
+
'url',
|
|
358
|
+
'userId',
|
|
359
|
+
'videoId',
|
|
360
|
+
'width',
|
|
361
|
+
...videoProps
|
|
362
|
+
], {
|
|
363
|
+
onSuccess: onSuccess
|
|
364
|
+
});
|
|
365
|
+
return await setCachedRequest(flux, `video.listByItem:${itemId}`, {
|
|
366
|
+
from,
|
|
367
|
+
itemId,
|
|
368
|
+
to,
|
|
369
|
+
videoProps
|
|
370
|
+
}, result, requestOptions);
|
|
371
|
+
} catch (error) {
|
|
372
|
+
flux.dispatch({
|
|
373
|
+
error,
|
|
374
|
+
type: VIDEO_CONSTANTS.GET_LIST_ERROR
|
|
375
|
+
});
|
|
376
|
+
throw error;
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
const listByReactions = async (reactions, from = 0, to = 10, videoProps = [], requestOptions = {})=>{
|
|
380
|
+
try {
|
|
381
|
+
const cachedResult = getCachedRequest(flux, 'video.listByReactions', {
|
|
382
|
+
from,
|
|
383
|
+
reactions,
|
|
384
|
+
to,
|
|
385
|
+
videoProps
|
|
386
|
+
}, requestOptions);
|
|
387
|
+
if (cachedResult !== undefined) {
|
|
388
|
+
return cachedResult;
|
|
389
|
+
}
|
|
390
|
+
const queryVariables = {
|
|
391
|
+
from: {
|
|
392
|
+
type: 'Int',
|
|
393
|
+
value: parseNum(from)
|
|
394
|
+
},
|
|
395
|
+
reactions: {
|
|
396
|
+
type: '[String!]',
|
|
397
|
+
value: reactions
|
|
398
|
+
},
|
|
399
|
+
to: {
|
|
400
|
+
type: 'Int',
|
|
401
|
+
value: parseNum(to)
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
const onSuccess = async (data)=>{
|
|
405
|
+
const list = data?.videos?.getVideoListByReactions || [];
|
|
406
|
+
await flux.dispatch({
|
|
407
|
+
list,
|
|
408
|
+
type: VIDEO_CONSTANTS.GET_LIST_SUCCESS
|
|
409
|
+
});
|
|
410
|
+
return list;
|
|
411
|
+
};
|
|
412
|
+
const result = await appQuery(flux, 'getVideoListByReactions', DATA_TYPE, queryVariables, [
|
|
413
|
+
'description',
|
|
414
|
+
'durationMs',
|
|
415
|
+
'fileSize',
|
|
416
|
+
'fileType',
|
|
417
|
+
'height',
|
|
418
|
+
'hlsUrl',
|
|
419
|
+
'playbackFileType',
|
|
420
|
+
'playbackUrl',
|
|
421
|
+
'privacy',
|
|
422
|
+
'thumbUrl',
|
|
423
|
+
'type',
|
|
424
|
+
'url',
|
|
425
|
+
'userId',
|
|
426
|
+
'videoId',
|
|
427
|
+
'width',
|
|
428
|
+
...videoProps
|
|
429
|
+
], {
|
|
430
|
+
onSuccess: onSuccess
|
|
431
|
+
});
|
|
432
|
+
return await setCachedRequest(flux, 'video.listByReactions', {
|
|
433
|
+
from,
|
|
434
|
+
reactions,
|
|
435
|
+
to,
|
|
436
|
+
videoProps
|
|
437
|
+
}, result, requestOptions);
|
|
438
|
+
} catch (error) {
|
|
439
|
+
flux.dispatch({
|
|
440
|
+
error,
|
|
441
|
+
type: VIDEO_CONSTANTS.GET_LIST_ERROR
|
|
442
|
+
});
|
|
443
|
+
throw error;
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
const deleteVideo = async (videoId, videoProps = [], requestOptions = {})=>{
|
|
447
|
+
try {
|
|
448
|
+
const queryVariables = {
|
|
449
|
+
videoId: {
|
|
450
|
+
type: 'ID!',
|
|
451
|
+
value: parseId(videoId)
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
const onSuccess = async (data)=>{
|
|
455
|
+
const video = data?.videos?.remove || {};
|
|
456
|
+
await flux.dispatch({
|
|
457
|
+
type: VIDEO_CONSTANTS.REMOVE_ITEM_SUCCESS,
|
|
458
|
+
video
|
|
459
|
+
});
|
|
460
|
+
return video;
|
|
461
|
+
};
|
|
462
|
+
return await appMutation(flux, 'remove', DATA_TYPE, queryVariables, [
|
|
463
|
+
'videoId',
|
|
464
|
+
...videoProps
|
|
465
|
+
], {
|
|
466
|
+
onSuccess: onSuccess
|
|
467
|
+
});
|
|
468
|
+
} catch (error) {
|
|
469
|
+
flux.dispatch({
|
|
470
|
+
error,
|
|
471
|
+
type: VIDEO_CONSTANTS.REMOVE_ITEM_ERROR
|
|
472
|
+
});
|
|
473
|
+
throw error;
|
|
474
|
+
} finally{
|
|
475
|
+
await clearCachedRequest(flux, `video.getVideoById:${videoId}`);
|
|
476
|
+
await clearCachedRequest(flux, 'video.list');
|
|
477
|
+
await clearCachedRequest(flux, 'video.listByReactions');
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
const update = async (video, videoProps = [], requestOptions = {})=>{
|
|
481
|
+
try {
|
|
482
|
+
const queryVariables = {
|
|
483
|
+
video: {
|
|
484
|
+
type: 'VideoInput!',
|
|
485
|
+
value: videoBase.validator(video)
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
const onSuccess = async (data)=>{
|
|
489
|
+
const video = data?.videos?.update || {};
|
|
490
|
+
await flux.dispatch({
|
|
491
|
+
type: VIDEO_CONSTANTS.UPDATE_ITEM_SUCCESS,
|
|
492
|
+
video
|
|
493
|
+
});
|
|
494
|
+
return video;
|
|
495
|
+
};
|
|
496
|
+
return await appMutation(flux, 'update', DATA_TYPE, queryVariables, [
|
|
497
|
+
'videoId',
|
|
498
|
+
...videoProps
|
|
499
|
+
], {
|
|
500
|
+
onSuccess: onSuccess
|
|
501
|
+
});
|
|
502
|
+
} catch (error) {
|
|
503
|
+
flux.dispatch({
|
|
504
|
+
error,
|
|
505
|
+
type: VIDEO_CONSTANTS.UPDATE_ITEM_ERROR
|
|
506
|
+
});
|
|
507
|
+
throw error;
|
|
508
|
+
} finally{
|
|
509
|
+
await clearCachedRequest(flux, `video.getVideoById:${String(video?.videoId || '')}`);
|
|
510
|
+
await clearCachedRequest(flux, 'video.list');
|
|
511
|
+
await clearCachedRequest(flux, `video.listByItem:${String(video?.itemId || '')}`);
|
|
512
|
+
await clearCachedRequest(flux, 'video.listByReactions');
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
return {
|
|
516
|
+
abortMultipartUpload,
|
|
517
|
+
add,
|
|
518
|
+
completeMultipartUpload,
|
|
519
|
+
createMultipartUpload,
|
|
520
|
+
delete: deleteVideo,
|
|
521
|
+
getMultipartUploadPartUrls,
|
|
522
|
+
getVideoById,
|
|
523
|
+
list,
|
|
524
|
+
listByItem,
|
|
525
|
+
listByReactions,
|
|
526
|
+
update,
|
|
527
|
+
updateVideoAdapter: videoBase.updateAdapter,
|
|
528
|
+
updateVideoAdapterOptions: videoBase.updateOptions
|
|
529
|
+
};
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy92aWRlb0FjdGlvbnMvdmlkZW9BY3Rpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge3BhcnNlSWQsIHBhcnNlTnVtfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlVmlkZW9JbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdmlkZW9BZGFwdGVyL3ZpZGVvQWRhcHRlci5qcyc7XG5pbXBvcnQge1ZJREVPX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3ZpZGVvU3RvcmUuanMnO1xuaW1wb3J0IHthcHBNdXRhdGlvbiwgYXBwUXVlcnl9IGZyb20gJy4uLy4uL3V0aWxzL2FwaS5qcyc7XG5pbXBvcnQge2NyZWF0ZUJhc2VBY3Rpb25zfSBmcm9tICcuLi8uLi91dGlscy9iYXNlQWN0aW9uRmFjdG9yeS5qcyc7XG5pbXBvcnQge2NsZWFyQ2FjaGVkUmVxdWVzdCwgZ2V0Q2FjaGVkUmVxdWVzdCwgc2V0Q2FjaGVkUmVxdWVzdH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdENhY2hlLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7VmlkZW9NdWx0aXBhcnRVcGxvYWRUeXBlLCBWaWRlb1R5cGUsIFZpZGVvVXBsb2FkUGFydElucHV0LCBWaWRlb1VwbG9hZFBhcnRVcmx9IGZyb20gJy4uLy4uL3R5cGVzL3ZpZGVvcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSB7QmFzZUFkYXB0ZXJPcHRpb25zfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JGYWN0b3J5LmpzJztcblxuY29uc3QgREFUQV9UWVBFID0gJ3ZpZGVvcyc7XG5cbmV4cG9ydCB0eXBlIFZpZGVvQWRhcHRlck9wdGlvbnMgPSBCYXNlQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9BY3Rpb25zT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHZpZGVvQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFZpZGVvQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgcmVhZG9ubHkgdmlkZW9BZGFwdGVyT3B0aW9ucz86IFZpZGVvQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCB0eXBlIFZpZGVvQXBpUmVzdWx0c1R5cGUgPSB7XG4gIHJlYWRvbmx5IHZpZGVvczoge1xuICAgIHJlYWRvbmx5IGFkZD86IFZpZGVvVHlwZTtcbiAgICByZWFkb25seSBhYm9ydE11bHRpcGFydFVwbG9hZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQ/OiBWaWRlb1R5cGU7XG4gICAgcmVhZG9ubHkgY3JlYXRlTXVsdGlwYXJ0VXBsb2FkPzogVmlkZW9NdWx0aXBhcnRVcGxvYWRUeXBlO1xuICAgIHJlYWRvbmx5IGdldE11bHRpcGFydFVwbG9hZFBhcnRVcmxzPzogVmlkZW9VcGxvYWRQYXJ0VXJsW107XG4gICAgcmVhZG9ubHkgZ2V0VmlkZW9CeUlkPzogVmlkZW9UeXBlO1xuICAgIHJlYWRvbmx5IGdldFZpZGVvTGlzdEJ5SXRlbT86IFZpZGVvVHlwZVtdO1xuICAgIHJlYWRvbmx5IGdldFZpZGVvTGlzdEJ5UmVhY3Rpb25zPzogVmlkZW9UeXBlW107XG4gICAgcmVhZG9ubHkgbGlzdD86IFZpZGVvVHlwZVtdO1xuICAgIHJlYWRvbmx5IHJlbW92ZT86IFZpZGVvVHlwZTtcbiAgICByZWFkb25seSB1cGRhdGU/OiBWaWRlb1R5cGU7XG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpZGVvQWN0aW9ucyB7XG4gIHJlYWRvbmx5IGFkZDogKHZpZGVvRGF0YTogUGFydGlhbDxWaWRlb1R5cGU+LCB2aWRlb1Byb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VmlkZW9UeXBlPjtcbiAgcmVhZG9ubHkgYWJvcnRNdWx0aXBhcnRVcGxvYWQ6ICh2aWRlb0lkOiBzdHJpbmcsIHVwbG9hZElkOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IGNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkOiAodmlkZW9JZDogc3RyaW5nLCB1cGxvYWRJZDogc3RyaW5nLCBwYXJ0czogVmlkZW9VcGxvYWRQYXJ0SW5wdXRbXSwgdmlkZW9Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFZpZGVvVHlwZT47XG4gIHJlYWRvbmx5IGNyZWF0ZU11bHRpcGFydFVwbG9hZDogKHZpZGVvRGF0YTogUGFydGlhbDxWaWRlb1R5cGU+LCBwYXJ0Q291bnQ6IG51bWJlciwgdmlkZW9Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFZpZGVvTXVsdGlwYXJ0VXBsb2FkVHlwZT47XG4gIHJlYWRvbmx5IGRlbGV0ZTogKHZpZGVvSWQ6IHN0cmluZywgdmlkZW9Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFZpZGVvVHlwZT47XG4gIHJlYWRvbmx5IGdldE11bHRpcGFydFVwbG9hZFBhcnRVcmxzOiAodmlkZW9JZDogc3RyaW5nLCB1cGxvYWRJZDogc3RyaW5nLCBwYXJ0TnVtYmVyczogbnVtYmVyW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VmlkZW9VcGxvYWRQYXJ0VXJsW10+O1xuICByZWFkb25seSBnZXRWaWRlb0J5SWQ6ICh2aWRlb0lkOiBzdHJpbmcsIHZpZGVvUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxWaWRlb1R5cGU+O1xuICByZWFkb25seSBsaXN0OiAoZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIsIHZpZGVvUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxWaWRlb1R5cGVbXT47XG4gIHJlYWRvbmx5IGxpc3RCeUl0ZW06IChpdGVtSWQ6IHN0cmluZywgZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIsIHZpZGVvUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxWaWRlb1R5cGVbXT47XG4gIHJlYWRvbmx5IGxpc3RCeVJlYWN0aW9uczogKHJlYWN0aW9uczogc3RyaW5nW10sIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCB2aWRlb1Byb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VmlkZW9UeXBlW10+O1xuICByZWFkb25seSB1cGRhdGU6ICh2aWRlbzogUGFydGlhbDxWaWRlb1R5cGU+LCB2aWRlb1Byb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VmlkZW9UeXBlPjtcbiAgcmVhZG9ubHkgdXBkYXRlVmlkZW9BZGFwdGVyOiAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVmlkZW9BZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICByZWFkb25seSB1cGRhdGVWaWRlb0FkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogVmlkZW9BZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuY29uc3QgZGVmYXVsdFZpZGVvVmFsaWRhdG9yID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVmlkZW9BZGFwdGVyT3B0aW9ucykgPT5cbiAgdmFsaWRhdGVWaWRlb0lucHV0KGlucHV0KTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVZpZGVvQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IFZpZGVvQWN0aW9uc09wdGlvbnNcbik6IFZpZGVvQWN0aW9ucyA9PiB7XG4gIGNvbnN0IHZpZGVvQmFzZSA9IGNyZWF0ZUJhc2VBY3Rpb25zKGZsdXgsIGRlZmF1bHRWaWRlb1ZhbGlkYXRvciwge1xuICAgIGFkYXB0ZXI6IG9wdGlvbnM/LnZpZGVvQWRhcHRlcixcbiAgICBhZGFwdGVyT3B0aW9uczogb3B0aW9ucz8udmlkZW9BZGFwdGVyT3B0aW9uc1xuICB9KTtcblxuICBjb25zdCBhZGQgPSBhc3luYyAoXG4gICAgdmlkZW9EYXRhOiBQYXJ0aWFsPFZpZGVvVHlwZT4sXG4gICAgdmlkZW9Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdmlkZW86IHtcbiAgICAgICAgICB0eXBlOiAnVmlkZW9JbnB1dCEnLFxuICAgICAgICAgIHZhbHVlOiB2aWRlb0Jhc2UudmFsaWRhdG9yKHZpZGVvRGF0YSlcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gYXN5bmMgKGRhdGE6IFZpZGVvQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgICAgY29uc3QgdmlkZW8gPSBkYXRhPy52aWRlb3M/LmFkZCB8fCB7fTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7dHlwZTogVklERU9fQ09OU1RBTlRTLkFERF9JVEVNX1NVQ0NFU1MsIHZpZGVvfSk7XG4gICAgICAgIHJldHVybiB2aWRlbztcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxWaWRlb1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnYWRkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWyd2aWRlb0lkJywgLi4udmlkZW9Qcm9wc10sXG4gICAgICAgIHtvblN1Y2Nlc3M6IG9uU3VjY2VzcyBhcyBhbnl9XG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuQUREX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3ZpZGVvLmxpc3QnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8ubGlzdEJ5SXRlbToke1N0cmluZyh2aWRlb0RhdGE/Lml0ZW1JZCB8fCAnJyl9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3ZpZGVvLmxpc3RCeVJlYWN0aW9ucycpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRWaWRlb0J5SWQgPSBhc3luYyAodmlkZW9JZDogc3RyaW5nLCB2aWRlb1Byb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VmlkZW9UeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VmlkZW9UeXBlPihmbHV4LCBgdmlkZW8uZ2V0VmlkZW9CeUlkOiR7dmlkZW9JZH1gLCB7dmlkZW9JZCwgdmlkZW9Qcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIHZpZGVvSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZCh2aWRlb0lkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCB2aWRlbyA9IGRhdGE/LnZpZGVvcz8uZ2V0VmlkZW9CeUlkIHx8IHt9O1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHt0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdmlkZW99KTtcbiAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8VmlkZW9UeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldFZpZGVvQnlJZCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdkdXJhdGlvbicsXG4gICAgICAgICAgJ2Zvcm1hdCcsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ21pbWVUeXBlJyxcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgJ3ByaXZhY3knLFxuICAgICAgICAgICdzaXplJyxcbiAgICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLnZpZGVvUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8uZ2V0VmlkZW9CeUlkOiR7dmlkZW9JZH1gLCB7dmlkZW9JZCwgdmlkZW9Qcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjcmVhdGVNdWx0aXBhcnRVcGxvYWQgPSBhc3luYyAoXG4gICAgdmlkZW9EYXRhOiBQYXJ0aWFsPFZpZGVvVHlwZT4sXG4gICAgcGFydENvdW50OiBudW1iZXIsXG4gICAgdmlkZW9Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvTXVsdGlwYXJ0VXBsb2FkVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgcGFydENvdW50OiB7XG4gICAgICAgICAgdHlwZTogJ0ludCEnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZU51bShwYXJ0Q291bnQpXG4gICAgICAgIH0sXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgdHlwZTogJ1ZpZGVvSW5wdXQhJyxcbiAgICAgICAgICB2YWx1ZTogdmlkZW9CYXNlLnZhbGlkYXRvcih2aWRlb0RhdGEpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBWaWRlb0FwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwbG9hZCA9IChkYXRhPy52aWRlb3M/LmNyZWF0ZU11bHRpcGFydFVwbG9hZCB8fCB7fSkgYXMgVmlkZW9NdWx0aXBhcnRVcGxvYWRUeXBlO1xuICAgICAgICBjb25zdCB2aWRlbyA9IHVwbG9hZD8udmlkZW8gfHwge307XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe3R5cGU6IFZJREVPX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTLCB2aWRlb30pO1xuICAgICAgICByZXR1cm4gdXBsb2FkO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFZpZGVvTXVsdGlwYXJ0VXBsb2FkVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdjcmVhdGVNdWx0aXBhcnRVcGxvYWQnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2J1Y2tldCcsXG4gICAgICAgICAgJ2tleScsXG4gICAgICAgICAgJ3BhcnRTaXplJyxcbiAgICAgICAgICAndXBsb2FkSWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAncGFydFVybHMge3BhcnROdW1iZXIgdXJsfScsXG4gICAgICAgICAgYHZpZGVvIHt2aWRlb0lkICR7dmlkZW9Qcm9wcy5qb2luKCcgJyl9fWBcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFZJREVPX0NPTlNUQU5UUy5BRERfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdCcpO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB2aWRlby5saXN0QnlJdGVtOiR7U3RyaW5nKHZpZGVvRGF0YT8uaXRlbUlkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldE11bHRpcGFydFVwbG9hZFBhcnRVcmxzID0gYXN5bmMgKFxuICAgIHZpZGVvSWQ6IHN0cmluZyxcbiAgICB1cGxvYWRJZDogc3RyaW5nLFxuICAgIHBhcnROdW1iZXJzOiBudW1iZXJbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvVXBsb2FkUGFydFVybFtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBwYXJ0TnVtYmVyczoge1xuICAgICAgICAgIHR5cGU6ICdbSW50IV0hJyxcbiAgICAgICAgICB2YWx1ZTogcGFydE51bWJlcnMubWFwKChwYXJ0TnVtYmVyKSA9PiBwYXJzZU51bShwYXJ0TnVtYmVyKSlcbiAgICAgICAgfSxcbiAgICAgICAgdXBsb2FkSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgICAgdmFsdWU6IHVwbG9hZElkXG4gICAgICAgIH0sXG4gICAgICAgIHZpZGVvSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZCh2aWRlb0lkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT5cbiAgICAgICAgZGF0YT8udmlkZW9zPy5nZXRNdWx0aXBhcnRVcGxvYWRQYXJ0VXJscyB8fCBbXTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFZpZGVvVXBsb2FkUGFydFVybFtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldE11bHRpcGFydFVwbG9hZFBhcnRVcmxzJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWydwYXJ0TnVtYmVyJywgJ3VybCddLFxuICAgICAgICB7b25TdWNjZXNzOiBvblN1Y2Nlc3MgYXMgYW55fVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVklERU9fQ09OU1RBTlRTLlVQREFURV9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQgPSBhc3luYyAoXG4gICAgdmlkZW9JZDogc3RyaW5nLFxuICAgIHVwbG9hZElkOiBzdHJpbmcsXG4gICAgcGFydHM6IFZpZGVvVXBsb2FkUGFydElucHV0W10sXG4gICAgdmlkZW9Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICB0eXBlOiAnW1ZpZGVvVXBsb2FkUGFydElucHV0IV0nLFxuICAgICAgICAgIHZhbHVlOiBwYXJ0c1xuICAgICAgICB9LFxuICAgICAgICB1cGxvYWRJZDoge1xuICAgICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgICB2YWx1ZTogdXBsb2FkSWRcbiAgICAgICAgfSxcbiAgICAgICAgdmlkZW9JZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZUlkKHZpZGVvSWQpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBWaWRlb0FwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZGVvID0gZGF0YT8udmlkZW9zPy5jb21wbGV0ZU11bHRpcGFydFVwbG9hZCB8fCB7fTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7dHlwZTogVklERU9fQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsIHZpZGVvfSk7XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe3R5cGU6IFZJREVPX0NPTlNUQU5UUy5QUk9DRVNTSU5HX0NPTVBMRVRFLCB2aWRlb30pO1xuICAgICAgICByZXR1cm4gdmlkZW87XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb248VmlkZW9UeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2NvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWyd2aWRlb0lkJywgLi4udmlkZW9Qcm9wc10sXG4gICAgICAgIHtvblN1Y2Nlc3M6IG9uU3VjY2VzcyBhcyBhbnl9XG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuVVBEQVRFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYHZpZGVvLmdldFZpZGVvQnlJZDoke3ZpZGVvSWR9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3ZpZGVvLmxpc3QnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFib3J0TXVsdGlwYXJ0VXBsb2FkID0gYXN5bmMgKFxuICAgIHZpZGVvSWQ6IHN0cmluZyxcbiAgICB1cGxvYWRJZDogc3RyaW5nLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXBsb2FkSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgICAgdmFsdWU6IHVwbG9hZElkXG4gICAgICAgIH0sXG4gICAgICAgIHZpZGVvSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZCh2aWRlb0lkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT5cbiAgICAgICAgISFkYXRhPy52aWRlb3M/LmFib3J0TXVsdGlwYXJ0VXBsb2FkO1xuXG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb248Ym9vbGVhbj4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdhYm9ydE11bHRpcGFydFVwbG9hZCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtdLFxuICAgICAgICB7b25TdWNjZXNzOiBvblN1Y2Nlc3MgYXMgYW55fVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVklERU9fQ09OU1RBTlRTLlVQREFURV9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB2aWRlby5nZXRWaWRlb0J5SWQ6JHt2aWRlb0lkfWApO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd2aWRlby5saXN0Jyk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3ZpZGVvLmxpc3RCeVJlYWN0aW9ucycpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0ID0gYXN5bmMgKFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHZpZGVvUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxWaWRlb1R5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFZpZGVvVHlwZVtdPihmbHV4LCAndmlkZW8ubGlzdCcsIHtmcm9tLCB0bywgdmlkZW9Qcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VOdW0oZnJvbSlcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VOdW0odG8pXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBWaWRlb0FwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBkYXRhPy52aWRlb3M/Lmxpc3QgfHwgW107XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe1xuICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgdHlwZTogVklERU9fQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1NcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8VmlkZW9UeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnbGlzdCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdkdXJhdGlvbicsXG4gICAgICAgICAgJ2Zvcm1hdCcsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ21pbWVUeXBlJyxcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgJ3ByaXZhY3knLFxuICAgICAgICAgICdzaXplJyxcbiAgICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLnZpZGVvUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdCcsIHtmcm9tLCB0bywgdmlkZW9Qcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0QnlJdGVtID0gYXN5bmMgKFxuICAgIGl0ZW1JZDogc3RyaW5nLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHZpZGVvUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxWaWRlb1R5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFZpZGVvVHlwZVtdPihmbHV4LCBgdmlkZW8ubGlzdEJ5SXRlbToke2l0ZW1JZH1gLCB7ZnJvbSwgaXRlbUlkLCB0bywgdmlkZW9Qcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VOdW0oZnJvbSlcbiAgICAgICAgfSxcbiAgICAgICAgaXRlbUlkOiB7XG4gICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgdmFsdWU6IHBhcnNlSWQoaXRlbUlkKVxuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZU51bSh0bylcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gYXN5bmMgKGRhdGE6IFZpZGVvQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgICAgY29uc3QgbGlzdCA9IGRhdGE/LnZpZGVvcz8uZ2V0VmlkZW9MaXN0QnlJdGVtIHx8IFtdO1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBsaXN0LFxuICAgICAgICAgIHR5cGU6IFZJREVPX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcFF1ZXJ5PFZpZGVvVHlwZVtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldFZpZGVvTGlzdEJ5SXRlbScsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdkdXJhdGlvbk1zJyxcbiAgICAgICAgICAnZmlsZVNpemUnLFxuICAgICAgICAgICdmaWxlVHlwZScsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ2hsc1VybCcsXG4gICAgICAgICAgJ3BsYXliYWNrRmlsZVR5cGUnLFxuICAgICAgICAgICdwbGF5YmFja1VybCcsXG4gICAgICAgICAgJ3ByaXZhY3knLFxuICAgICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLnZpZGVvUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8ubGlzdEJ5SXRlbToke2l0ZW1JZH1gLCB7ZnJvbSwgaXRlbUlkLCB0bywgdmlkZW9Qcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0QnlSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgcmVhY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICB2aWRlb1Byb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VmlkZW9UeXBlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxWaWRlb1R5cGVbXT4oZmx1eCwgJ3ZpZGVvLmxpc3RCeVJlYWN0aW9ucycsIHtmcm9tLCByZWFjdGlvbnMsIHRvLCB2aWRlb1Byb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgZnJvbToge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZU51bShmcm9tKVxuICAgICAgICB9LFxuICAgICAgICByZWFjdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAnW1N0cmluZyFdJyxcbiAgICAgICAgICB2YWx1ZTogcmVhY3Rpb25zXG4gICAgICAgIH0sXG4gICAgICAgIHRvOiB7XG4gICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgdmFsdWU6IHBhcnNlTnVtKHRvKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBsaXN0ID0gZGF0YT8udmlkZW9zPy5nZXRWaWRlb0xpc3RCeVJlYWN0aW9ucyB8fCBbXTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgbGlzdCxcbiAgICAgICAgICB0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBRdWVyeTxWaWRlb1R5cGVbXT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdnZXRWaWRlb0xpc3RCeVJlYWN0aW9ucycsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdkdXJhdGlvbk1zJyxcbiAgICAgICAgICAnZmlsZVNpemUnLFxuICAgICAgICAgICdmaWxlVHlwZScsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ2hsc1VybCcsXG4gICAgICAgICAgJ3BsYXliYWNrRmlsZVR5cGUnLFxuICAgICAgICAgICdwbGF5YmFja1VybCcsXG4gICAgICAgICAgJ3ByaXZhY3knLFxuICAgICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLnZpZGVvUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdEJ5UmVhY3Rpb25zJywge2Zyb20sIHJlYWN0aW9ucywgdG8sIHZpZGVvUHJvcHN9LCByZXN1bHQsIHJlcXVlc3RPcHRpb25zKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVklERU9fQ09OU1RBTlRTLkdFVF9MSVNUX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlVmlkZW8gPSBhc3luYyAoXG4gICAgdmlkZW9JZDogc3RyaW5nLFxuICAgIHZpZGVvUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxWaWRlb1R5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIHZpZGVvSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZCh2aWRlb0lkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCB2aWRlbyA9IGRhdGE/LnZpZGVvcz8ucmVtb3ZlIHx8IHt9O1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHt0eXBlOiBWSURFT19DT05TVEFOVFMuUkVNT1ZFX0lURU1fU1VDQ0VTUywgdmlkZW99KTtcbiAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFZpZGVvVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdyZW1vdmUnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ3ZpZGVvSWQnLCAuLi52aWRlb1Byb3BzXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFZJREVPX0NPTlNUQU5UUy5SRU1PVkVfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8uZ2V0VmlkZW9CeUlkOiR7dmlkZW9JZH1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdCcpO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd2aWRlby5saXN0QnlSZWFjdGlvbnMnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlID0gYXN5bmMgKFxuICAgIHZpZGVvOiBQYXJ0aWFsPFZpZGVvVHlwZT4sXG4gICAgdmlkZW9Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdmlkZW86IHtcbiAgICAgICAgICB0eXBlOiAnVmlkZW9JbnB1dCEnLFxuICAgICAgICAgIHZhbHVlOiB2aWRlb0Jhc2UudmFsaWRhdG9yKHZpZGVvKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCB2aWRlbyA9IGRhdGE/LnZpZGVvcz8udXBkYXRlIHx8IHt9O1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHt0eXBlOiBWSURFT19DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUywgdmlkZW99KTtcbiAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFZpZGVvVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICd1cGRhdGUnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ3ZpZGVvSWQnLCAuLi52aWRlb1Byb3BzXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFZJREVPX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8uZ2V0VmlkZW9CeUlkOiR7U3RyaW5nKHZpZGVvPy52aWRlb0lkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdCcpO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB2aWRlby5saXN0QnlJdGVtOiR7U3RyaW5nKHZpZGVvPy5pdGVtSWQgfHwgJycpfWApO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd2aWRlby5saXN0QnlSZWFjdGlvbnMnKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBhYm9ydE11bHRpcGFydFVwbG9hZCxcbiAgICBhZGQsXG4gICAgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQsXG4gICAgY3JlYXRlTXVsdGlwYXJ0VXBsb2FkLFxuICAgIGRlbGV0ZTogZGVsZXRlVmlkZW8sXG4gICAgZ2V0TXVsdGlwYXJ0VXBsb2FkUGFydFVybHMsXG4gICAgZ2V0VmlkZW9CeUlkLFxuICAgIGxpc3QsXG4gICAgbGlzdEJ5SXRlbSxcbiAgICBsaXN0QnlSZWFjdGlvbnMsXG4gICAgdXBkYXRlLFxuICAgIHVwZGF0ZVZpZGVvQWRhcHRlcjogdmlkZW9CYXNlLnVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlVmlkZW9BZGFwdGVyT3B0aW9uczogdmlkZW9CYXNlLnVwZGF0ZU9wdGlvbnNcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsicGFyc2VJZCIsInBhcnNlTnVtIiwidmFsaWRhdGVWaWRlb0lucHV0IiwiVklERU9fQ09OU1RBTlRTIiwiYXBwTXV0YXRpb24iLCJhcHBRdWVyeSIsImNyZWF0ZUJhc2VBY3Rpb25zIiwiY2xlYXJDYWNoZWRSZXF1ZXN0IiwiZ2V0Q2FjaGVkUmVxdWVzdCIsInNldENhY2hlZFJlcXVlc3QiLCJEQVRBX1RZUEUiLCJkZWZhdWx0VmlkZW9WYWxpZGF0b3IiLCJpbnB1dCIsIm9wdGlvbnMiLCJjcmVhdGVWaWRlb0FjdGlvbnMiLCJmbHV4IiwidmlkZW9CYXNlIiwiYWRhcHRlciIsInZpZGVvQWRhcHRlciIsImFkYXB0ZXJPcHRpb25zIiwidmlkZW9BZGFwdGVyT3B0aW9ucyIsImFkZCIsInZpZGVvRGF0YSIsInZpZGVvUHJvcHMiLCJyZXF1ZXN0T3B0aW9ucyIsInF1ZXJ5VmFyaWFibGVzIiwidmlkZW8iLCJ0eXBlIiwidmFsdWUiLCJ2YWxpZGF0b3IiLCJvblN1Y2Nlc3MiLCJkYXRhIiwidmlkZW9zIiwiZGlzcGF0Y2giLCJBRERfSVRFTV9TVUNDRVNTIiwiZXJyb3IiLCJBRERfSVRFTV9FUlJPUiIsIlN0cmluZyIsIml0ZW1JZCIsImdldFZpZGVvQnlJZCIsInZpZGVvSWQiLCJjYWNoZWRSZXN1bHQiLCJ1bmRlZmluZWQiLCJHRVRfSVRFTV9TVUNDRVNTIiwicmVzdWx0IiwiR0VUX0lURU1fRVJST1IiLCJjcmVhdGVNdWx0aXBhcnRVcGxvYWQiLCJwYXJ0Q291bnQiLCJ1cGxvYWQiLCJqb2luIiwiZ2V0TXVsdGlwYXJ0VXBsb2FkUGFydFVybHMiLCJ1cGxvYWRJZCIsInBhcnROdW1iZXJzIiwibWFwIiwicGFydE51bWJlciIsIlVQREFURV9JVEVNX0VSUk9SIiwiY29tcGxldGVNdWx0aXBhcnRVcGxvYWQiLCJwYXJ0cyIsIlVQREFURV9JVEVNX1NVQ0NFU1MiLCJQUk9DRVNTSU5HX0NPTVBMRVRFIiwiYWJvcnRNdWx0aXBhcnRVcGxvYWQiLCJsaXN0IiwiZnJvbSIsInRvIiwiR0VUX0xJU1RfU1VDQ0VTUyIsIkdFVF9MSVNUX0VSUk9SIiwibGlzdEJ5SXRlbSIsImdldFZpZGVvTGlzdEJ5SXRlbSIsImxpc3RCeVJlYWN0aW9ucyIsInJlYWN0aW9ucyIsImdldFZpZGVvTGlzdEJ5UmVhY3Rpb25zIiwiZGVsZXRlVmlkZW8iLCJyZW1vdmUiLCJSRU1PVkVfSVRFTV9TVUNDRVNTIiwiUkVNT1ZFX0lURU1fRVJST1IiLCJ1cGRhdGUiLCJkZWxldGUiLCJ1cGRhdGVWaWRlb0FkYXB0ZXIiLCJ1cGRhdGVBZGFwdGVyIiwidXBkYXRlVmlkZW9BZGFwdGVyT3B0aW9ucyIsInVwZGF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLE9BQU8sRUFBRUMsUUFBUSxRQUFPLGVBQWU7QUFFL0MsU0FBUUMsa0JBQWtCLFFBQU8sOENBQThDO0FBQy9FLFNBQVFDLGVBQWUsUUFBTyw2QkFBNkI7QUFDM0QsU0FBUUMsV0FBVyxFQUFFQyxRQUFRLFFBQU8scUJBQXFCO0FBQ3pELFNBQVFDLGlCQUFpQixRQUFPLG1DQUFtQztBQUNuRSxTQUFRQyxrQkFBa0IsRUFBRUMsZ0JBQWdCLEVBQUVDLGdCQUFnQixRQUFPLDhCQUE4QjtBQU9uRyxNQUFNQyxZQUFZO0FBeUNsQixNQUFNQyx3QkFBd0IsQ0FBQ0MsT0FBZ0JDLFVBQzdDWCxtQkFBbUJVO0FBRXJCLE9BQU8sTUFBTUUscUJBQXFCLENBQ2hDQyxNQUNBRjtJQUVBLE1BQU1HLFlBQVlWLGtCQUFrQlMsTUFBTUosdUJBQXVCO1FBQy9ETSxTQUFTSixTQUFTSztRQUNsQkMsZ0JBQWdCTixTQUFTTztJQUMzQjtJQUVBLE1BQU1DLE1BQU0sT0FDVkMsV0FDQUMsYUFBdUIsRUFBRSxFQUN6QkMsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxJQUFJO1lBQ0YsTUFBTUMsaUJBQWlC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
|