Repository: illacloud/illa-builder Branch: beta Commit: a468660903e2 Files: 2659 Total size: 4.9 MB Directory structure: gitextract_w9qrj6ts/ ├── .eslintignore ├── .eslintrc.js ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── custom.md │ │ └── feature_request.md │ ├── holopin.yml │ ├── pull_request_template.md │ ├── stale.yml │ └── workflows/ │ ├── build-all-in-one-image.yml │ ├── build-cname-docker.yml │ ├── close-stale-issues-and-PRs.yml │ ├── codeql-analysis.yml │ ├── deploy-to-flyio.yml │ └── issue-mark-assignees.yml ├── .gitignore ├── .gitmodules ├── .husky/ │ ├── commit-msg │ └── pre-commit ├── .lintstagedrc.mjs ├── .npmrc ├── .prettierignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README-CN.md ├── README-DE.md ├── README-JP.md ├── README.md ├── apps/ │ ├── builder/ │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── docker-config/ │ │ │ ├── illa-builder.conf │ │ │ └── nginx-root.conf │ │ ├── index.html │ │ ├── package.json │ │ ├── protos/ │ │ │ └── ILLA_PROTO.proto │ │ ├── public/ │ │ │ └── font-family/ │ │ │ ├── Fira-code/ │ │ │ │ └── fira_code.css │ │ │ └── Inter/ │ │ │ └── inter.css │ │ ├── src/ │ │ │ ├── App.tsx │ │ │ ├── api/ │ │ │ │ ├── actions/ │ │ │ │ │ └── index.ts │ │ │ │ ├── http/ │ │ │ │ │ └── base.ts │ │ │ │ └── ws/ │ │ │ │ ├── ILLA_PROTO.ts │ │ │ │ ├── illaBinaryWS.ts │ │ │ │ ├── illaWS.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ └── textSignal.ts │ │ │ ├── assets/ │ │ │ │ └── animationForLottie/ │ │ │ │ └── celebrate.json │ │ │ ├── components/ │ │ │ │ ├── CodeEditor/ │ │ │ │ │ ├── CodeMirror/ │ │ │ │ │ │ ├── core.tsx │ │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ │ ├── completionSources/ │ │ │ │ │ │ │ │ ├── ILLAContextDesc/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ │ │ ├── TernServer/ │ │ │ │ │ │ │ │ │ ├── defs/ │ │ │ │ │ │ │ │ │ │ └── ecmascript.json │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ └── illaContext.ts │ │ │ │ │ │ │ ├── heighLightJSExpression.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ └── theme.ts │ │ │ │ │ ├── HintToolTip/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── ModalCodeMirror/ │ │ │ │ │ │ ├── content.tsx │ │ │ │ │ │ ├── footer.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ ├── style.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── ColorPicker/ │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── interface.ts │ │ │ │ ├── ColorSetter/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── DriveFileSelect/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── Breadcrumb/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── EmptyState/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── FileList/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── FileListContent/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ └── LoadingState/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ └── usePath.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── utils.tsx │ │ │ │ ├── EditableText/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── style.ts │ │ │ │ ├── ErrorBoundary/ │ │ │ │ │ ├── fallback/ │ │ │ │ │ │ └── widget/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── interface.ts │ │ │ │ ├── FolderOperateModal/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── CreateFolderModal/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── Empty/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── FolderList/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── FolderModalContent/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── LoadingState/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ └── SameNameModal/ │ │ │ │ │ │ ├── content.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── FullPageLoading/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── Guide/ │ │ │ │ │ ├── GuideCreateApp/ │ │ │ │ │ │ ├── CreateModal/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── GuideDraggablePopover/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── GuidePoint/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── GuidePopover/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── GuideSuccess/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── WidgetStepMask/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── assets/ │ │ │ │ │ │ └── lottie/ │ │ │ │ │ │ ├── point.json │ │ │ │ │ │ └── success.json │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── ILLAMarkdown/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── style.ts │ │ │ │ ├── Iframe/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── LayoutAutoChange/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Modal/ │ │ │ │ │ ├── Body/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── Footer/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── Header/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ ├── movableModal.tsx │ │ │ │ │ ├── style.ts │ │ │ │ │ └── utils/ │ │ │ │ │ └── stopDragAndDrop.ts │ │ │ │ ├── PanelBar/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── style.ts │ │ │ │ ├── RecordEditor/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── style.ts │ │ │ │ ├── Tabs/ │ │ │ │ │ ├── constant.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── style.ts │ │ │ │ └── UpgradeTag/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.ts │ │ │ ├── config/ │ │ │ │ ├── AppWithAgent/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── templateNode.ts │ │ │ │ ├── guide/ │ │ │ │ │ ├── actions.json │ │ │ │ │ ├── components.json │ │ │ │ │ ├── config.tsx │ │ │ │ │ ├── data.json │ │ │ │ │ ├── index.ts │ │ │ │ │ └── resources.json │ │ │ │ └── template/ │ │ │ │ └── interface.ts │ │ │ ├── constants/ │ │ │ │ └── currency.ts │ │ │ ├── env.d.ts │ │ │ ├── hooks/ │ │ │ │ ├── useDestoryExecutionTree.ts │ │ │ │ ├── useGoogleAuthStatus.tsx │ │ │ │ ├── useInitApp.tsx │ │ │ │ ├── useInitGuideApp.tsx │ │ │ │ ├── useOAuthRefresh.tsx │ │ │ │ └── utils/ │ │ │ │ ├── fixComponentsUtils/ │ │ │ │ │ ├── chart.ts │ │ │ │ │ ├── container.ts │ │ │ │ │ ├── dataGrid.ts │ │ │ │ │ ├── image.ts │ │ │ │ │ ├── likeInput.ts │ │ │ │ │ ├── list.ts │ │ │ │ │ └── menu.ts │ │ │ │ ├── fixedAction.ts │ │ │ │ └── fixedComponents.ts │ │ │ ├── i18n/ │ │ │ │ ├── config.ts │ │ │ │ ├── i18next.d.ts │ │ │ │ └── react-i18next.d.ts │ │ │ ├── main.tsx │ │ │ ├── middleware/ │ │ │ │ ├── guideAsync/ │ │ │ │ │ ├── guideUpdate/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── mixpanelReport/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── reportMessage/ │ │ │ │ │ ├── component.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── reduxAsync/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── receiveMessages/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── sendMessage/ │ │ │ │ │ ├── actionMethod.ts │ │ │ │ │ ├── agentMethod.ts │ │ │ │ │ ├── appInfoMethod.ts │ │ │ │ │ ├── appsMethod.ts │ │ │ │ │ ├── componentsMethod.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── resourceMethod.ts │ │ │ │ └── undoRedo/ │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ └── method/ │ │ │ │ ├── action.tsx │ │ │ │ ├── components.tsx │ │ │ │ └── index.tsx │ │ │ ├── page/ │ │ │ │ ├── AI/ │ │ │ │ │ ├── AIAgent/ │ │ │ │ │ │ ├── aiagent.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── AIAgentRun/ │ │ │ │ │ │ ├── AIAgentRunMobile/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── AIAgentRunPC/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── components/ │ │ │ │ │ ├── AIAgentBlock/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── AIAgentMessage/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── AILoading/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ChatContext/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── interface.ts │ │ │ │ │ ├── ErrorText/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── GenerationMessage/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── KnowledgeUpload/ │ │ │ │ │ │ ├── contants.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── MarkdownMessage/ │ │ │ │ │ │ ├── Code/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── PreviewChat/ │ │ │ │ │ │ ├── UploadButton/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── UploadKnowledgeFiles/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── UserMessage/ │ │ │ │ │ │ ├── ShowFiles/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ └── ws/ │ │ │ │ │ ├── useAgentConnect.ts │ │ │ │ │ ├── useAgentProps.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── App/ │ │ │ │ │ ├── Module/ │ │ │ │ │ │ ├── ActionEditor/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── styles.ts │ │ │ │ │ │ ├── CanvasPanel/ │ │ │ │ │ │ │ ├── Components/ │ │ │ │ │ │ │ │ └── BuildAppOnEmpty/ │ │ │ │ │ │ │ │ ├── BuildByDatabase/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── BuildByTemplate/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── PreviewAppImage/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── ComponentManager/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.tsx │ │ │ │ │ │ ├── DataWorkspace/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ ├── ActionSpaceTree/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── BaseDataItem/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── ComponentSpaceTree/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── GlobalsSpaceTree/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── LibrariesTree/ │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── item.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── MoreAction/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── PageSpaceTree/ │ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ │ ├── ActionMenu/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ │ ├── ChangePathModal/ │ │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ │ ├── modal.tsx │ │ │ │ │ │ │ │ │ │ │ └── style.tsx │ │ │ │ │ │ │ │ │ │ └── PageItem/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── WorkSpaceTreeGroup/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ └── WorkSpaceTreeItem/ │ │ │ │ │ │ │ │ ├── WorkSpaceTreeNode.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ │ ├── constant.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── LeftPanel/ │ │ │ │ │ │ │ ├── Components/ │ │ │ │ │ │ │ │ ├── DebugButton/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── HistoryButton/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── MissingResourceButton/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── MoreActionButton/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ │ └── ToolBar/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── PageNavBar/ │ │ │ │ │ │ │ ├── AppName/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── AppSettingModal/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── AppSizeButtonGroup/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── CollaboratorsList/ │ │ │ │ │ │ │ │ ├── ListItem/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── DeloyButtonGroup/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── PreviewPopContent/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── ShareAppButton/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ ├── WindowIcons/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ ├── resp.ts │ │ │ │ │ │ │ └── style.tsx │ │ │ │ │ │ └── UploadDetail/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── DetailList/ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ ├── item.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ └── ProcessDetailModal/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── store/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── Actions/ │ │ │ │ │ │ │ ├── ActionGuidePanel/ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ ├── ActionSection/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ └── AgentSection/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── constans.ts │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── ActionList/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ ├── listWithNewButton.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── ActionListItem/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── ActionPanel/ │ │ │ │ │ │ │ │ ├── AIAgentPanel/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── ActionEventHandler/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── ActionMockPanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── ActionResult/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── restApiHeader.tsx │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ │ ├── ActionTitleBar/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── AirtablePanel/ │ │ │ │ │ │ │ │ │ ├── CreateRecordsPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteMultipleRecordsPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteRecordPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── GetRecordPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ListRecordsPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateMultipleRecordsPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateRecordPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── AppwritePanel/ │ │ │ │ │ │ │ │ │ ├── DocumentSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ListDocuments/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── CouchDBPanel/ │ │ │ │ │ │ │ │ │ ├── CreateRecordSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteRecordSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── FindRecordSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── GetViewSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ListRecordsSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── RetrieveRecordSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateRecordSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── values.ts │ │ │ │ │ │ │ │ ├── DynamoDBPanel/ │ │ │ │ │ │ │ │ │ ├── DeleteItemPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── GetItemPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── PutItemPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── QueryPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ScanPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateItemPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── items.ts │ │ │ │ │ │ │ │ ├── ElasticSearchPanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── FirebasePanel/ │ │ │ │ │ │ │ │ │ ├── AppendDataToList/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── CreateOneUser/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteOneDocument/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteOneUser/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── FirebasePanel.tsx │ │ │ │ │ │ │ │ │ ├── GetCollections/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── GetDocumentByID/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── GetUserByEmail/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── GetUserByID/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── GetUserByPhone/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── InsertDocument/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ListUsers/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── QueryCollectionGroup/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── QueryDatabase/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── QueryFirebase/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── SetData/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateData/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateDocument/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateOneUser/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ │ ├── CollectionInput/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ │ └── CollectionRecordEditor/ │ │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── intreface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── GlobalDataPanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── GoogleSheetsPanel/ │ │ │ │ │ │ │ │ │ ├── AppendSpreadsheetSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── BasicSheetConfig/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── BulkUpdateSpreadsheetSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── CopySpreadSheetSubPanel/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── CreateSpreadsheetSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteSpreadsheetSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── GetSpreadsheetSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ReadSpreadsheetSubPanel/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── UpdateSpreadsheetSubPanel/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ └── values.ts │ │ │ │ │ │ │ │ ├── GraphQLPanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── HuggingFaceCommonPanel/ │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── HuggingFaceEndpointPanel/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── HuggingFacePanel/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── ILLADrivePanel/ │ │ │ │ │ │ │ │ │ ├── DeleteMultiplePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DownloadMultiplePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DownloadOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ListAllPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ListFolders/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdatePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UploadMultiplePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UploadPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ │ ├── BaseFxSelect/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ │ ├── FolderSelect/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ │ ├── PathOperate/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ │ └── SortOperate/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── provider.tsx │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ │ │ ├── Layout/ │ │ │ │ │ │ │ │ │ ├── GeneralPanelLayout/ │ │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── HorizontalWithLabel/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── Label/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ └── Space/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── MicrosoftSqlPanel/ │ │ │ │ │ │ │ │ │ ├── MSSQLGUIMode/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── MSSQLSqlMode/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── MongoDbPanel/ │ │ │ │ │ │ │ │ │ ├── AggregatePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── BulkWritePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── Command/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── CountPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteManyPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DistinctPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── FindOneAndUpdatePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── FindOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── FindPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── InertManyPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── InertOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateManyPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UpdateOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── listCollectionsPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── MysqlLikePanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── OracleDBPanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── PanelHeader/ │ │ │ │ │ │ │ │ │ ├── AIAgentResourceChoose/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── MockOperation/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── ResourceChoose/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── TriggerModeChoose/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── RedisPanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── RestApiPanel/ │ │ │ │ │ │ │ │ │ ├── BodyEditor/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── S3Panel/ │ │ │ │ │ │ │ │ │ ├── DeleteMultiplePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DownloadOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ListAllPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── ReadOnePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UploadMultiplePart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── UploadPart/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ │ └── ContentTypeSelect/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── SMTPPanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── SingleTypeComponent/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── TransformerComponent/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── TransformerPanel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── pulicComponent/ │ │ │ │ │ │ │ │ │ ├── SQLModeSelector/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ └── SQLModeTip/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ │ ├── calculateFileSize.ts │ │ │ │ │ │ │ │ └── safeModeTip.ts │ │ │ │ │ │ │ ├── AdvancedPanel/ │ │ │ │ │ │ │ │ ├── Components/ │ │ │ │ │ │ │ │ │ ├── Control/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── Header/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ └── Space/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── Model/ │ │ │ │ │ │ │ │ │ ├── AdvancedOption/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ └── Timing/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── CheckboxInput/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── Context/ │ │ │ │ │ │ │ │ └── SqlModeTipContext/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── ControlledElement/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── DragBar/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── InputEditor/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── InputRecordEditor/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── ResourceDivider/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── SearchHeader/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.tsx │ │ │ │ │ │ │ │ └── style.tsx │ │ │ │ │ │ │ ├── api.ts │ │ │ │ │ │ │ ├── getIcon.tsx │ │ │ │ │ │ │ └── hook.ts │ │ │ │ │ │ ├── AppLoading/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── Avatar/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── ComponentPanel/ │ │ │ │ │ │ │ ├── ComponentItem.tsx │ │ │ │ │ │ │ ├── ComponentSession.tsx │ │ │ │ │ │ │ ├── componentListBuilder.tsx │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── SuggestComponent/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ ├── style.tsx │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── ConfigPanel/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── Debugger/ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ ├── ErrorItem/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ └── JsonView/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── DotPanel/ │ │ │ │ │ │ │ ├── calc.ts │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ ├── Canvas/ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── renderComponentCanvasContainer.tsx │ │ │ │ │ │ │ │ │ ├── renderComponentCanvasContainerWithJson.tsx │ │ │ │ │ │ │ │ │ ├── renderModalCanvasContainer.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── ComponentParser/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── DragPreview/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── DragShadowPreview/ │ │ │ │ │ │ │ │ │ ├── Shadow/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── MousePreview/ │ │ │ │ │ │ │ │ │ ├── Cursor/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── MultiSelectCanvas/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── MultiSelectedContainer/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── Page/ │ │ │ │ │ │ │ │ │ ├── emptyState.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── renderPage.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── PageLoading/ │ │ │ │ │ │ │ │ │ ├── pageLoading.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ └── Section/ │ │ │ │ │ │ │ │ ├── BodySection/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── FooterSection/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── HeaderSection/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── LeftSection/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── ModalSection/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── RightSection/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── constant/ │ │ │ │ │ │ │ │ ├── canvas.ts │ │ │ │ │ │ │ │ └── snapshotNew.ts │ │ │ │ │ │ │ ├── context/ │ │ │ │ │ │ │ │ ├── mouseHoverContext.tsx │ │ │ │ │ │ │ │ ├── mouseMoveContext.tsx │ │ │ │ │ │ │ │ └── scrollBarContext.tsx │ │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ │ ├── sectionUtils.ts │ │ │ │ │ │ │ │ └── useMousePostionAsync.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ ├── utils/ │ │ │ │ │ │ │ │ ├── calcMouse.ts │ │ │ │ │ │ │ │ ├── crossingHelper.ts │ │ │ │ │ │ │ │ ├── getDragShadow.ts │ │ │ │ │ │ │ │ ├── getDropResult.ts │ │ │ │ │ │ │ │ └── sendBinaryMessage.ts │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ ├── EmptySearchResult/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── Icons/ │ │ │ │ │ │ │ └── database.tsx │ │ │ │ │ │ ├── InspectPanel/ │ │ │ │ │ │ │ ├── PanelSetters/ │ │ │ │ │ │ │ │ ├── BorderSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── CalendarEventListSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── CarouselListSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── ChartSetter/ │ │ │ │ │ │ │ │ │ ├── chartColorSelectSetter.tsx │ │ │ │ │ │ │ │ │ ├── chartDatasetsSetter/ │ │ │ │ │ │ │ │ │ │ ├── datasetsContext.tsx │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ ├── listBody.tsx │ │ │ │ │ │ │ │ │ │ ├── listItem.tsx │ │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ │ │ │ ├── chartKeysDynamicSelectSetter.tsx │ │ │ │ │ │ │ │ │ ├── chartKeysSelectSetter.tsx │ │ │ │ │ │ │ │ │ ├── chartTypeSelectSetter.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── ColorPickerSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── ContainerSetter/ │ │ │ │ │ │ │ │ │ ├── ViewsSetter/ │ │ │ │ │ │ │ │ │ │ ├── context/ │ │ │ │ │ │ │ │ │ │ │ └── viewsListContext.tsx │ │ │ │ │ │ │ │ │ │ ├── dragIconAndLabel.tsx │ │ │ │ │ │ │ │ │ │ ├── header.tsx │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ ├── listBody.tsx │ │ │ │ │ │ │ │ │ │ ├── listItem.tsx │ │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ │ │ │ └── generateNewOptions.ts │ │ │ │ │ │ │ │ │ ├── defaultViewKeySetter.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── DataGridSetter/ │ │ │ │ │ │ │ │ │ ├── ColumnButtonGroupSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ ├── ColumnMappedInput/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ ├── ColumnMappedSelect/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── ColumnSetter/ │ │ │ │ │ │ │ │ │ │ ├── Components/ │ │ │ │ │ │ │ │ │ │ │ └── UpdateButton/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── ColumnSwitchSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── ColumnTypeSelectSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ ├── ColumnsSelectSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ │ ├── DragMoveComponent/ │ │ │ │ │ │ │ │ │ ├── Column/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── ColumnContainer/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ └── Empty/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── DriveSourceGroupSetter/ │ │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ │ ├── SourceHeader/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ │ ├── URLModeInput/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ │ ├── UploadInput/ │ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ │ └── UploadOperate/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── provider/ │ │ │ │ │ │ │ │ │ │ ├── FileUploadProvider/ │ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ │ └── SourceSelectProvider/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ │ │ ├── EventHandlerSetter/ │ │ │ │ │ │ │ │ │ ├── List/ │ │ │ │ │ │ │ │ │ │ ├── actionMenu.tsx │ │ │ │ │ │ │ │ │ │ ├── body.tsx │ │ │ │ │ │ │ │ │ │ ├── empty.tsx │ │ │ │ │ │ │ │ │ │ ├── eventAndMethodLabel.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ ├── item.tsx │ │ │ │ │ │ │ │ │ │ ├── more.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── context/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ │ ├── IconSetter/ │ │ │ │ │ │ │ │ │ ├── IconPickerList.tsx │ │ │ │ │ │ │ │ │ ├── IconSelector.tsx │ │ │ │ │ │ │ │ │ ├── IconTriggerComponent.tsx │ │ │ │ │ │ │ │ │ ├── baseIconSetter.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── InputSetter/ │ │ │ │ │ │ │ │ │ ├── BaseInput/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── FileMinMaxSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── MeasureCheckInput/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── OptionMappedInput/ │ │ │ │ │ │ │ │ │ │ └── optionMappedInputSetter.tsx │ │ │ │ │ │ │ │ │ ├── PaddingInput/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── ScriptInput/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ └── util.ts │ │ │ │ │ │ │ │ ├── ItemBorderSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── ListGapSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── MappedOptionSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── MenuSetter/ │ │ │ │ │ │ │ │ │ └── MenuOptionSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── newButton.tsx │ │ │ │ │ │ │ │ │ ├── setterMenuItem.tsx │ │ │ │ │ │ │ │ │ ├── setterSubMenu.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── OptionListSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── PublicComponent/ │ │ │ │ │ │ │ │ │ ├── DynamicIcon/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── Label/ │ │ │ │ │ │ │ │ │ │ ├── addActionLabel.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ └── Modal/ │ │ │ │ │ │ │ │ │ ├── baseBody.tsx │ │ │ │ │ │ │ │ │ ├── body.tsx │ │ │ │ │ │ │ │ │ ├── header.tsx │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── RadioGroupSetter/ │ │ │ │ │ │ │ │ │ ├── baseRadioGroup.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── SelectSetter/ │ │ │ │ │ │ │ │ │ ├── CustomBgSelect/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── MeasureSelectSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── ShadowSelect/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── baseDynamicSelect.tsx │ │ │ │ │ │ │ │ │ ├── baseSelect.tsx │ │ │ │ │ │ │ │ │ ├── dataSourceSelectSetter.tsx │ │ │ │ │ │ │ │ │ ├── dynamicSelectSetter.tsx │ │ │ │ │ │ │ │ │ ├── eventActionTypeSelect.tsx │ │ │ │ │ │ │ │ │ ├── eventBodyViewSelect.tsx │ │ │ │ │ │ │ │ │ ├── eventCalendarSelect.tsx │ │ │ │ │ │ │ │ │ ├── eventTargetActionSelect.tsx │ │ │ │ │ │ │ │ │ ├── eventTargetStateSelect.tsx │ │ │ │ │ │ │ │ │ ├── eventTargetWidgetSelect.tsx │ │ │ │ │ │ │ │ │ ├── eventWidgetMethodSelect.tsx │ │ │ │ │ │ │ │ │ ├── heightModeSelect.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── pageSelect.tsx │ │ │ │ │ │ │ │ │ ├── searchSelect.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── StepsListSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── StyleContainerSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── SwitchSetter/ │ │ │ │ │ │ │ │ │ ├── baseSwitch.tsx │ │ │ │ │ │ │ │ │ ├── driveWithStatusSwitch.tsx │ │ │ │ │ │ │ │ │ ├── dynamicSwitch.tsx │ │ │ │ │ │ │ │ │ ├── interface.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── TableSetter/ │ │ │ │ │ │ │ │ │ ├── CellSetter/ │ │ │ │ │ │ │ │ │ │ ├── body.tsx │ │ │ │ │ │ │ │ │ │ ├── columnItem.tsx │ │ │ │ │ │ │ │ │ │ ├── context/ │ │ │ │ │ │ │ │ │ │ │ └── columnListContext.tsx │ │ │ │ │ │ │ │ │ │ ├── dragIconAndLabel.tsx │ │ │ │ │ │ │ │ │ │ ├── empty.tsx │ │ │ │ │ │ │ │ │ │ ├── header.tsx │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ │ │ │ └── generateNewColumns.ts │ │ │ │ │ │ │ │ │ ├── ColumnSetter/ │ │ │ │ │ │ │ │ │ │ ├── body.tsx │ │ │ │ │ │ │ │ │ │ ├── columnItem.tsx │ │ │ │ │ │ │ │ │ │ ├── context/ │ │ │ │ │ │ │ │ │ │ │ └── columnListContext.tsx │ │ │ │ │ │ │ │ │ │ ├── dragIconAndLabel.tsx │ │ │ │ │ │ │ │ │ │ ├── empty.tsx │ │ │ │ │ │ │ │ │ │ ├── header.tsx │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ │ │ │ └── generateNewColumns.ts │ │ │ │ │ │ │ │ │ ├── columnTypeSelectSetter.tsx │ │ │ │ │ │ │ │ │ ├── columsSelectSetter.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── tableDataSourceSelectSetter.tsx │ │ │ │ │ │ │ │ │ └── tableMappedValueInputSetter.tsx │ │ │ │ │ │ │ │ ├── TabsSetter/ │ │ │ │ │ │ │ │ │ ├── DefaultTabKeySetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ ├── TabListSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ └── TabsContainerSelectSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ ├── ActionMenu/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── EmptySelected/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── FieldAndLabel/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── FieldFactory/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── GuideModePanelSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── Header/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── Label/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── MultiSelectedPanel/ │ │ │ │ │ │ │ │ │ ├── multiSelectedPanel.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── PanelSetter/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ ├── Panelbar/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ └── SingleSelectedPanel/ │ │ │ │ │ │ │ │ ├── singleSelectedPanel.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── context/ │ │ │ │ │ │ │ │ └── selectedContext.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ ├── setter.tsx │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── fieldFactory.tsx │ │ │ │ │ │ │ └── panelBuilder.ts │ │ │ │ │ │ ├── MissingRosourceModal/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ ├── PagePanel/ │ │ │ │ │ │ │ ├── Components/ │ │ │ │ │ │ │ │ ├── Label/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── LayoutSelect/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── PanelActionBar/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ └── ViewsList/ │ │ │ │ │ │ │ │ ├── body.tsx │ │ │ │ │ │ │ │ ├── emptyState.tsx │ │ │ │ │ │ │ │ ├── header.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ ├── item.tsx │ │ │ │ │ │ │ │ ├── labelName.tsx │ │ │ │ │ │ │ │ ├── modal.tsx │ │ │ │ │ │ │ │ ├── style.tsx │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ ├── Layout/ │ │ │ │ │ │ │ │ ├── divider/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── leftAndRight/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── setterPadding/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ └── verticalLayout/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── Modules/ │ │ │ │ │ │ │ │ ├── Basic/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── Frame/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ └── Style/ │ │ │ │ │ │ │ │ ├── Components/ │ │ │ │ │ │ │ │ │ ├── AddSection/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── interface.ts │ │ │ │ │ │ │ │ │ ├── BackgroundSetter/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── DeleteActionContainer/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── DirectionPaddingSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── DividerSetter/ │ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ │ ├── PaddingSetter/ │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ ├── ShadowSelect/ │ │ │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ │ └── ShadowSetter/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ └── ScaleSquare/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── AutoHeightWithLimitedContainer/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── CollaboratorsList/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── DragContainer/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── MoveBar/ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ ├── moveBar.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── PositionContainer/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ ├── ResizingAndDragContainer/ │ │ │ │ │ │ │ │ ├── ResizeHandler/ │ │ │ │ │ │ │ │ │ ├── hooks.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ │ └── WrapperContainer/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── constant/ │ │ │ │ │ │ │ ├── moveBar.ts │ │ │ │ │ │ │ └── widget.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ ├── modalScaleSquare.tsx │ │ │ │ │ │ ├── scaleSquareWithJSON.tsx │ │ │ │ │ │ ├── style.ts │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ ├── getRealShapeAndPosition.ts │ │ │ │ │ │ ├── useGetDisplayNameInMoveBar.ts │ │ │ │ │ │ ├── useMouseHover.ts │ │ │ │ │ │ └── useScaleStateSelector.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── resp/ │ │ │ │ │ │ └── currentAppResp.ts │ │ │ │ │ └── style.tsx │ │ │ │ ├── Deploy/ │ │ │ │ │ ├── Watermark/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── content.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── History/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ActionArea/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── HistoryNavBar/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── SnapShotItem/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ └── SnapShotList/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Resource/ │ │ │ │ │ ├── Create/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CreateOrEdit/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── Edit/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── layout/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── Status/ │ │ │ │ │ ├── 403/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── 404/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── 500/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── MobileFobidden/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── errorPage.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── style.tsx │ │ │ │ └── Template/ │ │ │ │ └── GuideApp.tsx │ │ │ ├── redux/ │ │ │ │ ├── aiAgent/ │ │ │ │ │ ├── dashboardTeamAIAgentPayload.ts │ │ │ │ │ ├── dashboardTeamAIAgentReducer.ts │ │ │ │ │ ├── dashboardTeamAIAgentSelector.ts │ │ │ │ │ ├── dashboardTeamAIAgentSlice.ts │ │ │ │ │ └── dashboardTeamAIAgentState.ts │ │ │ │ ├── builderInfo/ │ │ │ │ │ ├── builderInfoReducer.ts │ │ │ │ │ ├── builderInfoSelector.ts │ │ │ │ │ ├── builderInfoSlice.ts │ │ │ │ │ └── builderInfoState.ts │ │ │ │ ├── config/ │ │ │ │ │ ├── configListener.ts │ │ │ │ │ ├── configPayload.ts │ │ │ │ │ ├── configReducer.ts │ │ │ │ │ ├── configSelector.ts │ │ │ │ │ ├── configSlice.ts │ │ │ │ │ └── configState.ts │ │ │ │ ├── currentApp/ │ │ │ │ │ ├── action/ │ │ │ │ │ │ ├── actionListener.ts │ │ │ │ │ │ ├── actionReducer.ts │ │ │ │ │ │ ├── actionSelector.ts │ │ │ │ │ │ ├── actionSlice.ts │ │ │ │ │ │ └── actionState.ts │ │ │ │ │ ├── appInfo/ │ │ │ │ │ │ ├── appInfoReducer.ts │ │ │ │ │ │ ├── appInfoSelector.ts │ │ │ │ │ │ ├── appInfoSlice.ts │ │ │ │ │ │ └── appInfoState.ts │ │ │ │ │ ├── collaborators/ │ │ │ │ │ │ ├── collaboratorsHandlers.ts │ │ │ │ │ │ ├── collaboratorsReducer.ts │ │ │ │ │ │ ├── collaboratorsSelector.ts │ │ │ │ │ │ ├── collaboratorsSlice.ts │ │ │ │ │ │ └── collaboratorsState.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── componentsListener.ts │ │ │ │ │ │ ├── componentsPayload.ts │ │ │ │ │ │ ├── componentsReducer.ts │ │ │ │ │ │ ├── componentsSelector.ts │ │ │ │ │ │ ├── componentsSlice.ts │ │ │ │ │ │ └── componentsState.ts │ │ │ │ │ ├── cursor/ │ │ │ │ │ │ ├── cursorReducer.ts │ │ │ │ │ │ ├── cursorSelector.ts │ │ │ │ │ │ ├── cursorSlice.ts │ │ │ │ │ │ └── cursorState.ts │ │ │ │ │ ├── dragShadow/ │ │ │ │ │ │ ├── dragShadowReducer.ts │ │ │ │ │ │ ├── dragShadowSelector.ts │ │ │ │ │ │ ├── dragShadowSlice.ts │ │ │ │ │ │ └── dragShadowState.ts │ │ │ │ │ ├── executionTree/ │ │ │ │ │ │ ├── executionListener.ts │ │ │ │ │ │ ├── executionReducer.ts │ │ │ │ │ │ ├── executionSelector.ts │ │ │ │ │ │ ├── executionSlice.ts │ │ │ │ │ │ └── executionState.ts │ │ │ │ │ ├── layoutInfo/ │ │ │ │ │ │ ├── layoutInfoListener.ts │ │ │ │ │ │ ├── layoutInfoReducer.ts │ │ │ │ │ │ ├── layoutInfoSelector.ts │ │ │ │ │ │ ├── layoutInfoSlice.ts │ │ │ │ │ │ ├── layoutInfoState.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── selector.ts │ │ │ │ │ └── slice.ts │ │ │ │ ├── currentAppHistory/ │ │ │ │ │ ├── currentAppHistoryReducer.ts │ │ │ │ │ ├── currentAppHistorySelector.ts │ │ │ │ │ ├── currentAppHistorySlice.ts │ │ │ │ │ └── currentAppHistoryState.ts │ │ │ │ ├── guide/ │ │ │ │ │ ├── guideReducer.ts │ │ │ │ │ ├── guideSelector.ts │ │ │ │ │ ├── guideSlice.ts │ │ │ │ │ └── guideState.ts │ │ │ │ └── resource/ │ │ │ │ ├── resourceReducer.ts │ │ │ │ ├── resourceSelector.ts │ │ │ │ ├── resourceSlice.ts │ │ │ │ ├── resourceState.ts │ │ │ │ └── upstashResource.ts │ │ │ ├── router/ │ │ │ │ ├── config/ │ │ │ │ │ ├── cloud.tsx │ │ │ │ │ ├── public.tsx │ │ │ │ │ └── selfHost.tsx │ │ │ │ ├── constant.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── loader/ │ │ │ │ │ ├── agentLoader.ts │ │ │ │ │ ├── agentRunLoader.ts │ │ │ │ │ ├── beautifyURLLoader.ts │ │ │ │ │ ├── cloudAuthLoader.ts │ │ │ │ │ ├── deployLoader.ts │ │ │ │ │ ├── historyLoader.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── resourceEditorLoader.ts │ │ │ │ ├── routerConfig.tsx │ │ │ │ └── utils/ │ │ │ │ ├── lazyLoad.tsx │ │ │ │ └── translateQS.ts │ │ │ ├── services/ │ │ │ │ ├── action.ts │ │ │ │ ├── agent.ts │ │ │ │ ├── apps.ts │ │ │ │ ├── drive.ts │ │ │ │ ├── history.ts │ │ │ │ ├── public.ts │ │ │ │ ├── resource.ts │ │ │ │ ├── setting.ts │ │ │ │ ├── team.ts │ │ │ │ └── users.ts │ │ │ ├── store.ts │ │ │ ├── style.tsx │ │ │ ├── types/ │ │ │ │ ├── environment.d.ts │ │ │ │ ├── global.d.ts │ │ │ │ └── richText.d.ts │ │ │ ├── utils/ │ │ │ │ ├── InspectHelper/ │ │ │ │ │ └── selectWidgetHelper.ts │ │ │ │ ├── action/ │ │ │ │ │ ├── driveActions.ts │ │ │ │ │ ├── fetchS3ClientResult.ts │ │ │ │ │ ├── premiumActionHandler.ts │ │ │ │ │ ├── runAction.ts │ │ │ │ │ ├── runActionErrorForColla.ts │ │ │ │ │ ├── runActionEventHandler.ts │ │ │ │ │ ├── runActionTransformer.ts │ │ │ │ │ ├── transResponse.ts │ │ │ │ │ └── transformDataFormat.ts │ │ │ │ ├── billing/ │ │ │ │ │ └── errorHandler.ts │ │ │ │ ├── calculateMemoryUsage.ts │ │ │ │ ├── changeDisplayNameHelper.ts │ │ │ │ ├── componentNode/ │ │ │ │ │ ├── buildTree.ts │ │ │ │ │ ├── changeDisplayNameHelper.ts │ │ │ │ │ ├── copyHelper.ts │ │ │ │ │ ├── flatTree.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── search.ts │ │ │ │ ├── copyManager.ts │ │ │ │ ├── copyToClipboard.ts │ │ │ │ ├── drag/ │ │ │ │ │ └── drag.ts │ │ │ │ ├── drive/ │ │ │ │ │ └── upload/ │ │ │ │ │ └── getSingedURL.ts │ │ │ │ ├── evaluateDynamicString/ │ │ │ │ │ ├── codeSandbox.ts │ │ │ │ │ ├── dynamicConverter.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── utils.ts │ │ │ │ │ └── valueConverter.ts │ │ │ │ ├── eventHandlerHelper/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── commonUtils.ts │ │ │ │ │ ├── driveUtils.ts │ │ │ │ │ ├── globalDataUtils.ts │ │ │ │ │ ├── localStorage.ts │ │ │ │ │ └── premiumEventUtils.ts │ │ │ │ ├── executionTreeHelper/ │ │ │ │ │ ├── executionTreeFactory.ts │ │ │ │ │ ├── generateGlobalData.ts │ │ │ │ │ ├── generatePageInfo.ts │ │ │ │ │ ├── generateRawAction.ts │ │ │ │ │ ├── generateRawWidget.ts │ │ │ │ │ ├── generateUrlParams.ts │ │ │ │ │ ├── interface.ts │ │ │ │ │ ├── rawTreeFactory.ts │ │ │ │ │ ├── rrecursiveDelete.ts │ │ │ │ │ ├── runtimePropsCollector.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── file/ │ │ │ │ │ ├── calculateFileInfo.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── parseFileValue.ts │ │ │ │ │ └── upload.ts │ │ │ │ ├── focusManager.ts │ │ │ │ ├── formatData.ts │ │ │ │ ├── generators/ │ │ │ │ │ ├── generateAllTypePathsFromWidgetConfig.ts │ │ │ │ │ ├── generateComponentNode.ts │ │ │ │ │ ├── generateDisplayName.ts │ │ │ │ │ └── generatePageOrSectionConfig.ts │ │ │ │ ├── mediaSourceLoad/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── mixpanelHelper/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── navigate/ │ │ │ │ │ └── index.ts │ │ │ │ ├── routerHelper.ts │ │ │ │ ├── screen/ │ │ │ │ │ └── index.ts │ │ │ │ ├── shortcut/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── shortcutProvider.tsx │ │ │ │ ├── storage.ts │ │ │ │ ├── styleUtils/ │ │ │ │ │ ├── padding.ts │ │ │ │ │ └── shadow.ts │ │ │ │ ├── team.ts │ │ │ │ ├── typeHelper.ts │ │ │ │ ├── undoRedo/ │ │ │ │ │ ├── antonymyRule.ts │ │ │ │ │ ├── circularStack.ts │ │ │ │ │ ├── undo.ts │ │ │ │ │ └── undoRedoMethod/ │ │ │ │ │ ├── action.ts │ │ │ │ │ └── components.ts │ │ │ │ ├── url/ │ │ │ │ │ └── base64.ts │ │ │ │ ├── useFuse.ts │ │ │ │ ├── userAgent/ │ │ │ │ │ └── index.ts │ │ │ │ └── validationFactory/ │ │ │ │ └── index.ts │ │ │ └── widgetLibrary/ │ │ │ ├── AudioWidget/ │ │ │ │ ├── audio.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── AvatarWidget/ │ │ │ │ ├── avatar.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── BarProgressWidget/ │ │ │ │ ├── barProgress.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── BasicContainer/ │ │ │ │ └── BasicContainer.tsx │ │ │ ├── ButtonWidget/ │ │ │ │ ├── button.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── CarouselWidget/ │ │ │ │ ├── carousel.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── slick-carousel/ │ │ │ │ │ ├── slick-theme.css │ │ │ │ │ └── slick.css │ │ │ │ ├── style.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── CascaderWidget/ │ │ │ │ ├── cascader.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── ChartWidget/ │ │ │ │ ├── chart.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── ChatWidget/ │ │ │ │ ├── chat.tsx │ │ │ │ ├── components/ │ │ │ │ │ ├── baseChat.tsx │ │ │ │ │ ├── messageItem.tsx │ │ │ │ │ ├── messageItems/ │ │ │ │ │ │ ├── audioMessage.tsx │ │ │ │ │ │ ├── imageMessage.tsx │ │ │ │ │ │ ├── replayMessage.tsx │ │ │ │ │ │ ├── sendMessage.tsx │ │ │ │ │ │ ├── textMessage.tsx │ │ │ │ │ │ └── videoMessage.tsx │ │ │ │ │ ├── options.tsx │ │ │ │ │ ├── receiving.tsx │ │ │ │ │ └── replyTo.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── useSizeChange.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── CheckboxGroupWidget/ │ │ │ │ ├── checkboxGroup.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── CircleProgressWidget/ │ │ │ │ ├── circleProgress.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── CodeScannerWidget/ │ │ │ │ ├── codeModal.tsx │ │ │ │ ├── codeScanner.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── ContainerWidget/ │ │ │ │ ├── container.tsx │ │ │ │ ├── emptyState.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── DataGridWidget/ │ │ │ │ ├── ExportAllSetting/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Toolbar/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── interface.ts │ │ │ │ ├── columnDeal.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── dataGrid.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── DateRangeWidget/ │ │ │ │ ├── dateRange.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── DateTimeWidget/ │ │ │ │ ├── dateTime.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── DateWidget/ │ │ │ │ ├── date.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── DividerWidget/ │ │ │ │ ├── divider.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── DrivePickerWidget/ │ │ │ │ ├── constants.ts │ │ │ │ ├── drivePicker.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── provider.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── EditableWidget/ │ │ │ │ ├── editableText.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.tsx │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── EventCalendarWidget/ │ │ │ │ ├── eventCalendar.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── useElementSize.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── FormWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── form.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── GridListWidget/ │ │ │ │ ├── components/ │ │ │ │ │ ├── CursorBasedSelector/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── ListWidgetWithAutoPagination/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ListWidgetWithServerPagination/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Loading/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── RenderCopyContainer/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── RenderTemplateContainer/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── gridList.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── utils.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── IFrameWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── iframe.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── IconWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── ImageWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── image.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── InputWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── input.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── JsonEditorWidget/ │ │ │ │ ├── baseJsonEditor.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── jsonEditor.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── JsonSchemaFormWidget/ │ │ │ │ ├── @illadesign-ui/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── labelWrapper/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── templates/ │ │ │ │ │ │ ├── ArrayFieldItemTemplate/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── ArrayFieldTemplate/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── BaseInputTemplate/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── DescriptionField/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── ErrorList/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── FieldTemplate/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── IconButton/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── ObjectFieldTemplate/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── SubmitButton/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── TitleField/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── WrapIfAdditionalTemplate/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── widgets/ │ │ │ │ │ ├── AltDateTimeWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── AltDateWidget/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── CheckboxWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CheckboxesWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── DateTimeWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── DateWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RadioWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RangeWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SelectWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── TextareaWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── TimeWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── UpDownWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── jsonSchemaForm.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── widgetConfig.tsx │ │ │ │ └── wrapperSchemaForm.tsx │ │ │ ├── ListWidget/ │ │ │ │ ├── components/ │ │ │ │ │ ├── CursorBasedSelector/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── ListWidgetWithAutoPagination/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ListWidgetWithServerPagination/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Loading/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── RenderCopyContainer/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── RenderTemplateContainer/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── list.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── utils.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── MapBoxWidget/ │ │ │ │ ├── SearchInput.tsx │ │ │ │ ├── content.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── map.tsx │ │ │ │ ├── mapBox.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── useCenter.ts │ │ │ │ ├── useMark.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── MenuWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── menu.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── ModalWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── modal.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── MultiselectWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── multiselect.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── NumberInputWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── numberInput.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── PdfWidget/ │ │ │ │ ├── button.tsx │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── pdf.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── PublicSector/ │ │ │ │ ├── AutoHeightContainer/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── InvalidMessage/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.tsx │ │ │ │ │ ├── style.tsx │ │ │ │ │ └── utils.tsx │ │ │ │ ├── Label/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ └── styles.tsx │ │ │ │ ├── RenderChildrenCanvas/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── interface.ts │ │ │ │ ├── TooltipWrapper/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── interface.ts │ │ │ │ ├── TransformWidgetWrapper/ │ │ │ │ │ ├── config.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ ├── renderWithJSON.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── WidgetLoading/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── containerStyle.ts │ │ │ │ └── utils/ │ │ │ │ ├── autoUpdateHeight.ts │ │ │ │ ├── formatSelectOptions.ts │ │ │ │ ├── generatorEventHandlerConfig.ts │ │ │ │ └── generatorTableEventHandlerConfig.ts │ │ │ ├── QRCodeWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── qrCode.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── RadioButtonWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── radioButton.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── RadioGroupWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── radioGroup.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── RangeSliderWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── rangeSlider.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── RateWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── rate.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── RecordingWidget/ │ │ │ │ ├── baseRecord.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── recording.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── useHandleRecord.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── RichTextWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── richText.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── useInitConfig.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── SelectWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── select.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── SignatureWidget/ │ │ │ │ ├── constants.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── signature.tsx │ │ │ │ ├── signatureCanvas.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── SliderWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── slider.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── StatisticsWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── statistics.tsx │ │ │ │ ├── style.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── StepsWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── steps.tsx │ │ │ │ ├── util.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── SwitchGroupWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── switchGroup.tsx │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── SwitchWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── switch.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── TableWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── react-table.d.ts │ │ │ │ ├── renderTableCell.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── table.tsx │ │ │ │ ├── utils.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── TabsWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.tsx │ │ │ │ ├── tabs.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── TagsWidget/ │ │ │ │ ├── components/ │ │ │ │ │ ├── MorePanel/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ └── TagContainer/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── interface.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── tags.tsx │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── TextAreaWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── textArea.tsx │ │ │ │ ├── utils.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── TextWidget/ │ │ │ │ ├── constans.ts │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.tsx │ │ │ │ ├── text.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── TimePickerWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── timePicker.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── TimeRangeWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── timeRange.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── TimelineWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interface.ts │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── timeline.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── UploadWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.tsx │ │ │ │ ├── upload.tsx │ │ │ │ ├── util.ts │ │ │ │ └── widgetConfig.tsx │ │ │ ├── VideoWidget/ │ │ │ │ ├── eventHandlerConfig.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.tsx │ │ │ │ ├── panelConfig.tsx │ │ │ │ ├── style.ts │ │ │ │ ├── video.tsx │ │ │ │ └── widgetConfig.tsx │ │ │ ├── interface.ts │ │ │ └── widgetBuilder.tsx │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.mts │ ├── cloud/ │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.tsx │ │ │ ├── api/ │ │ │ │ ├── auth/ │ │ │ │ │ └── index.ts │ │ │ │ ├── custom/ │ │ │ │ │ └── index.ts │ │ │ │ └── http/ │ │ │ │ └── base.ts │ │ │ ├── components/ │ │ │ │ ├── FullPageLoading/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── FullSectionLoading/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ └── Menu/ │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── menuItem.tsx │ │ │ │ └── style.ts │ │ │ ├── env.d.ts │ │ │ ├── i18n/ │ │ │ │ ├── i18next.d.ts │ │ │ │ ├── index.ts │ │ │ │ └── react-i18next.d.ts │ │ │ ├── main.tsx │ │ │ ├── page/ │ │ │ │ ├── setting/ │ │ │ │ │ ├── account/ │ │ │ │ │ │ ├── language/ │ │ │ │ │ │ │ ├── hook.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ └── pc/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ ├── password/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ │ │ ├── changePassword/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ └── pc/ │ │ │ │ │ │ │ ├── changePassword/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── personal/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ └── pc/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ ├── logout.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── Header/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── context/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ ├── landing/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ ├── landingMenu/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── items.tsx │ │ │ │ │ │ ├── mobileEntrance.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ │ └── style.ts │ │ │ │ │ │ └── pc/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ └── style.ts │ │ │ │ ├── status/ │ │ │ │ │ ├── 403/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── 404/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── 500/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── user/ │ │ │ │ │ └── login/ │ │ │ │ │ └── index.tsx │ │ │ │ └── workspace/ │ │ │ │ ├── InitTeamPage/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── apps/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ └── pc/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── components/ │ │ │ │ │ ├── ChangeLogModal/ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── DynamicMenu/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── interface.ts │ │ │ │ │ ├── Header/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── interface.tsx │ │ │ │ │ │ ├── mobileStyle.ts │ │ │ │ │ │ └── style.ts │ │ │ │ │ ├── ToCloudModal/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.ts │ │ │ │ │ └── UpgradeTip/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── hooks.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── hook.tsx │ │ │ │ │ ├── interface.ts │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── pc/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ └── resources/ │ │ │ │ ├── index.tsx │ │ │ │ ├── mobile/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ ├── pc/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.ts │ │ │ │ └── utils.ts │ │ │ ├── router/ │ │ │ │ ├── index.tsx │ │ │ │ ├── interface.ts │ │ │ │ ├── lazyLoad/ │ │ │ │ │ └── SettingLazyLoad/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── loader/ │ │ │ │ │ ├── accessUtils.ts │ │ │ │ │ ├── authLoader.ts │ │ │ │ │ └── rootLoader.ts │ │ │ │ └── routerConfig.tsx │ │ │ ├── services/ │ │ │ │ ├── auth.ts │ │ │ │ ├── swr/ │ │ │ │ │ ├── app.ts │ │ │ │ │ └── resource.ts │ │ │ │ ├── team.ts │ │ │ │ └── user.ts │ │ │ ├── store.ts │ │ │ ├── style.ts │ │ │ ├── types/ │ │ │ │ ├── environment.d.ts │ │ │ │ ├── global.d.ts │ │ │ │ └── react.d.ts │ │ │ ├── utils/ │ │ │ │ ├── auth/ │ │ │ │ │ └── index.ts │ │ │ │ ├── copy.ts │ │ │ │ ├── dayjs.ts │ │ │ │ └── storage/ │ │ │ │ └── index.ts │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ └── playwright/ │ ├── .gitignore │ ├── package.json │ ├── playwright.config.ts │ ├── script/ │ │ ├── codeGen.js │ │ └── initEnv.js │ └── tests/ │ ├── Resources/ │ │ ├── SMTP.test.ts │ │ ├── appwrite.test.ts │ │ ├── couchDB.test.ts │ │ ├── elasticSearch.test.ts │ │ ├── firebase.test.ts │ │ ├── googleSheets.test.ts │ │ ├── huggingFaceAPI.test.ts │ │ ├── mariaDB.test.ts │ │ ├── microsoftSQL.test.ts │ │ ├── mysql.test.ts │ │ ├── neon.test.ts │ │ ├── oracleDB.test.ts │ │ ├── postgreSQL.test.ts │ │ ├── redis.test.ts │ │ ├── restAPI.test.ts │ │ ├── supabaseDB.test.ts │ │ └── tiDB.test.ts │ ├── auth.setup.ts │ └── env.d.ts ├── commitlint.config.js ├── crowdin.yml ├── fluid-config.yaml ├── fly.toml ├── hacktoberfest2023/ │ ├── README.md │ ├── awesome-ai-agents/ │ │ ├── AI Haiku generator.md │ │ ├── AI Health-Agent.md │ │ ├── AI Regex generator.md │ │ ├── AI-Designer │ │ ├── AIDecipher.md │ │ ├── AIM - Jailbreak CHATGPT.md │ │ ├── AINameGenerator.md │ │ ├── AIOptima.md │ │ ├── APIMaster.md │ │ ├── ATCgt │ │ ├── AccommodationHelper.md │ │ ├── Ace.md │ │ ├── AchieveWithEmma.md │ │ ├── Advice-on-preventing-sports-injuries.md │ │ ├── Ai-agent-finder.md │ │ ├── Algorithm Generator using input and output in any language │ │ ├── AnagramGenerator.md │ │ ├── Analytical writing Bot │ │ ├── Anime Recommendations.md │ │ ├── Anomaly Detection AI Agent │ │ ├── AntonymFinder.md │ │ ├── App-Vision │ │ ├── Ara-ara.md │ │ ├── ArtGenius.md │ │ ├── Articreate.md │ │ ├── AstroGuide.md │ │ ├── Astronaut.md │ │ ├── AuthorSpotlights.md │ │ ├── AutoSubnet.md │ │ ├── AutomatedCodeReviewer.md │ │ ├── Ava_the_nutritionist.md │ │ ├── BABY.md │ │ ├── BabyGPT.md │ │ ├── Base Number Converter │ │ ├── Base64Encoder.md │ │ ├── Base64_encoder.md │ │ ├── BatchBlueAi.md │ │ ├── Beta Testing Survey.md │ │ ├── Between Us.md │ │ ├── Binary Operation.md │ │ ├── BioBuddy.md │ │ ├── Blog Post Title Generator.md │ │ ├── Blog generator.md │ │ ├── Book-Recommender.md │ │ ├── Book-to-Film Adaptations │ │ ├── Book-to-Film.md │ │ ├── BookClub-Agent.md │ │ ├── BookRecommendationEngine.md │ │ ├── Book_suggest.md │ │ ├── BookstoreandLibraryGuides.md │ │ ├── BrainwaveBuilder.md │ │ ├── BrandCraftAI.md │ │ ├── BrandIdentityLogoConceptDesigner.md │ │ ├── BugSpotter.md │ │ ├── Business Analyzer.md │ │ ├── C++ToARM.md │ │ ├── CSS_To_Tailwind_CSS_Converter.md │ │ ├── CalamitySupport.ai │ │ ├── CaloryCal.md │ │ ├── CapitalCityFinder.md │ │ ├── Career_Compass.md │ │ ├── CaseStudyHelper.md │ │ ├── Celeb Generator.md │ │ ├── ChangeRequestPro.md │ │ ├── Charles_Darwin_AI │ │ ├── CheatCodeGenius.md │ │ ├── ChemWiz.md │ │ ├── ChemicalFormulaGenerator.md │ │ ├── Chinese Sentence Creator.md │ │ ├── Cipher Master │ │ ├── Citizen Science Projects Contribution Scope Assistant.md │ │ ├── Code Check.md │ │ ├── Code Converter.md │ │ ├── Code Documentation.md │ │ ├── Code Explainer.md │ │ ├── Code Pioneer.md │ │ ├── Code Reviewer │ │ ├── Code generator.md │ │ ├── Code with Koala.md │ │ ├── Code-De-Plagger.md │ │ ├── Code-Review-Guide.md │ │ ├── CodeCheck.md │ │ ├── CodeDebugger.md │ │ ├── CodeFixerAssistant.md │ │ ├── CodeMasters │ │ ├── Code_Complexity_Analyzer.md │ │ ├── Code_Review.md │ │ ├── Codector.md │ │ ├── Coin_Sage.md │ │ ├── Cold-Email-Generator.md │ │ ├── ColdCallingScript.md │ │ ├── Color Palette Generator │ │ ├── Colour-Palette-Provider.md │ │ ├── Competitor-Analyser │ │ ├── ComposeAI.md │ │ ├── CompuHelp.md │ │ ├── Conducting User Interviews │ │ ├── ConstellationHelper.md │ │ ├── Content Shortner.md │ │ ├── Content Summarizer │ │ ├── Content creator │ │ ├── Content-Marketing-Strategist.md │ │ ├── Content-Recommendations-Agent.md │ │ ├── ContentRecommender.md │ │ ├── Cooking Assistant.md │ │ ├── Cooking for Special Diets.md │ │ ├── Cooking-Techniques-and-Tips.md │ │ ├── Create chess opening generator.md │ │ ├── Create chess player generator.md │ │ ├── Cricket team generator.md │ │ ├── Cultural Immersion experience AI │ │ ├── CupRushAI.md │ │ ├── Curator.md │ │ ├── Curling.md │ │ ├── Custom Love Poem Generator │ │ ├── CyberSentinel.md │ │ ├── DC-Universe-Facts.md │ │ ├── Dad Jokes.md │ │ ├── Daily Code Generator.md │ │ ├── Data Exploration and Visualization.md │ │ ├── DataCleanseAI.md │ │ ├── DataDash.md │ │ ├── DataDashCraft.md │ │ ├── DataVisualizationAgent │ │ ├── DataVisualizationGuide.md │ │ ├── Deadpool.md │ │ ├── Decimal to Binary converter.md │ │ ├── Description writer.md │ │ ├── Design Database Schema.md │ │ ├── Design Guidelines [Hacktoberfest] │ │ ├── Design Product RoadMap.md │ │ ├── Design User Story Template.md │ │ ├── Dev Laughs.md │ │ ├── Dev Mode - Jailbreak ChatGPT.md │ │ ├── DevRizz.md │ │ ├── DialectCoach.md │ │ ├── DialogixPro.md │ │ ├── Discord BOT │ │ ├── DistanceConverter.md │ │ ├── DocumentGenerator.md │ │ ├── Drill-Skill.md │ │ ├── DrugAssistant.md │ │ ├── DungeonMasterGPT(MK.I).md │ │ ├── EarthWiseAI.md │ │ ├── EasyLogin Form Generator.md │ │ ├── EcoSavvy.md │ │ ├── Ecofriendly.md │ │ ├── Elementalist.md │ │ ├── ElevatorPitchGPT.md │ │ ├── Emailolot.md │ │ ├── Emoji Playground.md │ │ ├── Emotional Support Companion.md │ │ ├── Engineer's buddy.md │ │ ├── English to Hindi Translator.md │ │ ├── English to Kannada translator.md │ │ ├── English to Sinhala Translator.md │ │ ├── English-to-Bangla-Translator.md │ │ ├── English-to-Kannada translator.md │ │ ├── EnglishToArabicTranslator.md │ │ ├── EnglishToHindiTranslator.md │ │ ├── EnglishtoUrduTranslator.md │ │ ├── Environmental Conservation.md │ │ ├── EnvironmentalConservation.md │ │ ├── EquationSolver.md │ │ ├── Error fix Assistant │ │ ├── Ethical AI agent.md │ │ ├── EthicalSupportAgent │ │ ├── EventPlannerAssistant.md │ │ ├── Excuse Wizard │ │ ├── Exercise_Buddy.md │ │ ├── Explore the personalities.md │ │ ├── F.R.I.E.N.D.S quotes generator 🫰.md │ │ ├── Facts.md │ │ ├── FakeMultimediaDetection.md │ │ ├── Famous Birthday Twins.md │ │ ├── Famous Football Players Generator.md │ │ ├── Female Tech Entrepreneur.md │ │ ├── Fiber-Chat.md │ │ ├── Figure Skating Routine Generator.md │ │ ├── Fit Bot.md │ │ ├── FitBot.md │ │ ├── FitLife Coach.md │ │ ├── Fitness Tracking and Progress Monitoring.md │ │ ├── Fitness-challenger.md │ │ ├── FlashDigUp.md │ │ ├── Food-recipe-generator.md │ │ ├── Foodie+wine.md │ │ ├── Football-Analyst.md │ │ ├── Foreign Language Vocabulary Builder.md │ │ ├── Fortunecookie.md │ │ ├── Funny Limerick Party Game.md │ │ ├── GOSSIF.md │ │ ├── GRAMMAR INSTRUCTOR.md │ │ ├── Game NPCs.md │ │ ├── GameConceptDesigner-GPT.md │ │ ├── GameReadyPro.md │ │ ├── GardenGuide │ │ ├── Gear and equipment recommendations.md │ │ ├── GeetaShlokas.md │ │ ├── GenZSlangs.md │ │ ├── General Stock Advisor.md │ │ ├── Generate projects in any framework │ │ ├── Geologist-GPT (MK.II).md │ │ ├── German Word-Assistant.md │ │ ├── GermanHistoryGuide.md │ │ ├── GetDiet.md │ │ ├── Get_Health_Advice.md │ │ ├── GigaChat.md │ │ ├── GitHub_Profile_Readme_Generator.md │ │ ├── GrammerGig │ │ ├── Graph Theory Algorithms with Steps.md │ │ ├── GreenLivingAdvisor.md │ │ ├── GreenThumb.md │ │ ├── GroundPinAI.md │ │ ├── Hackathon Buddy │ │ ├── HalalRecipeGenerator.md │ │ ├── Harry-Potter-quotes │ │ ├── Hash.md │ │ ├── Health-Diagnoser.md │ │ ├── HealthBuddy.md │ │ ├── Health_track.md │ │ ├── HealthyBites.md │ │ ├── Hindi to English Translator │ │ ├── Hinglish Translator │ │ ├── HistoricalReenactor.md │ │ ├── HomeRemedies.md │ │ ├── How_To_Bot.md │ │ ├── Humorous Fact.md │ │ ├── Humorous Facts │ │ ├── IceRinkEtiquetteAndSafety.md │ │ ├── IceSkatingGear&EquipmentRecommendation.md │ │ ├── IceSportGuideBot.md │ │ ├── Ice_Skater.md │ │ ├── IdeaHouse.md │ │ ├── Illa.md │ │ ├── Image Upload Component │ │ ├── Incorrect grammar detection.md │ │ ├── IndianHistoryHub.md │ │ ├── InfoVisCraftAI.md │ │ ├── Information_generator.md │ │ ├── Ingrain.md │ │ ├── Innovator.md │ │ ├── InspireBuddy │ │ ├── Inter_L_Coder.md │ │ ├── InteractiVisionAI.md │ │ ├── Interesting Harry Potter Fact.md │ │ ├── International Cuisines.md │ │ ├── InterviewScriptGenerator │ │ ├── Is-It-Endangered.md │ │ ├── Japanese To All Translator.md │ │ ├── JavascriptCoder │ │ ├── Job Search and Career Assistant.md │ │ ├── Job Seeker Assistant │ │ ├── Job-Seeker-Outreach-Assistant.md │ │ ├── Json to CSV Converter.md │ │ ├── Kitchen-Essentials.md │ │ ├── Know_about_nepal.md │ │ ├── LANGUAGE PROFICIENCY PREPARE AI │ │ ├── LULLU_storyBot.md │ │ ├── Language Learning Challenges.md │ │ ├── LanguageLearningRoadmap.md │ │ ├── Latest Scientific Discoveries.md │ │ ├── Lead-Generation-Tactics.md │ │ ├── LeadNurturePro.md │ │ ├── LeadQualifyBot.md │ │ ├── League of Legends Champion Recommender.md │ │ ├── Learn French.md │ │ ├── Learn Japanese.md │ │ ├── LearnLingo.md │ │ ├── Leftover-food-recipes │ │ ├── Leftover-recipes-generator.md │ │ ├── Legal Advisor │ │ ├── LegalAdvisor.md │ │ ├── LegalLumin.md │ │ ├── Ligament.md │ │ ├── Line-Coding-Waves.md │ │ ├── LingoLink.md │ │ ├── LinguoLingo.md │ │ ├── LionAgent │ │ ├── Lit.md │ │ ├── LitSleuth.md │ │ ├── LyricsGenerator.md │ │ ├── MCQ (Multiple Choice Question) Builder.md │ │ ├── Make an Impression.md │ │ ├── Market competition analysis report.md │ │ ├── MarketSegmenter.md │ │ ├── Marketing-Analytics-Frameworks.md │ │ ├── Markettrendresearchreport.md │ │ ├── Marvel-comic-universe-facts.md │ │ ├── MasterMind Tutor-AI │ │ ├── Mathematrix.md │ │ ├── MealPlanner.md │ │ ├── MealPrep.md │ │ ├── MediCare.md │ │ ├── MeditationGuide.md │ │ ├── MeetTaskwhizz │ │ ├── Meeting Agenda Maker.md │ │ ├── MentalConditioning.md │ │ ├── Mentalist.md │ │ ├── MinecraftAssistant.md │ │ ├── MixerChef(MK.I).md │ │ ├── MoneyKing │ │ ├── Monumental Chronicles.md │ │ ├── Morse-Coder.md │ │ ├── Motivational Quote Generator.md │ │ ├── MotivationalSpeakerAndMindsetSpecialist.md │ │ ├── Movie-Guider.md │ │ ├── MovieRecommendor.md │ │ ├── MultiLingo Code Interpreter.md │ │ ├── Multiple Musical Instruments Learning.md │ │ ├── Muse-maker.md │ │ ├── My Therapist │ │ ├── Nature.md │ │ ├── No Thinker.md │ │ ├── NutritionCalci.md │ │ ├── Objection Handling Guide.md │ │ ├── One Piece.md │ │ ├── OptiTechPro.md │ │ ├── OrganizerBot.md │ │ ├── Osiris.md │ │ ├── Otaku_Senpai.md │ │ ├── OutfitPlanner.md │ │ ├── PackagingConceptDesigner.md │ │ ├── PackingListGenerator.md │ │ ├── Panda-Debugger.md │ │ ├── Paraphraser.md │ │ ├── Password_History_Tracker.md │ │ ├── Password_Strength_Checker.md │ │ ├── Peom_in_hindi.md │ │ ├── Perfect Pen.md │ │ ├── PeriodicTableElementHelper.md │ │ ├── PersonGPT - Jailbreak ChatGPT.md │ │ ├── Personal Productivity Assistant.md │ │ ├── Personalise Learning system.md │ │ ├── Personalized-Workout-Generator.md │ │ ├── Pharmacist-GPT.md │ │ ├── Physics Demystified │ │ ├── Poem generator.md │ │ ├── PoemCraft.md │ │ ├── PoemGeneratorApp.md │ │ ├── Poetry Critic AI.md │ │ ├── Positive Affirmation Generator │ │ ├── PredictiveModelPro.md │ │ ├── PrimeCompositeNumberHelper.md │ │ ├── Product Analyzer.md │ │ ├── Product positioning document │ │ ├── Product usability testing plan │ │ ├── ProjectBreakdownAI.md │ │ ├── ProjectWisdomBot.md │ │ ├── Python Interpreter.md │ │ ├── QRGenerator │ │ ├── QuantumQuill.md │ │ ├── QuizMaster.md │ │ ├── QuoteGenerator.md │ │ ├── Quoter.md │ │ ├── README.md │ │ ├── RandomPhrasePass.md │ │ ├── Rap lyrics Generator -The weekend │ │ ├── RapMaster.md │ │ ├── ReadHorizonAI.md │ │ ├── Reading Comprehension Coach.md │ │ ├── ReadingHabitBuilding.md │ │ ├── ReadmeGenerator.md │ │ ├── RecipeInspirationGenerator.md │ │ ├── Regex Generator.md │ │ ├── Rephraser.md │ │ ├── RephraserTool.md │ │ ├── ResGent.md │ │ ├── Research-Summarizer.md │ │ ├── RiddleGenerator.md │ │ ├── Risk Management │ │ ├── Rive.md │ │ ├── RoadmapBuilder.md │ │ ├── RoastMaster3000.md │ │ ├── Russian-Translator.md │ │ ├── SEO Generator.md │ │ ├── SMILE_To_Name_and_Vice_Versa.md │ │ ├── SONG-ify.md │ │ ├── Saitama.md │ │ ├── Sales Presentation Slides.md │ │ ├── SalesProposalGPT.md │ │ ├── SanskritTranslator.md │ │ ├── SciCompPhysXpert.md │ │ ├── SciConnectAI.md │ │ ├── Science History and Pioneers.md │ │ ├── Science News Analysis Assistant.md │ │ ├── ScienceNewsAnalyzer.md │ │ ├── Script Like a Pro │ │ ├── Script Writer │ │ ├── SegmentMasterAI.md │ │ ├── Sentiment Analysis.md │ │ ├── Sentiment_Analysis_bot │ │ ├── Series-movies suggester.md │ │ ├── SkateCompInfoBot.md │ │ ├── Skynet.md │ │ ├── SnaTellAI.md │ │ ├── Social Campaigns │ │ ├── Socratesbot.md │ │ ├── Song Sage.md │ │ ├── SpamDetector.md │ │ ├── Spanish Poem Generator.md │ │ ├── Spanish.md │ │ ├── SpecifyMe.md │ │ ├── Speed Skating Techniques.md │ │ ├── Sport-strategies.md │ │ ├── Sports Injury Prevention.md │ │ ├── SportsMentor.md │ │ ├── SportsPsychology.md │ │ ├── SquareRootFinder.md │ │ ├── Stakeholder's Matrix Generator.md │ │ ├── StarAI.md │ │ ├── StatusUpdateGenius.md │ │ ├── StockX │ │ ├── Story Weave.md │ │ ├── Story generator │ │ ├── Story generator.md │ │ ├── Story teller.md │ │ ├── Story-Idea-generator.md │ │ ├── Story-Wizard.md │ │ ├── Story-teller.md │ │ ├── StorySpark.md │ │ ├── Story_generator.md │ │ ├── Study Pal │ │ ├── Study Roadmap │ │ ├── Study plan generator.md │ │ ├── Study-Buddy.md │ │ ├── StudyBuddy.md │ │ ├── Sudoku Solver.md │ │ ├── Suggest-Something-to-Cook.md │ │ ├── SymptomAnalyizer.md │ │ ├── SynonymFinder.md │ │ ├── TACG.ai.md │ │ ├── TALK.md │ │ ├── TV series suggester │ │ ├── TaskTitan.md │ │ ├── Teacher.md │ │ ├── Tech Stack Finder │ │ ├── Techo │ │ ├── Temperature Converter.md │ │ ├── TestImpactAI.md │ │ ├── Testing Code generator │ │ ├── Text-to-image-converter.md │ │ ├── Text2Hindi.md │ │ ├── TextSentimentAnalyzer.md │ │ ├── TextSummarizer.md │ │ ├── Thai_Translator.md │ │ ├── The Companion.md │ │ ├── Tic_tac_toe game.md │ │ ├── TimeTravelerTom.md │ │ ├── TimeTrendPro.md │ │ ├── TipSplitterCalculator.md │ │ ├── ToGoLang.md │ │ ├── Top 10 Movie Rankings.md │ │ ├── TourSuggester.md │ │ ├── TrainingDrillsandExercises.md │ │ ├── Translate English Messages.md │ │ ├── Translation Tutor.md │ │ ├── Translator │ │ ├── Translator.md │ │ ├── Translator2.md │ │ ├── TranslatorAurica │ │ ├── TravelBuddy.md │ │ ├── TravelLighter │ │ ├── Travel_Explorer.md │ │ ├── Travel_Itinerary.md │ │ ├── Trivia Bot.md │ │ ├── TwistedTales AI.md │ │ ├── Typing test.md │ │ ├── UsabilityTestingScript.md │ │ ├── Used Electronics Price Analyzer.md │ │ ├── User Research Report.md │ │ ├── User-Research-Questionnaire-Template.md │ │ ├── Userbehavioranalysisreport.md │ │ ├── VideoAdScripter │ │ ├── Virtual Companion.md │ │ ├── VirtualPetAdoptionAdvisor.md │ │ ├── Virtual_Historian_AI.md │ │ ├── WP Snippet Generator │ │ ├── WeathEats │ │ ├── Web Developer Helper.md │ │ ├── Web Development Helper.md │ │ ├── Web development help assistant.md │ │ ├── Web styling frameworks.md │ │ ├── WeblyAI.md │ │ ├── Welcome to Wilcume !.md │ │ ├── What's your MBTI.md │ │ ├── WikiScience.md │ │ ├── Wireframes.md │ │ ├── Word Meaning (Any Language) │ │ ├── Yoda Translator.md │ │ ├── YouTube Script Generator.md │ │ ├── Your Anxiety Buddy │ │ ├── [AI Agent]Version Control Workflows.md │ │ ├── [Ai Agent] Influencer's Era │ │ ├── [Ai Agent] Roadmap-generator.md │ │ ├── [Buzzman]The_latest_newsletter.md │ │ ├── [Direc-AI-tor]Movie script generator.md │ │ ├── academic-paraphrase-agent.md │ │ ├── ai-movie-critic.md │ │ ├── all-things-counter-strike.md │ │ ├── astrology facts generator │ │ ├── bibleQuotes.md │ │ ├── brandnamegenerator.md │ │ ├── career-roadmap-generator.md │ │ ├── ch-en-translator-model.md │ │ ├── chat got │ │ ├── combodia-name-generator │ │ ├── competitive-analysis-report.md │ │ ├── cooking-special-diets │ │ ├── cooking-techniques-and-tips │ │ ├── cube-root-finder │ │ ├── culinary-adventures │ │ ├── data-storytelling.md │ │ ├── dictionary │ │ ├── email Marketing Automation │ │ ├── finance-model.md │ │ ├── game-name-generator │ │ ├── gear-equipment-recommendations-ai-agent.md │ │ ├── grammar corrector │ │ ├── hackername generator.md │ │ ├── hashtage_generator.md │ │ ├── healthyfy.md │ │ ├── hello_cobol.md │ │ ├── html to jsx converter │ │ ├── job-interview-preparation.md │ │ ├── kannada.md │ │ ├── launch-plan-checklist.md │ │ ├── math-and-science-tutor.md │ │ ├── mohit.md │ │ ├── movie_suggent.md │ │ ├── music-recommender.md │ │ ├── ninja-java-script-assistant.md │ │ ├── nutriSport.md │ │ ├── osu! rhythm game coach.md │ │ ├── personal fitness advisor │ │ ├── productivitySongs │ │ ├── qr-scanner.md │ │ ├── quantum-computing-problem-solver.md │ │ ├── quantum-education-resource.md │ │ ├── routines-pal.md │ │ ├── secureCodingPractices.md │ │ ├── skating-guide.md │ │ ├── smith_the_converter │ │ ├── snooker-summarizer.md │ │ ├── software-architecture-design.md │ │ ├── space-travel-planner.md │ │ ├── spam detector │ │ ├── strategies for handling errors │ │ ├── study buddy app │ │ ├── the_matrix_quotes.md │ │ ├── travel_guide.md │ │ ├── unit-converter.md │ │ ├── user persona creator │ │ ├── user-research-report.md │ │ └── wthIsThis.md │ └── awesome-illa-apps/ │ ├── AI-Image-Gen │ ├── Anomaly Detection Dashboard with AI Agent │ ├── AskMyDocument.md │ ├── Awesome Avatars.md │ ├── Awesome-Notes-App.md │ ├── BMI Calculator.md │ ├── BMI_Notif │ ├── Barcode-Generator.md │ ├── Bible Quotes.md │ ├── Birthday-wisher.md │ ├── Blog_template.md │ ├── Bug-Reporting.md │ ├── CRUD APP │ ├── CSV_To_MYSQL.md │ ├── Calculator App.md │ ├── Calculator.md │ ├── Case Converter.md │ ├── Cats API.md │ ├── CheatCodeGenius │ ├── Contact Developers.md │ ├── Crazy-Avatars.md │ ├── CrudApp.md │ ├── Data-entry.md │ ├── Date to Timestamp.md │ ├── Day_Planner.md │ ├── Dialogue Generator.md │ ├── DrugWiki.md │ ├── ENGLISH-HINDI-Translation-App │ ├── EarthLens.md │ ├── English To Higlish Translater │ ├── Export Charts │ ├── Feedback_Form.md │ ├── Funky_Calculator.md │ ├── GiftSwap.md │ ├── GitHubStatsGenerator.md │ ├── Github Issue Finder.md │ ├── Github Stats Generator │ ├── Github Stats.md │ ├── Github Status Generator.md │ ├── GithubActivityGraphGenerator.md │ ├── GithubRepoStats.md │ ├── HacktoberFest23.md │ ├── Hacktoberfest Treasure Hunt.md │ ├── Hex to RGB Color Converter.md │ ├── Hex-RGB-Converter │ ├── Holopin Board Preview.md │ ├── Holopin Profile Viewer.md │ ├── Imaginate Creator.md │ ├── InputField.md │ ├── Inventory management.md │ ├── Joker.md │ ├── Jotfusion.md │ ├── LeetCodeStatsCardGenerator.md │ ├── MPLgen │ ├── Max Portfolio.md │ ├── Monitor Repositories Star, Forks and Issues.md │ ├── Newsletter │ ├── Notes App.md │ ├── NotesUsingSupabaseCRUD.md │ ├── Payment_form.md │ ├── Pearls-Illa-App.md │ ├── PokemonGenerator.md │ ├── Pokémon Stats.md │ ├── Predict Number │ ├── Product CRUD App Using TiDB.md │ ├── ProgrammingMemeGenerator.md │ ├── QR Code Generator.md │ ├── QR-Generator.md │ ├── README.md │ ├── Restaurantmenu.md │ ├── Resume_Builder.md │ ├── Say Hello.md │ ├── Sentimental-Analysis.md │ ├── Sentimental.md │ ├── Signin_form.md │ ├── Simple Form.md │ ├── Simple-portfolio-page │ ├── SimpleSignupForm.md │ ├── SpamDetection.md │ ├── Stable-Diffusion-XL │ ├── StatsGenerator │ ├── Subscription_form.md │ ├── Survey Form │ ├── TODO Application.md │ ├── Text to Image Generator.md │ ├── To-Do List App.md │ ├── Translator HiNDI to English │ ├── TriviaGenerator.md │ ├── TwitterClone │ ├── Url Decoder APP │ ├── WaifuGenerator.md │ ├── Weather-App.md │ ├── contactDevelopers.md │ ├── hello-word.md │ ├── rgbaColorGenerator.md │ ├── simple-login-form.md │ └── simple-portfolio-template ├── illa-builder-frontend.conf ├── nginx.conf ├── package.json ├── packages/ │ ├── eslint-config-illa/ │ │ ├── index.js │ │ └── package.json │ └── tsconfig/ │ ├── base.json │ ├── package.json │ └── react.json ├── pnpm-workspace.yaml └── turbo.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintignore ================================================ **/*.svg ================================================ FILE: .eslintrc.js ================================================ module.exports = { root: true, extends: ["illa"] } ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ # thx chakra ui template name: "Bug Report" description: "File a bug report" labels: ["bug"] assignees: - Aruseito title: "[BUG] " body: - type: "markdown" attributes: value: | Thanks for creating an issue 😄! Please search open/closed issues before submitting. Someone might have asked the same thing before 😉! If you want to discuss sth, please go to the [Discussion](https://github.com/illacloud/discussions) - type: "input" id: "description" attributes: label: "Description" description: "A brief description of the issue." placeholder: | When I ____, I expected ____ to happen but ____ happened instead. validations: required: true - type: "textarea" id: "steps" attributes: label: "Steps to reproduce" description: | Explain how to cause the issue in the provided reproduction. value: | 1. Go to '...' 2. Click on '...' 3. Scroll down to '...' 4. See error - type: dropdown id: version attributes: label: Version description: What version of our software are you running? options: - cloud - self-host validations: required: true - type: "input" id: "illa-builder-version" attributes: label: "ILLA Builder Version" description: "The version of ILLA Builder you use." placeholder: "1.0.0" validations: required: true - type: "input" id: "browser" attributes: label: "Browser" description: "The browser(s) this issue occurred with." placeholder: "Google Chrome 93" - type: "checkboxes" id: "operating-system" attributes: label: "Operating System" description: "The operating system(s) this issue occurred with." options: - label: "macOS" - label: "Windows" - label: "Linux" - type: "textarea" id: "additional-information" attributes: label: "Additional Information" description: | Use this section to provide any additional information you might have like screenshots, notes, or links to ideas. ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: Ask a question url: https://github.com/orgs/illacloud/discussions about: Ask questions and discuss topics with other community members - name: Chat with other community members url: https://discord.gg/illacloud about: The official illa Cloud Discord community ================================================ FILE: .github/ISSUE_TEMPLATE/custom.md ================================================ --- name: Custom issue template about: Describe this issue template's purpose here. title: '' labels: '' assignees: '' --- ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project title: "[Feature Requested] " labels: feature assignees: wenzhuo2022 --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/holopin.yml ================================================ organization: illa defaultSticker: clnbuq0zt55350il7di08vxey stickers: - id: clnbuwccz20050il45drk120o alias: Awesome ILLA App - id: clnbuz74g85880lkz0a5fyzis alias: Awesome AI Agent - id: clnbv3uo903310fmgagvt713t alias: AI Agent - id: clnbuq0zt55350il7di08vxey alias: ILLA App ================================================ FILE: .github/pull_request_template.md ================================================ ## 📝 Description Add a brief description. ## 💣 Is this a breaking change (Yes/No): - [ ] Yes - [x] No ## 🚧 How to migrate? Don't need. ## 📝 Additional Information lol ================================================ FILE: .github/stale.yml ================================================ # Number of days of inactivity before an issue becomes stale daysUntilStale: 7 # Number of days of inactivity before a stale issue is closed daysUntilClose: 7 # Issues with these labels will never be considered stale exemptLabels: - pinned - security - feature - bug # Label to use when marking an issue as stale staleLabel: stale # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. # Comment to post when closing a stale issue. Set to `false` to disable closeComment: true ================================================ FILE: .github/workflows/build-all-in-one-image.yml ================================================ name: Build all in one image on: push: branches: - main release: types: [published] env: ILLA_MUI_LICENSE: ${{ secrets.ILLA_MUI_LICENSE }} ILLA_BASE_PATH: /build jobs: build: name: Build docker image runs-on: ubuntu-latest steps: - name: Set build args run: | if [ "${{ github.event_name }}" = "release" ]; then TAG=${{ github.event.release.tag_name }} VERSION=v${TAG#illa-builder@} echo "IMAGE_TAG=${VERSION}" >> $GITHUB_ENV echo "BUILD_SBE_BRANCH=main" >> $GITHUB_ENV echo "BUILD_BE_BRANCH=main" >> $GITHUB_ENV echo "BUILD_FE_BRANCH=${{ github.event.release.tag_name }}" >> $GITHUB_ENV else echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV echo "BUILD_SBE_BRANCH=${{ github.ref_name }}" >> $GITHUB_ENV echo "BUILD_BE_BRANCH=${{ github.ref_name }}" >> $GITHUB_ENV echo "BUILD_FE_BRANCH=${{ github.ref_name }}" >> $GITHUB_ENV fi - uses: actions/checkout@v4 with: repository: illacloud/build-all-in-one-image path: build-all-in-one-image - uses: actions/checkout@v4 with: repository: illacloud/illa-builder path: illa-builder submodules: true - uses: actions/setup-node@v3 with: node-version: 18.12.1 - uses: pnpm/action-setup@v2 with: version: 8.7.0 - name: Build website run: | ls cd illa-builder pnpm install --frozen-lockfile echo "Building for $GITHUB_REF_NAME branch,ILLA APP ENV is $ILLA_APP_ENV" pnpm build-self cp ./apps/builder/dist ../build-all-in-one-image/builder -r cp ./apps/cloud/dist ../build-all-in-one-image/cloud -r cd .. - name: ls build-all-in-one run: | ls build-all-in-one-image - name: ls cloud run: | ls build-all-in-one-image/cloud - name: ls builder run: | ls build-all-in-one-image/builder - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_LOGIN }} password: ${{ secrets.DOCKER_PWD }} - name: Build and push uses: docker/build-push-action@v5 with: context: ./build-all-in-one-image platforms: linux/amd64,linux/arm64 push: true tags: | illasoft/illa-builder:${{ env.IMAGE_TAG }} ${{ github.event_name == 'release' && startsWith(github.event.release.tag_name, 'illa-builder@') && 'illasoft/illa-builder:latest' || '' }} build-args: | FE=${{ env.BUILD_FE_BRANCH }} BE=${{ env.BUILD_BE_BRANCH }} SBE=${{ env.BUILD_SBE_BRANCH }} ================================================ FILE: .github/workflows/build-cname-docker.yml ================================================ name: Deploy cname image to k8s on: push: branches: - main env: ILLA_GOOGLE_MAP_KEY: ${{ secrets.ILLA_GOOGLE_MAP_KEY }} ILLA_MIXPANEL_API_KEY: ${{ secrets.ILLA_MIXPANEL_API_KEY }} ILLA_MUI_LICENSE: ${{ secrets.ILLA_MUI_LICENSE }} ILLA_SENTRY_AUTH_TOKEN: ${{ secrets.ILLA_SENTRY_AUTH_TOKEN }} DO_CLUSTER: ${{ secrets.DO_CLUSTER }} DOCKER_LOGIN: ${{ secrets.DOCKER_LOGIN }} DOCKER_PWD: ${{ secrets.DOCKER_PWD }} ILLA_BASE_PATH: /builder jobs: build: name: Build website runs-on: ubuntu-latest environment: name: ${{ (github.ref == 'refs/heads/main') && 'production' || (github.ref == 'refs/heads/develop') && 'test' || (github.ref == 'refs/heads/beta') && 'beta' }} env: ILLA_API_BASE_URL: ${{ vars.ILLA_API_BASE_URL }} ILLA_APP_ENV: ${{ vars.ILLA_APP_ENV }} ILLA_BUILDER_URL: ${{ vars.ILLA_BUILDER_URL }} ILLA_CLOUD_URL: ${{ vars.ILLA_CLOUD_URL }} ILLA_MARKET_URL: ${{ vars.ILLA_MARKET_URL }} steps: - uses: actions/checkout@v4 with: submodules: true - uses: actions/setup-node@v3 with: node-version: 18.12.1 - uses: pnpm/action-setup@v2 with: version: 8.7.0 - name: Install dependencies run: pnpm install --frozen-lockfile - name: Install doctl uses: digitalocean/action-doctl@v2 with: token: ${{ secrets.DO_TOKEN }} - name: Install kubectl run: | sudo snap install kubectl --classic - name: Setup kubectl run: | doctl kubernetes cluster kubeconfig save $DO_CLUSTER kubectl version - name: Build website run: | echo "Building for $GITHUB_REF_NAME branch,ILLA APP ENV is $ILLA_APP_ENV" pnpm build-cloud - name: Build Docker run: | docker build --cache-from=illa-builder-cname-frontend -f Dockerfile -t illa-builder-cname-frontend . - name: Push application Docker image run: | docker login -u $DOCKER_LOGIN -p $DOCKER_PWD docker tag illa-builder-cname-frontend "illasoft/illa-builder-cname-frontend:$GITHUB_REF_NAME" docker push "illasoft/illa-builder-cname-frontend:$GITHUB_REF_NAME" - uses: actions/checkout@v4 with: repository: illacloud/k8s-application-do token: ${{ secrets.ILLA_BOT_TOKEN }} path: k8s-application-do - name: Deploy to Kubernetes run: | cd k8s-application-do/namespace-$ILLA_APP_ENV kubectl apply -f ./illa-builder-cname-frontend/ -n $ILLA_APP_ENV kubectl -n $ILLA_APP_ENV rollout restart deployment illa-builder-cname-frontend ================================================ FILE: .github/workflows/close-stale-issues-and-PRs.yml ================================================ name: "Close stale issues and PR" on: schedule: - cron: "30 1 * * *" jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v7 with: stale-issue-message: "This issue is stale because it has been open 5 days with no activity. Remove stale label or comment or this will be closed in 2 days." stale-pr-message: "This PR is stale because it has been open 5 days with no activity. Remove stale label or comment or this will be closed in 2 days." close-issue-message: "This issue was closed because it has been stalled for 2 days with no activity." days-before-issue-stale: 5 days-before-pr-stale: 5 days-before-issue-close: 2 days-before-pr-close: 2 exempt-issue-labels: "bug,feature,help wanted,invalid,hacktoberfest,hacktoberfest developing" exempt-all-assignees: true ================================================ FILE: .github/workflows/codeql-analysis.yml ================================================ # For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: [ main, develop ] pull_request: # The branches below must be a subset of the branches above branches: [ main ] schedule: - cron: '40 0 * * 3' jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'javascript' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - name: Checkout repository uses: actions/checkout@v3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@v2 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun # If the Autobuild fails above, remove it and uncomment the following three lines. # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. # - run: | # echo "Run, Build Application using script" # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 ================================================ FILE: .github/workflows/deploy-to-flyio.yml ================================================ name: Deploy to flyio on: push: branches: - main env: ILLA_GOOGLE_MAP_KEY: ${{ secrets.ILLA_GOOGLE_MAP_KEY }} ILLA_MIXPANEL_API_KEY: ${{ secrets.ILLA_MIXPANEL_API_KEY }} ILLA_AMPLITUDE_API_KEY: ${{ secrets.ILLA_AMPLITUDE_API_KEY }} ILLA_MUI_LICENSE: ${{ secrets.ILLA_MUI_LICENSE }} ILLA_SENTRY_AUTH_TOKEN: ${{ secrets.ILLA_SENTRY_AUTH_TOKEN }} jobs: build: name: Build website runs-on: ubuntu-latest environment: name: "production" env: ILLA_API_BASE_URL: ${{ vars.ILLA_API_BASE_URL }} ILLA_APP_ENV: ${{ vars.ILLA_APP_ENV }} ILLA_BUILDER_URL: ${{ vars.ILLA_BUILDER_URL }} ILLA_CLOUD_URL: ${{ vars.ILLA_CLOUD_URL }} ILLA_MARKET_URL: ${{ vars.ILLA_MARKET_URL }} steps: - uses: actions/checkout@v4 with: submodules: true - uses: actions/setup-node@v3 with: node-version: 18.12.1 - uses: pnpm/action-setup@v2 with: version: 8.7.0 - name: Install dependencies run: pnpm install --frozen-lockfile - name: Build website run: | echo "Building for $GITHUB_REF_NAME branch,ILLA APP ENV is $ILLA_APP_ENV" pnpm build-cloud - uses: superfly/flyctl-actions/setup-flyctl@master - run: flyctl deploy --remote-only env: FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} ================================================ FILE: .github/workflows/issue-mark-assignees.yml ================================================ name: Issue Mark Assignees on: issue_comment: types: [created, edited] jobs: mark-assignees: runs-on: ubuntu-latest steps: - name: mark-assignees uses: actions-cool/issues-helper@v3 with: actions: 'mark-assignees' token: ${{ secrets.ILLA_BOT_TOKEN }} ================================================ FILE: .gitignore ================================================ node_modules .idea .DS_Store .vscode .turbo ================================================ FILE: .gitmodules ================================================ [submodule "packages/illa-public-component"] path = packages/illa-public-component url = https://github.com/illacloud/illa-public-component.git branch = beta [submodule "packages/illa-design"] path = packages/illa-design url = https://github.com/illacloud/illa-design.git ================================================ FILE: .husky/commit-msg ================================================ #!/bin/sh . "$(dirname "$0")/_/husky.sh" pnpm commitlint --edit "${1}" ================================================ FILE: .husky/pre-commit ================================================ #!/bin/sh . "$(dirname "$0")/_/husky.sh" pnpm ts-check && pnpm lint && pnpm lint-staged ================================================ FILE: .lintstagedrc.mjs ================================================ export default { "*.{ts,tsx}": ["prettier --write"], } ================================================ FILE: .npmrc ================================================ registry = https://registry.npmjs.org/ ================================================ FILE: .prettierignore ================================================ # snapchat __snapshots__/** *.test.tsx.snap ILLA_PROTO.* *.md *.mdx ================================================ FILE: .prettierrc ================================================ { "bracketSpacing": true, "jsxBracketSameLine": false, "jsxSingleQuote": false, "printWidth": 80, "proseWrap": "always", "semi": false, "singleQuote": false, "tabWidth": 2, "trailingComma": "all", "arrowParens": "always", "plugins": ["@trivago/prettier-plugin-sort-imports"], "importOrder": ["","^@illa-design/(.*)$", "^@/(.*)$", "^[./]"], "importOrderSeparation": false, "importOrderSortSpecifiers": true } ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct is in effect in all community spaces and applies when someone is officially representing the community in public. Representation includes activities like using an official email, posting from an official social media account, or acting as a designated representative at online or offline events. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at opensource@illasoft.com. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. ================================================ FILE: CONTRIBUTING.md ================================================ # How to Contribute Illa-builder is one of Illa’s open-source projects that is under very active development. We’re still working out the kinks to make contributing to this project as easy and transparent as possible, but we’re not quite there yet. Hopefully this document makes the process for contributing clear and answers some questions that you may have. ## Open Development All work on Illa-builder happens directly on GitHub. Both core team members and external contributors send pull requests which go through the same review process. ## Your First Pull Request Working on your first Pull Request? You can learn how from this free video series: [How to Contribute to an Open-Source Project on GitHub](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github) ## Sending a Pull Request The core team is monitoring pull requests. We will review your pull request and either merge it, request changes to it, or close it with an explanation. For API changes we may need to fix our internal uses at Illa, which could cause some delay. We’ll do our best to provide updates and feedback throughout the process. **Before submitting a pull request**, please make sure the following is done: 1. Fork the repository and create your branch from `beta`. 2. Run `git submodule init && git submodule update` in the repository root. 3. Run `pnpm install` in the repository root. 4. If you’ve fixed a bug or added code that should be tested! 5. Format your code with prettier `pnpm format`. 6. Make sure your code lint’s `pnpm lint`. For additional information on contributing, you can check out our landing page [Hacktoberfest2023 | Illa Cloud](https://www.illacloud.com/hacktoberfest2023?utm_medium=social&utm_source=twitter&utm_campaign=twitter-social-hacktoberfest2023-illa-0925). ## Utilizing Docker (Recommended) Illa recommends utilizing a docker all-in-one image for making contributions towards illa-builder: ### Creating an Official Image To create an official illa-soft image, execute command: `docker pull illasoft/illa-builder:latest` This command will pull the illa-soft official image and run it in your docker environment. By default, all configurations are for running a production environment. When successfully pulled, Logs will display the ILLA BUILDER BANNER in your docker environment. Note: You must have the docker image configured for self-host prerequisites. For more information on running an Image, check out [Docker all-in-one Image](https://www.illacloud.com/docs/docker-all-in-one-image). ### Deploying Illa Builder via Docker All deploys default auto-config settings for a production environment unless your deployment is customized. It's highly recommended deploying with our auto-deploy tools, ILLA CLI. To install ILLA-CLI: ``` #### download illa cli binary file > wget https://github.com/illacloud/illa/releases/latest/download/illa-x86_64-linux.tar.gz #### unpack the file > tar -zxvf illa-x86_64-linux.tar.gz > cd illa-x86_64-linux > chmod +x illa #### run the illa cli > ./illa ``` ### Contribution Self-host Prerequisites - You have the latest version of [Node.js LTS](https://nodejs.org/en/download) and [pnpm](https://pnpm.io/installation) installed. - You are familiar with Git. - You have docker-all-in-one, illa-cli installed, and illa-builder-backend running on your local machine. ### Confirm self-host prerequisites Next, check the prerequisites of self-host, execute command: `./illa doctor` When it's run is complete you should receive a message in green stating "Success! The minimum requirement for deploying ILLA has been satisfied." Ports 5432, 9999, 8000, should remain open for deploying ILLA Builder. For more information on ILLA CLI and Other Operations check out [ILLA-CLI](https://www.illacloud.com/docs/illa-cli). ### Deploy self-host locally After you have confirmed you meet the minimum requirements for deploying Illa Builder, deploy via either port 5432, 8000, 9345, 9999, or 10000. To deploy Illa Builder via self-host locally, execute command: `./illa deploy --self --port ` change `` with port number This will deploy illa-builder-backend at port ``. Then execute command: `docker run -d -p :2022 illasoft/illa-builder:latest` change `` with port number Check your docker containers and you should find an illasoft/illabuilder container running at Port ``:2022. If you deploy executing the deploy command as: `./illa deploy --self` This will auto-deploy illa-builder on port 80; you'll be able to access illa-builder at `http://localhost:80`. Once you have successfully deployed illa builder and have received the Illa Builder Started, please visit `http://localhost:` response, go to the website and login using the credentials: Username: root Password: password (self-host mode only). Alternatively, you can deploy/ or change the port by which Illa Builder can be accessed; execute command: ``` # the port which ILLA Builder can be accessed on can be changed # the is the custom mount path of ILLA Builder, the default value is a path under the user home directory if not filled > illa deploy --self --port=10000 --mount= ``` The Docker all-in-one Image is built based on the official Debian Image, which makes the username and password for the container the same as the image, you have the option to omit or change the username and password at your discretion. For more information on other operations, check out [ILLA-CLI](https://www.illacloud.com/docs/illa-cli). If needing to run a self-host production workflow environment version based on deployment at port ``, input the following to `apps/builder/env.self` ``` ILLA_API_BASE_URL=localhost: # this is your backend address, if this is not present, it will use the default backend address, location.origin, update to port number ILLA_INSTANCE_ID=SELF_HOST_CLOUD ILLA_APP_VERSION=0.0.0 ILLA_APP_ENV=production ``` Once illa-builder-backend services are running, you can utilize several commands such as: - `pnpm build-self` creates a self-host production version for the illa-builder frontend repository. - `pnpm lint` checks the code style. - `pnpm format` format your code with prettier - `pnpm dev` preview in real time while coding with cloud version - `pnpm dev:self` preview in real time while coding with self-host version - `pnpm build-cloud` creates a cloud production version with illa-builder. For more information on contributing to illa-builder-frontend check out our [Build All-In-One-Image Dockerfile](https://github.com/illacloud/build-all-in-one-image/blob/main/dockerfile). ### Modifying an Image By default, all configuration settings for a Docker all-in-one Image are for running a production environment. To modify a created Image, execute command: `docker exec -it illa_builder /bin/bash` The default configuration settings for the Docker all-in-one Image include all environment parameters. You have the option to modify these parameters when you run the container to accommodate specific needs or to connect to a database instance. You can review the default configuration parameters at [config.go](https://github.com/illacloud/builder-backend/blob/main/src/utils/config/config.go). ### Additional Self-hosting Information You can self-host locally with ILLA CLI, Docker compose, k8s helm etc. We’ve repeatedly optimized the self-host process to enable you to make self-host and software deployments in just a few minutes. Compared to the cloud, you can use ILLA products more securely and reliably, and you can use ILLA Builder by simply visiting the deployment site after hosting and deploying Builder locally. ### Customized Development Workflow Example Latest version of Node.js LTS and pnpm are installed/ running. Install from links above following instructions. Clone the illa-builder repository, and run `pnpm install` to fetch its dependencies. Customize your language parameter, i.e. NEXT.js, and create a development workflow environment; input the following to `apps/builder/.env.development.local` And `apps/cloud/.env.development.local` ``` ILLA_API_BASE_URL=localhost: # this is your backend address, if this is not present, it will use the default backend address, location.origin, update to port number ILLA_INSTANCE_ID=SELF_HOST_CLOUD ILLA_APP_VERSION=0.0.0 ILLA_APP_ENV=development ILLA_USE_HTTPS=false ILLA_BUILDER_URL=http://localhost:3000 ILLA_CLOUD_URL=http://localhost:5173 ``` ### Deploying Manually Alternatively, you can deploy Illa Builder manually using Docker Compose and Kubernetes. Check out instructions for deploying with [Docker Compose](https://github.com/illacloud/deploy-illa-manually/blob/main/docker-compose/README.md), and Instructions for deploying with [Kubernetes](https://github.com/illacloud/deploy-illa-manually/blob/main/kubernetes/README.md). For more information on self-hosting, please see the ILA CLI, Docker Compose, and k8s helm boot pages. If you have difficulties with your self-deployment, please review the [Deploy Introduction](https://www.illacloud.com/docs/deploy-introduction) Self-host/ Deploy Manually instructions; you can also contact us on GitHub or at business@illasoft.com. ## For Rust Developer's As a Rust Developer, you can easily build+install the latest ILLA CLI release with cargo, execute command: `cargo install illa` The cargo tool will download the ILLA CLI with its source dependencies, build and install it into the cargo bin path so that we can run it. Once installed, you can run the ILLA CLI utilizing the illa command: `./illa ` Illa CLI is a tool for hosting ILLA Builder in your local environment. Once installed, execute command `./illa deploy --self --port `, update `` to port number. Again, this will deploy illa-builder-backend at port ``. If needing to modify your `.env.self`, input: ``` ILLA_API_BASE_URL=localhost: # update to port number ILLA_INSTANCE_ID=SELF_HOST_CLOUD ILLA_APP_VERSION=0.0.0 ILLA_APP_ENV=development ILLA_USE_HTTPS=false ``` ## For GO Developer's There is currently no formal documentation for setup with GO, however you're encouraged to check out and contribute to builder-backend here [illa-builder-backend](https://github.com/illacloud/builder-backend). ================================================ FILE: Dockerfile ================================================ # ------------------- # build runner images FROM nginx:stable-alpine as runner RUN ls -alh /etc/nginx/ RUN apk add --no-cache \ bash \ sed ## copy frontend COPY nginx.conf /etc/nginx/nginx.conf COPY illa-builder-frontend.conf /etc/nginx/conf.d/illa-builder-frontend.conf COPY ./apps/builder/dist /opt/illa/illa-builder-frontend RUN rm /etc/nginx/conf.d/default.conf # test nginx RUN nginx -t # HEALTHCHECK --interval=5s --timeout=3s CMD curl -fs http://127.0.0.1:80/status?src=docker_health_check -H"Host:localhost" || exit 1 # run EXPOSE 80 ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README-CN.md ================================================

ILLA Builder

ILLA 是一个强大的开源低代码平台,供开发人员构建内部工具。 通过使用 ILLA 的组件和操作库,开发人员可以节省大量构建工具的时间。

English | 简体中文 | Deutsch | 日本語

GitHub - Readme - jp

[![Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://discord.gg/illacloud) [![Twitter](https://img.shields.io/badge/Twitter-1DA1F2?logo=x&logoColor=white)](https://twitter.com/illa_cloud) [![Discussions](https://img.shields.io/badge/discussions-GitHub-333333?logo=github)](https://github.com/orgs/illacloud/discussions) [![Crowdin](https://badges.crowdin.net/illa-builder/localized.svg)](https://crowdin.com/project/illa-builder) [![CI (Rolling and Humble)](https://github.com/illacloud/illa-builder/actions/workflows/build-docker.yml/badge.svg?query=branch%3Amain)](https://github.com/illacloud/illa-builder/actions/workflows/build-docker.yml?query=branch%3Amain) [![PR:s Welcome](https://img.shields.io/badge/PR:s-welcome-brightgreen.svg)](https://github.com/illacloud/illa-builder/pulls) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=socialflat-square&)](https://www.apache.org/licenses/LICENSE-2.0.html) ## 🚀开始体验ILLA 试用ILLA的最方便的方式是注册并登录 [ILLA Cloud](https://cloud.illacloud.com?utm_source=github&utm_medium=readme&utm_campaign=github-readme)。 您还可以[本地部署](https://github.com/illacloud/illa-builder/blob/main/README-CN.md#%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2)ILLA工具(Docker、Docker Compose和Kubernetes)。

## ✨ 特色功能 1. ⚽ **实时协作:** 我们可以一起实时创建内容。 2. 🤖 **自动化支持:** 连接一切组件,并在 5 秒内实现自动化。 3. 🖥 **本地部署:** 支持Docker和k8s 4. 📝 **Page支持:** 创建内容丰富且 UI 友好的工具的基础。 5. 🎨 **由 [ILLA Design](https://github.com/illacloud/illa-design) 提供支持:** 组件不应限制您的想象力。 ## 本地部署 ILLA CLI 使您能够以超乎想象的速度部署 ILLA Builder。 [单击此处](https://docs.illacloud.com/self-hosted-deployment) 了解更多详细信息。
部署成功后,您可以使用邮箱注册或使用以下信息登录:

Username (email): root

Password: password

## 使用指南 #### 🎯 第 1 步:连接到您的数据库

#### 🎨 第 2 步:使用内置组件构建 UI 将组件拖动到画布来构建您的 UI。我们在 Illa Builder 和 Illa Design 中提供了数十种组件,包括图表、表格、表单等。当组件重叠时,它们的位置会自动调整,使得布局开发变得简单灵活。

#### 🔌 第 3 步:连接您的数据 通过我们的 GUI 数据连接器连接到 MySQL 或 REST API。我们未来将添加10多个数据库和API。

#### 🚀 第 4 步:部署您的应用 部署您的应用程序并自行托管。

## 💬 社区 加入 ILLA 社区,分享您的想法、建议或问题,并与其他用户和贡献者交流。 加入微信群: ![IMG_8665](https://github.com/user-attachments/assets/eeb23db8-d42f-45b2-be65-bce74a8c8b85) Discord与Github社区入口 [![Chat on Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://discord.gg/illacloud) [![Discuss on GitHub](https://img.shields.io/badge/discussions-GitHub-333333?logo=github)](https://github.com/orgs/illacloud/discussions) ## 🌱 贡献 考虑为ILLA社区作出贡献?非常感谢和欢迎大家对ILLA的各种贡献!查看[贡献指南](./CONTRIBUTING.md),了解有关如何参与的详细信息。

感谢 ❤︎ 贡献者们 为ILLA做出的贡献

## 📢 翻译 `apps/builder/src/i18n/locale/*`目录是通过Crowdin自动更新的。如果你想作出贡献,请查看我们的[官方翻译页面](https://crowdin.com/project/illa-builder)。 ## 版权说明 ILLA是 [Apache License 2.0](./LICENSE)。 ================================================ FILE: README-DE.md ================================================

ILLA Builder

ILLA ist eine robuste, quelloffene Low-Code-Plattform für Entwickler zur Erstellung interner Tools. Durch die Verwendung der ILLA-Bibliothek von Komponenten und Aktionen können Entwickler viel Zeit bei der Erstellung von Tools sparen.


GitHub - Readme - jp

[![Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://discord.gg/illacloud) [![Twitter](https://img.shields.io/badge/Twitter-1DA1F2?logo=x&logoColor=white)](https://twitter.com/illa_cloud) [![Discussions](https://img.shields.io/badge/discussions-GitHub-333333?logo=github)](https://github.com/orgs/illacloud/discussions) [![Crowdin](https://badges.crowdin.net/illa-builder/localized.svg)](https://crowdin.com/project/illa-builder) [![CI (Rolling and Humble)](https://github.com/illacloud/illa-builder/actions/workflows/build-docker.yml/badge.svg?query=branch%3Amain)](https://github.com/illacloud/illa-builder/actions/workflows/build-docker.yml?query=branch%3Amain) [![PR:s Welcome](https://img.shields.io/badge/PR:s-welcome-brightgreen.svg)](https://github.com/illacloud/illa-builder/pulls) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=socialflat-square&)](https://www.apache.org/licenses/LICENSE-2.0.html) ## 🚀Starten Sie Um ILLA auszuprobieren, ist es am bequemsten, sich zu registrieren und einzuloggen bei[ILLA Cloud](https://cloud.illacloud.com?utm_source=github&utm_medium=readme&utm_campaign=github-readme) Sie können ILLA-Utilities auch manuell bereitstellen und selbst hosten [Docker, docker-compose, und k8s](https://github.com/illacloud/illa-builder/blob/main/README-KR.md#%EC%9E%90%EC%B2%B4-%ED%98%B8%EC%8A%A4%ED%8C%85).

## ✨ Eigenschaften 1. ⚽ **Kollaboration in Echtzeit:** Wir können alles gemeinsam in Echtzeit erstellen. 2. 🤖 **Automatisierte Unterstützung:** Verbinden Sie alles und automatisieren Sie es in 5 Sekunden 3. 🖥 **Selbst gehostet:** unterstützt Docker & k8s 4. 📝 **eitenunterstützung:** Die Basis für die Erstellung eines inhaltsreichen und UI-freundlichen Tools. 5. 🎨 ** [Angetrieben von ILLA Design](https://github.com/illacloud/illa-design):** : Komponenten sollten Ihre Fantasie nicht einschränken. ## Selbst gehostet The ILLA CLI enables you to deploy ILLA Builder faster than your imagination. [Click here](https://docs.illacloud.com/self-hosted-deployment) for more details. After successfully deployed, you can register with email address or log in with the following information:

Benutzername (E-Mail): root

Kennwort: password

## Wie Sie Ihr Werkzeug bauen #### 🎯 Schritt 1: Verbinden Sie sich mit Ihrer Datenbank

#### 🎨 Schritt 2: Erstellen der Benutzeroberfläche mit integrierten Komponenten Erstellen Sie Ihre Benutzeroberfläche, indem Sie Komponenten auf die Leinwand ziehen. Wir bieten Dutzende von Komponenten wie Diagramme, Tabellen, Formulare und viele mehr in Illa Builder und Illa Design. Wenn sich Komponenten überschneiden, wird ihre Position automatisch angepasst, was die Layoutentwicklung einfach und flexibel macht.

#### 🔌 Schritt 3: Verbindung zu Ihren Daten Stellen Sie eine Verbindung zu MySQL oder REST API über unsere GUI-Datenkonnektoren her. Wir werden bald mehr als 10 Datenbanken und APIs hinzufügen.

#### 🚀 Schritt 4: Bereitstellen der Anwendung Stellen Sie Ihre Anwendung bereit oder hosten Sie sie selbst.

## 💬 Gemeinschaft Join ILLA Community to share your ideas, suggestions, or questions and connect with other users and contributors. [![Chat on Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://discord.gg/illacloud) [![Discuss on GitHub](https://img.shields.io/badge/discussions-GitHub-333333?logo=github)](https://github.com/orgs/illacloud/discussions) ## 🌱 Beitragender Denken Sie über eine Spende nach? Alle Arten von Beiträgen zur ILLA werden sehr geschätzt und sind willkommen! In unserem Beitragsleitfaden finden Sie Einzelheiten darüber, wie Sie sich beteiligen können. Wir freuen uns über alle Beiträge unserer ❤︎ Mitwirkenden! ## 📢 Übersetzen Die Verzeichnisse `apps/builder/src/i18n/locale/*` werden automatisch über Crowdin auf dem neuesten Stand gehalten. Sehen Sie sich unsere [offizielle Übersetzungsseite](https://crowdin.com/project/illa-builder). an, falls Sie dazu beitragen möchten. ## LIZENZ Dieses Projekt ist derzeit lizenziert unter [Apache License 2.0](./LICENSE). ================================================ FILE: README-JP.md ================================================

ILLA Builder

ILLA は、開発者が内部ツールを構築するための堅牢なオープン ソースのローコード プラットフォームです。 コンポーネントとアクションのILLAのライブラリを使用することで、開発者はツールの構築にかかる時間を大幅に節約できます。

English | 简体中文 | Deutsch | 日本語

GitHub - Readme - jp

[![Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://discord.gg/illacloud) [![Twitter](https://img.shields.io/badge/Twitter-1DA1F2?logo=x&logoColor=white)](https://twitter.com/illa_cloud) [![Discussions](https://img.shields.io/badge/discussions-GitHub-333333?logo=github)](https://github.com/orgs/illacloud/discussions) [![Crowdin](https://badges.crowdin.net/illa-builder/localized.svg)](https://crowdin.com/project/illa-builder) [![CI (Rolling and Humble)](https://github.com/illacloud/illa-builder/actions/workflows/build-docker.yml/badge.svg?query=branch%3Amain)](https://github.com/illacloud/illa-builder/actions/workflows/build-docker.yml?query=branch%3Amain) [![PR:s Welcome](https://img.shields.io/badge/PR:s-welcome-brightgreen.svg)](https://github.com/illacloud/illa-builder/pulls) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=socialflat-square&)](https://www.apache.org/licenses/LICENSE-2.0.html) ## 🚀始めましょう [ILLA Cloud](https://cloud.illacloud.com?utm_source=github&utm_medium=readme&utm_campaign=github-readme) にサインアップしてログインするのが最も便利です。招待コードを入手するには、この [Google Form](https://forms.gle/XFRSUc3yFpzbCdcWA) に記入し、できるだけ多くの情報を提供してください。ご提出いただいた内容は、最大2営業日以内にレビューし、できるだけ早くご連絡いたします。 レビュープロセスを迅速化するために、[Discordコミュニティ](https://discord.gg/illacloud) に参加して、より迅速に招待コードを入手できるようにすることもできます。 また、ILLAユーティリティを手動で(Docker、docker-compose、k8s)展開および自己ホストすることもできます。

## ✨ 特徴 1. ⚽ **リアルタイム コラボレーション:** すべてをリアルタイムで一緒に作成できます。 2. 🤖 **サポートの自動化:** すべてを接続して 5 秒で自動化します。 3. 🖥 **自己ホスト型:** Docker と k8s をサポート 4. 📝 **ページのサポート:** コンテンツが豊富で UI に適したツールを作成するための基盤。 5. 🎨 **[ILLA Design](https://github.com/illacloud/illa-design) を利用:** コンポーネントによって想像力が制約されることはありません。 ## Self-hosted ILLA CLI を使用すると、ILLA Builder を想像よりも速く展開できます。 [ここをクリック](https://docs.illacloud.com/self-hosted-deployment) 詳細については。 デプロイが正常に完了したら、電子メール アドレスで登録するか、次の情報でログインできます。

Username (email): root

Password: password

## ツールの作成方法 #### 🎯 Step 1: Connect to your database

#### 🎨 ステップ 2: 組み込みコンポーネントを使用して UI を構築する コンポーネントをキャンバスにドラッグして、UI を構築します。 Illa Builder および Illa Design には、チャート、テーブル、フォームなど、多数のコンポーネントが用意されています。 コンポーネントが重なっている場合、それらの位置は自動的に調整されるため、レイアウト開発が容易かつ柔軟になります。

#### 🔌 ステップ 3: データに接続する GUI データ コネクタを介して MySQL または REST API に接続します。 また、近日中に 10 を超えるデータベースと API を追加する予定です。

#### 🚀 ステップ 4: アプリをデプロイする アプリをデプロイして自己ホストします。

## 💬 コミュニティ ILLA コミュニティに参加して、アイデア、提案、質問を共有し、他のユーザーや貢献者とつながりましょう。
[![Chat on Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://discord.gg/illacloud) [![Discuss on GitHub](https://img.shields.io/badge/discussions-GitHub-333333?logo=github)](https://github.com/orgs/illacloud/discussions) ## 🌱 貢献 貢献を考えていますか? ILLA へのあらゆる種類の貢献を歓迎します。 参加方法の詳細については、[貢献ガイド](./CONTRIBUTING.md) をご覧ください。

からのすべての貢献に感謝します ❤︎ 貢献者

## 📢 翻訳 `apps/builder/src/i18n/locale/*` ディレクトリは Crowdin によって自動的に更新されます。貢献したい場合は、[公式翻訳ページ](https://crowdin.com/project/illa-builder) を参照してください。 ## ライセンス このプロジェクトは [Apache License 2.0](./LICENSE) です。 ================================================ FILE: README.md ================================================

ILLA Builder

ILLA is a robust open source low-code platform for developers to build internal tools. By using ILLA's library of Components and Actions, developers can save massive amounts of time on building tools.


Github(1)

[![PR:s Welcome](https://img.shields.io/badge/PR:s-welcome-brightgreen.svg)](https://github.com/illacloud/illa-builder/pulls) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=socialflat-square&)](https://www.apache.org/licenses/LICENSE-2.0.html) ## 🚀Get Started To try ILLA, the most convenient way is to sign up and log in to [ILLA Cloud](https://cloud.illacloud.com?utm_source=github&utm_medium=readme&utm_campaign=github-readme). You can also deploy and [self-host](https://docs.illacloud.com/self-hosted-deployment/) ILLA utils manually([Docker](https://www.docker.com/), [docker-compose](https://docs.docker.com/compose/), and [k8s](https://kubernetes.io/)). ## ✨ Features 1. ⚽ **Real-time Collaboration:** We can create everything in real-time together. 2. 🤖 **Automate Support:** Connect everything and automate them in 5 seconds. 3. 🖥 **Self-hosted:** supports Docker & k8s 4. 📝 **Page Support:** The base of creating a content-rich and UI-friendly tool. 5. 🎨 **Powered by [ILLA Design](https://github.com/illacloud/illa-design):** Components should not constrain your imagination. ## Self-hosted The ILLA CLI enables you to deploy ILLA Builder faster than your imagination. [Click here](https://docs.illacloud.com/self-hosted-deployment) for more details. After successfully deployed, you can register with email address or log in with the following information:

Username (email): root

Password: password

## How to build your tool #### 🎯 Step 1: Connect to your database

#### 🎨 Step 2: Build UI with built-in components Build your UI by dragging components to the canvas. We provide dozens of components including charts, tables, forms, and many more in Illa Builder and Illa Design. When components overlap, their position will be automatically adjusted, which makes the layout development easy and flexible.

#### 🔌 Step 3: Connect to your data Connect to MySQL or REST API through our GUI data connectors. We will add more than 10 databases and APIs soon.

#### 🚀 Step 4: Deploy your app Deploy your app and self-host it.

## 🌱 Contributing Thinking about contributing? All kinds of contributions to ILLA are greatly appreciated and welcomed! Check out our [Contribution Guide](./CONTRIBUTING.md) for details about how you can get involved.

Appreciate all the contributions from our ❤︎ Contributors!

## 📢 Translating The `apps/builder/src/i18n/locale/*` dirs are kept up-to-date automatically via Crowdin. See our [official translation page](https://crowdin.com/project/illa-builder) in case you would like to contribute. ## LICENSE This project is currently licensed under [Apache License 2.0](./LICENSE). ================================================ FILE: apps/builder/.eslintrc.js ================================================ module.exports = { root: true, settings: { "import/resolver": { typescript: { project: "./tsconfig.json", } }, }, extends: ["illa"], } ================================================ FILE: apps/builder/.gitignore ================================================ # local changelog cache (lerna-changelog) .changelog/ # website public/ folder (temporary; copied to root for docs:build and vercel compat) # public/ node_modules/ lerna-debug.log npm-debug.log npm-debug.log* packages/*/.env *.log *.cache yarn-error.log .next .idea dist src/i18n/locale/*.json # Local Netlify folder .netlify .idea draft* .yarn .vercel # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* # Runtime data pids *.pid *.seed *.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage cypress-coverage jest-coverage reports # nyc test coverage .nyc_output # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) bower_components # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ # Typescript v1 declaration files typings/ # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz # dotenv environment variables file .env.*.local .env.local # Mac files .DS_Store # Yarn yarn-error.log .pnp/ .pnp.js # Yarn Integrity file .yarn-integrity report.* # turbo .turbo # cypress cypress/videos cypress/screenshots stats.html public/appInfo.json i18n/locales/*.json ================================================ FILE: apps/builder/Dockerfile ================================================ FROM nginx:alpine ADD docker-config/nginx-root.conf /etc/nginx/nginx.conf ADD docker-config/illa-builder.conf /etc/nginx/conf.d/app.conf ADD dist/index.html /usr/share/nginx/html/index.html ADD dist/assets /usr/share/nginx/html/assets ================================================ FILE: apps/builder/docker-config/illa-builder.conf ================================================ server { listen 80; server_name localhost; root /opt/illa/illa-builder/; index index.html; gzip on; proxy_ssl_server_name on; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header Accept-Encoding ""; sub_filter_once off; location / { try_files $uri $uri/ /index.html; expires -1; } location /assets { expires 1y; } } ================================================ FILE: apps/builder/docker-config/nginx-root.conf ================================================ user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '"$time_local" client=$remote_addr ' 'method=$request_method request="$request" ' 'request_length=$request_length ' 'status=$status bytes_sent=$bytes_sent ' 'body_bytes_sent=$body_bytes_sent ' 'referer=$http_referer ' 'http_x_forwarded_for=$http_x_forwarded_for ' 'user_agent="$http_user_agent" ' 'upstream_addr=$upstream_addr ' 'upstream_status=$upstream_status ' 'request_time=$request_time ' 'upstream_response_time=$upstream_response_time ' 'upstream_connect_time=$upstream_connect_time ' 'upstream_header_time=$upstream_header_time'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; } ================================================ FILE: apps/builder/index.html ================================================ Loading...
================================================ FILE: apps/builder/package.json ================================================ { "name": "illa-builder", "description": "Help every Developer as fast as to build Business Tools", "repository": "git@github.com:illacloud/illa-builder.git", "private": true, "author": "ILLA Cloud ", "license": "Apache-2.0", "version": "4.8.3", "scripts": { "dev": "vite --strictPort --force", "build-cloud": "NODE_OPTIONS=--max-old-space-size=12288 vite build --mode cloud", "build-self": "NODE_OPTIONS=--max-old-space-size=12288 vite build --mode self", "preview": "vite preview", "ts-check": "tsc --noEmit", "gen:protobuf": "pnpm protoc --ts_out ./src/api/ws/ --proto_path protos protos/ILLA_PROTO.proto" }, "dependencies": { "@chatscope/chat-ui-kit-react": "^1.10.1", "@chatscope/chat-ui-kit-styles": "^1.4.0", "@codemirror/autocomplete": "^6.4.0", "@codemirror/commands": "^6.1.3", "@codemirror/lang-html": "^6.4.0", "@codemirror/lang-javascript": "^6.1.2", "@codemirror/lang-json": "^6.0.1", "@codemirror/lang-sql": "^6.3.3", "@codemirror/lang-xml": "^6.0.1", "@codemirror/language": "^6.3.2", "@codemirror/lint": "^6.1.0", "@codemirror/search": "^6.2.3", "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.7.2", "@dnd-kit/core": "^6.0.8", "@dnd-kit/modifiers": "^6.0.1", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.1", "@editorjs/checklist": "^1.5.0", "@editorjs/code": "^2.8.0", "@editorjs/editorjs": "^2.27.2", "@editorjs/embed": "^2.5.3", "@editorjs/header": "^2.7.0", "@editorjs/image": "^2.8.1", "@editorjs/inline-code": "^1.4.0", "@editorjs/list": "^1.8.0", "@editorjs/marker": "^1.3.0", "@emotion/cache": "^11.11.0", "@emotion/styled": "^11.11.0", "@illa-design/react": "workspace:*", "@illa-public/avatar": "workspace:*", "@illa-public/code-editor": "workspace:*", "@illa-public/create-app": "workspace:*", "@illa-public/cropper": "workspace:*", "@illa-public/dynamic-string": "workspace:^", "@illa-public/icon": "workspace:*", "@illa-public/icon-hot-spot": "workspace:^", "@illa-public/illa-net": "workspace:*", "@illa-public/illa-storage": "workspace:*", "@illa-public/invite-modal": "workspace:*", "@illa-public/layout-auto-change": "workspace:*", "@illa-public/market-agent": "workspace:*", "@illa-public/market-app": "workspace:*", "@illa-public/missing-resource-module": "workspace:^", "@illa-public/mixpanel-utils": "workspace:*", "@illa-public/public-configs": "workspace:*", "@illa-public/public-types": "workspace:*", "@illa-public/record-editor": "workspace:*", "@illa-public/resource-generator": "workspace:*", "@illa-public/sso-module": "workspace:*", "@illa-public/styleis-plugin": "workspace:*", "@illa-public/text-link": "workspace:*", "@illa-public/upgrade-modal": "workspace:*", "@illa-public/user-data": "workspace:*", "@illa-public/user-role-utils": "workspace:*", "@illa-public/utils": "workspace:*", "@mui/icons-material": "^5.14.18", "@mui/material": "^5.14.18", "@mui/x-data-grid-premium": "^6.20.0", "@protobuf-ts/runtime": "^2.8.3", "@react-google-maps/api": "^2.18.1", "@reduxjs/toolkit": "^2.0.1", "@rjsf/core": "^5.10.0", "@rjsf/utils": "^5.10.0", "@rjsf/validator-ajv8": "^5.10.0", "@sentry/react": "^7.54.0", "@tanstack/react-table": "^8.9.1", "@tanstack/table-core": "^8.9.1", "@uiw/codemirror-theme-github": "^4.19.8", "@uiw/color-convert": "^1.4.2", "@uiw/react-codemirror": "^4.20.2", "@uiw/react-color-sketch": "^1.4.2", "axios": "^1.6.2", "chart.js": "^3.9.1", "chroma-js": "^2.4.2", "copy-to-clipboard": "^3.3.2", "dayjs": "^1.11.10", "deep-diff": "^1.0.2", "downloadjs": "^1.4.7", "editorjs-html": "^3.4.3", "editorjs-md-parser": "^0.0.3", "fflate": "^0.8.1", "framer-motion": "^10.16.4", "fuse.js": "^6.6.2", "html5-qrcode": "^2.3.8", "i18next": "^23.7.6", "i18next-browser-languagedetector": "^7.0.1", "klona": "^2.0.6", "lodash-es": "^4.17.21", "lottie-react": "^2.4.0", "mammoth": "^1.7.0", "numbro": "^2.4.0", "overlap-area": "^1.1.0", "papaparse": "^5.4.1", "pdfjs-dist": "2.16.105", "qrcode.react": "^3.1.0", "qs": "^6.11.2", "rc-virtual-list": "^3.4.2", "re-resizable": "^6.9.9", "react-big-calendar": "^1.6.9", "react-chartjs-2": "^4.3.1", "react-code-blocks": "^0.1.4", "react-dnd": "^16.0.1", "react-dnd-touch-backend": "^16.0.1", "react-helmet-async": "^1.3.0", "react-hook-form": "^7.30.0", "react-hotkeys-hook": "^4.4.1", "react-i18next": "^13.5.0", "react-icons": "^4.7.1", "react-markdown": "^8.0.3", "react-pdf": "^6.2.2", "react-player": "^2.11.2", "react-redux": "^9.0.4", "react-rnd": "^10.3.7", "react-router-dom": "^6.14.0", "react-selecto": "^1.22.0", "react-slick": "^0.29.0", "react-syntax-highlighter": "^15.5.0", "react-use": "^17.4.0", "react-use-measure": "^2.1.1", "react-virtuoso": "^4.3.11", "react-window": "^1.8.9", "react-window-infinite-loader": "^1.0.9", "rehype-raw": "^6.1.1", "rehype-sanitize": "^5.0.1", "remark-breaks": "^4.0.0", "remark-gfm": "^3.0.1", "streamsaver": "^2.0.6", "tern": "^0.24.3", "toposort": "^2.0.2", "ts-key-enum": "^2.0.12", "uuid": "^8.3.2", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz" }, "devDependencies": { "@mdx-js/rollup": "^2.3.0", "@protobuf-ts/plugin": "^2.8.3", "@sentry/vite-plugin": "^2.4.0", "@types/chroma-js": "^2.4.1", "@types/codemirror": "^5.60.5", "@types/deep-diff": "^1.0.1", "@types/downloadjs": "^1.4.4", "@types/google.maps": "^3.53.2", "@types/gtag.js": "^0.0.18", "@types/lodash-es": "^4.17.12", "@types/mdx": "^2.0.3", "@types/papaparse": "^5.3.9", "@types/qs": "^6.9.8", "@types/react-big-calendar": "^1.6.4", "@types/react-pdf": "^6.2.0", "@types/react-slick": "^0.23.10", "@types/react-syntax-highlighter": "^15.5.11", "@types/react-window": "^1.8.5", "@types/react-window-infinite-loader": "^1.0.6", "@types/streamsaver": "^2.0.1", "@types/tern": "^0.23.5", "@types/toposort": "^2.0.4", "@types/uuid": "^9.0.4", "@types/ws": "^8.5.5", "cross-env": "^7.0.3", "eslint-config-illa": "workspace:*", "protoc": "1.0.4", "rollup-plugin-copy": "^3.5.0", "rollup-plugin-visualizer": "^5.12.0", "tsconfig": "workspace:*" } } ================================================ FILE: apps/builder/protos/ILLA_PROTO.proto ================================================ syntax = "proto3"; package tutorial; enum Signal { SIGNAL_PING = 0; SIGNAL_ENTER = 1; SIGNAL_LEAVE = 2; SIGNAL_CREATE_STATE = 3; SIGNAL_DELETE_STATE = 4; SIGNAL_UPDATE_STATE = 5; SIGNAL_MOVE_STATE = 6; SIGNAL_CREATE_OR_UPDATE_STATE = 7; SIGNAL_BROADCAST_ONLY = 8; SIGNAL_PUT_STATE = 9; SIGNAL_GLOBAL_BROADCAST_ONLY = 10; SIGNAL_COOPERATE_ATTACH = 11; SIGNAL_COOPERATE_DISATTACH = 12; SIGNAL_MOVE_CURSOR = 13; SIGNAL_FORCE_REFRESH = 14; SIGNAL_TAKE_APP_SNAPSHOT = 15; SIGNAL_RECOVER_APP_SNAPSHOT = 16; } enum Target { TARGET_NOTHING = 0; // placeholder for nothing TARGET_COMPONENTS = 1; // ComponentsState TARGET_DEPENDENCIES = 2; // DependenciesState TARGET_DRAG_SHADOW = 3; // DragShadowState TARGET_DOTTED_LINE_SQUARE = 4; // DottedLineSquareState TARGET_DISPLAY_NAME = 5; // DisplayNameState TARGET_APPS = 6; // only for broadcast TARGET_RESOURCE = 7; // only for broadcast TARGET_ACTION = 8; // only for broadcast TARGET_CURSOR = 9; // only for broadcast TARGET_WINDOW = 10; // only for broadcast } message MovingMessageBin { Signal signal = 1; // see package ws const define Target target = 2; // string clientID = 3; // message sender client ID bool needBroadcast = 4; string userID = 5; // message sender user ID string nickname = 6; // message sender nickname int32 status = 7; // set instance to status, 0 for empty status string parentDisplayName = 8; // parent component displayname string displayNames = 9; // message affected component display names, separate with comma "," uint32 cursorXInteger = 10; // cursor's position with dot number uint32 cursorYInteger = 11; // cursor's position with dot number float cursorXMod = 12; // cursor's position with dot number float cursorYMod = 13; // cursor's position with dot number uint32 widgetX = 14; // widget'position with dot number uint32 widgetY = 15; // widget'position with dot number uint32 widgetW = 16; // widget'shape with dot number uint32 widgetH = 17; // widget'shape with dot number } ================================================ FILE: apps/builder/public/font-family/Fira-code/fira_code.css ================================================ @font-face { font-family: 'Fira Code'; src: url('woff2/FiraCode-Light.woff2') format('woff2'), url("woff/FiraCode-Light.woff") format("woff"); font-weight: 300; font-style: normal; } @font-face { font-family: 'Fira Code'; src: url('woff2/FiraCode-Regular.woff2') format('woff2'), url("woff/FiraCode-Regular.woff") format("woff"); font-weight: 400; font-style: normal; } @font-face { font-family: 'Fira Code'; src: url('woff2/FiraCode-Medium.woff2') format('woff2'), url("woff/FiraCode-Medium.woff") format("woff"); font-weight: 500; font-style: normal; } @font-face { font-family: 'Fira Code'; src: url('woff2/FiraCode-SemiBold.woff2') format('woff2'), url("woff/FiraCode-SemiBold.woff") format("woff"); font-weight: 600; font-style: normal; } @font-face { font-family: 'Fira Code'; src: url('woff2/FiraCode-Bold.woff2') format('woff2'), url("woff/FiraCode-Bold.woff") format("woff"); font-weight: 700; font-style: normal; } @font-face { font-family: 'Fira Code VF'; src: url('woff2/FiraCode-VF.woff2') format('woff2-variations'), url('woff/FiraCode-VF.woff') format('woff-variations'); /* font-weight requires a range: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide#Using_a_variable_font_font-face_changes */ font-weight: 300 700; font-style: normal; } ================================================ FILE: apps/builder/public/font-family/Inter/inter.css ================================================ @font-face { font-family: 'Inter'; font-style: normal; font-weight: 100; font-display: swap; src: url("Inter-Thin.woff2") format("woff2"), url("Inter-Thin.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 100; font-display: swap; src: url("Inter-ThinItalic.woff2") format("woff2"), url("Inter-ThinItalic.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 200; font-display: swap; src: url("Inter-ExtraLight.woff2") format("woff2"), url("Inter-ExtraLight.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 200; font-display: swap; src: url("Inter-ExtraLightItalic.woff2") format("woff2"), url("Inter-ExtraLightItalic.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 300; font-display: swap; src: url("Inter-Light.woff2") format("woff2"), url("Inter-Light.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 300; font-display: swap; src: url("Inter-LightItalic.woff2") format("woff2"), url("Inter-LightItalic.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: swap; src: url("Inter-Regular.woff2") format("woff2"), url("Inter-Regular.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 400; font-display: swap; src: url("Inter-Italic.woff2") format("woff2"), url("Inter-Italic.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 500; font-display: swap; src: url("Inter-Medium.woff2") format("woff2"), url("Inter-Medium.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 500; font-display: swap; src: url("Inter-MediumItalic.woff2") format("woff2"), url("Inter-MediumItalic.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: swap; src: url("Inter-SemiBold.woff2") format("woff2"), url("Inter-SemiBold.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 600; font-display: swap; src: url("Inter-SemiBoldItalic.woff2") format("woff2"), url("Inter-SemiBoldItalic.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 700; font-display: swap; src: url("Inter-Bold.woff2") format("woff2"), url("Inter-Bold.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 700; font-display: swap; src: url("Inter-BoldItalic.woff2") format("woff2"), url("Inter-BoldItalic.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 800; font-display: swap; src: url("Inter-ExtraBold.woff2") format("woff2"), url("Inter-ExtraBold.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 800; font-display: swap; src: url("Inter-ExtraBoldItalic.woff2") format("woff2"), url("Inter-ExtraBoldItalic.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 900; font-display: swap; src: url("Inter-Black.woff2") format("woff2"), url("Inter-Black.woff") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 900; font-display: swap; src: url("Inter-BlackItalic.woff2") format("woff2"), url("Inter-BlackItalic.woff") format("woff"); } /* ------------------------------------------------------- Variable font. Usage: html { font-family: 'Inter', sans-serif; } @supports (font-variation-settings: normal) { html { font-family: 'Inter var', sans-serif; } } */ @font-face { font-family: 'Inter var'; font-weight: 100 900; font-display: swap; font-style: normal; font-named-instance: 'Regular'; src: url("Inter-roman.var.woff2") format("woff2"); } @font-face { font-family: 'Inter var'; font-weight: 100 900; font-display: swap; font-style: italic; font-named-instance: 'Italic'; src: url("Inter-italic.var.woff2") format("woff2"); } /* -------------------------------------------------------------------------- [EXPERIMENTAL] Multi-axis, single variable font. Slant axis is not yet widely supported (as of February 2019) and thus this multi-axis single variable font is opt-in rather than the default. When using this, you will probably need to set font-variation-settings explicitly, e.g. * { font-variation-settings: "slnt" 0deg } .italic { font-variation-settings: "slnt" 10deg } */ @font-face { font-family: 'Inter var experimental'; font-weight: 100 900; font-display: swap; font-style: oblique 0deg 10deg; src: url("Inter.var.woff2") format("woff2"); } ================================================ FILE: apps/builder/src/App.tsx ================================================ import { Global } from "@emotion/react" import { ILLA_MIXPANEL_EVENT_TYPE, ILLA_MIXPANEL_PUBLIC_PAGE_NAME, } from "@illa-public/mixpanel-utils" import { UpgradeModalGroup } from "@illa-public/upgrade-modal" import { getCurrentTranslateLanguage } from "@illa-public/user-data" import { useEffect, useMemo } from "react" import { DndProvider } from "react-dnd" import { TouchBackend } from "react-dnd-touch-backend" import { HelmetProvider } from "react-helmet-async" import { useTranslation } from "react-i18next" import { useSelector } from "react-redux" import { RouterProvider } from "react-router-dom" import { ConfigProvider, MessageGroup, ModalGroup, NotificationGroup, enUS, jaJP, koKR, zhCN, } from "@illa-design/react" import { illaCodeMirrorTooltipStyle } from "@/components/CodeEditor/CodeMirror/theme" import { getIsILLAProductMode } from "@/redux/config/configSelector" import { ILLARoute } from "@/router" import { globalStyle } from "./style" import { track } from "./utils/mixpanelHelper" const dragOptions = { enableTouchEvents: true, enableMouseEvents: true, } function App() { const currentUserLanguage = useSelector(getCurrentTranslateLanguage) const configLanguage = useMemo(() => { switch (currentUserLanguage) { case "en-US": return enUS case "zh-CN": return zhCN case "ja-JP": return jaJP case "ko-KR": return koKR default: return enUS } }, [currentUserLanguage]) const { i18n } = useTranslation() const isProductMode = useSelector(getIsILLAProductMode) useEffect(() => { if (!!currentUserLanguage) { i18n.changeLanguage(currentUserLanguage) } }, [currentUserLanguage, i18n]) useEffect(() => { track( ILLA_MIXPANEL_EVENT_TYPE.ILLA_ACTIVE, ILLA_MIXPANEL_PUBLIC_PAGE_NAME.PLACEHOLDER, ) }, []) return (
) } export default App ================================================ FILE: apps/builder/src/api/actions/index.ts ================================================ import { builderRequest } from "@illa-public/illa-net" import { ActionContent, Resource, ResourceContent, } from "@illa-public/public-types" import { ActionItem } from "@illa-public/public-types" import { resourceActions } from "@/redux/resource/resourceSlice" import { ResourceInitialConfig } from "@/redux/resource/resourceState" import store from "@/store" import { getCurrentTeamID } from "@/utils/team" export const createResource = async ( data: ResourceInitialConfig, ) => { const response = await builderRequest>( { method: "POST", url: "/resources", data, }, { teamID: getCurrentTeamID(), }, ) store.dispatch(resourceActions.addResourceItemReducer(response.data)) return response.data.resourceID } export const createAction = async ( appId: string, data: Partial>, ) => { const response = await builderRequest>( { url: `/apps/${appId}/actions`, method: "POST", data, }, { teamID: getCurrentTeamID() }, ) return response.data.actionID } ================================================ FILE: apps/builder/src/api/http/base.ts ================================================ import { actionRuntimeAxios, authInterceptor, errorHandlerInterceptor, needAuthAxios, } from "@illa-public/illa-net" needAuthAxios.interceptors.request.use(authInterceptor) needAuthAxios.interceptors.response.use(undefined, errorHandlerInterceptor) actionRuntimeAxios.interceptors.request.use(authInterceptor) ================================================ FILE: apps/builder/src/api/ws/ILLA_PROTO.ts ================================================ // @generated by protobuf-ts 2.8.3 // @generated from protobuf file "ILLA_PROTO.proto" (package "tutorial", syntax proto3) // tslint:disable import type { BinaryWriteOptions } from "@protobuf-ts/runtime"; import type { IBinaryWriter } from "@protobuf-ts/runtime"; import { WireType } from "@protobuf-ts/runtime"; import type { BinaryReadOptions } from "@protobuf-ts/runtime"; import type { IBinaryReader } from "@protobuf-ts/runtime"; import { UnknownFieldHandler } from "@protobuf-ts/runtime"; import type { PartialMessage } from "@protobuf-ts/runtime"; import { reflectionMergePartial } from "@protobuf-ts/runtime"; import { MESSAGE_TYPE } from "@protobuf-ts/runtime"; import { MessageType } from "@protobuf-ts/runtime"; /** * @generated from protobuf message tutorial.MovingMessageBin */ export interface MovingMessageBin { /** * @generated from protobuf field: tutorial.Signal signal = 1; */ signal: Signal; // see package ws const define /** * @generated from protobuf field: tutorial.Target target = 2; */ target: Target; /** * @generated from protobuf field: string clientID = 3; */ clientID: string; // message sender client ID /** * @generated from protobuf field: bool needBroadcast = 4; */ needBroadcast: boolean; /** * @generated from protobuf field: string userID = 5; */ userID: string; // message sender user ID /** * @generated from protobuf field: string nickname = 6; */ nickname: string; // message sender nickname /** * @generated from protobuf field: int32 status = 7; */ status: number; // set instance to status, 0 for empty status /** * @generated from protobuf field: string parentDisplayName = 8; */ parentDisplayName: string; // parent component displayname /** * @generated from protobuf field: string displayNames = 9; */ displayNames: string; // message affected component display names, separate with comma "," /** * @generated from protobuf field: uint32 cursorXInteger = 10; */ cursorXInteger: number; // cursor's position with dot number /** * @generated from protobuf field: uint32 cursorYInteger = 11; */ cursorYInteger: number; // cursor's position with dot number /** * @generated from protobuf field: float cursorXMod = 12; */ cursorXMod: number; // cursor's position with dot number /** * @generated from protobuf field: float cursorYMod = 13; */ cursorYMod: number; // cursor's position with dot number /** * @generated from protobuf field: uint32 widgetX = 14; */ widgetX: number; // widget'position with dot number /** * @generated from protobuf field: uint32 widgetY = 15; */ widgetY: number; // widget'position with dot number /** * @generated from protobuf field: uint32 widgetW = 16; */ widgetW: number; // widget'shape with dot number /** * @generated from protobuf field: uint32 widgetH = 17; */ widgetH: number; // widget'shape with dot number } /** * @generated from protobuf enum tutorial.Signal */ export enum Signal { /** * @generated from protobuf enum value: SIGNAL_PING = 0; */ PING = 0, /** * @generated from protobuf enum value: SIGNAL_ENTER = 1; */ ENTER = 1, /** * @generated from protobuf enum value: SIGNAL_LEAVE = 2; */ LEAVE = 2, /** * @generated from protobuf enum value: SIGNAL_CREATE_STATE = 3; */ CREATE_STATE = 3, /** * @generated from protobuf enum value: SIGNAL_DELETE_STATE = 4; */ DELETE_STATE = 4, /** * @generated from protobuf enum value: SIGNAL_UPDATE_STATE = 5; */ UPDATE_STATE = 5, /** * @generated from protobuf enum value: SIGNAL_MOVE_STATE = 6; */ MOVE_STATE = 6, /** * @generated from protobuf enum value: SIGNAL_CREATE_OR_UPDATE_STATE = 7; */ CREATE_OR_UPDATE_STATE = 7, /** * @generated from protobuf enum value: SIGNAL_BROADCAST_ONLY = 8; */ BROADCAST_ONLY = 8, /** * @generated from protobuf enum value: SIGNAL_PUT_STATE = 9; */ PUT_STATE = 9, /** * @generated from protobuf enum value: SIGNAL_GLOBAL_BROADCAST_ONLY = 10; */ GLOBAL_BROADCAST_ONLY = 10, /** * @generated from protobuf enum value: SIGNAL_COOPERATE_ATTACH = 11; */ COOPERATE_ATTACH = 11, /** * @generated from protobuf enum value: SIGNAL_COOPERATE_DISATTACH = 12; */ COOPERATE_DISATTACH = 12, /** * @generated from protobuf enum value: SIGNAL_MOVE_CURSOR = 13; */ MOVE_CURSOR = 13, /** * @generated from protobuf enum value: SIGNAL_FORCE_REFRESH = 14; */ FORCE_REFRESH = 14, /** * @generated from protobuf enum value: SIGNAL_TAKE_APP_SNAPSHOT = 15; */ TAKE_APP_SNAPSHOT = 15, /** * @generated from protobuf enum value: SIGNAL_RECOVER_APP_SNAPSHOT = 16; */ RECOVER_APP_SNAPSHOT = 16 } /** * @generated from protobuf enum tutorial.Target */ export enum Target { /** * placeholder for nothing * * @generated from protobuf enum value: TARGET_NOTHING = 0; */ NOTHING = 0, /** * ComponentsState * * @generated from protobuf enum value: TARGET_COMPONENTS = 1; */ COMPONENTS = 1, /** * DependenciesState * * @generated from protobuf enum value: TARGET_DEPENDENCIES = 2; */ DEPENDENCIES = 2, /** * DragShadowState * * @generated from protobuf enum value: TARGET_DRAG_SHADOW = 3; */ DRAG_SHADOW = 3, /** * DottedLineSquareState * * @generated from protobuf enum value: TARGET_DOTTED_LINE_SQUARE = 4; */ DOTTED_LINE_SQUARE = 4, /** * DisplayNameState * * @generated from protobuf enum value: TARGET_DISPLAY_NAME = 5; */ DISPLAY_NAME = 5, /** * only for broadcast * * @generated from protobuf enum value: TARGET_APPS = 6; */ APPS = 6, /** * only for broadcast * * @generated from protobuf enum value: TARGET_RESOURCE = 7; */ RESOURCE = 7, /** * only for broadcast * * @generated from protobuf enum value: TARGET_ACTION = 8; */ ACTION = 8, /** * only for broadcast * * @generated from protobuf enum value: TARGET_CURSOR = 9; */ CURSOR = 9, /** * only for broadcast * * @generated from protobuf enum value: TARGET_WINDOW = 10; */ WINDOW = 10 } // @generated message type with reflection information, may provide speed optimized methods class MovingMessageBin$Type extends MessageType { constructor() { super("tutorial.MovingMessageBin", [ { no: 1, name: "signal", kind: "enum", T: () => ["tutorial.Signal", Signal, "SIGNAL_"] }, { no: 2, name: "target", kind: "enum", T: () => ["tutorial.Target", Target, "TARGET_"] }, { no: 3, name: "clientID", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 4, name: "needBroadcast", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, { no: 5, name: "userID", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 6, name: "nickname", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 7, name: "status", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, { no: 8, name: "parentDisplayName", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 9, name: "displayNames", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 10, name: "cursorXInteger", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, { no: 11, name: "cursorYInteger", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, { no: 12, name: "cursorXMod", kind: "scalar", T: 2 /*ScalarType.FLOAT*/ }, { no: 13, name: "cursorYMod", kind: "scalar", T: 2 /*ScalarType.FLOAT*/ }, { no: 14, name: "widgetX", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, { no: 15, name: "widgetY", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, { no: 16, name: "widgetW", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, { no: 17, name: "widgetH", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } ]); } create(value?: PartialMessage): MovingMessageBin { const message = { signal: 0, target: 0, clientID: "", needBroadcast: false, userID: "", nickname: "", status: 0, parentDisplayName: "", displayNames: "", cursorXInteger: 0, cursorYInteger: 0, cursorXMod: 0, cursorYMod: 0, widgetX: 0, widgetY: 0, widgetW: 0, widgetH: 0 }; globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); if (value !== undefined) reflectionMergePartial(this, message, value); return message; } internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MovingMessageBin): MovingMessageBin { let message = target ?? this.create(), end = reader.pos + length; while (reader.pos < end) { let [fieldNo, wireType] = reader.tag(); switch (fieldNo) { case /* tutorial.Signal signal */ 1: message.signal = reader.int32(); break; case /* tutorial.Target target */ 2: message.target = reader.int32(); break; case /* string clientID */ 3: message.clientID = reader.string(); break; case /* bool needBroadcast */ 4: message.needBroadcast = reader.bool(); break; case /* string userID */ 5: message.userID = reader.string(); break; case /* string nickname */ 6: message.nickname = reader.string(); break; case /* int32 status */ 7: message.status = reader.int32(); break; case /* string parentDisplayName */ 8: message.parentDisplayName = reader.string(); break; case /* string displayNames */ 9: message.displayNames = reader.string(); break; case /* uint32 cursorXInteger */ 10: message.cursorXInteger = reader.uint32(); break; case /* uint32 cursorYInteger */ 11: message.cursorYInteger = reader.uint32(); break; case /* float cursorXMod */ 12: message.cursorXMod = reader.float(); break; case /* float cursorYMod */ 13: message.cursorYMod = reader.float(); break; case /* uint32 widgetX */ 14: message.widgetX = reader.uint32(); break; case /* uint32 widgetY */ 15: message.widgetY = reader.uint32(); break; case /* uint32 widgetW */ 16: message.widgetW = reader.uint32(); break; case /* uint32 widgetH */ 17: message.widgetH = reader.uint32(); break; default: let u = options.readUnknownField; if (u === "throw") throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); let d = reader.skip(wireType); if (u !== false) (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); } } return message; } internalBinaryWrite(message: MovingMessageBin, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { /* tutorial.Signal signal = 1; */ if (message.signal !== 0) writer.tag(1, WireType.Varint).int32(message.signal); /* tutorial.Target target = 2; */ if (message.target !== 0) writer.tag(2, WireType.Varint).int32(message.target); /* string clientID = 3; */ if (message.clientID !== "") writer.tag(3, WireType.LengthDelimited).string(message.clientID); /* bool needBroadcast = 4; */ if (message.needBroadcast !== false) writer.tag(4, WireType.Varint).bool(message.needBroadcast); /* string userID = 5; */ if (message.userID !== "") writer.tag(5, WireType.LengthDelimited).string(message.userID); /* string nickname = 6; */ if (message.nickname !== "") writer.tag(6, WireType.LengthDelimited).string(message.nickname); /* int32 status = 7; */ if (message.status !== 0) writer.tag(7, WireType.Varint).int32(message.status); /* string parentDisplayName = 8; */ if (message.parentDisplayName !== "") writer.tag(8, WireType.LengthDelimited).string(message.parentDisplayName); /* string displayNames = 9; */ if (message.displayNames !== "") writer.tag(9, WireType.LengthDelimited).string(message.displayNames); /* uint32 cursorXInteger = 10; */ if (message.cursorXInteger !== 0) writer.tag(10, WireType.Varint).uint32(message.cursorXInteger); /* uint32 cursorYInteger = 11; */ if (message.cursorYInteger !== 0) writer.tag(11, WireType.Varint).uint32(message.cursorYInteger); /* float cursorXMod = 12; */ if (message.cursorXMod !== 0) writer.tag(12, WireType.Bit32).float(message.cursorXMod); /* float cursorYMod = 13; */ if (message.cursorYMod !== 0) writer.tag(13, WireType.Bit32).float(message.cursorYMod); /* uint32 widgetX = 14; */ if (message.widgetX !== 0) writer.tag(14, WireType.Varint).uint32(message.widgetX); /* uint32 widgetY = 15; */ if (message.widgetY !== 0) writer.tag(15, WireType.Varint).uint32(message.widgetY); /* uint32 widgetW = 16; */ if (message.widgetW !== 0) writer.tag(16, WireType.Varint).uint32(message.widgetW); /* uint32 widgetH = 17; */ if (message.widgetH !== 0) writer.tag(17, WireType.Varint).uint32(message.widgetH); let u = options.writeUnknownFields; if (u !== false) (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); return writer; } } /** * @generated MessageType for protobuf message tutorial.MovingMessageBin */ export const MovingMessageBin = new MovingMessageBin$Type(); ================================================ FILE: apps/builder/src/api/ws/illaBinaryWS.ts ================================================ import { ILLA_WEBSOCKET_CONTEXT, ILLA_WEBSOCKET_STATUS, } from "@/api/ws/interface" import { getIsOnline } from "@/redux/config/configSelector" import { configActions } from "@/redux/config/configSlice" import { cursorActions } from "@/redux/currentApp/cursor/cursorSlice" import { dragShadowActions } from "@/redux/currentApp/dragShadow/dragShadowSlice" import store from "@/store" import { MovingMessageBin, Signal } from "./ILLA_PROTO" // const HEARTBEAT_PING_TIMEOUT = 2 * 1000 // const HEARTBEAT_PONG_TIMEOUT = 5 * 1000 const RECONNECT_TIMEOUT = 5 * 1000 const REPEAT_LIMIT = 5 export class ILLABinaryWebsocket { url: string ws: WebSocket | null = null repeat: number = 0 lockReconnect: boolean = false forbidReconnect: boolean = false pingTimeoutId: number = -1 pongTimeoutId: number = -1 isOnline: boolean = getIsOnline(store.getState()) // messageQueue: Uint8Array[] = [] status: ILLA_WEBSOCKET_STATUS = ILLA_WEBSOCKET_STATUS.INIT context: ILLA_WEBSOCKET_CONTEXT = ILLA_WEBSOCKET_CONTEXT.DASHBOARD constructor(url: string, context: ILLA_WEBSOCKET_CONTEXT) { this.url = url this.context = context this.createWebsocket() } private createWebsocket() { try { store.dispatch( configActions.updateWSStatusReducer({ context: this.context, wsStatus: ILLA_WEBSOCKET_STATUS.CONNECTING, }), ) this.ws = new WebSocket(this.url) this.ws.binaryType = "arraybuffer" this.initEventHandle() } catch (e) { this.reconnect() throw e } } private initEventHandle() { if (this.ws) { this.ws.onclose = () => { this.reconnect() store.dispatch( configActions.updateWSStatusReducer({ context: this.context, wsStatus: ILLA_WEBSOCKET_STATUS.CLOSED, }), ) } this.ws.onerror = () => { this.reconnect() store.dispatch( configActions.updateWSStatusReducer({ context: this.context, wsStatus: ILLA_WEBSOCKET_STATUS.FAILED, }), ) } this.ws.onopen = () => { console.log(`[WS OPENED](${this.url}) connection succeeded`) store.dispatch(configActions.updateDevicesOnlineStatusReducer(true)) store.dispatch( configActions.updateWSStatusReducer({ context: this.context, wsStatus: ILLA_WEBSOCKET_STATUS.CONNECTED, }), ) this.isOnline = true this.repeat = 0 // this.heartCheck() // while (this.messageQueue.length > 0) { // this.send(this.messageQueue.shift() as Uint8Array) // } } this.ws.onmessage = (event) => { this.onMessage(event) // this.heartCheck() } } } private split(byteBuf: Uint8Array) { const result = [] let start = 0 for (let i = 0; i < byteBuf.length; i++) { if ( byteBuf[i] === 30 && byteBuf[i + 1] === 30 && byteBuf[i + 2] === 30 && byteBuf[i + 3] === 30 ) { result.push(byteBuf.slice(start, i)) start = i + 4 } } if (start < byteBuf.length) { result.push(byteBuf.slice(start)) } return result } private reconnect() { if (this.forbidReconnect) return if (this.isOnline) { store.dispatch(configActions.updateDevicesOnlineStatusReducer(false)) this.isOnline = false } if (REPEAT_LIMIT <= this.repeat) return if (this.lockReconnect) return this.lockReconnect = true this.repeat++ setTimeout(() => { this.createWebsocket() this.lockReconnect = false }, RECONNECT_TIMEOUT) } // private heartCheck() { // this.heartReset() // this.heartStart() // } // private heartStart() { // if (this.forbidReconnect) return // this.pingTimeoutId = window.setTimeout(() => { // this.ws?.send(pingMessage) // this.pongTimeoutId = window.setTimeout(() => { // if (this.isOnline) { // store.dispatch(configActions.updateDevicesOnlineStatusReducer(false)) // this.isOnline = false // } // this.ws?.close() // }, HEARTBEAT_PONG_TIMEOUT) // }, HEARTBEAT_PING_TIMEOUT) // } // private heartReset() { // clearTimeout(this.pingTimeoutId) // clearTimeout(this.pongTimeoutId) // } public close() { this.forbidReconnect = true // this.heartReset() this.ws?.close() } public onMessage(event: MessageEvent) { const message = event.data if (!(message instanceof ArrayBuffer)) { return } const unit8ArrayMessage = new Uint8Array(message) const updateDate = new Date() const lastUpdateTime = updateDate.getTime() const groupUnit8ArrayMessage = this.split(unit8ArrayMessage) groupUnit8ArrayMessage.forEach((message) => { try { const payload = MovingMessageBin.fromBinary(message) switch (payload.signal) { case Signal.MOVE_CURSOR: { store.dispatch( cursorActions.updateCursorReducer({ userID: payload.userID, nickname: payload.nickname, parentDisplayName: payload.parentDisplayName, status: payload.status, xInteger: payload.cursorXInteger, yInteger: payload.cursorYInteger, xMod: payload.cursorXMod, yMod: payload.cursorYMod, lastUpdateTime, }), ) break } case Signal.MOVE_STATE: { const lastUpdateTime = new Date().getTime() store.dispatch( dragShadowActions.updateDragShadowInfoReducer({ userID: payload.userID, nickname: payload.nickname, displayNames: payload.displayNames, parentDisplayName: payload.parentDisplayName, status: payload.status, xInteger: payload.cursorXInteger, yInteger: payload.cursorYInteger, xMod: payload.cursorXMod, yMod: payload.cursorYMod, rectX: payload.widgetX, rectY: payload.widgetY, rectW: payload.widgetW, rectH: payload.widgetH, lastUpdateTime, }), ) } } } catch (e) { console.debug("[debug] message is not a MovingMessageBin", e) } }) } public send(message: Uint8Array) { if (this.ws?.readyState !== 1) { // this.messageQueue.push(message) return } try { this.ws?.send(message) } catch (e) { console.error(e) } } } ================================================ FILE: apps/builder/src/api/ws/illaWS.ts ================================================ import { getCurrentTeamInfo } from "@illa-public/user-data" import { getAuthToken } from "@illa-public/utils" import { getTextMessagePayload } from "@/api/ws/index" import { Callback, ILLA_WEBSOCKET_CONTEXT, ILLA_WEBSOCKET_STATUS, } from "@/api/ws/interface" import { TextSignal, TextTarget } from "@/api/ws/textSignal" import { getIsOnline } from "@/redux/config/configSelector" import { configActions } from "@/redux/config/configSlice" import store from "@/store" import { ADD_DISPLAY_NAME, DisplayNameGenerator, GENERATE_OR_UPDATE_DISPLAYNAME, REMOVE_DISPLAY_NAME, UPDATE_DISPLAY_NAME, } from "@/utils/generators/generateDisplayName" const HEARTBEAT_PING_TIMEOUT = 10 * 1000 const HEARTBEAT_PONG_TIMEOUT = 10 * 1000 const RECONNECT_TIMEOUT = 5 * 1000 const REPEAT_LIMIT = 5 const MESSAGE_QUEUE_MAX_LENGTH = 20 const pingMessage = JSON.stringify({ signal: 0, option: 0, target: 0, payload: [], broadcast: null, }) export interface WSMessageListener { onMessage: ( event: MessageEvent, context: ILLA_WEBSOCKET_CONTEXT, ws: ILLAWebsocket, ) => void onError?: (context: ILLA_WEBSOCKET_CONTEXT, ws: ILLAWebsocket) => void onClosed?: (context: ILLA_WEBSOCKET_CONTEXT, ws: ILLAWebsocket) => void } export const ReduxMessageListener: WSMessageListener = { onMessage: ( event: MessageEvent, context: ILLA_WEBSOCKET_CONTEXT, ws: ILLAWebsocket, ) => { const message = event.data if (typeof message !== "string") { return } const dataList = message.split("\n") dataList.forEach((data: string) => { let callback: Callback = JSON.parse(data) if (callback.errorCode === 0) { if (callback.broadcast != null) { let broadcast = callback.broadcast let type = broadcast.type let payload = broadcast.payload switch (type) { case `${ADD_DISPLAY_NAME}/remote`: { ;(payload as string[]).forEach((name) => { DisplayNameGenerator.displayNameList.add(name) }) break } case `${REMOVE_DISPLAY_NAME}/remote`: { ;(payload as string[]).forEach((name) => { DisplayNameGenerator.displayNameList.delete(name) }) break } case `${UPDATE_DISPLAY_NAME}/remote`: { DisplayNameGenerator.displayNameList.delete(payload[0]) DisplayNameGenerator.displayNameList.add(payload[1]) break } case `${GENERATE_OR_UPDATE_DISPLAYNAME}/remote`: { DisplayNameGenerator.displayNameList.add(payload) } default: { try { store.dispatch({ type, payload, }) } catch (ignore) {} } } } } else if (callback.errorCode === 14) { // signal for recover app snapshot store.dispatch( configActions.updateWSStatusReducer({ context: context, wsStatus: ILLA_WEBSOCKET_STATUS.LOCKING, }), ) ws.reconnect() } }) }, } export class ILLAWebsocket { url: string ws: WebSocket | null = null repeat: number = 0 lockReconnect: boolean = false forbidReconnect: boolean = false pingTimeoutId: number = -1 pongTimeoutId: number = -1 isOnline: boolean = getIsOnline(store.getState()) messageQueue: string[] = [] status: ILLA_WEBSOCKET_STATUS = ILLA_WEBSOCKET_STATUS.INIT context: ILLA_WEBSOCKET_CONTEXT = ILLA_WEBSOCKET_CONTEXT.DASHBOARD listeners: WSMessageListener[] = [] constructor(url: string, context: ILLA_WEBSOCKET_CONTEXT) { this.url = url this.context = context } public initWebsocket() { try { store.dispatch( configActions.updateWSStatusReducer({ context: this.context, wsStatus: ILLA_WEBSOCKET_STATUS.CONNECTING, }), ) this.ws = new WebSocket(this.url) this.initEventHandle() } catch (e) { this.reconnect() throw e } } public registerListener(listener: WSMessageListener) { this.listeners.push(listener) } public unRegisterListener(listener: WSMessageListener) { const index = this.listeners.findIndex((value) => value === listener) if (index != -1) { this.listeners.splice(index, 1) } } public clearListener() { if (this.ws) { this.ws.onclose = null this.ws.onerror = null this.ws.onopen = null this.ws.onmessage = null } this.listeners = [] } private initEventHandle() { if (this.ws) { this.ws.onclose = () => { store.dispatch( configActions.updateWSStatusReducer({ context: this.context, wsStatus: ILLA_WEBSOCKET_STATUS.CLOSED, }), ) this.listeners.forEach((listener) => { listener.onClosed?.(this.context, this) }) this.reconnect() } this.ws.onerror = () => { store.dispatch( configActions.updateWSStatusReducer({ context: this.context, wsStatus: ILLA_WEBSOCKET_STATUS.FAILED, }), ) this.listeners.forEach((listener) => { listener.onError?.(this.context, this) }) this.reconnect() } this.ws.onopen = () => { const { id: teamID = "", uid = "" } = getCurrentTeamInfo(store.getState()) ?? {} store.dispatch(configActions.updateDevicesOnlineStatusReducer(true)) store.dispatch( configActions.updateWSStatusReducer({ context: this.context, wsStatus: ILLA_WEBSOCKET_STATUS.CONNECTED, }), ) this.send( getTextMessagePayload( TextSignal.ENTER, TextTarget.NOTHING, false, { type: "enter", payload: [], }, teamID, uid, [ { authToken: getAuthToken(), }, ], ), ) this.isOnline = true this.repeat = 0 this.heartCheck() while (this.messageQueue.length > 0) { this.send(this.messageQueue.shift() as string) } } this.ws.onmessage = (event) => { this.listeners.forEach((listener) => { listener.onMessage(event, this.context, this) }) this.heartCheck() } } } public reconnect() { if (this.forbidReconnect) return if (this.isOnline) { store.dispatch(configActions.updateDevicesOnlineStatusReducer(false)) this.isOnline = false } if (REPEAT_LIMIT <= this.repeat) return if (this.lockReconnect) return this.lockReconnect = true this.repeat++ setTimeout(() => { this.initWebsocket() this.lockReconnect = false }, RECONNECT_TIMEOUT) } private heartCheck() { this.heartReset() this.heartStart() } private heartStart() { if (this.forbidReconnect) { return } this.pingTimeoutId = window.setTimeout(() => { this.ws?.send(pingMessage) this.pongTimeoutId = window.setTimeout(() => { if (this.isOnline) { store.dispatch(configActions.updateDevicesOnlineStatusReducer(false)) this.isOnline = false } this.ws?.close() }, HEARTBEAT_PONG_TIMEOUT) }, HEARTBEAT_PING_TIMEOUT) } private heartReset() { clearTimeout(this.pingTimeoutId) clearTimeout(this.pongTimeoutId) } public close() { this.forbidReconnect = true this.clearListener() this.heartReset() this.ws?.close() } public send(message: string) { if (this.ws?.readyState !== 1) { this.messageQueue.push(message) while (this.messageQueue.length > MESSAGE_QUEUE_MAX_LENGTH) { this.messageQueue.shift() } return } try { this.ws?.send(message) } catch (e) { console.error(e) } } } ================================================ FILE: apps/builder/src/api/ws/index.ts ================================================ import { HTTP_REQUEST_PUBLIC_BASE_URL } from "@illa-public/illa-net/constant" import { ComponentTreeNode } from "@illa-public/public-types" import { getCurrentTeamInfo } from "@illa-public/user-data" import { isCloudVersion } from "@illa-public/utils" import { ILLAWebsocket, ReduxMessageListener, WSMessageListener, } from "@/api/ws/illaWS" import { TextSignal, TextTarget } from "@/api/ws/textSignal" import store from "@/store" import { MovingMessageBin, Signal, Target } from "./ILLA_PROTO" import { ILLABinaryWebsocket } from "./illaBinaryWS" import { Broadcast, ILLAWebSocketComponentPayload, ILLA_WEBSOCKET_CONTEXT, RoomType, } from "./interface" export function transformComponentReduxPayloadToWsPayload( componentNodes: ComponentTreeNode[] | ComponentTreeNode, ): ILLAWebSocketComponentPayload[] { if (Array.isArray(componentNodes)) { return componentNodes.map((node) => { return { before: { displayName: node.displayName, }, after: node, } }) } if (!componentNodes) return [] return [ { before: { displayName: componentNodes.displayName, }, after: componentNodes, }, ] } export function getTextMessagePayload( signal: TextSignal, target: TextTarget, broadcast: boolean, reduxBroadcast: Broadcast | null, teamID: string, uid: string, payload: T[], ): string { return JSON.stringify({ signal, target, option: broadcast ? 1 : 0, broadcast: reduxBroadcast, payload, teamID, uid, }) } export const getBinaryMessagePayload = ( signal: Signal, target: Target, needBroadcast: boolean, userID: string, nickname: string, status: number, parentDisplayName: string, displayNames: string, cursorXInteger: number, cursorYInteger: number, cursorXMod: number, cursorYMod: number, widgetX: number, widgetY: number, widgetW: number, widgetH: number, ) => { const payloadObject: MovingMessageBin = { signal, target, clientID: "", needBroadcast, userID, nickname, status, parentDisplayName, displayNames, cursorXInteger, cursorYInteger, cursorXMod, cursorYMod, widgetX, widgetY, widgetW, widgetH, } return MovingMessageBin.toBinary(payloadObject) } export const fixedWsURL = (wsURL: string) => { const protocol = isCloudVersion ? location.protocol : new URL(HTTP_REQUEST_PUBLIC_BASE_URL).protocol const wsProtocol = protocol === "https:" ? "wss://" : "ws://" if (!isCloudVersion) { const wsPREFIX = `${wsProtocol}${ new URL(HTTP_REQUEST_PUBLIC_BASE_URL).host }` wsURL = `${wsPREFIX}${wsURL}` } return wsURL } export class Connection { static roomMap: Map = new Map() static enterDashboardRoom(wsURL: string) { let ws = generateTextMessageWs(wsURL, ILLA_WEBSOCKET_CONTEXT.DASHBOARD) ws.registerListener(ReduxMessageListener) ws.initWebsocket() this.roomMap.set("dashboard/", ws) } static enterAppRoom(wsURL: string, binaryWsURL: string, appID: string) { let ws = generateTextMessageWs(wsURL, ILLA_WEBSOCKET_CONTEXT.APP) ws.registerListener(ReduxMessageListener) ws.initWebsocket() let binaryWs = generateBinaryMessageWs(binaryWsURL) this.roomMap.set(`app/${appID}`, ws) this.roomMap.set(`app/${appID}/binary`, binaryWs) } static enterAgentRoom(wsURL: string, messageListener: WSMessageListener) { let ws = generateTextMessageWs(wsURL, ILLA_WEBSOCKET_CONTEXT.AI_AGENT) ws.registerListener(messageListener) ws.initWebsocket() this.roomMap.set("ai-agent/", ws) } static getTextRoom( type: RoomType, roomId: string, ): ILLAWebsocket | undefined { return this.roomMap.get(`${type}/${roomId}`) as ILLAWebsocket } static getBinaryRoom( type: RoomType, roomId: string, ): ILLABinaryWebsocket | undefined { return this.roomMap.get(`${type}/${roomId}/binary`) as ILLABinaryWebsocket } static leaveRoom(type: RoomType, roomId: string) { const { id: teamID = "", uid = "" } = getCurrentTeamInfo(store.getState()) ?? {} let textWS = this.roomMap.get(`${type}/${roomId}`) as ILLAWebsocket let binaryWS = this.roomMap.get(`app/${roomId}/binary`) if (textWS != undefined) { textWS.send( getTextMessagePayload( TextSignal.LEAVE, TextTarget.NOTHING, false, { type: "leave", payload: [], }, teamID, uid, [], ), ) textWS.close() } if (binaryWS != undefined) { binaryWS.close() } } } export function generateTextMessageWs( url: string, context: ILLA_WEBSOCKET_CONTEXT, ) { return new ILLAWebsocket(url, context) } export function generateBinaryMessageWs(url: string) { return new ILLABinaryWebsocket(url, ILLA_WEBSOCKET_CONTEXT.APP_BINARY) } ================================================ FILE: apps/builder/src/api/ws/interface.ts ================================================ import { ComponentTreeNode } from "@illa-public/public-types" import { TextSignal, TextTarget } from "@/api/ws/textSignal" export type RoomType = "dashboard" | "app" | "ai-agent" export interface Room { wsURL: string } export interface Broadcast { type: string payload: any } export interface Callback { broadcast: Broadcast // extra data data: T // string errorMessage: string // 0 success, not zero error errorCode: number target: TextTarget signal: TextSignal } export interface ILLAWebSocketComponentPayload { before: { displayName: string } after: ComponentTreeNode } export enum ILLA_WEBSOCKET_STATUS { INIT = "INIT", CONNECTING = "CONNECTING", CONNECTED = "CONNECTED", CLOSED = "CLOSED", FAILED = "FAILED", LOCKING = "LOCKING", } export enum ILLA_WEBSOCKET_CONTEXT { DASHBOARD = "DASHBOARD", APP = "APP", APP_BINARY = "APP_BINARY", AI_AGENT = "AI_AGENT", } ================================================ FILE: apps/builder/src/api/ws/textSignal.ts ================================================ export enum TextSignal { PING = 0, ENTER = 1, LEAVE = 2, CREATE_STATE = 3, DELETE_STATE = 4, UPDATE_STATE = 5, MOVE_STATE = 6, CREATE_OR_UPDATE_STATE = 7, BROADCAST_ONLY = 8, PUT_STATE = 9, GLOBAL_BROADCAST_ONLY = 10, COOPERATE_ATTACH = 11, COOPERATE_DISATTACH = 12, MOVE_CURSOR = 13, FORCE_REFRESH = 14, TAKE_APP_SNAPSHOT = 15, RECOVER_APP_SNAPSHOT = 16, RUN = 17, STOP_ALL = 18, CLEAN = 19, } export enum TextTarget { NOTHING = 0, COMPONENTS = 1, DEPENDENCIES = 2, DRAG_SHADOW = 3, DOTTED_LINE_SQUARE = 4, DISPLAY_NAME = 5, APPS = 6, RESOURCE = 7, ACTION = 8, CURSOR = 9, WINDOW = 10, } export enum ErrorCode { ERROR_CODE_OK = 0, ERROR_CODE_FAILED = 1, ERROR_CODE_NEED_ENTER = 2, ERROR_CODE_PONG = 3, ERROR_CODE_LOGIN_FAILED = 4, ERROR_CREATE_STATE_FAILED = 5, ERROR_DELETE_STATE_FAILED = 6, ERROR_UPDATE_STATE_FAILED = 7, ERROR_MOVE_STATE_FAILED = 8, ERROR_CREATE_OR_UPDATE_STATE_FAILED = 9, ERROR_CAN_NOT_MOVE_KVSTATE = 10, ERROR_CAN_NOT_MOVE_SETSTATE = 11, ERROR_CREATE_SNAPSHOT_MODIFY_HISTORY_FAILED = 12, ERROR_UPDATE_SNAPSHOT_MODIFY_HISTORY_FAILED = 13, ERROR_FORCE_REFRESH_WINDOW = 14, ERROR_MESSAGE_END = 15, } ================================================ FILE: apps/builder/src/assets/animationForLottie/celebrate.json ================================================ {"v":"5.5.6","fr":70,"ip":0,"op":370,"w":609,"h":812,"nm":"lottie (mobile)","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"_small-side","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[218,320,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":15,"op":234,"st":15,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"streamer b","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":166,"ix":10},"p":{"a":0,"k":[554,664,0],"ix":2},"a":{"a":0,"k":[-157,-245,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.685,-13.314],[0,-14.907],[0,-15.206],[0,-14.907],[0,-14.907],[0,-15.206],[1.754,-14.206],[-3.934,-9.465]],"o":[[-3.895,8.562],[1.872,14.789],[0,15.206],[0,14.907],[0,14.907],[0,15.206],[0,14.314],[-1.803,14.605],[0,0]],"v":[[-156.5,-406],[-166.5,-367],[-146.5,-327],[-166.5,-286],[-146.5,-246],[-166.5,-206],[-146.5,-165],[-166.5,-127],[-156.5,-84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[4]},{"t":57,"s":[0.5]}],"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"t":57,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[35]},{"t":57,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":9,"op":58,"st":9,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"streamer a","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":167,"ix":10},"p":{"a":0,"k":[532,582,0],"ix":2},"a":{"a":0,"k":[-157,-245,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.685,-13.314],[0,-14.907],[0,-15.206],[0,-14.907],[0,-14.907],[0,-15.206],[1.754,-14.206],[-3.934,-9.465]],"o":[[-3.895,8.562],[1.872,14.789],[0,15.206],[0,14.907],[0,14.907],[0,15.206],[0,14.314],[-1.803,14.605],[0,0]],"v":[[-156.5,-406],[-166.5,-367],[-146.5,-327],[-166.5,-286],[-146.5,-246],[-166.5,-206],[-146.5,-165],[-166.5,-127],[-156.5,-84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[4]},{"t":48,"s":[0.5]}],"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[35]},{"t":48,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":49,"st":5,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"circle a","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[321.019]},{"t":158,"s":[1800]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":1,"s":[599.5,838,0],"to":[-30,-106.667,0],"ti":[46.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":29,"s":[419.5,198,0],"to":[-46.667,0,0],"ti":[0,0,0]},{"t":158,"s":[319.5,838,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":1,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[100,100,100]},{"t":128,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":159,"st":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"circle b","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[0]},{"t":128,"s":[1440]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":3,"s":[599.5,838,0],"to":[-26.667,-93.333,0],"ti":[66.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":21,"s":[439.5,278,0],"to":[-66.667,0,0],"ti":[0,0,0]},{"t":128,"s":[199.5,838,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":3,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":98,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":129,"st":3,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"star a","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[343.949]},{"t":158,"s":[1800]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":1,"s":[596.087,836.292,0],"to":[-36.098,-100,0],"ti":[52.765,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":31,"s":[379.5,236.292,0],"to":[-52.765,0,0],"ti":[0,0,0]},{"t":158,"s":[279.5,836.292,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":1,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":31,"s":[100,100,100]},{"t":128,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":159,"st":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"star b","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[288]},{"t":128,"s":[1800]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":3,"s":[596.087,836.292,0],"to":[-39.431,-113.333,0],"ti":[66.098,1.667,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":23,"s":[359.5,156.292,0],"to":[-66.098,-1.667,0],"ti":[0,0,0]},{"t":128,"s":[199.5,826.292,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":3,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"t":98,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":129,"st":3,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"rec a","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":33,"s":[381.468]},{"t":218,"s":[2520]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[599.5,842,0],"to":[-23.333,-100,0],"ti":[41.333,1.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":33,"s":[459.5,242,0],"to":[-41.333,-1.333,0],"ti":[0,0,0]},{"t":218,"s":[351.5,834,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":33,"s":[100,100,100]},{"t":188,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.8313725490196079,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":219,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"rec b","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[262.857]},{"t":191,"s":[2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[599.5,842,0],"to":[-23.333,-113.333,0],"ti":[74,5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":25,"s":[459.5,162,0],"to":[-74,-5,0],"ti":[0,0,0]},{"t":191,"s":[155.5,812,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":2,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"t":161,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":192,"st":2,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"square a","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":35,"s":[462.385]},{"t":218,"s":[2880]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[599.5,838,0],"to":[-43.333,-123.333,0],"ti":[60,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":35,"s":[339.5,98,0],"to":[-60,0,0],"ti":[0,0,0]},{"t":218,"s":[239.5,838,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":0,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"t":188,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":219,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"square b","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[285.714]},{"t":191,"s":[2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[599.5,838,0],"to":[-30,-120,0],"ti":[75,3.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":27,"s":[419.5,118,0],"to":[-75,-3.333,0],"ti":[0,0,0]},{"t":191,"s":[149.5,818,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":2,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":27,"s":[100,100,100]},{"t":161,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":192,"st":2,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"streamer b 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":171,"ix":10},"p":{"a":0,"k":[543,427,0],"ix":2},"a":{"a":0,"k":[-157,-245,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.685,-13.314],[0,-14.907],[0,-15.206],[0,-14.907],[0,-14.907],[0,-15.206],[1.754,-14.206],[-3.934,-9.465]],"o":[[-3.895,8.562],[1.872,14.789],[0,15.206],[0,14.907],[0,14.907],[0,15.206],[0,14.314],[-1.803,14.605],[0,0]],"v":[[-156.5,-406],[-166.5,-367],[-146.5,-327],[-166.5,-286],[-146.5,-246],[-166.5,-206],[-146.5,-165],[-166.5,-127],[-156.5,-84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9686274509803922,0.37254901960784315,0.023529411764705882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[4]},{"t":61,"s":[0.5]}],"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0]},{"t":61,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[35]},{"t":61,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":13,"op":62,"st":13,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"streamer a 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":151,"ix":10},"p":{"a":0,"k":[454,444,0],"ix":2},"a":{"a":0,"k":[-157,-245,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.685,-13.314],[0,-14.907],[0,-15.206],[0,-14.907],[0,-14.907],[0,-15.206],[1.754,-14.206],[-3.934,-9.465]],"o":[[-3.895,8.562],[1.872,14.789],[0,15.206],[0,14.907],[0,14.907],[0,15.206],[0,14.314],[-1.803,14.605],[0,0]],"v":[[-156.5,-406],[-166.5,-367],[-146.5,-327],[-166.5,-286],[-146.5,-246],[-166.5,-206],[-146.5,-165],[-166.5,-127],[-156.5,-84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[4]},{"t":53,"s":[0.5]}],"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[0]},{"t":53,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[35]},{"t":53,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":10,"op":54,"st":10,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"circle a 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[-371.368]},{"t":191,"s":[-2520]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":1,"s":[599.5,838,0],"to":[-53.333,-113.333,0],"ti":[56.667,-3.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":29,"s":[279.5,158,0],"to":[-56.667,3.333,0],"ti":[0,0,0]},{"t":191,"s":[259.5,858,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"t":1,"s":[100,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[100,100,100]},{"t":161,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.8313725490196079,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":192,"st":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"circle b 2","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[-250.839]},{"t":158,"s":[-2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":3,"s":[599.5,838,0],"to":[-53.333,-100,0],"ti":[63,-7,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":21,"s":[279.5,238,0],"to":[-63,7,0],"ti":[0,0,0]},{"t":158,"s":[221.5,880,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"t":3,"s":[100,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"t":128,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":159,"st":3,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"star a 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[-397.895]},{"t":191,"s":[-2520]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":1,"s":[596.087,836.292,0],"to":[-9.431,-113.333,0],"ti":[42.765,-3.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":31,"s":[539.5,156.292,0],"to":[-42.765,3.333,0],"ti":[0,0,0]},{"t":191,"s":[339.5,856.292,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"t":1,"s":[100,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":31,"s":[100,100,100]},{"t":161,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":192,"st":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"star b 2","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[-278.71]},{"t":158,"s":[-2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":3,"s":[596.087,836.292,0],"to":[-12.765,-96.667,0],"ti":[52.765,-3.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":23,"s":[519.5,256.292,0],"to":[-52.765,3.333,0],"ti":[0,0,0]},{"t":158,"s":[279.5,856.292,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"t":3,"s":[100,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"t":128,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":3,"op":159,"st":3,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"rec a 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":33,"s":[-556.875]},{"t":128,"s":[-2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[599.5,842,0],"to":[-16.667,-120,0],"ti":[66.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":33,"s":[499.5,122,0],"to":[-66.667,0,0],"ti":[0,0,0]},{"t":128,"s":[199.5,842,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"t":0,"s":[100,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,0.833,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":33,"s":[100,100,100]},{"t":98,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":129,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"rec b 2","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[-306.667]},{"t":218,"s":[-2880]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[599.5,842,0],"to":[-22.62,-109.87,0],"ti":[2.877,-2.055,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":25,"s":[339.5,262,0],"to":[-51.333,36.667,0],"ti":[0,0,0]},{"t":218,"s":[219.5,862,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"t":2,"s":[100,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"t":188,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9686274509803922,0.37254901960784315,0.023529411764705882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":219,"st":2,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"square a 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":35,"s":[-590.625]},{"t":128,"s":[-2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[599.5,838,0],"to":[-20,-90,0],"ti":[36.667,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":35,"s":[479.5,298,0],"to":[-36.667,0,0],"ti":[0,0,0]},{"t":128,"s":[379.5,838,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"t":0,"s":[100,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"t":98,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":129,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"square b 2","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[-333.333]},{"t":218,"s":[-2880]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[599.5,838,0],"to":[-10,-103.333,0],"ti":[50,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":27,"s":[539.5,218,0],"to":[-50,0,0],"ti":[0,0,0]},{"t":218,"s":[299.5,838,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0.167,0]},"t":2,"s":[100,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":27,"s":[100,100,100]},{"t":188,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":219,"st":2,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"_small-side","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[260,320,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":0,"op":219,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"left","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":13,"op":313,"st":13,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"right","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":30,"op":330,"st":30,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"streamer a 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":14,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[219.178,-190.096,0],"to":[-95.333,426.667,0],"ti":[167.333,-560.667,0]},{"t":173,"s":[179.178,989.904,0]}],"ix":2},"a":{"a":0,"k":[-157,-245,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.685,-13.314],[0,-14.907],[0,-15.206],[0,-14.907],[0,-14.907],[0,-15.206],[1.754,-14.206],[-3.934,-9.465]],"o":[[-3.895,8.562],[1.872,14.789],[0,15.206],[0,14.907],[0,14.907],[0,15.206],[0,14.314],[-1.803,14.605],[0,0]],"v":[[-156.5,-406],[-166.5,-367],[-146.5,-327],[-166.5,-286],[-146.5,-246],[-166.5,-206],[-146.5,-165],[-166.5,-127],[-156.5,-84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[4]},{"t":176,"s":[0.5]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0]},{"t":176,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[40]},{"t":176,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":13,"op":174,"st":13,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"streamer b 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-1.458,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[269.863,-175.455,0],"to":[-110,415.333,0],"ti":[216,-599.333,0]},{"t":173,"s":[69.863,984.545,0]}],"ix":2},"a":{"a":0,"k":[-157,-245,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.685,-13.314],[0,-14.907],[0,-15.206],[0,-14.907],[0,-14.907],[0,-15.206],[1.754,-14.206],[-3.934,-9.465]],"o":[[-3.895,8.562],[1.872,14.789],[0,15.206],[0,14.907],[0,14.907],[0,15.206],[0,14.314],[-1.803,14.605],[0,0]],"v":[[-156.5,-406],[-166.5,-367],[-146.5,-327],[-166.5,-286],[-146.5,-246],[-166.5,-206],[-146.5,-165],[-166.5,-127],[-156.5,-84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[4]},{"t":173,"s":[0.5]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":173,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[40]},{"t":173,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":174,"st":5,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"circle a 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"t":155,"s":[1800]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[325.643,-26.292,0],"to":[-101.333,75.667,0],"ti":[15.333,-507.667,0]},{"t":155,"s":[125.643,835.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[50,100,100]},{"t":155,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":156,"st":-7,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"circle b 4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":215,"s":[2520]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[619.5,-26.292,0],"to":[-138,77.667,0],"ti":[-2,-497.667,0]},{"t":215,"s":[259.5,835.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":2,"s":[50,100,100]},{"t":215,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":216,"st":-13,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"star a 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0]},{"t":245,"s":[2880]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[376.929,-28,0],"to":[-213.333,157.667,0],"ti":[173.333,-127.667,0]},{"t":245,"s":[116.929,834,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[50,100,100]},{"t":245,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":246,"st":-9,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"star b 4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":125,"s":[1800]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[171.786,-28,0],"to":[0,0,0],"ti":[-161.333,-275.667,0]},{"t":125,"s":[251.786,834,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":2,"s":[50,100,100]},{"t":125,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":126,"st":-13,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"rec a 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"t":185,"s":[2520]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[428.214,-22.292,0],"to":[-167.333,119.667,0],"ti":[-130.667,-315.667,0]},{"t":185,"s":[228.214,839.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":4,"s":[50,100,100]},{"t":185,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.8313725490196079,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":186,"st":-11,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"rec b 4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0]},{"t":245,"s":[2880]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[223.071,-22.292,0],"to":[0,0,0],"ti":[-92.571,-383.708,0]},{"t":245,"s":[223.071,839.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[50,100,100]},{"t":245,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":246,"st":-9,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"square a 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"t":217,"s":[2520]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[120.5,-26.292,0],"to":[13,430.305,0],"ti":[52.221,-418.892,0]},{"t":217,"s":[198.5,833.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":4,"s":[50,100,100]},{"t":217,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":218,"st":-11,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"square b 4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"t":215,"s":[2520]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[274.357,-26.292,0],"to":[157.333,415.667,0],"ti":[22.667,-253.667,0]},{"t":215,"s":[114.357,835.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[50,100,100]},{"t":215,"s":[100,50,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":216,"st":-7,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"streamer a 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":3,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[275.178,-173.096,0],"to":[-87.333,413.333,0],"ti":[177.333,-643.333,0]},{"t":185,"s":[219.178,974.904,0]}],"ix":2},"a":{"a":0,"k":[-157,-245,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.685,-13.314],[0,-14.907],[0,-15.206],[0,-14.907],[0,-14.907],[0,-15.206],[1.754,-14.206],[-3.934,-9.465]],"o":[[-3.895,8.562],[1.872,14.789],[0,15.206],[0,14.907],[0,14.907],[0,15.206],[0,14.314],[-1.803,14.605],[0,0]],"v":[[-156.5,-406],[-166.5,-367],[-146.5,-327],[-166.5,-286],[-146.5,-246],[-166.5,-206],[-146.5,-165],[-166.5,-127],[-156.5,-84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[4]},{"t":177,"s":[0.5]}],"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"t":177,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[40]},{"t":177,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":186,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"streamer b 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":9,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[199.863,74.545,0],"to":[-13.363,405.455,0],"ti":[179.333,-430.667,0]},{"t":217,"s":[139.863,834.545,0]}],"ix":2},"a":{"a":0,"k":[-157,-245,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.685,-13.314],[0,-14.907],[0,-15.206],[0,-14.907],[0,-14.907],[0,-15.206],[1.754,-14.206],[-3.934,-9.465]],"o":[[-3.895,8.562],[1.872,14.789],[0,15.206],[0,14.907],[0,14.907],[0,15.206],[0,14.314],[-1.803,14.605],[0,0]],"v":[[-156.5,-406],[-166.5,-367],[-146.5,-327],[-166.5,-286],[-146.5,-246],[-166.5,-206],[-146.5,-165],[-166.5,-127],[-156.5,-84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9686274509803922,0.37254901960784315,0.023529411764705882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[4]},{"t":199,"s":[0.5]}],"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"t":199,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[40]},{"t":199,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":11,"op":218,"st":11,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"circle a 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":125,"s":[-1800]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[365.643,-26.292,0],"to":[-101.333,75.667,0],"ti":[15.333,-507.667,0]},{"t":125,"s":[165.643,835.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":2,"s":[100,50,100]},{"t":125,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.8313725490196079,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":126,"st":-13,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"circle b 3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"t":245,"s":[-2880]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[519.5,-26.292,0],"to":[-138,77.667,0],"ti":[-2,-497.667,0]},{"t":245,"s":[159.5,835.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,50,100]},{"t":245,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":246,"st":-7,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"star a 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0]},{"t":245,"s":[-2880]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[416.929,-28,0],"to":[-213.333,157.667,0],"ti":[173.333,-127.667,0]},{"t":245,"s":[156.929,834,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,50,100]},{"t":245,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":246,"st":-9,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"star b 3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"t":155,"s":[-2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[211.786,-28,0],"to":[0,0,0],"ti":[-161.333,-275.667,0]},{"t":155,"s":[291.786,834,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,50,100]},{"t":155,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":156,"st":-7,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"rec a 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"t":185,"s":[-2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[468.214,-22.292,0],"to":[-167.333,119.667,0],"ti":[-130.667,-315.667,0]},{"t":185,"s":[268.214,839.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":4,"s":[100,50,100]},{"t":185,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9921568627450981,0.4980392156862745,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":186,"st":-11,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"rec b 3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0]},{"t":245,"s":[-2880]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[263.071,-22.292,0],"to":[0,143.667,0],"ti":[-114.571,-267.708,0]},{"t":245,"s":[263.071,839.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,50,100]},{"t":245,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9686274509803922,0.37254901960784315,0.023529411764705882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":246,"st":-9,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"square a 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":217,"s":[-2520]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[160.5,-26.292,0],"to":[13,430.305,0],"ti":[52.221,-418.892,0]},{"t":217,"s":[238.5,833.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":2,"s":[100,50,100]},{"t":217,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":218,"st":-13,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"square b 3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"t":185,"s":[-2160]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[314.357,-26.292,0],"to":[157.333,415.667,0],"ti":[22.667,-253.667,0]},{"t":185,"s":[154.357,835.708,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":4,"s":[100,50,100]},{"t":185,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9764705882352941,0.6196078431372549,0.027450980392156862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":186,"st":-11,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"cannon (small - left)","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[76,451.99999999999994,0],"ix":2},"a":{"a":0,"k":[0,360,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":480,"h":720,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"cannon (small - right)","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[533,451.99999999999994,0],"ix":2},"a":{"a":0,"k":[479.994,360,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":480,"h":720,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"cannon (small - top)","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[304,408,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[102,102,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":0,"op":300,"st":0,"bm":0}],"markers":[]} ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/core.tsx ================================================ import { closeCompletion } from "@codemirror/autocomplete" import { Compartment, EditorState, Extension, StateEffect, } from "@codemirror/state" import { EditorView, placeholder as placeholderExtension, } from "@codemirror/view" import { FC, useCallback, useEffect, useMemo, useRef, useState } from "react" import { useBasicSetup } from "@/components/CodeEditor/CodeMirror/extensions" import { CODE_LANG, CODE_TYPE, } from "@/components/CodeEditor/CodeMirror/extensions/interface" import { ILLACodeMirrorProps } from "@/components/CodeEditor/CodeMirror/interface" import { applyEditorWrapperStyle } from "@/components/CodeEditor/CodeMirror/style" import { ILLACodeMirrorTheme } from "@/components/CodeEditor/CodeMirror/theme" import { HintToolTip } from "@/components/CodeEditor/HintToolTip" import { VALIDATION_TYPES } from "@/utils/validationFactory" // thk ReactCodeMirror:https://github.com/uiwjs/react-codemirror export const ILLACodeMirrorCore: FC = (props) => { const { className, extensions = [], value, height = "", maxHeight = "", minHeight = "", width = "", maxWidth = "", minWidth = "", editable = true, readOnly = false, placeholder, showLineNumbers = false, lang = CODE_LANG.JAVASCRIPT, codeType = CODE_TYPE.EXPRESSION, expressions = [], result = "", hasError = false, resultType = VALIDATION_TYPES.STRING, canShowCompleteInfo = false, sqlScheme = {}, singleLine, onChange, onBlur, onFocus, tooltipContainer, scopeOfAutoComplete, } = props const [isFocus, setIsFocus] = useState(false) const editorViewRef = useRef() const editorWrapperRef = useRef(null) const compartmentsRef = useRef([]) const extensionOptions = useMemo(() => { return { showLineNumbers, lang, codeType, expressions, canShowCompleteInfo, sqlScheme, scopeOfAutoComplete, } }, [ canShowCompleteInfo, codeType, expressions, lang, showLineNumbers, sqlScheme, scopeOfAutoComplete, ]) const basicExtensions = useBasicSetup(extensionOptions) const defaultThemeOption = useMemo( () => EditorView.theme({ "&": { height, minHeight, maxHeight, width, maxWidth, minWidth, }, ...ILLACodeMirrorTheme, }), [height, maxHeight, maxWidth, minHeight, minWidth, width], ) const focusUpdateListener: Extension = useMemo(() => { return EditorView.updateListener.of((viewUpdate) => { if (viewUpdate.focusChanged) { setIsFocus(viewUpdate.view.hasFocus) const currentString = viewUpdate.state.doc.toString() if (viewUpdate.view.hasFocus) { onFocus?.() } else { onBlur?.(currentString) } if (!viewUpdate.view.hasFocus) { setTimeout(() => { closeCompletion(viewUpdate.view) }, 500) } } }) }, [onBlur, onFocus]) const changeUpdateListener: Extension = useMemo(() => { return EditorView.updateListener.of((viewUpdate) => { const currentString = viewUpdate.state.doc.toString() if (viewUpdate.docChanged) { onChange?.(currentString) } }) }, [onChange]) const readOnlyStateChangeEffect: Extension = useMemo( () => EditorState.readOnly.of(readOnly), [readOnly], ) const editableStateChangeEffect: Extension = useMemo( () => EditorView.editable.of(editable), [editable], ) const placeholderExt: Extension = useMemo(() => { return typeof placeholder === "string" ? placeholderExtension(placeholder) : [] }, [placeholder]) const singleLineExt: Extension = useMemo(() => { return singleLine ? EditorState.transactionFilter.of((tr) => { return tr.newDoc.lines > 1 ? [] : [tr] }) : EditorView.lineWrapping }, [singleLine]) const allExtensions = useMemo(() => { return [ basicExtensions, defaultThemeOption, focusUpdateListener, changeUpdateListener, readOnlyStateChangeEffect, editableStateChangeEffect, placeholderExt, singleLineExt, extensions, ] }, [ basicExtensions, defaultThemeOption, focusUpdateListener, changeUpdateListener, readOnlyStateChangeEffect, editableStateChangeEffect, placeholderExt, singleLineExt, extensions, ]) const extensionsWithCompartment = useMemo(() => { for ( let i = compartmentsRef.current.length; i < allExtensions.length; i++ ) { const compartment = new Compartment() compartmentsRef.current.push(compartment) } return allExtensions.map((ext, index) => compartmentsRef.current[index].of(ext), ) }, [allExtensions]) useEffect(() => { if ( !editorViewRef.current || (!isFocus && value !== editorViewRef.current.state.doc.toString()) ) { const state = EditorState.create({ doc: value, extensions: extensionsWithCompartment, }) if (editorViewRef.current) { editorViewRef.current.setState(state) } else { if (editorWrapperRef.current) { editorViewRef.current = new EditorView({ state, parent: editorWrapperRef.current, }) } } } }, [value, extensionsWithCompartment, isFocus]) const reconfigure = useCallback( (view?: EditorView) => { if (view) { const effects: StateEffect[] = [] allExtensions.forEach((e, i) => { if (compartmentsRef.current[i].get(view.state) !== e) { effects.push(compartmentsRef.current[i].reconfigure(e)) } }) if (effects.length > 0) { view.dispatch({ effects }) } } }, [allExtensions], ) useEffect(() => { if (editorViewRef.current) { reconfigure(editorViewRef.current) } }, [reconfigure]) return (
) } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/completionSources/ILLAContextDesc/index.tsx ================================================ import { ILLA_UTILS_DESC } from "./utils" export const ILLAContextDesc: Record = { utils: ILLA_UTILS_DESC, } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/completionSources/ILLAContextDesc/utils.tsx ================================================ interface IILLAUtilsDesc { desc?: string usage: string } export const ILLA_UTILS_DESC: Record = { goToURL: { desc: "", usage: "utils.goToURL({url:string,newTab?:boolean = false})", }, showNotification: { desc: "", usage: `utils.showNotification({type:"info" | "error" | "success" | "warning" | "normal" = "info",title?:string,description?:string,duration?:number = 4500})`, }, copyToClipboard: { desc: "", usage: `utils.copyToClipboard(copiedValue:any)`, }, setRouter: { desc: "", usage: "utils.setRouter({pagePath:string;viewPath?:string})", }, downloadFile: { desc: "", usage: `utils.downloadFile({fileType?:string = "auto";fileName?:string = "Untitled File",data:any})`, }, downloadFromILLADrive: { desc: "", usage: `utils.downloadFromILLADrive({downloadInfo:{tinyURL:string,fileID:string}[],asZip?:boolean})`, }, saveToILLADrive: { desc: "", usage: `utils.saveToILLADrive({fileName:string,fileData:string,fileType?:string="auto",folder?:string="",allowAnonymous?:boolean = false,replace?:boolean = false})`, }, setGlobalDataIn: { desc: "", usage: `utils.setGlobalDataIn({key:string,path:string,value:any})`, }, setGlobalDataValue: { desc: "", usage: `utils.setGlobalDataValue({key:string,value:any})`, }, setLocalStorage: { desc: "", usage: `utils.setLocalStorage({key:string,value:any})`, }, clearLocalStorage: { desc: "", usage: `utils.clearLocalStorage()`, }, } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/completionSources/TernServer/defs/ecmascript.json ================================================ { "!name": "ecmascript", "!define": { "Error.prototype": "Error.prototype", "propertyDescriptor": { "enumerable": "bool", "configurable": "bool", "value": "?", "writable": "bool", "get": "fn() -> ?", "set": "fn(value: ?)" }, "Promise.prototype": { "catch": { "!doc": "The catch() method returns a Promise and deals with rejected cases only. It behaves the same as calling Promise.prototype.then(undefined, onRejected).", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch", "!type": "fn(onRejected: fn(reason: ?)) -> !this" }, "then": { "!doc": "The then() method returns a Promise. It takes two arguments, both are callback functions for the success and failure cases of the Promise.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then", "!type": "fn(onFulfilled: fn(value: ?), onRejected: fn(reason: ?)) -> !custom:Promise_then", "!effects": ["call !0 !this.:t"] } }, "Promise_reject": { "!type": "fn(reason: ?) -> !this", "!doc": "The Promise.reject(reason) method returns a Promise object that is rejected with the given reason.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject" }, "iter_prototype": { ":Symbol.iterator": "fn() -> !this" }, "iter": { "!proto": "iter_prototype", "next": { "!type": "fn() -> +iter_result[value=!this.:t]", "!doc": "Return the next item in the sequence.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators" }, "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators" }, "iter_result": { "done": "bool", "value": "?" }, "generator_prototype": { "!proto": "iter_prototype", "next": "fn(value?: ?) -> iter_result", "return": "fn(value?: ?) -> iter_result", "throw": "fn(exception: +Error)" }, "Proxy_handler": { "!doc": "The proxy's handler object is a placeholder object which contains traps for proxies.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler", "getPrototypeOf": "fn(target: ?)", "setPrototypeOf": "fn(target: ?, prototype: ?)", "isExtensible": "fn(target: ?)", "preventExtensions": "fn(target: ?)", "getOwnPropertyDescriptor": "fn(target: ?, property: string) -> propertyDescriptor", "defineProperty": "fn(target: ?, property: string, descriptor: propertyDescriptor)", "has": "fn(target: ?, property: string)", "get": "fn(target: ?, property: string)", "set": "fn(target: ?, property: string, value: ?)", "deleteProperty": "fn(target: ?, property: string)", "enumerate": "fn(target: ?)", "ownKeys": "fn(target: ?)", "apply": "fn(target: ?, self: ?, arguments: [?])", "construct": "fn(target: ?, arguments: [?])" }, "Proxy_revocable": { "proxy": "+Proxy", "revoke": "fn()" }, "TypedArray": { "!type": "fn(size: number)", "!doc": "A TypedArray object describes an array-like view of an underlying binary data buffer. There is no global property named TypedArray, nor is there a directly visible TypedArray constructor. Instead, there are a number of different global properties, whose values are typed array constructors for specific element types, listed below. On the following pages you will find common properties and methods that can be used with any typed array containing elements of any type.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray", "from": { "!type": "fn(arrayLike: ?, mapFn?: fn(elt: ?, i: number) -> number, thisArg?: ?) -> +TypedArray", "!effects": ["call !1 this=!2 !0. number"], "!doc": "Creates a new typed array from an array-like or iterable object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/from" }, "of": { "!type": "fn(elements: number) -> +TypedArray", "!doc": "Creates a new typed array from a variable number of arguments.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of" }, "BYTES_PER_ELEMENT": { "!type": "number", "!doc": "The TypedArray.BYTES_PER_ELEMENT property represents the size in bytes of each element in an typed array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/BYTES_PER_ELEMENT" }, "name": { "!type": "string", "!doc": "The TypedArray.name property represents a string value of the typed array constructor name.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/name" }, "prototype": { "": "number", "buffer": { "!type": "+ArrayBuffer", "!doc": "The buffer accessor property represents the ArrayBuffer referenced by a TypedArray at construction time.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/buffer" }, "byteLength": { "!type": "number", "!doc": "The byteLength accessor property represents the length (in bytes) of a typed array from the start of its ArrayBuffer.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/byteLength" }, "byteOffset": { "!type": "number", "!doc": "The byteOffset accessor property represents the offset (in bytes) of a typed array from the start of its ArrayBuffer.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/byteOffset" }, "copyWithin": { "!type": "fn(target: number, start: number, end?: number) -> ?", "!doc": "The copyWithin() method copies the sequence of array elements within the array to the position starting at target. The copy is taken from the index positions of the second and third arguments start and end. The end argument is optional and defaults to the length of the array. This method has the same algorithm as Array.prototype.copyWithin. TypedArray is one of the typed array types here.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/copyWithin" }, "entries": { "!type": "fn() -> +iter[:t=number]", "!doc": "The entries() method returns a new Array Iterator object that contains the key/value pairs for each index in the array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/entries" }, "every": { "!type": "fn(callback: fn(element: number, index: number, array: TypedArray) -> bool, thisArg?: ?) -> bool", "!effects": ["call !0 this=!1 number number !this"], "!doc": "The every() method tests whether all elements in the typed array pass the test implemented by the provided function. This method has the same algorithm as Array.prototype.every(). TypedArray is one of the typed array types here.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/every" }, "fill": { "!type": "fn(value: number, start?: number, end?: number)", "!doc": "The fill() method fills all the elements of a typed array from a start index to an end index with a static value. This method has the same algorithm as Array.prototype.fill(). TypedArray is one of the typed array types here.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/fill" }, "filter": { "!type": "fn(test: fn(element: number, i: number) -> bool, context?: ?) -> !this", "!effects": ["call !0 this=!1 number number"], "!doc": "Creates a new array with all of the elements of this array for which the provided filtering function returns true. See also Array.prototype.filter().", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/filter" }, "find": { "!type": "fn(callback: fn(element: number, index: number, array: +TypedArray) -> bool, thisArg?: ?) -> number", "!effects": ["call !0 this=!1 number number !this"], "!doc": "The find() method returns a value in the typed array, if an element satisfies the provided testing function. Otherwise undefined is returned. TypedArray is one of the typed array types here.\nSee also the findIndex() method, which returns the index of a found element in the typed array instead of its value.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/find" }, "findIndex": { "!type": "fn(callback: fn(element: number, index: number, array: +TypedArray) -> bool, thisArg?: ?) -> number", "!effects": ["call !0 this=!1 number number !this"], "!doc": "The findIndex() method returns an index in the typed array, if an element in the typed array satisfies the provided testing function. Otherwise -1 is returned.\nSee also the find() method, which returns the value of a found element in the typed array instead of its index.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/findIndex" }, "forEach": { "!type": "fn(callback: fn(value: number, key: number, array: +TypedArray), thisArg?: ?)", "!effects": ["call !0 this=!1 number number !this"], "!doc": "Executes a provided function once per array element.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/forEach" }, "indexOf": { "!type": "fn(searchElement: number, fromIndex?: number) -> number", "!doc": "The indexOf() method returns the first index at which a given element can be found in the typed array, or -1 if it is not present. This method has the same algorithm as Array.prototype.indexOf(). TypedArray is one of the typed array types here.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/indexOf" }, "join": { "!type": "fn(separator?: string) -> string", "!doc": "The join() method joins all elements of an array into a string. This method has the same algorithm as Array.prototype.join(). TypedArray is one of the typed array types here.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/join" }, "keys": { "!type": "fn() -> +iter[:t=number]", "!doc": "The keys() method returns a new Array Iterator object that contains the keys for each index in the array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/keys" }, "lastIndexOf": { "!type": "fn(searchElement: number, fromIndex?: number) -> number", "!doc": "The lastIndexOf() method returns the last index at which a given element can be found in the typed array, or -1 if it is not present. The typed array is searched backwards, starting at fromIndex. This method has the same algorithm as Array.prototype.lastIndexOf(). TypedArray is one of the typed array types here.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/lastIndexOf" }, "length": { "!type": "number", "!doc": "Returns the number of elements hold in the typed array. Fixed at construction time and thus read only.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/length" }, "map": { "!type": "fn(f: fn(element: number, i: number) -> number, context?: ?) -> +TypedArray", "!effects": ["call !0 this=!1 number number"], "!doc": "Creates a new array with the results of calling a provided function on every element in this array. See also Array.prototype.map().", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/map" }, "reduce": { "!type": "fn(combine: fn(sum: ?, elt: number, i: number) -> ?, init?: ?) -> !0.!ret", "!effects": ["call !0 !1 number number"], "!doc": "Apply a function against an accumulator and each value of the array (from left-to-right) as to reduce it to a single value. See also Array.prototype.reduce().", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/reduce" }, "reduceRight": { "!type": "fn(combine: fn(sum: ?, elt: number, i: number) -> ?, init?: ?) -> !0.!ret", "!effects": ["call !0 !1 number number"], "!doc": "Apply a function against an accumulator and each value of the array (from right-to-left) as to reduce it to a single value. See also Array.prototype.reduceRight().", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/reduceRight" }, "reverse": { "!type": "fn()", "!doc": "The reverse() method reverses a typed array in place. The first typed array element becomes the last and the last becomes the first. This method has the same algorithm as Array.prototype.reverse(). TypedArray is one of the typed array types here.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/reverse" }, "set": { "!type": "fn(array: [number], offset?: number)", "!doc": "The set() method stores multiple values in the typed array, reading input values from a specified array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/set" }, "slice": { "!type": "fn(from: number, to?: number) -> +TypedArray", "!doc": "Extracts a section of an array and returns a new array. See also Array.prototype.slice().", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice" }, "some": { "!type": "fn(test: fn(elt: number, i: number) -> bool, context?: ?) -> bool", "!effects": ["call !0 this=!1 number number"], "!doc": "The some() method tests whether some element in the typed array passes the test implemented by the provided function. This method has the same algorithm as Array.prototype.some(). TypedArray is one of the typed array types here.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/some" }, "sort": { "!type": "fn(compare?: fn(a: number, b: number) -> number)", "!effects": ["call !0 number number"], "!doc": "Sorts the elements of an array in place and returns the array. See also Array.prototype.sort().", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/sort" }, "subarray": { "!type": "fn(begin?: number, end?: number) -> +TypedArray", "!doc": "The subarray() method returns a new TypedArray on the same ArrayBuffer store and with the same element types as for this TypedArray object. The begin offset is inclusive and the end offset is exclusive. TypedArray is one of the typed array types.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray" }, "values": { "!type": "fn() -> +iter[:t=number]", "!doc": "The values() method returns a new Array Iterator object that contains the values for each index in the array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/values" }, ":Symbol.iterator": { "!type": "fn() -> +iter[:t=number]", "!doc": "Returns a new Array Iterator object that contains the values for each index in the array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/@@iterator" } } } }, "Infinity": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Infinity", "!doc": "A numeric value representing infinity." }, "undefined": { "!type": "?", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/undefined", "!doc": "The value undefined." }, "NaN": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/NaN", "!doc": "A value representing Not-A-Number." }, "Object": { "!type": "fn()", "getPrototypeOf": { "!type": "fn(obj: ?) -> ?", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf", "!doc": "Returns the prototype (i.e. the internal prototype) of the specified object." }, "create": { "!type": "fn(proto: ?) -> !custom:Object_create", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create", "!doc": "Creates a new object with the specified prototype object and properties." }, "defineProperty": { "!type": "fn(obj: ?, prop: string, desc: propertyDescriptor) -> !custom:Object_defineProperty", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty", "!doc": "Defines a new property directly on an object, or modifies an existing property on an object, and returns the object. If you want to see how to use the Object.defineProperty method with a binary-flags-like syntax, see this article." }, "defineProperties": { "!type": "fn(obj: ?, props: ?) -> !custom:Object_defineProperties", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty", "!doc": "Defines a new property directly on an object, or modifies an existing property on an object, and returns the object. If you want to see how to use the Object.defineProperty method with a binary-flags-like syntax, see this article." }, "getOwnPropertyDescriptor": { "!type": "fn(obj: ?, prop: string) -> propertyDescriptor", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor", "!doc": "Returns a property descriptor for an own property (that is, one directly present on an object, not present by dint of being along an object's prototype chain) of a given object." }, "keys": { "!type": "fn(obj: ?) -> [string]", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys", "!doc": "Returns an array of a given object's own enumerable properties, in the same order as that provided by a for-in loop (the difference being that a for-in loop enumerates properties in the prototype chain as well)." }, "getOwnPropertyNames": { "!type": "fn(obj: ?) -> [string]", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames", "!doc": "Returns an array of all properties (enumerable or not) found directly upon a given object." }, "seal": { "!type": "fn(obj: ?)", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/seal", "!doc": "Seals an object, preventing new properties from being added to it and marking all existing properties as non-configurable. Values of present properties can still be changed as long as they are writable." }, "isSealed": { "!type": "fn(obj: ?) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/isSealed", "!doc": "Determine if an object is sealed." }, "freeze": { "!type": "fn(obj: ?) -> !0", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/freeze", "!doc": "Freezes an object: that is, prevents new properties from being added to it; prevents existing properties from being removed; and prevents existing properties, or their enumerability, configurability, or writability, from being changed. In essence the object is made effectively immutable. The method returns the object being frozen." }, "isFrozen": { "!type": "fn(obj: ?) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/isFrozen", "!doc": "Determine if an object is frozen." }, "preventExtensions": { "!type": "fn(obj: ?)", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions", "!doc": "Prevents new properties from ever being added to an object." }, "isExtensible": { "!type": "fn(obj: ?) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible", "!doc": "The Object.isExtensible() method determines if an object is extensible (whether it can have new properties added to it)." }, "assign": { "!type": "fn(target: ?, source: ?, source?: ?) -> !0", "!effects": ["copy !1 !0", "copy !2 !0", "copy !3 !0"], "!doc": "The Object.assign() method is used to copy the values of all enumerable own properties from one or more source objects to a target object. It will return the target object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign" }, "getOwnPropertySymbols": { "!type": "fn(obj: ?) -> !custom:getOwnPropertySymbols", "!doc": "The Object.getOwnPropertySymbols() method returns an array of all symbol properties found directly upon a given object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertySymbols" }, "is": { "!type": "fn(value1: ?, value2: ?) -> bool", "!doc": "The Object.is() method determines whether two values are the same value.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" }, "setPrototypeOf": { "!type": "fn(obj: ?, prototype: ?)", "!doc": "The Object.setPrototype() method sets the prototype (i.e., the internal [[Prototype]] property) of a specified object to another object or null.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf" }, "prototype": { "!stdProto": "Object", "toString": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/toString", "!doc": "Returns a string representing the object." }, "toLocaleString": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/toLocaleString", "!doc": "Returns a string representing the object. This method is meant to be overriden by derived objects for locale-specific purposes." }, "valueOf": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/valueOf", "!doc": "Returns the primitive value of the specified object" }, "hasOwnProperty": { "!type": "fn(prop: string) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty", "!doc": "Returns a boolean indicating whether the object has the specified property." }, "propertyIsEnumerable": { "!type": "fn(prop: string) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable", "!doc": "Returns a Boolean indicating whether the specified property is enumerable." }, "isPrototypeOf": { "!type": "fn(obj: ?) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf", "!doc": "Tests for an object in another object's prototype chain." } }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object", "!doc": "Creates an object wrapper." }, "Function": { "!type": "fn(body: string) -> fn()", "prototype": { "!stdProto": "Function", "apply": { "!type": "fn(this: ?, args: [?])", "!effects": ["call and return !this this=!0 !1. !1. !1."], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply", "!doc": "Calls a function with a given this value and arguments provided as an array (or an array like object)." }, "call": { "!type": "fn(this: ?, args?: ?) -> !this.!ret", "!effects": ["call and return !this this=!0 !1 !2 !3 !4"], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call", "!doc": "Calls a function with a given this value and arguments provided individually." }, "bind": { "!type": "fn(this: ?, args?: ?) -> !custom:Function_bind", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind", "!doc": "Creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function was called." }, "prototype": "?" }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function", "!doc": "Every function in JavaScript is actually a Function object." }, "Array": { "!type": "fn(size: number) -> !custom:Array_ctor", "isArray": { "!type": "fn(value: ?) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray", "!doc": "Returns true if an object is an array, false if it is not." }, "from": { "!type": "fn(arrayLike: ?, mapFn?: fn(elt: ?, i: number) -> ?, thisArg?: ?) -> [!0.]", "!effects": ["call !1 this=!2 !0. number"], "!doc": "The Array.from() method creates a new Array instance from an array-like or iterable object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from" }, "of": { "!type": "fn(elementN: ?) -> [!0]", "!doc": "The Array.of() method creates a new Array instance with a variable number of arguments, regardless of number or type of the arguments.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of" }, "prototype": { "!stdProto": "Array", "length": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/length", "!doc": "An unsigned, 32-bit integer that specifies the number of elements in an array." }, "concat": { "!type": "fn(other: [?]) -> !this", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/concat", "!doc": "Returns a new array comprised of this array joined with other array(s) and/or value(s)." }, "join": { "!type": "fn(separator?: string) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/join", "!doc": "Joins all elements of an array into a string." }, "splice": { "!type": "fn(pos: number, amount: number, newelt?: ?) -> [?]", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/splice", "!doc": "Changes the content of an array, adding new elements while removing old elements." }, "pop": { "!type": "fn() -> !this.", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/pop", "!doc": "Removes the last element from an array and returns that element." }, "push": { "!type": "fn(newelt: ?) -> number", "!effects": ["propagate !0 !this."], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/push", "!doc": "Mutates an array by appending the given elements and returning the new length of the array." }, "shift": { "!type": "fn() -> !this.", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/shift", "!doc": "Removes the first element from an array and returns that element. This method changes the length of the array." }, "unshift": { "!type": "fn(newelt: ?) -> number", "!effects": ["propagate !0 !this."], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/unshift", "!doc": "Adds one or more elements to the beginning of an array and returns the new length of the array." }, "slice": { "!type": "fn(from?: number, to?: number) -> !this", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice", "!doc": "Returns a shallow copy of a portion of an array." }, "reverse": { "!type": "fn()", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/reverse", "!doc": "Reverses an array in place. The first array element becomes the last and the last becomes the first." }, "sort": { "!type": "fn(compare?: fn(a: ?, b: ?) -> number)", "!effects": ["call !0 !this. !this."], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort", "!doc": "Sorts the elements of an array in place and returns the array." }, "indexOf": { "!type": "fn(elt: ?, from?: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf", "!doc": "Returns the first index at which a given element can be found in the array, or -1 if it is not present." }, "lastIndexOf": { "!type": "fn(elt: ?, from?: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/lastIndexOf", "!doc": "Returns the last index at which a given element can be found in the array, or -1 if it is not present. The array is searched backwards, starting at fromIndex." }, "every": { "!type": "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> bool", "!effects": ["call !0 this=!1 !this. number !this"], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/every", "!doc": "Tests whether all elements in the array pass the test implemented by the provided function." }, "some": { "!type": "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> bool", "!effects": ["call !0 this=!1 !this. number !this"], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/some", "!doc": "Tests whether some element in the array passes the test implemented by the provided function." }, "filter": { "!type": "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> !this", "!effects": ["call !0 this=!1 !this. number !this"], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter", "!doc": "Creates a new array with all elements that pass the test implemented by the provided function." }, "forEach": { "!type": "fn(f: fn(elt: ?, i: number, array: +Array), context?: ?)", "!effects": ["call !0 this=!1 !this. number !this"], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach", "!doc": "Executes a provided function once per array element." }, "map": { "!type": "fn(f: fn(elt: ?, i: number, array: +Array) -> ?, context?: ?) -> [!0.!ret]", "!effects": ["call !0 this=!1 !this. number !this"], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map", "!doc": "Creates a new array with the results of calling a provided function on every element in this array." }, "reduce": { "!type": "fn(combine: fn(sum: ?, elt: ?, i: number, array: +Array) -> ?, init?: ?) -> !0.!ret", "!effects": ["call !0 !1 !this. number !this"], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce", "!doc": "Apply a function against an accumulator and each value of the array (from left-to-right) as to reduce it to a single value." }, "reduceRight": { "!type": "fn(combine: fn(sum: ?, elt: ?, i: number, array: +Array) -> ?, init?: ?) -> !0.!ret", "!effects": ["call !0 !1 !this. number !this"], "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/ReduceRight", "!doc": "Apply a function simultaneously against two values of the array (from right-to-left) as to reduce it to a single value." }, "copyWithin": { "!type": "fn(target: number, start: number, end?: number) -> !this", "!doc": "The copyWithin() method copies the sequence of array elements within the array to the position starting at target. The copy is taken from the index positions of the second and third arguments start and end.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/copyWithin" }, "entries": { "!type": "fn() -> +iter[:t=[number, !this.]]", "!doc": "The entries() method returns a new Array Iterator object that contains the key/value pairs for each index in the array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries" }, "fill": { "!type": "fn(value: ?, start?: number, end?: number) -> !this", "!doc": "The fill() method fills all the elements of an array from a start index to an end index with a static value.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill" }, "find": { "!type": "fn(callback: fn(element: ?, index: number, array: [?]) -> bool, thisArg?: ?) -> !this.", "!effects": ["call !0 this=!2 !this. number"], "!doc": "The find() method returns a value in the array, if an element in the array satisfies the provided testing function. Otherwise undefined is returned.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find" }, "findIndex": { "!type": "fn(callback: fn(element: ?, index: number, array: [?]), thisArg?: ?) -> number", "!effects": ["call !0 this=!2 !this. number"], "!doc": "The findIndex() method returns an index in the array, if an element in the array satisfies the provided testing function. Otherwise -1 is returned.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex" }, "keys": { "!type": "fn() -> +iter[:t=number]", "!doc": "The keys() method returns a new Array Iterator that contains the keys for each index in the array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/keys" }, "values": { "!type": "fn() -> +iter[:t=!this.]", "!doc": "The values() method returns a new Array Iterator object that contains the values for each index in the array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values" }, ":Symbol.iterator": { "!type": "fn() -> +iter[:t=!this.]", "!doc": "Returns a new Array Iterator object that contains the values for each index in the array.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/@@iterator" }, "includes": { "!type": "fn(value: ?) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes", "!doc": "Determines whether an array includes a certain element, returning true or false as appropriate." } }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array", "!doc": "The JavaScript Array global object is a constructor for arrays, which are high-level, list-like objects." }, "String": { "!type": "fn(value: ?) -> string", "fromCharCode": { "!type": "fn(code: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode", "!doc": "Returns a string created by using the specified sequence of Unicode values." }, "fromCodePoint": { "!type": "fn(point: number, point?: number) -> string", "!doc": "The static String.fromCodePoint() method returns a string created by using the specified sequence of code points.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint" }, "raw": { "!type": "fn(template: [string], substitutions: ?, templateString: ?) -> string", "!doc": "The static String.raw() method is a tag function of template strings, used to get the raw string form of template strings.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw" }, "prototype": { "!stdProto": "String", "length": { "!type": "number", "!url": "https://developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/String/length", "!doc": "Represents the length of a string." }, "": "string", "charAt": { "!type": "fn(i: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/charAt", "!doc": "Returns the specified character from a string." }, "charCodeAt": { "!type": "fn(i: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/charCodeAt", "!doc": "Returns the numeric Unicode value of the character at the given index (except for unicode codepoints > 0x10000)." }, "indexOf": { "!type": "fn(char: string, from?: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/indexOf", "!doc": "Returns the index within the calling String object of the first occurrence of the specified value, starting the search at fromIndex,\nreturns -1 if the value is not found." }, "lastIndexOf": { "!type": "fn(char: string, from?: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/lastIndexOf", "!doc": "Returns the index within the calling String object of the last occurrence of the specified value, or -1 if not found. The calling string is searched backward, starting at fromIndex." }, "substring": { "!type": "fn(from: number, to?: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/substring", "!doc": "Returns a subset of a string between one index and another, or through the end of the string." }, "substr": { "!type": "fn(from: number, length?: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/substr", "!doc": "Returns the characters in a string beginning at the specified location through the specified number of characters." }, "slice": { "!type": "fn(from: number, to?: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/slice", "!doc": "Extracts a section of a string and returns a new string." }, "trim": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/Trim", "!doc": "Removes whitespace from both ends of the string." }, "toUpperCase": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/toUpperCase", "!doc": "Returns the calling string value converted to uppercase." }, "toLowerCase": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/toLowerCase", "!doc": "Returns the calling string value converted to lowercase." }, "toLocaleUpperCase": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase", "!doc": "Returns the calling string value converted to upper case, according to any locale-specific case mappings." }, "toLocaleLowerCase": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase", "!doc": "Returns the calling string value converted to lower case, according to any locale-specific case mappings." }, "split": { "!type": "fn(pattern?: string|+RegExp, limit?: number) -> [string]", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/split", "!doc": "Splits a String object into an array of strings by separating the string into substrings." }, "concat": { "!type": "fn(other: string) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/concat", "!doc": "Combines the text of two or more strings and returns a new string." }, "localeCompare": { "!type": "fn(other: string) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/localeCompare", "!doc": "Returns a number indicating whether a reference string comes before or after or is the same as the given string in sort order." }, "match": { "!type": "fn(pattern: +RegExp) -> [string]", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/match", "!doc": "Used to retrieve the matches when matching a string against a regular expression." }, "replace": { "!type": "fn(pattern: string|+RegExp, replacement: string) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace", "!doc": "Returns a new string with some or all matches of a pattern replaced by a replacement. The pattern can be a string or a RegExp, and the replacement can be a string or a function to be called for each match." }, "search": { "!type": "fn(pattern: +RegExp) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/search", "!doc": "Executes the search for a match between a regular expression and this String object." }, "codePointAt": { "!type": "fn(pos: number) -> number", "!doc": "The codePointAt() method returns a non-negative integer that is the UTF-16 encoded code point value.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt" }, "endsWith": { "!type": "fn(searchString: string, position?: number) -> bool", "!doc": "The endsWith() method determines whether a string ends with the characters of another string, returning true or false as appropriate.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith" }, "includes": { "!type": "fn(searchString: string, position?: number) -> bool", "!doc": "The includes() method determines whether one string may be found within another string, returning true or false as appropriate.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/contains" }, "normalize": { "!type": "fn(form: string) -> string", "!doc": "The normalize() method returns the Unicode Normalization Form of a given string (if the value isn't a string, it will be converted to one first).", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize" }, "repeat": { "!type": "fn(count: number) -> string", "!doc": "The repeat() method constructs and returns a new string which contains the specified number of copies of the string on which it was called, concatenated together.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat" }, "startsWith": { "!type": "fn(searchString: string, position?: number) -> bool", "!doc": "The startsWith() method determines whether a string begins with the characters of another string, returning true or false as appropriate.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith" }, ":Symbol.iterator": { "!type": "fn() -> +iter[:t=string]", "!doc": "Returns a new Iterator object that iterates over the code points of a String value, returning each code point as a String value.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/@@iterator" } }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String", "!doc": "The String global object is a constructor for strings, or a sequence of characters." }, "Number": { "!type": "fn(value: ?) -> number", "MAX_VALUE": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/MAX_VALUE", "!doc": "The maximum numeric value representable in JavaScript." }, "MIN_VALUE": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/MIN_VALUE", "!doc": "The smallest positive numeric value representable in JavaScript." }, "POSITIVE_INFINITY": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY", "!doc": "A value representing the positive Infinity value." }, "NEGATIVE_INFINITY": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/NEGATIVE_INFINITY", "!doc": "A value representing the negative Infinity value." }, "prototype": { "!stdProto": "Number", "toString": { "!type": "fn(radix?: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toString", "!doc": "Returns a string representing the specified Number object" }, "toFixed": { "!type": "fn(digits: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toFixed", "!doc": "Formats a number using fixed-point notation" }, "toExponential": { "!type": "fn(digits: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toExponential", "!doc": "Returns a string representing the Number object in exponential notation" }, "toPrecision": { "!type": "fn(digits: number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toPrecision", "!doc": "The toPrecision() method returns a string representing the number to the specified precision." } }, "EPSILON": { "!type": "number", "!doc": "The Number.EPSILON property represents the difference between one and the smallest value greater than one that can be represented as a Number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON" }, "MAX_SAFE_INTEGER": { "!type": "number", "!doc": "The Number.MAX_SAFE_INTEGER constant represents the maximum safe integer in JavaScript (253 - 1).", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER" }, "MIN_SAFE_INTEGER": { "!type": "number", "!doc": "The Number.MIN_SAFE_INTEGER constant represents the minimum safe integer in JavaScript (-(253 - 1)).", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER" }, "isFinite": { "!type": "fn(testValue: ?) -> bool", "!doc": "The Number.isFinite() method determines whether the passed value is finite.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite" }, "isInteger": { "!type": "fn(testValue: ?) -> bool", "!doc": "The Number.isInteger() method determines whether the passed value is an integer.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger" }, "isNaN": { "!type": "fn(testValue: ?) -> bool", "!doc": "The Number.isNaN() method determines whether the passed value is NaN. More robust version of the original global isNaN().", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN" }, "isSafeInteger": { "!type": "fn(testValue: ?) -> bool", "!doc": "The Number.isSafeInteger() method determines whether the provided value is a number that is a safe integer. A safe integer is an integer that", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger" }, "parseFloat": { "!type": "fn(string: string) -> number", "!doc": "The Number.parseFloat() method parses a string argument and returns a floating point number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseFloat" }, "parseInt": { "!type": "fn(string: string, radix?: number) -> number", "!doc": "The Number.parseInt() method parses a string argument and returns an integer of the specified radix or base.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseInt" }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number", "!doc": "The Number JavaScript object is a wrapper object allowing you to work with numerical values. A Number object is created using the Number() constructor." }, "Boolean": { "!type": "fn(value: ?) -> bool", "prototype": { "!stdProto": "Boolean" }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Boolean", "!doc": "The Boolean object is an object wrapper for a boolean value." }, "RegExp": { "!type": "fn(source: string, flags?: string)", "prototype": { "!stdProto": "RegExp", "exec": { "!type": "fn(input: string) -> [string]", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec", "!doc": "Executes a search for a match in a specified string. Returns a result array, or null." }, "test": { "!type": "fn(input: string) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/test", "!doc": "Executes the search for a match between a regular expression and a specified string. Returns true or false." }, "global": { "!type": "bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp", "!doc": "Creates a regular expression object for matching text with a pattern." }, "ignoreCase": { "!type": "bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp", "!doc": "Creates a regular expression object for matching text with a pattern." }, "multiline": { "!type": "bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/multiline", "!doc": "Reflects whether or not to search in strings across multiple lines.\n" }, "source": { "!type": "string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/source", "!doc": "A read-only property that contains the text of the pattern, excluding the forward slashes.\n" }, "lastIndex": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/lastIndex", "!doc": "A read/write integer property that specifies the index at which to start the next match." }, "flags": { "!type": "string", "!doc": "The flags property returns a string consisting of the flags of the current regular expression object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags" }, "sticky": { "!type": "bool", "!doc": "The sticky property reflects whether or not the search is sticky (searches in strings only from the index indicated by the lastIndex property of this regular expression). sticky is a read-only property of an individual regular expression object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky" }, "unicode": { "!type": "bool", "!doc": "The 'u' flag enables various Unicode-related features.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/unicode" } }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp", "!doc": "Creates a regular expression object for matching text with a pattern." }, "Date": { "!type": "fn(ms: number)", "parse": { "!type": "fn(source: string) -> +Date", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/parse", "!doc": "Parses a string representation of a date, and returns the number of milliseconds since January 1, 1970, 00:00:00 UTC." }, "UTC": { "!type": "fn(year: number, month: number, date: number, hour?: number, min?: number, sec?: number, ms?: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/UTC", "!doc": "Accepts the same parameters as the longest form of the constructor, and returns the number of milliseconds in a Date object since January 1, 1970, 00:00:00, universal time." }, "now": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/now", "!doc": "Returns the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC." }, "prototype": { "toUTCString": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toUTCString", "!doc": "Converts a date to a string, using the universal time convention." }, "toISOString": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toISOString", "!doc": "JavaScript provides a direct way to convert a date object into a string in ISO format, the ISO 8601 Extended Format." }, "toDateString": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toDateString", "!doc": "Returns the date portion of a Date object in human readable form in American English." }, "toTimeString": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toTimeString", "!doc": "Returns the time portion of a Date object in human readable form in American English." }, "toLocaleDateString": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toLocaleDateString", "!doc": "Converts a date to a string, returning the \"date\" portion using the operating system's locale's conventions.\n" }, "toLocaleTimeString": { "!type": "fn() -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString", "!doc": "Converts a date to a string, returning the \"time\" portion using the current locale's conventions." }, "getTime": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getTime", "!doc": "Returns the numeric value corresponding to the time for the specified date according to universal time." }, "getFullYear": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getFullYear", "!doc": "Returns the year of the specified date according to local time." }, "getYear": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getYear", "!doc": "Returns the year in the specified date according to local time." }, "getMonth": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getMonth", "!doc": "Returns the month in the specified date according to local time." }, "getUTCMonth": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getUTCMonth", "!doc": "Returns the month of the specified date according to universal time.\n" }, "getDate": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getDate", "!doc": "Returns the day of the month for the specified date according to local time." }, "getUTCDate": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getUTCDate", "!doc": "Returns the day (date) of the month in the specified date according to universal time.\n" }, "getDay": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getDay", "!doc": "Returns the day of the week for the specified date according to local time." }, "getUTCDay": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getUTCDay", "!doc": "Returns the day of the week in the specified date according to universal time.\n" }, "getHours": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getHours", "!doc": "Returns the hour for the specified date according to local time." }, "getUTCHours": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getUTCHours", "!doc": "Returns the hours in the specified date according to universal time.\n" }, "getMinutes": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getMinutes", "!doc": "Returns the minutes in the specified date according to local time." }, "getUTCMinutes": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date", "!doc": "Creates JavaScript Date instances which let you work with dates and times." }, "getSeconds": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getSeconds", "!doc": "Returns the seconds in the specified date according to local time." }, "getUTCSeconds": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getUTCSeconds", "!doc": "Returns the seconds in the specified date according to universal time.\n" }, "getMilliseconds": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getMilliseconds", "!doc": "Returns the milliseconds in the specified date according to local time." }, "getUTCMilliseconds": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getUTCMilliseconds", "!doc": "Returns the milliseconds in the specified date according to universal time.\n" }, "getTimezoneOffset": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset", "!doc": "Returns the time-zone offset from UTC, in minutes, for the current locale." }, "setTime": { "!type": "fn(date: +Date) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setTime", "!doc": "Sets the Date object to the time represented by a number of milliseconds since January 1, 1970, 00:00:00 UTC.\n" }, "setFullYear": { "!type": "fn(year: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setFullYear", "!doc": "Sets the full year for a specified date according to local time.\n" }, "setUTCFullYear": { "!type": "fn(year: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setUTCFullYear", "!doc": "Sets the full year for a specified date according to universal time.\n" }, "setMonth": { "!type": "fn(month: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setMonth", "!doc": "Set the month for a specified date according to local time." }, "setUTCMonth": { "!type": "fn(month: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setUTCMonth", "!doc": "Sets the month for a specified date according to universal time.\n" }, "setDate": { "!type": "fn(day: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setDate", "!doc": "Sets the day of the month for a specified date according to local time." }, "setUTCDate": { "!type": "fn(day: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setUTCDate", "!doc": "Sets the day of the month for a specified date according to universal time.\n" }, "setHours": { "!type": "fn(hour: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setHours", "!doc": "Sets the hours for a specified date according to local time, and returns the number of milliseconds since 1 January 1970 00:00:00 UTC until the time represented by the updated Date instance." }, "setUTCHours": { "!type": "fn(hour: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setUTCHours", "!doc": "Sets the hour for a specified date according to universal time.\n" }, "setMinutes": { "!type": "fn(min: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setMinutes", "!doc": "Sets the minutes for a specified date according to local time." }, "setUTCMinutes": { "!type": "fn(min: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setUTCMinutes", "!doc": "Sets the minutes for a specified date according to universal time.\n" }, "setSeconds": { "!type": "fn(sec: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setSeconds", "!doc": "Sets the seconds for a specified date according to local time." }, "setUTCSeconds": { "!type": "fn(sec: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setUTCSeconds", "!doc": "Sets the seconds for a specified date according to universal time.\n" }, "setMilliseconds": { "!type": "fn(ms: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setMilliseconds", "!doc": "Sets the milliseconds for a specified date according to local time.\n" }, "setUTCMilliseconds": { "!type": "fn(ms: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/setUTCMilliseconds", "!doc": "Sets the milliseconds for a specified date according to universal time.\n" }, "toJSON": { "!type": "fn() -> string", "!doc": "Returns a string (using toISOString()) representing the Date object's value.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON" } }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date", "!doc": "Creates JavaScript Date instances which let you work with dates and times." }, "Error": { "!type": "fn(message: string)", "prototype": { "name": { "!type": "string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Error/name", "!doc": "A name for the type of error." }, "message": { "!type": "string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Error/message", "!doc": "A human-readable description of the error." } }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Error", "!doc": "Creates an error object." }, "SyntaxError": { "!type": "fn(message: string)", "prototype": "Error.prototype", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/SyntaxError", "!doc": "Represents an error when trying to interpret syntactically invalid code." }, "ReferenceError": { "!type": "fn(message: string)", "prototype": "Error.prototype", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/ReferenceError", "!doc": "Represents an error when a non-existent variable is referenced." }, "URIError": { "!type": "fn(message: string)", "prototype": "Error.prototype", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/URIError", "!doc": "Represents an error when a malformed URI is encountered." }, "EvalError": { "!type": "fn(message: string)", "prototype": "Error.prototype", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/EvalError", "!doc": "Represents an error regarding the eval function." }, "RangeError": { "!type": "fn(message: string)", "prototype": "Error.prototype", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RangeError", "!doc": "Represents an error when a number is not within the correct range allowed." }, "TypeError": { "!type": "fn(message: string)", "prototype": "Error.prototype", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/TypeError", "!doc": "Represents an error an error when a value is not of the expected type." }, "parseInt": { "!type": "fn(string: string, radix?: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/parseInt", "!doc": "Parses a string argument and returns an integer of the specified radix or base." }, "parseFloat": { "!type": "fn(string: string) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/parseFloat", "!doc": "Parses a string argument and returns a floating point number." }, "isNaN": { "!type": "fn(value: number) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/isNaN", "!doc": "Determines whether a value is NaN or not. Be careful, this function is broken. You may be interested in ECMAScript 6 Number.isNaN." }, "isFinite": { "!type": "fn(value: number) -> bool", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/isFinite", "!doc": "Determines whether the passed value is a finite number." }, "eval": { "!type": "fn(code: string) -> ?", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/eval", "!doc": "Evaluates JavaScript code represented as a string." }, "encodeURI": { "!type": "fn(uri: string) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURI", "!doc": "Encodes a Uniform Resource Identifier (URI) by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character (will only be four escape sequences for characters composed of two \"surrogate\" characters)." }, "encodeURIComponent": { "!type": "fn(uri: string) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent", "!doc": "Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character (will only be four escape sequences for characters composed of two \"surrogate\" characters)." }, "decodeURI": { "!type": "fn(uri: string) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/decodeURI", "!doc": "Decodes a Uniform Resource Identifier (URI) previously created by encodeURI or by a similar routine." }, "decodeURIComponent": { "!type": "fn(uri: string) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/decodeURIComponent", "!doc": "Decodes a Uniform Resource Identifier (URI) component previously created by encodeURIComponent or by a similar routine." }, "Math": { "E": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/E", "!doc": "The base of natural logarithms, e, approximately 2.718." }, "LN2": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/LN2", "!doc": "The natural logarithm of 2, approximately 0.693." }, "LN10": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/LN10", "!doc": "The natural logarithm of 10, approximately 2.302." }, "LOG2E": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/LOG2E", "!doc": "The base 2 logarithm of E (approximately 1.442)." }, "LOG10E": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/LOG10E", "!doc": "The base 10 logarithm of E (approximately 0.434)." }, "SQRT1_2": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/SQRT1_2", "!doc": "The square root of 1/2; equivalently, 1 over the square root of 2, approximately 0.707." }, "SQRT2": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/SQRT2", "!doc": "The square root of 2, approximately 1.414." }, "PI": { "!type": "number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/PI", "!doc": "The ratio of the circumference of a circle to its diameter, approximately 3.14159." }, "abs": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/abs", "!doc": "Returns the absolute value of a number." }, "cos": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/cos", "!doc": "Returns the cosine of a number." }, "sin": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/sin", "!doc": "Returns the sine of a number." }, "tan": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/tan", "!doc": "Returns the tangent of a number." }, "acos": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/acos", "!doc": "Returns the arccosine (in radians) of a number." }, "asin": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/asin", "!doc": "Returns the arcsine (in radians) of a number." }, "atan": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/atan", "!doc": "Returns the arctangent (in radians) of a number." }, "atan2": { "!type": "fn(y: number, x: number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/atan2", "!doc": "Returns the arctangent of the quotient of its arguments." }, "ceil": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/ceil", "!doc": "Returns the smallest integer greater than or equal to a number." }, "floor": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/floor", "!doc": "Returns the largest integer less than or equal to a number." }, "round": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/round", "!doc": "Returns the value of a number rounded to the nearest integer." }, "exp": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/exp", "!doc": "Returns Ex, where x is the argument, and E is Euler's constant, the base of the natural logarithms." }, "log": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/log", "!doc": "Returns the natural logarithm (base E) of a number." }, "sqrt": { "!type": "fn(number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/sqrt", "!doc": "Returns the square root of a number." }, "pow": { "!type": "fn(number, number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/pow", "!doc": "Returns base to the exponent power, that is, baseexponent." }, "max": { "!type": "fn(number, number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/max", "!doc": "Returns the largest of zero or more numbers." }, "min": { "!type": "fn(number, number) -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/min", "!doc": "Returns the smallest of zero or more numbers." }, "random": { "!type": "fn() -> number", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/random", "!doc": "Returns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range." }, "acosh": { "!type": "fn(x: number) -> number", "!doc": "The Math.acosh() function returns the hyperbolic arc-cosine of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acosh" }, "asinh": { "!type": "fn(x: number) -> number", "!doc": "The Math.asinh() function returns the hyperbolic arcsine of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asinh" }, "atanh": { "!type": "fn(x: number) -> number", "!doc": "The Math.atanh() function returns the hyperbolic arctangent of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atanh" }, "cbrt": { "!type": "fn(x: number) -> number", "!doc": "The Math.cbrt() function returns the cube root of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cbrt" }, "clz32": { "!type": "fn(x: number) -> number", "!doc": "The Math.clz32() function returns the number of leading zero bits in the 32-bit binary representation of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32" }, "cosh": { "!type": "fn(x: number) -> number", "!doc": "The Math.cosh() function returns the hyperbolic cosine of a number, that can be expressed using the constant e:", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cosh" }, "expm1": { "!type": "fn(x: number) -> number", "!doc": "The Math.expm1() function returns ex - 1, where x is the argument, and e the base of the natural logarithms.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/expm1" }, "fround": { "!type": "fn(x: number) -> number", "!doc": "The Math.fround() function returns the nearest single precision float representation of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround" }, "hypot": { "!type": "fn(value: number) -> number", "!doc": "The Math.hypot() function returns the square root of the sum of squares of its arguments.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot" }, "imul": { "!type": "fn(a: number, b: number) -> number", "!doc": "The Math.imul() function returns the result of the C-like 32-bit multiplication of the two parameters.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul" }, "log10": { "!type": "fn(x: number) -> number", "!doc": "The Math.log10() function returns the base 10 logarithm of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10" }, "log1p": { "!type": "fn(x: number) -> number", "!doc": "The Math.log1p() function returns the natural logarithm (base e) of 1 + a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log1p" }, "log2": { "!type": "fn(x: number) -> number", "!doc": "The Math.log2() function returns the base 2 logarithm of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log2" }, "sign": { "!type": "fn(x: number) -> number", "!doc": "The Math.sign() function returns the sign of a number, indicating whether the number is positive, negative or zero.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign" }, "sinh": { "!type": "fn(x: number) -> number", "!doc": "The Math.sinh() function returns the hyperbolic sine of a number, that can be expressed using the constant e:", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sinh" }, "tanh": { "!type": "fn(x: number) -> number", "!doc": "The Math.tanh() function returns the hyperbolic tangent of a number.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tanh" }, "trunc": { "!type": "fn(x: number) -> number", "!doc": "The Math.trunc() function returns the integral part of a number by removing any fractional digits. It does not round any numbers. The function can be expressed with the floor() and ceil() function:", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc" }, "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math", "!doc": "A built-in object that has properties and methods for mathematical constants and functions." }, "JSON": { "parse": { "!type": "fn(json: string, reviver?: fn(key: string, value: ?) -> ?) -> ?", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/parse", "!doc": "Parse a string as JSON, optionally transforming the value produced by parsing." }, "stringify": { "!type": "fn(value: ?, replacer?: fn(key: string, value: ?) -> ?, space?: string|number) -> string", "!url": "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/stringify", "!doc": "Convert a value to JSON, optionally replacing values if a replacer function is specified, or optionally including only the specified properties if a replacer array is specified." }, "!url": "https://developer.mozilla.org/en-US/docs/JSON", "!doc": "JSON (JavaScript Object Notation) is a data-interchange format. It closely resembles a subset of JavaScript syntax, although it is not a strict subset. (See JSON in the JavaScript Reference for full details.) It is useful when writing any kind of JavaScript-based application, including websites and browser extensions. For example, you might store user information in JSON format in a cookie, or you might store extension preferences in JSON in a string-valued browser preference." }, "ArrayBuffer": { "!type": "fn(length: number)", "!doc": "The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer", "isView": { "!type": "fn(arg: +ArrayBuffer) -> bool", "!doc": "The ArrayBuffer.isView() method returns true if arg is one of the ArrayBuffer views, such as typed array objects or a DataView; false otherwise.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/isView" }, "prototype": { "byteLength": { "!type": "number", "!doc": "The byteLength accessor property represents the length of an ArrayBuffer in bytes.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/byteLength" }, "slice": { "!type": "fn(begin: number, end?: number) -> +ArrayBuffer", "!doc": "The slice() method returns a new ArrayBuffer whose contents are a copy of this ArrayBuffer's bytes from begin, inclusive, up to end, exclusive.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice" } } }, "DataView": { "!type": "fn(buffer: +ArrayBuffer, byteOffset?: number, byteLength?: number)", "!doc": "The DataView view provides a low-level interface for reading data from and writing it to an ArrayBuffer.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView", "prototype": { "buffer": { "!type": "+ArrayBuffer", "!doc": "The buffer accessor property represents the ArrayBuffer referenced by the DataView at construction time.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/buffer" }, "byteLength": { "!type": "number", "!doc": "The byteLength accessor property represents the length (in bytes) of this view from the start of its ArrayBuffer.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/byteLength" }, "byteOffset": { "!type": "number", "!doc": "The byteOffset accessor property represents the offset (in bytes) of this view from the start of its ArrayBuffer.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/byteOffset" }, "getFloat32": { "!type": "fn(byteOffset: number, littleEndian?: bool) -> number", "!doc": "The getFloat32() method gets a signed 32-bit integer (float) at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat32" }, "getFloat64": { "!type": "fn(byteOffset: number, littleEndian?: bool) -> number", "!doc": "The getFloat64() method gets a signed 64-bit float (double) at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat64" }, "getInt16": { "!type": "fn(byteOffset: number, littleEndian?: bool) -> number", "!doc": "The getInt16() method gets a signed 16-bit integer (short) at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt16" }, "getInt32": { "!type": "fn(byteOffset: number, littleEndian?: bool) -> number", "!doc": "The getInt32() method gets a signed 32-bit integer (long) at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt32" }, "getInt8": { "!type": "fn(byteOffset: number, littleEndian?: bool) -> number", "!doc": "The getInt8() method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt8" }, "getUint16": { "!type": "fn(byteOffset: number, littleEndian?: bool) -> number", "!doc": "The getUint16() method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint16" }, "getUint32": { "!type": "fn(byteOffset: number, littleEndian?: bool) -> number", "!doc": "The getUint32() method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint32" }, "getUint8": { "!type": "fn(byteOffset: number) -> number", "!doc": "The getUint8() method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint8" }, "setFloat32": { "!type": "fn(byteOffset: number, value: number, littleEndian?: bool)", "!doc": "The setFloat32() method stores a signed 32-bit integer (float) value at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat32" }, "setFloat64": { "!type": "fn(byteOffset: number, value: number, littleEndian?: bool)", "!doc": "The setFloat64() method stores a signed 64-bit integer (double) value at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat64" }, "setInt16": { "!type": "fn(byteOffset: number, value: number, littleEndian?: bool)", "!doc": "The setInt16() method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt16" }, "setInt32": { "!type": "fn(byteOffset: number, value: number, littleEndian?: bool)", "!doc": "The setInt32() method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt32" }, "setInt8": { "!type": "fn(byteOffset: number, value: number)", "!doc": "The setInt8() method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8" }, "setUint16": { "!type": "fn(byteOffset: number, value: number, littleEndian?: bool)", "!doc": "The setUint16() method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint16" }, "setUint32": { "!type": "fn(byteOffset: number, value: number, littleEndian?: bool)", "!doc": "The setUint32() method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint32" }, "setUint8": { "!type": "fn(byteOffset: number, value: number)", "!doc": "The setUint8() method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the DataView.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint8" } } }, "Float32Array": "TypedArray", "Float64Array": "TypedArray", "Int16Array": "TypedArray", "Int32Array": "TypedArray", "Int8Array": "TypedArray", "Map": { "!type": "fn(iterable?: [?])", "!doc": "The Map object is a simple key/value map. Any value (both objects and primitive values) may be used as either a key or a value.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map", "prototype": { "clear": { "!type": "fn()", "!doc": "The clear() method removes all elements from a Map object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/clear" }, "delete": { "!type": "fn(key: ?)", "!doc": "The delete() method removes the specified element from a Map object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/delete" }, "entries": { "!type": "fn() -> +iter[:t=[!this.:key, !this.:value]]", "!doc": "The entries() method returns a new Iterator object that contains the [key, value] pairs for each element in the Map object in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/entries" }, "forEach": { "!type": "fn(callback: fn(value: ?, key: ?, map: +Map), thisArg?: ?)", "!effects": ["call !0 this=!1 !this.:value !this.:key !this"], "!doc": "The forEach() method executes a provided function once per each key/value pair in the Map object, in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach" }, "get": { "!type": "fn(key: ?) -> !this.:value", "!doc": "The get() method returns a specified element from a Map object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/get" }, "has": { "!type": "fn(key: ?) -> bool", "!doc": "The has() method returns a boolean indicating whether an element with the specified key exists or not.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has" }, "keys": { "!type": "fn() -> +iter[:t=!this.:key]", "!doc": "The keys() method returns a new Iterator object that contains the keys for each element in the Map object in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/keys" }, "set": { "!type": "fn(key: ?, value: ?) -> !this", "!effects": ["propagate !0 !this.:key", "propagate !1 !this.:value"], "!doc": "The set() method adds a new element with a specified key and value to a Map object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set" }, "size": { "!type": "number", "!doc": "The size accessor property returns the number of elements in a Map object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/size" }, "values": { "!type": "fn() -> +iter[:t=!this.:value]", "!doc": "The values() method returns a new Iterator object that contains the values for each element in the Map object in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values" }, ":Symbol.iterator": { "!type": "fn() -> +iter[:t=[!this.:key, !this.:value]]", "!doc": "Returns a new Iterator object that contains the [key, value] pairs for each element in the Map object in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/@@iterator" } } }, "Promise": { "!type": "fn(executor: fn(resolve: fn(value: ?), reject: fn(reason: ?))) -> !custom:Promise_ctor", "!doc": "The Promise object is used for deferred and asynchronous computations. A Promise is in one of the three states:", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise", "all": { "!type": "fn(iterable: [+Promise]) -> +Promise[:t=[!0..:t]]", "!doc": "The Promise.all(iterable) method returns a promise that resolves when all of the promises in the iterable argument have resolved.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all" }, "race": { "!type": "fn(iterable: [+Promise]) -> !0.", "!doc": "The Promise.race(iterable) method returns a promise that resolves or rejects as soon as one of the promises in the iterable resolves or rejects, with the value or reason from that promise.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race" }, "reject": "Promise_reject", "resolve": { "!type": "fn(value: ?) -> !custom:Promise_resolve", "!doc": "The Promise.resolve(value) method returns a Promise object that is resolved with the given value. If the value is a thenable (i.e. has a then method), the returned promise will 'follow' that thenable, adopting its eventual state; otherwise the returned promise will be fulfilled with the value.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve" }, "prototype": "Promise.prototype" }, "Proxy": { "!type": "fn(target: ?, handler: Proxy_handler)", "!doc": "The Proxy object is used to define the custom behavior in JavaScript fundamental operation (e.g. property lookup, assignment, enumeration, function invocation, etc).", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy", "revocable": { "!type": "fn(target: ?, handler: Proxy_handler) -> Proxy_revocable", "!doc": "The Proxy.revocable() method is used to create a revocable Proxy object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/revocable" } }, "Reflect": { "!doc": "Reflect is a built-in object that provides methods for interceptable JavaScript operations.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect", "apply": { "!type": "fn(target: fn(), thisArg?: ?, argumentList?: [?]) -> !0.!ret", "!doc": "Calls a target function with arguments as specified.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply" }, "construct": { "!type": "fn(target: fn(), argumentList?: [?]) -> ?", "!doc": "Acts like the new operator as a function. It is equivalent to calling new target(...args).", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/construct" }, "defineProperty": { "!type": "fn(target: ?, property: string, descriptor: propertyDescriptor) -> bool", "!doc": "The static Reflect.defineProperty() method is like Object.defineProperty() but returns a Boolean.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty" }, "deleteProperty": { "!type": "fn(target: ?, property: string) -> bool", "!doc": "Works like the delete operator as a function.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/deleteProperty" }, "enumerate": { "!type": "fn(target: ?) -> +iter[:t=string]", "!doc": "Returns an iterator with the enumerable own and inherited properties of the target object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/enumerate" }, "get": { "!type": "fn(target: ?, property: string) -> ?", "!doc": "Gets a property from an object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/get" }, "getOwnPropertyDescriptor": { "!type": "fn(target: ?, property: string) -> ?", "!doc": "Returns a property descriptor of the given property if it exists on the object, undefined otherwise.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getOwnPropertyDescriptor" }, "getPrototypeOf": { "!type": "fn(target: ?) -> ?", "!doc": "Returns the prototype of the specified object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getPrototypeOf" }, "has": { "!type": "fn(target: ?, property: string) -> bool", "!doc": "The static Reflect.has() method works like the in operator as a function.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/has" }, "isExtensible": { "!type": "fn(target: ?) -> bool", "!doc": "Determines if an object is extensible (whether it can have new properties added to it).", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/isExtensible" }, "ownKeys": { "!type": "fn(target: ?) -> [string]", "!doc": "Returns an array of the target object's own property keys.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys" }, "preventExtensions": { "!type": "fn(target: ?) -> bool", "!doc": "Prevents new properties from ever being added to an object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions" }, "set": { "!type": "fn(target: ?, property: string, value: ?) -> bool", "!doc": "Set a property on an object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set" }, "setPrototypeOf": { "!type": "fn(target: ?, prototype: ?) -> bool", "!doc": "Sets the prototype of a specified object to another object or to null.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/setPrototypeOf" } }, "Set": { "!type": "fn(iterable?: [?])", "!doc": "The Set object lets you store unique values of any type, whether primitive values or object references.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set", "prototype": { "add": { "!type": "fn(value: ?) -> !this", "!effects": ["propagate !0 !this.:t"], "!doc": "The add() method appends a new element with a specified value to the end of a Set object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/add" }, "clear": { "!type": "fn()", "!doc": "The clear() method removes all elements from a Set object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/clear" }, "delete": { "!type": "fn(value: ?) -> bool", "!doc": "The delete() method removes the specified element from a Set object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/delete" }, "entries": { "!type": "fn() -> +iter[:t=[!this.:t]]", "!doc": "The entries() method returns a new Iterator object that contains an array of [value, value] for each element in the Set object, in insertion order. For Set objects there is no key like in Map objects. However, to keep the API similar to the Map object, each entry has the same value for its key and value here, so that an array [value, value] is returned.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/entries" }, "forEach": { "!type": "fn(callback: fn(value: ?, value2: ?, set: +Set), thisArg?: ?)", "!effects": ["call !0 this=!1 !this.:t number !this"], "!doc": "The forEach() method executes a provided function once per each value in the Set object, in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/forEach" }, "has": { "!type": "fn(value: ?) -> bool", "!doc": "The has() method returns a boolean indicating whether an element with the specified value exists in a Set object or not.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/has" }, "keys": { "!type": "fn() -> +iter[:t=!this.:t]", "!doc": "The values() method returns a new Iterator object that contains the values for each element in the Set object in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/keys" }, "size": { "!type": "number", "!doc": "The size accessor property returns the number of elements in a Set object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/size" }, "values": { "!type": "fn() -> +iter[:t=!this.:t]", "!doc": "The values() method returns a new Iterator object that contains the values for each element in the Set object in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/values" }, ":Symbol.iterator": { "!type": "fn() -> +iter[:t=!this.:t]", "!doc": "Returns a new Iterator object that contains the values for each element in the Set object in insertion order.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/@@iterator" } } }, "Symbol": { "!type": "fn(description?: string) -> !custom:getSymbol", "!doc": "A symbol is a unique and immutable data type and may be used as an identifier for object properties. The symbol object is an implicit object wrapper for the symbol primitive data type.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol", "for": { "!type": "fn(key: string) -> !custom:getSymbol", "!doc": "The Symbol.for(key) method searches for existing symbols in a runtime-wide symbol registry with the given key and returns it if found. Otherwise a new symbol gets created in the global symbol registry with this key.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/for" }, "keyFor": { "!type": "fn(sym: +Symbol) -> string", "!doc": "The Symbol.keyFor(sym) method retrieves a shared symbol key from the global symbol registry for the given symbol.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/keyFor" }, "hasInstance": ":Symbol.hasInstance", "isConcatSpreadable": ":Symbol.isConcatSpreadable", "iterator": ":Symbol.iterator", "keyFor": ":Symbol.keyFor", "match": ":Symbol.match", "replace": ":Symbol.replace", "search": ":Symbol.search", "species": ":Symbol.species", "split": ":Symbol.split", "toStringTag": ":Symbol.toStringTag", "unscopables": ":Symbol.unscopables", "prototype": { "!stdProto": "Symbol" } }, "Uint16Array": "TypedArray", "Uint32Array": "TypedArray", "Uint8Array": "TypedArray", "Uint8ClampedArray": "TypedArray", "WeakMap": { "!type": "fn(iterable?: [?])", "!doc": "The WeakMap object is a collection of key/value pairs in which the keys are objects and the values can be arbitrary values.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap", "prototype": { "delete": { "!type": "fn(key: ?) -> bool", "!doc": "The delete() method removes the specified element from a WeakMap object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/delete" }, "get": { "!type": "fn(key: ?) -> !this.:value", "!doc": "The get() method returns a specified element from a WeakMap object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/get" }, "has": { "!type": "fn(key: ?) -> bool", "!doc": "The has() method returns a boolean indicating whether an element with the specified key exists in the WeakMap object or not.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/has" }, "set": { "!type": "fn(key: ?, value: ?)", "!effects": ["propagate !0 !this.:key", "propagate !1 !this.:value"], "!doc": "The set() method adds a new element with a specified key and value to a WeakMap object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/set" } } }, "WeakSet": { "!type": "fn(iterable?: [?])", "!doc": "The WeakSet object lets you store weakly held objects in a collection.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet", "prototype": { "add": { "!type": "fn(value: ?)", "!doc": "The add() method appends a new object to the end of a WeakSet object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/add" }, "delete": { "!type": "fn(value: ?) -> bool", "!doc": "The delete() method removes the specified element from a WeakSet object.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/delete" }, "has": { "!type": "fn(value: ?) -> bool", "!doc": "The has() method returns a boolean indicating whether an object exists in a WeakSet or not.", "!url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/has" } } }, "uuid": {}, "numbro": { "!type": "fn(number)", "!doc": "Numbers can be formatted to look like currency, percentages, times, or even plain old numbers with decimal places, thousands, and abbreviations.", "!url": "https://numbrojs.com/format.html" }, "Papa": {} } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/completionSources/TernServer/index.tsx ================================================ import { Completion, CompletionContext, CompletionResult, } from "@codemirror/autocomplete" import { getStringSnippets } from "@illa-public/dynamic-string" import { CompletionsQuery, Server } from "tern" import { CompletionsQueryResult } from "tern/lib/tern" import { CODE_TYPE } from "@/components/CodeEditor/CodeMirror/extensions/interface" import ecmaScript from "./defs/ecmascript.json" // @ts-ignore const server = new Server({ defs: [ecmaScript] }) export enum AutocompleteDataType { OBJECT = "Object", NUMBER = "Number", ARRAY = "Array", FUNCTION = "Function", BOOLEAN = "Boolean", STRING = "String", UNKNOWN = "Unknown", } export function getDataType(type: string): AutocompleteDataType { if (type === "?") return AutocompleteDataType.UNKNOWN else if (type === "number") return AutocompleteDataType.NUMBER else if (type === "string") return AutocompleteDataType.STRING else if (type === "bool") return AutocompleteDataType.BOOLEAN else if (type === "array") return AutocompleteDataType.ARRAY else if (/^\[/.test(type)) return AutocompleteDataType.ARRAY else if (/^fn\(/.test(type)) return AutocompleteDataType.FUNCTION else return AutocompleteDataType.UNKNOWN } export function checkCursorInDynamicFlag( context: CompletionContext, isFunction?: boolean, ): boolean { if (isFunction) { return true } const { state, pos } = context const doc = state.sliceDoc(0, pos) const stringSnippets = getStringSnippets(doc) let nextDynamicStringStartIndex = 0 for (let i = 0; i < stringSnippets.length; i++) { const snippet = stringSnippets[i] const start = nextDynamicStringStartIndex const dynamicStringStartIndex = snippet.indexOf("{{") const stringStartIndex = dynamicStringStartIndex + start + 2 const dynamicStringEndIndex = snippet.indexOf("}}") const stringEndIndex = dynamicStringEndIndex + start if ( dynamicStringStartIndex > -1 && stringStartIndex <= pos && (dynamicStringEndIndex <= -1 || pos <= stringEndIndex) ) { return true } nextDynamicStringStartIndex += snippet.length } return false } export const ternSeverCompletionSource = ( canShowCompleteInfo: boolean, codeType: CODE_TYPE, ): (( context: CompletionContext, ) => CompletionResult | Promise | null) => { const isFunction = codeType === CODE_TYPE.FUNCTION || codeType === CODE_TYPE.NO_METHOD_FUNCTION return (context: CompletionContext) => { const isCursorInDynamicFlag = checkCursorInDynamicFlag(context, isFunction) if (!isCursorInDynamicFlag) { return null } if ( context.matchBefore(/\w[\w\.]*/) === null && (isFunction || context.matchBefore(/\{\{\s*/) === null) ) { return null } const pos = context.pos const query: CompletionsQuery = { type: "completions", types: true, docs: true, urls: true, origins: true, caseInsensitive: true, guess: false, inLiteral: false, includeKeywords: true, end: pos, file: "#0", } const files = [ // @ts-ignore maybe this is a ternjs type error { type: "full", name: "_temp", text: context.state.sliceDoc(), }, ] const request = { query, files } let error: string | null = null // @ts-ignore maybe this is a ternjs type error let result: any server.request( // @ts-ignore maybe this is a ternjs type error request, (ternError, response) => { error = ternError if (response) { result = response as CompletionsQueryResult } }, ) if (error || !result || result.completions.length === 0) { return null } const options: Completion[] = [] const completions = result.completions as Array<{ name: string type?: string | undefined depth?: number | undefined doc?: string | undefined url?: string | undefined origin?: string | undefined }> completions.forEach((completion) => { const dataType = getDataType(completion?.type || "?") const completionOption: Completion = { type: dataType, label: completion.name, detail: dataType, boost: -1, } if (completion.doc && canShowCompleteInfo) { completionOption.info = () => { let dom = document.createElement("span") dom.innerHTML = `
${completion.name}

${completion.type}

${completion.doc}

` return dom } } options.push(completionOption) }) return { from: result.start, validFor: /^\w*$/, options, } } } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/completionSources/illaContext.ts ================================================ import { Completion, CompletionContext, CompletionResult, } from "@codemirror/autocomplete" import { capitalize } from "lodash-es" import { AutocompleteDataType, checkCursorInDynamicFlag, } from "@/components/CodeEditor/CodeMirror/extensions/completionSources/TernServer" import { CODE_TYPE } from "@/components/CodeEditor/CodeMirror/extensions/interface" import { removeIgnoredKeys, removeWidgetOrActionMethods, } from "@/utils/executionTreeHelper/utils" import { isFunction, isObject } from "@/utils/typeHelper" import { ILLAContextDesc } from "./ILLAContextDesc" const formatUtils = (data: unknown) => { if (isObject(data)) { return "#Object#" } else if (Array.isArray(data)) { return "#Array#" } else if (typeof data === "string") { return `"${data.length > 50 ? data.slice(0, 50) + "..." : data}"` } else if (typeof data === "number" || typeof data === "boolean") { return data } else if (typeof data === "function") { return "#Function#" } else if (data === null) { return "null" } else if (data === undefined) { return "undefined" } else { return "#Unknown#" } } const formatEvaluate = (data: any) => { let format = "" if (Array.isArray(data)) { if (data.length > 0) { format = "[
" data.forEach((item) => { const showStr = formatUtils(item) format += ` ${showStr},
` }) } else { format = "[" } format += "]" } if (isObject(data)) { format = "Object {
" Object.keys(data).forEach((key) => { const showStr = formatUtils(data[key]) format += ` ${key}: ${showStr},
` }) format += "}" } return format } export function getDataInfo(data: Record, path: string) { let currentData: Record = data let offset: number = 0 let descInfos: Record = {} for (let i = 0; i < path.length; i++) { switch (path[i]) { case ".": case "[": case "]": if (offset < i) { const currentPath = path.slice(offset, i).trim() currentData = currentData[currentPath] as Record if (!currentData || !isObject(currentData)) { return null } descInfos = ILLAContextDesc[currentPath] as Record } offset = i + 1 if (path[i] === "." && Array.isArray(currentData)) { return null } if (path[i] === "[" && !Array.isArray(currentData)) { return null } break } } return { currentData, descInfos, offset, prefix: path.slice(offset), } } export const buildIllaContextCompletionSource = ( canShowCompleteInfo: boolean, codeType: CODE_TYPE, executionResult: Record, ): (( context: CompletionContext, ) => CompletionResult | Promise | null) => { const isFunction = codeType === CODE_TYPE.FUNCTION || codeType === CODE_TYPE.NO_METHOD_FUNCTION if (codeType === CODE_TYPE.FUNCTION) { executionResult = removeIgnoredKeys(executionResult) } else { executionResult = removeIgnoredKeys( removeWidgetOrActionMethods(executionResult), ) } return (context: CompletionContext) => { const isCursorInDynamicFlag = checkCursorInDynamicFlag(context, isFunction) if (!isCursorInDynamicFlag) { return null } const validString = context.matchBefore(/(\w+(\[\s*\d+\s*\])*\.)*\w*/) if (!validString) { return null } if ( validString.text.length === 0 && (isFunction || context.matchBefore(/\{\{\s*/) === null) ) { return null } const dataInfo = getDataInfo(executionResult, validString.text) if (!dataInfo) { return null } const { currentData, offset, prefix, descInfos } = dataInfo const keys = Object.keys(currentData).filter((key) => key.startsWith(prefix), ) const options = keys.map((key) => { const dataType = getDataType(currentData[key]) const currentKeyDesc = descInfos?.[key] const result: Completion = { type: dataType, label: key, detail: capitalize(dataType), boost: 1, } if (canShowCompleteInfo) { result.info = () => { let dom = document.createElement("span") dom.innerHTML = `
${key}

${ currentKeyDesc ? currentKeyDesc.usage : dataType }

Evaluates to

${getDataEvaluatesToDom(currentData[key], dataType)}` return dom } } return result }) return { from: validString.from + offset, validFor: /^\w*$/, options: options, } } } function getDataType(data: unknown): AutocompleteDataType { const type = typeof data if (type === "number") return AutocompleteDataType.NUMBER else if (type === "string") return AutocompleteDataType.STRING else if (type === "boolean") return AutocompleteDataType.BOOLEAN else if (Array.isArray(data)) return AutocompleteDataType.ARRAY else if (isFunction(data)) return AutocompleteDataType.FUNCTION else if (type === "undefined") return AutocompleteDataType.UNKNOWN return AutocompleteDataType.OBJECT } function getDataEvaluatesToDom(data: unknown, dataType: AutocompleteDataType) { switch (dataType) { case AutocompleteDataType.STRING: return `"${data}"` case AutocompleteDataType.NUMBER: case AutocompleteDataType.BOOLEAN: return `${data}` case AutocompleteDataType.ARRAY: return `[ ... ]${getEvaluatesTooltipDOM( data as unknown[], )}` case AutocompleteDataType.OBJECT: return `{ ... } ${getEvaluatesTooltipDOM( data as Object, )}` default: return `null` } } const getEvaluatesTooltipDOM = (data: Object | unknown[]) => { return `
${formatEvaluate(data)}
` } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/heighLightJSExpression.ts ================================================ import { Range } from "@codemirror/state" import { Decoration, DecorationSet, EditorView, ViewPlugin, ViewUpdate, } from "@codemirror/view" import { IExpressionShape } from "@/components/CodeEditor/CodeMirror/extensions/interface" export const defaultHighlightClassName = "cm-default-highlight" export const errorHighlightClassName = "cm-error-highlight" const defaultHighlightMark = Decoration.mark({ class: defaultHighlightClassName, }) const errorHighlightMark = Decoration.mark({ class: errorHighlightClassName }) export function getDecoration( view: EditorView, expressions?: IExpressionShape[], ) { if (!Array.isArray(expressions) || expressions.length === 0) { return Decoration.none } const value = view.state.doc.toString() if (!value) { return Decoration.none } const ranges: Range[] = [] let i = 0 expressions.forEach((expression) => { const start = value.indexOf(expression.value, i) if (start >= 0) { i = start + expression.value.length const rang = ( expression.hasError ? errorHighlightMark : defaultHighlightMark ).range(start, i) ranges.push(rang) } }) return Decoration.set(ranges) } const getHighlightExtDecorations = (value: { decoration: DecorationSet update: (update: ViewUpdate) => void }) => value.decoration const getCls = (expressions?: IExpressionShape[]) => { return class { decoration: DecorationSet constructor(view: EditorView) { this.decoration = getDecoration(view, expressions) } update(update: ViewUpdate) { this.decoration = getDecoration(update.view, expressions) } } } export const getHighlightExpressionExtension = ( expressions?: IExpressionShape[], ) => { return ViewPlugin.fromClass(getCls(expressions), { decorations: getHighlightExtDecorations, }) } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/index.ts ================================================ import { CompletionContext, CompletionResult, acceptCompletion, autocompletion, closeBrackets, closeBracketsKeymap, closeCompletion, moveCompletionSelection, } from "@codemirror/autocomplete" import { defaultKeymap, history, historyKeymap } from "@codemirror/commands" import { html, htmlCompletionSource } from "@codemirror/lang-html" import { javascript } from "@codemirror/lang-javascript" import { json } from "@codemirror/lang-json" import { Cassandra, MSSQL, MariaSQL, MySQL, PLSQL, SQLite, StandardSQL, keywordCompletionSource, schemaCompletionSource, sql, } from "@codemirror/lang-sql" import { xml } from "@codemirror/lang-xml" import { bracketMatching, defaultHighlightStyle, indentOnInput, syntaxHighlighting, } from "@codemirror/language" import { Extension, Prec } from "@codemirror/state" import { dropCursor, keymap, lineNumbers, tooltips } from "@codemirror/view" import { useMemo } from "react" import { ternSeverCompletionSource } from "@/components/CodeEditor/CodeMirror/extensions/completionSources/TernServer" import { buildIllaContextCompletionSource } from "@/components/CodeEditor/CodeMirror/extensions/completionSources/illaContext" import { getHighlightExpressionExtension } from "@/components/CodeEditor/CodeMirror/extensions/heighLightJSExpression" import { CODE_LANG, CODE_TYPE, ICodeMirrorOptions, } from "@/components/CodeEditor/CodeMirror/extensions/interface" import { ILLAEditorRuntimePropsCollectorInstance } from "@/utils/executionTreeHelper/runtimePropsCollector" import { isObject } from "@/utils/typeHelper" export const basicExtension: Extension = [ history(), dropCursor(), indentOnInput(), bracketMatching(), closeBrackets(), keymap.of([...closeBracketsKeymap, ...defaultKeymap, ...historyKeymap]), ] const buildSqlSchemeSources = (sqlScheme: Record) => { const requiredScheme: { [table: string]: string[] } = {} Object.keys(sqlScheme).forEach((tableName) => { if (sqlScheme[tableName] && isObject(sqlScheme[tableName])) { requiredScheme[tableName] = Object.keys( sqlScheme[tableName] as Record, ) } }) const completionSourceFunc = schemaCompletionSource({ schema: requiredScheme, }) return (context: CompletionContext) => { const completionSource = completionSourceFunc(context) as CompletionResult if (Array.isArray(completionSource?.options)) { completionSource.options = completionSource.options.map((option) => { return { ...option, type: "table", } }) } return completionSource } } const buildSqlKeywordSources = (lang: CODE_LANG) => { switch (lang) { case CODE_LANG.PLSQL: { return keywordCompletionSource(PLSQL) } case CODE_LANG.CASSANDRA: { return keywordCompletionSource(Cassandra) } case CODE_LANG.SQLite: { return keywordCompletionSource(SQLite) } case CODE_LANG.MSSQL: { return keywordCompletionSource(MSSQL) } case CODE_LANG.MARIASQL: { return keywordCompletionSource(MariaSQL) } case CODE_LANG.MYSQL: { return keywordCompletionSource(MySQL) } case CODE_LANG.PGSQL: { return keywordCompletionSource(StandardSQL) } default: case CODE_LANG.SQL: { return keywordCompletionSource(StandardSQL) } } } const buildCompletionSources = ( codeType: CODE_TYPE, lang: CODE_LANG, canShowCompleteInfo: boolean, sqlScheme: Record, executedResult: Record, ) => { const ternSource = ternSeverCompletionSource(canShowCompleteInfo, codeType) const illaSources = buildIllaContextCompletionSource( canShowCompleteInfo, codeType, executedResult, ) const completionSources = [ternSource, illaSources] switch (lang) { case CODE_LANG.HTML: { completionSources.push(htmlCompletionSource) break } case CODE_LANG.PGSQL: case CODE_LANG.MARIASQL: case CODE_LANG.MSSQL: case CODE_LANG.SQLite: case CODE_LANG.CASSANDRA: case CODE_LANG.PLSQL: case CODE_LANG.MYSQL: case CODE_LANG.SQL: { const sqlKeywordsSources = buildSqlKeywordSources(lang) const sqlSchemeSources = buildSqlSchemeSources(sqlScheme) completionSources.push(sqlKeywordsSources, sqlSchemeSources) break } default: { break } } return completionSources } const keyMapExtensions = Prec.highest( keymap.of([ { key: "Escape", run: closeCompletion }, { key: "ArrowDown", run: moveCompletionSelection(true) }, { key: "ArrowUp", run: moveCompletionSelection(false) }, { key: "PageDown", run: moveCompletionSelection(true, "page") }, { key: "PageUp", run: moveCompletionSelection(false, "page") }, { key: "Tab", run: acceptCompletion }, { key: "Enter", run: acceptCompletion }, ]), ) const getAutoCompletionExtension = ( codeType: CODE_TYPE, lang: CODE_LANG, canShowCompleteInfo: boolean, sqlScheme: Record, executedResult: Record, ) => { const completionSources = buildCompletionSources( codeType, lang, canShowCompleteInfo, sqlScheme, executedResult, ) return [ autocompletion({ override: completionSources, defaultKeymap: false, closeOnBlur: false, }), keyMapExtensions, ] } export const useBasicSetup = (options: ICodeMirrorOptions) => { const { showLineNumbers, lang = CODE_LANG.JAVASCRIPT, codeType = CODE_TYPE.EXPRESSION, canShowCompleteInfo = false, sqlScheme = {}, expressions = [], scopeOfAutoComplete = "global", } = options const executedResult = scopeOfAutoComplete === "global" ? ILLAEditorRuntimePropsCollectorInstance.getGlobalCalcContextWithLimit() : ILLAEditorRuntimePropsCollectorInstance.getCurrentPageCalcContext() const autocompletionExtension = useMemo( () => getAutoCompletionExtension( codeType, lang, canShowCompleteInfo, sqlScheme, executedResult, ), [canShowCompleteInfo, codeType, executedResult, lang, sqlScheme], ) const showLinNUmberExtension = useMemo( () => (showLineNumbers ? [lineNumbers()] : []), [showLineNumbers], ) const langExtension = useMemo(() => { const plugins: Extension[] = [ syntaxHighlighting(defaultHighlightStyle, { fallback: true }), ] switch (lang) { case CODE_LANG.PGSQL: case CODE_LANG.MARIASQL: case CODE_LANG.MSSQL: case CODE_LANG.SQLite: case CODE_LANG.CASSANDRA: case CODE_LANG.PLSQL: case CODE_LANG.MYSQL: case CODE_LANG.SQL: { plugins.push(sql()) break } case CODE_LANG.HTML: { plugins.push(html()) break } case CODE_LANG.JSON: { plugins.push(json()) break } case CODE_LANG.XML: { plugins.push(xml()) break } case CODE_LANG.JAVASCRIPT: default: { plugins.push(javascript()) break } } return plugins }, [lang]) const highlightJSExpressionExtension = useMemo(() => { const isFunction = codeType === CODE_TYPE.FUNCTION return isFunction ? [] : getHighlightExpressionExtension(expressions) }, [codeType, expressions]) const tooltipExtension = useMemo(() => { return tooltips({ position: "absolute", parent: document.querySelector(".illaCodeMirrorWrapper") || document.body, }) }, []) const extensions = useMemo( () => [ basicExtension, showLinNUmberExtension, langExtension, autocompletionExtension, highlightJSExpressionExtension, tooltipExtension, ], [ showLinNUmberExtension, langExtension, autocompletionExtension, highlightJSExpressionExtension, tooltipExtension, ], ) return extensions } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/interface.ts ================================================ export enum CODE_TYPE { "EXPRESSION" = "EXPRESSION", "FUNCTION" = "FUNCTION", "NO_METHOD_FUNCTION" = "NO_METHOD_FUNCTION", } export enum CODE_LANG { "JAVASCRIPT" = "javascript", "SQL" = "sql", "HTML" = "html", "JSON" = "json", "XML" = "xml", "PGSQL" = "pgsql", "MYSQL" = "mysql", "MARIASQL" = "mariasql", "MSSQL" = "mssql", "SQLite" = "sqlite", "CASSANDRA" = "cassandra", "PLSQL" = "plsql", } export interface IExpressionShape { value: string hasError: boolean } export interface ICodeMirrorOptions { showLineNumbers?: boolean lang?: CODE_LANG codeType?: CODE_TYPE expressions?: IExpressionShape[] canShowCompleteInfo?: boolean sqlScheme?: Record singleLine?: boolean scopeOfAutoComplete?: "global" | "page" } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/extensions/utils.ts ================================================ import { Text } from "@codemirror/state" export function posToOffset(doc: Text, pos: IPosition) { return doc.line(pos.line + 1).from + pos.character } export function offsetToPos(doc: Text, offset: number): Position { const line = doc.lineAt(offset) return new Position(line.number - 1, offset - line.from) } export interface IPosition { line: number character: number setLine(line: number): void setCharacter(character: number): void lessThanOrEqualTo(position: IPosition): boolean } export class Position implements IPosition { constructor(public line: number, public character: number) {} setLine(line: number) { this.line = line } setCharacter(character: number) { this.character = character } lessThanOrEqualTo(position: IPosition) { return ( this.line < position.line || (this.line === position.line && this.character <= position.character) ) } } const isMac = () => /mac/i.test(navigator.platform) export const isMetaKeyPressed = (e: MouseEvent) => isMac() ? e.metaKey : e.ctrlKey ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/interface.ts ================================================ import { Extension } from "@codemirror/state" import { RefObject } from "react" import { ICodeMirrorOptions } from "@/components/CodeEditor/CodeMirror/extensions/interface" import { HintTooltipProps } from "@/components/CodeEditor/HintToolTip/interface" export interface ILLACodeMirrorProps extends ICodeMirrorOptions, Omit { extensions?: Extension[] value?: string onChange?: (value: string) => void onFocus?: () => void onBlur?: (value: string) => void height?: string minHeight?: string maxHeight?: string width?: string minWidth?: string maxWidth?: string editable?: boolean readOnly?: boolean placeholder?: string className?: string tooltipContainer?: RefObject } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" const getEditorWrapperBorderColor = ( hasError: boolean, isFocused: boolean, isHovered: boolean, ) => { if (hasError) { return getColor("red", "03") } if (isFocused) { return getColor("green", "03") } return isHovered ? getColor("techPurple", "07") : getColor("grayBlue", "08") } export const applyEditorWrapperStyle = ( hasError: boolean, isFocused: boolean, editable: boolean, readOnly: boolean, ) => { const hoverStyle = !editable || readOnly ? null : css` :hover { border: 1px solid ${getEditorWrapperBorderColor(hasError, isFocused, true)}; z-index: 1; } ` return css` width: 100%; height: 100%; .cm-editor { border: 1px solid ${getEditorWrapperBorderColor(hasError, isFocused, false)}; border-radius: ${isFocused ? "8px 8px 0px 0px;" : "8px"}; &.cm-focused { z-index: 1; } ${hoverStyle} } ` } ================================================ FILE: apps/builder/src/components/CodeEditor/CodeMirror/theme.ts ================================================ import { css } from "@emotion/react" import { githubLightInit } from "@uiw/codemirror-theme-github/src" import { getColor } from "@illa-design/react" import ArrayIcon from "@/components/CodeEditor/CodeMirror/assets/array.svg" import BooleanIcon from "@/components/CodeEditor/CodeMirror/assets/boolean.svg" import FunctionIcon from "@/components/CodeEditor/CodeMirror/assets/function.svg" import KeywordIcon from "@/components/CodeEditor/CodeMirror/assets/keyword.svg" import NullIcon from "@/components/CodeEditor/CodeMirror/assets/null.svg" import NumberIcon from "@/components/CodeEditor/CodeMirror/assets/number.svg" import ObjectIcon from "@/components/CodeEditor/CodeMirror/assets/object.svg" import StringIcon from "@/components/CodeEditor/CodeMirror/assets/string.svg" import TableIcon from "@/components/CodeEditor/CodeMirror/assets/table.svg" import TypeIcon from "@/components/CodeEditor/CodeMirror/assets/type.svg" import UnknownIcon from "@/components/CodeEditor/CodeMirror/assets/undefine.svg" import { defaultHighlightClassName, errorHighlightClassName, } from "@/components/CodeEditor/CodeMirror/extensions/heighLightJSExpression" export const ILLACodeMirrorTheme = { "&.cm-editor": { borderRadius: "8px", border: `1px solid ${getColor("grayBlue", "03")}`, overflow: "hidden", fontFamily: "Fira Code", }, "&.cm-editor .cm-scroller": { lineHeight: "22px", fontSize: "12px", }, "&.cm-editor .cm-content": { padding: "4px 0", }, "&.cm-editor .cm-line": { padding: "0 16px", }, "&.cm-editor.cm-focused .cm-matchingBracket": { color: getColor("green", "03"), }, "&.cm-editor .cm-placeholder": { color: getColor("grayBlue", "04"), height: 0, }, "&.cm-editor .cm-gutters .cm-gutter .cm-gutterElement": { padding: "0 8px 0 23px", }, "&.cm-editor .cm-gutters": { borderRadius: "8px 0 0 8px", borderRight: "none", }, [`.${defaultHighlightClassName}`]: { color: getColor("green", "03"), backgroundColor: "rgba(0, 170, 91, 0.08);", }, [`.${errorHighlightClassName}`]: { color: getColor("red", "03"), backgroundColor: "rgba(255, 71, 71, 0.08);", }, } export const illaCodeMirrorTooltipStyle = css` > div { height: unset; min-height: unset; } .cm-tooltip { &.cm-tooltip-autocomplete { border: none; > ul { background-color: ${getColor("white", "01")}; border: 1px solid ${getColor("greyBlue", "08")}; box-shadow: 0 2px 16px rgba(0, 0, 0, 0.16); border-radius: 8px; font-family: "Fira Code", monospace; li { height: 24px; line-height: 24px; position: relative; overflow: hidden; &[aria-selected] { background-color: ${getColor("techPurple", "08")}; color: ${getColor("techPurple", "03")}; } .cm-completionIcon { width: 14px; height: 14px; font-size: 14px; opacity: 1; padding-right: 8px; position: absolute; top: 2.5px; } .cm-completionIcon-Function::after { content: url(${FunctionIcon}); } .cm-completionIcon-Number::after { content: url(${NumberIcon}); } .cm-completionIcon-String::after { content: url(${StringIcon}); } .cm-completionIcon-Boolean::after { content: url(${BooleanIcon}); } .cm-completionIcon-Null::after { content: url(${NullIcon}); } .cm-completionIcon-Object::after { content: url(${ObjectIcon}); } .cm-completionIcon-Array::after { content: url(${ArrayIcon}); } .cm-completionIcon-Unknown::after { content: url(${UnknownIcon}); } .cm-completionIcon-keyword::after { content: url(${KeywordIcon}); } .cm-completionIcon-type::after { content: url(${TypeIcon}); } .cm-completionIcon-table::after { content: url(${TableIcon}); } .cm-completionLabel { font-size: 12px; line-height: 22px; position: absolute; left: 25px; top: 2px; .cm-completionMatchedText { font-weight: 600; text-decoration: none; } } .cm-completionDetail { position: absolute; right: 8px; top: 2px; margin: 0; color: ${getColor("grayBlue", "04")}; font-size: 12px; line-height: 22px; font-style: normal; } } } .cm-completionInfo { padding: 4px 8px; background-color: ${getColor("white", "01")}; border: 1px solid ${getColor("greyBlue", "08")}; box-shadow: 0 2px 16px rgba(0, 0, 0, 0.16); border-radius: 8px; width: 287px; &.cm-completionInfo-right { left: calc(100% + 8px); } .completionInfoCardTitle { display: flex; justify-content: space-between; align-items: center; .cardTitle { width: 100%; font-weight: 500; font-size: 12px; line-height: 20px; color: ${getColor("techPurple", "03")}; } .openInfo { width: 12px; height: 12px; display: flex; align-items: center; } } .completionInfoType { font-size: 12px; color: ${getColor("grayBlue", "02")}; margin: 0; line-height: 20px; word-break: break-all; } .completionInfoEvaluatesTitle { font-size: 12px; color: ${getColor("grayBlue", "02")}; margin: 0; font-weight: 500; line-height: 20px; } .completionInfoDoc { font-size: 12px; color: ${getColor("grayBlue", "04")}; margin: 0; line-height: 20px; } .evaluatesResult { display: inline-block; margin: 0; padding: 0 8px; font-size: 12px; line-height: 18px; color: ${getColor("grayBlue", "02")}; background-color: ${getColor("grayBlue", "09")}; position: relative; cursor: pointer; :hover { .evaluatesTooltips { visibility: visible; } } .evaluatesTooltips { visibility: hidden; font-family: "Fira Code", monospace; position: absolute; left: calc(100% + 4px); top: -50%; max-height: 162px; border-radius: 4px; box-shadow: 0 2px 16px rgba(0, 0, 0, 0.16); background-color: ${getColor("grayBlue", "01")}; padding: 12px 16px; font-size: 14px; line-height: 18px; color: ${getColor("white", "01")}; white-space: pre; overflow-y: auto; cursor: auto; } } } } } ` export const githubLightScheme = githubLightInit({ settings: { background: "#fff", foreground: "#24292e", gutterBackground: getColor("grayBlue", "09"), }, }) ================================================ FILE: apps/builder/src/components/CodeEditor/HintToolTip/index.tsx ================================================ import copy from "copy-to-clipboard" import { FC, useCallback, useState } from "react" import { CopyIcon, ErrorIcon, Trigger } from "@illa-design/react" import { HintTooltipContentProps, HintTooltipProps, } from "@/components/CodeEditor/HintToolTip/interface" import { applyHintTooltipContentMainWrapperStyle, applyHintTooltipContentWrapperStyle, copyIconStyle, hintTooltipContentTitleStyle, hintTooltipContentTitleWrapperStyle, hintTooltipResultStyle, } from "@/components/CodeEditor/HintToolTip/style" export const HintTooltipContent: FC = (props) => { const { hasError = false, resultType, result, setIsHovered } = props const handleClickCopy = useCallback(() => { if (result) { copy(result) } }, [result]) return (
{ setIsHovered(true) }} onMouseLeave={() => { setIsHovered(false) }} >
{hasError && } {hasError ? "Error" : resultType}
{result}
) } export const HintToolTip: FC = (props) => { const { isEditorFocused, result, hasError, resultType, children, toolTipContainer, } = props const [isHovered, setIsHovered] = useState(false) return ( } > {children} ) } ================================================ FILE: apps/builder/src/components/CodeEditor/HintToolTip/interface.ts ================================================ import { Dispatch, ReactNode, RefObject, SetStateAction } from "react" import { VALIDATION_TYPES } from "@/utils/validationFactory" export interface HintTooltipProps { isEditorFocused: boolean hasError?: boolean resultType?: VALIDATION_TYPES result?: string children: ReactNode toolTipContainer?: RefObject } export interface HintTooltipContentProps extends Pick { setIsHovered: Dispatch> } ================================================ FILE: apps/builder/src/components/CodeEditor/HintToolTip/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" export const applyHintTooltipContentWrapperStyle = (hasError: boolean) => css` display: flex; width: 100%; padding: 4px 0; border-radius: 0 0 8px 8px; font-family: "fira code", monospace; background-color: ${hasError ? getColor("red", "08") : getColor("green", "08")}; ` export const applyHintTooltipContentMainWrapperStyle = ( hasError: boolean, ) => css` display: flex; flex-direction: column; justify-content: center; color: ${hasError ? getColor("red", "03") : getColor("green", "03")}; flex: 9; ` export const hintTooltipContentTitleWrapperStyle = css` gap: 4px; align-items: center; padding: 0 8px; position: relative; ` export const hintTooltipContentTitleStyle = css` font-size: 14px; font-weight: 600; line-height: 22px; ` export const hintTooltipResultStyle = css` word-break: break-all; max-height: 150px; overflow: auto; padding: 0 8px; ` export const copyIconStyle = css` cursor: pointer; position: absolute; top: 4px; right: 4px; ` ================================================ FILE: apps/builder/src/components/CodeEditor/ModalCodeMirror/content.tsx ================================================ import { FC } from "react" import useMeasure from "react-use-measure" import { getColor } from "@illa-design/react" import { CodeEditor } from "@/components/CodeEditor" import { ModalBodyContent } from "@/components/CodeEditor/ModalCodeMirror/interface" import { applyCodeMirrorWrapperStyle, codeMirrorContainerStyle, contentWrapperStyle, descriptionStyle, } from "@/components/CodeEditor/ModalCodeMirror/style" import { ILLAMarkdown } from "@/components/ILLAMarkdown" export const ModalContent: FC = (props) => { const { description, lang, expectValueType, onChange, value, placeholder, wrappedCodeFunc, scopeOfAutoComplete, codeType, } = props const [ref, rect] = useMeasure() return (
{description && (
)}
) } ================================================ FILE: apps/builder/src/components/CodeEditor/ModalCodeMirror/footer.tsx ================================================ import { FC } from "react" import { useTranslation } from "react-i18next" import { Button } from "@illa-design/react" import { FooterContentProps } from "@/components/CodeEditor/ModalCodeMirror/interface" import { saveButtonStyle } from "@/components/CodeEditor/ModalCodeMirror/style" export const FooterContent: FC = (props) => { const { t } = useTranslation() const { onClickSaveButton } = props return ( ) } ================================================ FILE: apps/builder/src/components/CodeEditor/ModalCodeMirror/index.tsx ================================================ import { FC } from "react" import { useTranslation } from "react-i18next" import { ModalContent } from "@/components/CodeEditor/ModalCodeMirror/content" import { FooterContent } from "@/components/CodeEditor/ModalCodeMirror/footer" import { ModalCodeMirrorProps } from "@/components/CodeEditor/ModalCodeMirror/interface" import { MovableModal } from "@/components/Modal/movableModal" export const ModalCodeMirror: FC = (props) => { const { title, value, description, lang, expectValueType, codeType, onChange, onClickSaveButton, onClose, placeholder, scopeOfAutoComplete, wrappedCodeFunc, onBlur, onFocus, } = props const { t } = useTranslation() return ( } footerContent={ onClickSaveButton ? ( ) : null } onClose={onClose} /> ) } ================================================ FILE: apps/builder/src/components/CodeEditor/ModalCodeMirror/interface.ts ================================================ import { CodeEditorProps } from "@/components/CodeEditor/interface" import { MovableModalProps } from "@/components/Modal/interface" export interface ModalBodyContent { description?: string placeholder?: string lang?: CodeEditorProps["lang"] expectValueType?: CodeEditorProps["expectValueType"] scopeOfAutoComplete?: CodeEditorProps["scopeOfAutoComplete"] onChange?: CodeEditorProps["onChange"] wrappedCodeFunc?: CodeEditorProps["wrappedCodeFunc"] onFocus?: CodeEditorProps["onFocus"] onBlur?: CodeEditorProps["onBlur"] value: string codeType?: CodeEditorProps["codeType"] } export interface FooterContentProps { onClickSaveButton: () => void } export interface ModalCodeMirrorProps extends Omit, ModalBodyContent { onClickSaveButton?: () => void } ================================================ FILE: apps/builder/src/components/CodeEditor/ModalCodeMirror/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" export const descriptionStyle = css` font-size: 14px; color: ${getColor("grayBlue", "04")}; font-weight: 400; line-height: 22px; margin: 0; ` export const applyCodeMirrorWrapperStyle = (desHeight: number) => css` width: 100%; height: max(88px, calc(100% - ${desHeight}px - 16px)); ` export const codeMirrorContainerStyle = css` height: 100%; ` export const saveButtonStyle = css` position: absolute; right: 16px; ` export const contentWrapperStyle = css` width: 100%; height: 100%; display: flex; flex-direction: column; gap: 16px; ` ================================================ FILE: apps/builder/src/components/CodeEditor/index.tsx ================================================ import { getStringSnippets, isDynamicStringSnippet, } from "@illa-public/dynamic-string" import { debounce } from "lodash-es" import { FC, useCallback, useMemo, useRef, useState } from "react" import { useSelector } from "react-redux" import OpenWindowIcon from "@/assets/public/openWindow.svg?react" import { ILLACodeMirrorCore } from "@/components/CodeEditor/CodeMirror/core" import { CODE_TYPE, IExpressionShape, } from "@/components/CodeEditor/CodeMirror/extensions/interface" import { githubLightScheme } from "@/components/CodeEditor/CodeMirror/theme" import { ModalCodeMirror } from "@/components/CodeEditor/ModalCodeMirror" import { CodeEditorProps } from "@/components/CodeEditor/interface" import { ILLACodeMirrorWrapperStyle, openWindowIconHotspotStyle, } from "@/components/CodeEditor/style" import i18n from "@/i18n/config" import { getExecutionResultToCurrentPageCodeMirror, getExecutionResultToGlobalCodeMirror, } from "@/redux/currentApp/executionTree/executionSelector" import { RootState } from "@/store" import { LIMIT_MEMORY, estimateMemoryUsage } from "@/utils/calculateMemoryUsage" import { evaluateDynamicString } from "@/utils/evaluateDynamicString" import { removeIgnoredKeys, removeWidgetOrActionMethods, } from "@/utils/executionTreeHelper/utils" import { VALIDATION_TYPES } from "@/utils/validationFactory" import { fixedValue } from "./utils" const getResultType = (result: unknown) => { if (Array.isArray(result)) { return VALIDATION_TYPES.ARRAY } else if (typeof result === "string") { return VALIDATION_TYPES.STRING } else if (typeof result === "number") { return VALIDATION_TYPES.NUMBER } else if (typeof result === "boolean") { return VALIDATION_TYPES.BOOLEAN } else if (typeof result === "undefined") { return VALIDATION_TYPES.UNDEFINED } else { return VALIDATION_TYPES.OBJECT } } const getShowResultType = (results: unknown[]) => { if (results.length === 0) { return VALIDATION_TYPES.STRING } if (results.length === 1) { return getResultType(results[0]) } else { return VALIDATION_TYPES.STRING } } const getShowResult = (results: unknown[]) => { let calcResult: string = "" if (results.length === 0) { return "" } else { const memorySize = estimateMemoryUsage(results) if (LIMIT_MEMORY < memorySize) { return i18n.t("editor.global.size_exceed", { current_size: memorySize, limit_size: LIMIT_MEMORY, }) } results.forEach((result) => { if ( typeof result === "string" || typeof result === "number" || typeof result === "boolean" ) { calcResult += result } else if (result == undefined) { calcResult += result } else { calcResult += JSON.stringify(result) } }) } return calcResult } export const MAX_LEN_WITH_SNIPPETS = 1024 export const CodeEditor: FC = (props) => { const { value = "", modalTitle = "", modalDescription, onChange = () => {}, showLineNumbers, placeholder, lang, sqlScheme, width, maxWidth, height, maxHeight, editable = true, readOnly, extensions, expectValueType, codeType = CODE_TYPE.EXPRESSION, minWidth, minHeight, canShowCompleteInfo, wrapperCss, singleLine, canExpand = true, scopeOfAutoComplete = "global", wrappedCodeFunc, onBlur = () => {}, onFocus = () => {}, className, } = props const [result, setResult] = useState("") const [error, setError] = useState(false) const [resultType, setResultType] = useState(VALIDATION_TYPES.STRING) const [isExpanded, setIsExpanded] = useState(false) const popupContainerRef = useRef(null) const innerCanExpand = canExpand && !readOnly && editable const tmpCalcContext = useSelector>( (rootState) => { return scopeOfAutoComplete === "global" ? getExecutionResultToGlobalCodeMirror(rootState) : getExecutionResultToCurrentPageCodeMirror(rootState) }, ) const calcContext = useMemo(() => { if (codeType === CODE_TYPE.FUNCTION) { return removeIgnoredKeys(tmpCalcContext) } else { return removeIgnoredKeys(removeWidgetOrActionMethods(tmpCalcContext)) } }, [codeType, tmpCalcContext]) const stringSnippets = useMemo(() => { const result: IExpressionShape[] = [] const realInput = wrappedCodeFunc ? wrappedCodeFunc(value) : value const dynamicStrings = getStringSnippets(realInput) const errors: string[] = [] const calcResultArray: unknown[] = [] const calcResultMap: Map = new Map() dynamicStrings.forEach((dynamicString, index) => { if (isDynamicStringSnippet(dynamicString)) { try { const calcRes = evaluateDynamicString("", dynamicString, calcContext) calcResultArray.push(calcRes) const res = { value: dynamicString, hasError: false } result.push(res) if (calcResultMap.has(dynamicString)) { calcResultMap.get(dynamicString)?.push(index) } else { calcResultMap.set(dynamicString, [index]) } } catch (e) { errors.push((e as Error).message) const res = { value: dynamicString, hasError: true } result.push(res) if (calcResultMap.has(dynamicString)) { calcResultMap.get(dynamicString)?.push(index) } else { calcResultMap.set(dynamicString, [index]) } } } else { calcResultArray.push(dynamicString) } }) if (errors.length > 0) { setError(true) setResult(errors[0]) return result } const showResult = getShowResult(calcResultArray) const showResultType = getShowResultType(calcResultArray) setError(false) if (expectValueType) { setResultType(expectValueType) if (showResultType !== expectValueType && value) { dynamicStrings.forEach((dynamicString) => { if ( dynamicString.length <= MAX_LEN_WITH_SNIPPETS && isDynamicStringSnippet(dynamicString) && calcResultMap.has(dynamicString) ) { const indexs = calcResultMap.get(dynamicString) indexs?.forEach((index) => { if (result[index]) { result[index].hasError = true } }) } }) setResult(`Expect ${expectValueType}, but got ${showResultType}`) setError(true) } else { setResult( showResult.length > MAX_LEN_WITH_SNIPPETS ? showResult.slice(0, MAX_LEN_WITH_SNIPPETS) + "..." : showResult, ) } } else { setResultType(showResultType) setResult( showResult.length > MAX_LEN_WITH_SNIPPETS ? showResult.slice(0, MAX_LEN_WITH_SNIPPETS) + "..." : showResult, ) } return result }, [wrappedCodeFunc, value, expectValueType, calcContext]) const debounceHandleChange = useMemo(() => { return debounce(onChange, 160) }, [onChange]) const customExtensions = useMemo( () => (extensions ? [extensions, githubLightScheme] : [githubLightScheme]), [extensions], ) const handleOpenExpandModal = useCallback(() => { setIsExpanded(true) }, []) const handleCloseExpandModal = useCallback(() => { setIsExpanded(false) }, []) return (
{innerCanExpand && (
)} {isExpanded && ( )}
) } ================================================ FILE: apps/builder/src/components/CodeEditor/interface.ts ================================================ import { SerializedStyles } from "@emotion/react" import { ILLACodeMirrorProps } from "@/components/CodeEditor/CodeMirror/interface" import { VALIDATION_TYPES } from "@/utils/validationFactory" export interface CodeEditorProps extends Omit< ILLACodeMirrorProps, | "hasError" | "resultType" | "result" | "executionResult" | "expressions" | "canShowResultRealtime" > { expectValueType?: VALIDATION_TYPES wrappedCodeFunc?: (value: string) => string canExpand?: boolean modalTitle?: string modalDescription?: string wrapperCss?: SerializedStyles } ================================================ FILE: apps/builder/src/components/CodeEditor/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" export const ILLACodeMirrorWrapperStyle = css` width: 100%; height: 100%; position: relative; :hover { .open-window-icon-hotspot { visibility: visible; } } ` export const openWindowIconHotspotStyle = css` position: absolute; z-index: 10; right: 2px; bottom: 2px; width: 16px; height: 16px; cursor: pointer; font-size: 12px; background-color: ${getColor("grayBlue", "09")}; display: flex; align-items: center; justify-content: center; border-radius: 2px 2px 6px 2px; visibility: hidden; ` ================================================ FILE: apps/builder/src/components/CodeEditor/utils.ts ================================================ export const fixedValue = (value: unknown) => { if (value == undefined) return "" if (typeof value === "string") return value return `{{${JSON.stringify(value)}}}` } ================================================ FILE: apps/builder/src/components/ColorPicker/constants.ts ================================================ import { getSpecialThemeColor } from "@illa-design/react" export const colorSchemes = [ "white", "grayBlue", "red", "orange", "yellow", "green", "blue", "cyan", "purple", ] // for old app export const deletedColorSchemes = ["transparent", "blackAlpha"] export const COLOR_MAP = (() => { const m = new Map() colorSchemes.forEach((color) => { m.set(getSpecialThemeColor(color), color) }) return m })() export const PRE_COLOR = colorSchemes.map((color) => { return { title: color, color: getSpecialThemeColor(color), } }) ================================================ FILE: apps/builder/src/components/ColorPicker/index.tsx ================================================ import Sketch from "@uiw/react-color-sketch" import { FC } from "react" import { getSpecialThemeColor } from "@illa-design/react" import { COLOR_MAP, PRE_COLOR, colorSchemes } from "./constants" import { ColorPickerProps } from "./interface" export const ColorPicker: FC = (props) => { const { onChange, selectedColor, disableAlpha } = props let c = selectedColor if (colorSchemes.includes(selectedColor)) { c = getSpecialThemeColor(selectedColor) } return ( { if (COLOR_MAP.has(color.hexa) || COLOR_MAP.has(color.hex)) { onChange(COLOR_MAP.get(color.hex) || COLOR_MAP.get(color.hexa)!!) } else { onChange(color.hexa) } }} /> ) } ColorPicker.displayName = "ColorPicker" ================================================ FILE: apps/builder/src/components/ColorPicker/interface.ts ================================================ export interface ColorPickerProps { selectedColor: string onChange: (color: string) => void disableAlpha?: boolean } ================================================ FILE: apps/builder/src/components/ColorSetter/index.tsx ================================================ import { hexToHsva } from "@uiw/color-convert" import { debounce } from "lodash-es" import { FC, useRef } from "react" import { BindIcon, Trigger, getSpecialThemeColor } from "@illa-design/react" import { ColorPicker } from "@/components/ColorPicker" import { colorSchemes, deletedColorSchemes, } from "@/components/ColorPicker/constants" import { ColorPickerSetterProps } from "./interface" import { alphaContentStyle, applyCircleStyle, buttonContentWrapperStyle, circleHotSpotStyle, colorContentStyle, colorTipAndValueContainerStyle, } from "./style" const ColorPickerSetter: FC = (props) => { const { handleUpdateColor, value, setterSize = "small" } = props const currentColor = useRef(value) const debounceOnChange = debounce(handleUpdateColor, 300) let c = value let isInnerColorScheme = false if (colorSchemes.includes(value)) { isInnerColorScheme = true c = getSpecialThemeColor(value) } const showBindIcon = isInnerColorScheme || deletedColorSchemes.includes(value) return ( { currentColor.current = color debounceOnChange(color) }} /> } >
{value?.includes("#") ? value?.toLocaleUpperCase().slice(0, -2) : value}
{showBindIcon ? ( ) : ( {parseInt(`${hexToHsva(c || "#fff").a * 100}`)}% )}
) } ColorPickerSetter.displayName = "ColorPickerSetter" export default ColorPickerSetter ================================================ FILE: apps/builder/src/components/ColorSetter/interface.tsx ================================================ export interface ColorPickerSetterProps { value: string handleUpdateColor: (color: string) => void setterSize?: "small" | "medium" } ================================================ FILE: apps/builder/src/components/ColorSetter/style.ts ================================================ import { SerializedStyles, css } from "@emotion/react" import { getColor, globalColor, illaPrefix } from "@illa-design/react" import alpha from "@/assets/alpha.svg" export const circleHotSpotStyle = css` width: 24px; height: 24px; padding: 4px; display: flex; align-items: center; ` export function applyCircleStyle(color: string): SerializedStyles { return css` &::after { content: ""; display: inline-block; background-color: ${color}; width: 16px; height: 16px; } background-image: url(${alpha}); width: 16px; height: 16px; border-radius: 50%; border: 1px solid ${globalColor(`--${illaPrefix}-grayBlue-08`)}; overflow: hidden; flex: none; ` } export const colorTipAndValueContainerStyle = css` display: flex; align-items: center; gap: 8px; ` export const buttonContentWrapperStyle = ( setterSize: "small" | "medium", ) => css` display: flex; width: ${setterSize === "medium" ? "182px" : "170px"}; cursor: pointer; align-items: center; border-radius: 8px; padding: 3px 12px 3px 12px; justify-content: space-between; border: 1px solid ${getColor("grayBlue", "08")}; :hover { background-color: ${globalColor(`--${illaPrefix}-grayBlue-09`)}; } :active { background-color: ${globalColor(`--${illaPrefix}-grayBlue-08`)}; } ` export const colorContentStyle = css` text-align: left; font-size: 12px; overflow: hidden; text-overflow: ellipsis; color: ${globalColor(`--${illaPrefix}-grayBlue-02`)}; align-self: center; line-height: 24px; flex: none; ` export const alphaContentStyle = css` font-size: 12px; color: ${globalColor(`--${illaPrefix}-grayBlue-02`)}; align-self: center; line-height: 24px; flex: none; ` ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/Breadcrumb/index.tsx ================================================ import { FC, useCallback, useContext, useMemo } from "react" import { Breadcrumb, BreadcrumbItem } from "@illa-design/react" import { DriveFileSelectContext, ROOT_PATH } from "@/components/DriveFileSelect" const FileBreadCrumb: FC = () => { const { currentPath, totalPath, updatePath } = useContext( DriveFileSelectContext, ) const handleClickBreadcrumb = useCallback( (path: string, last: boolean) => { if (last) { return } updatePath(path) }, [updatePath], ) const breadList = useMemo(() => { if (!currentPath) { return [ { path: ROOT_PATH, title: ROOT_PATH, last: true, }, ] } return currentPath?.split("/").map((item, index, array) => { const breadcrumbPath = array.slice(0, index + 1).join("/") const limitPath = totalPath.split(breadcrumbPath)[0] const path = `${limitPath}${breadcrumbPath}` const isLast = index === array.length - 1 return { path, title: item, last: isLast, } }) }, [currentPath, totalPath]) return ( {breadList.map((item, index) => ( {item.title} ))} ) } export default FileBreadCrumb ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/EmptyState/index.tsx ================================================ import { FolderIcon } from "@illa-public/icon" import { FC } from "react" import { useTranslation } from "react-i18next" import { emptyContainerStyle } from "./style" const EmptyState: FC = () => { const { t } = useTranslation() return (
{t("widget.drive_picker.modal.no_file")}
) } export default EmptyState ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/EmptyState/style.ts ================================================ import { css } from "@emotion/react" export const emptyContainerStyle = css` width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; ` ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/FileList/index.tsx ================================================ import { getFileIconByContentType } from "@illa-public/icon" import { GCS_OBJECT_TYPE, IILLAFileInfo } from "@illa-public/public-types" import VirtualList from "rc-virtual-list" import { FC, MouseEvent, useCallback, useRef } from "react" import { useTranslation } from "react-i18next" import { Checkbox, DoubtIcon, Trigger } from "@illa-design/react" import { FOLDER_LIST_CONTAINER_HEIGHT, FOLDER_LIST_ITEM_HEIGHT, } from "@/components/DriveFileSelect/constants" import { FileListProps } from "./interface" import { doubtStyle, fileNameStyle, iconPublicStyle, listItemContainerStyle, singleListItemContainerStyle, } from "./style" const FileList: FC = (props) => { const { listData, totalPath, search, selectItems, colorScheme, singleSelect, onChange, getFileList, updatePath, handleSingleChange, } = props const { t } = useTranslation() const handleClickItem = useCallback( (e: MouseEvent, item: IILLAFileInfo) => { e.stopPropagation() if ( item.type === GCS_OBJECT_TYPE.FOLDER || item.type === GCS_OBJECT_TYPE.ANONYMOUS_FOLDER ) { updatePath(`${totalPath}/${item.name}`) return } else if (singleSelect) { handleSingleChange(item) } }, [singleSelect, totalPath, updatePath, handleSingleChange], ) const currentPageIndexRef = useRef(1) const onScroll = (e: React.UIEvent) => { if ( e.currentTarget.scrollHeight - e.currentTarget.scrollTop === FOLDER_LIST_CONTAINER_HEIGHT ) { getFileList(++currentPageIndexRef.current, totalPath, search?.current) } } return ( {(item: IILLAFileInfo) => { return ( ) }} ) } export default FileList ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/FileList/interface.ts ================================================ import { MutableRefObject } from "react" import { FileToPanel } from "@/components/DriveFileSelect/interface" import { IILLAFileInfo } from "@/services/drive" export interface FileListProps { listData: IILLAFileInfo[] totalPath: string search?: MutableRefObject selectItems: FileToPanel[] colorScheme: string singleSelect?: boolean getFileList: (currentPage: number, totalPath: string, search?: string) => void updatePath: (changedPath: string) => void onChange: (flag: boolean, item: FileToPanel) => void handleSingleChange: (item: FileToPanel) => void } ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/FileList/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" import { FOLDER_LIST_ITEM_HEIGHT } from "../../constants" export const fileNameStyle = css` font-size: 14px; color: ${getColor("grayBlue", "02")}; font-weight: 500; ` export const iconPublicStyle = css` display: inline-block; width: 24px; height: 30px; flex: none; ` export const listItemContainerStyle = css` display: flex; align-items: center; padding: 0 24px; height: ${FOLDER_LIST_ITEM_HEIGHT}px; gap: 8px; cursor: pointer; & > input { margin: 3px 4px; } ` export const singleListItemContainerStyle = (isSelected: boolean) => css` ${listItemContainerStyle}; background-color: ${isSelected ? getColor("techPurple", "08") : "transparent"}; ` export const doubtStyle = css` display: flex; width: 16px; height: 16px; ` ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/FileListContent/index.tsx ================================================ import { debounce } from "lodash-es" import { FC, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react" import { useTranslation } from "react-i18next" import { Button, CloseIcon, Search, useMessage } from "@illa-design/react" import { DriveFileSelectContext } from "@/components/DriveFileSelect" import FileBreadCrumb from "@/components/DriveFileSelect/components/Breadcrumb" import EmptyState from "@/components/DriveFileSelect/components/EmptyState" import FileList from "@/components/DriveFileSelect/components/FileList" import { LoadingState } from "@/components/DriveFileSelect/components/LoadingState" import { MAX_FILE_NUM, MAX_SIZE_MESSAGE, MIN_FILE_NUM, MIN_SIZE_MESSAGE, } from "@/components/DriveFileSelect/constants" import { FileToPanel } from "@/components/DriveFileSelect/interface" import i18n from "@/i18n/config" import { ModalTitleStyle, applyInnerFileListContainerStyle, fileListContainerStyle, footerContainerStyle, headerContainerStyle, } from "./style" const FilesModalContent: FC = () => { const { modalVisible, fileList, totalPath, minSize, maxSize, minFileNum, maxFileNum, sizeType = "mb", colorScheme, singleSelect = false, getFileList, updatePath, submitSelect, handleCloseModal, } = useContext(DriveFileSelectContext) const { t } = useTranslation() const [isConfirmLoading, setConfirmLoading] = useState(false) const searchRef = useRef("") const [selectItems, setSelectItems] = useState([]) const [disabled, setDisabled] = useState(true) const [loading, setLoading] = useState(true) const message = useMessage() const handleBtnDisabled = useCallback( (list: FileToPanel[]) => { if (disabled && list.length > 0) { setDisabled(false) } else if (!disabled && list.length === 0) { setDisabled(true) } }, [disabled], ) const validateFileNum = useCallback(() => { if (maxFileNum && selectItems.length > maxFileNum) { message.info({ content: i18n.t(MAX_FILE_NUM, { max: maxFileNum, }), }) return false } if (minFileNum && selectItems.length < minFileNum) { message.info({ content: i18n.t(MIN_FILE_NUM, { min: minFileNum, }), }) return false } if (maxSize) { const equalMaxSize = sizeType === "mb" ? maxSize * 1024 * 1024 : maxSize * 1024 if (selectItems.some((item) => item.size > equalMaxSize)) { message.info({ content: i18n.t(MAX_SIZE_MESSAGE, { max: maxSize + sizeType, }), }) return false } } if (minSize) { const equalMinSize = sizeType === "mb" ? minSize * 1024 * 1024 : minSize * 1024 if (selectItems.some((item) => item.size < equalMinSize)) { message.info({ content: i18n.t(MIN_SIZE_MESSAGE, { min: minSize + sizeType, }), }) return false } } return true }, [maxFileNum, maxSize, message, minFileNum, minSize, selectItems, sizeType]) const handleChange = useCallback( (flag: boolean, item: FileToPanel) => { const index = selectItems.findIndex((file) => file.id === item.id) if (!flag && index !== -1) { const newSelectItems = selectItems.concat() newSelectItems.splice(index, 1) setSelectItems(newSelectItems) handleBtnDisabled(newSelectItems) } else if (flag && index === -1) { const newSelectItems = selectItems.concat(item) setSelectItems(newSelectItems) handleBtnDisabled(newSelectItems) } }, [handleBtnDisabled, selectItems], ) const handleSingleChange = useCallback( (item: FileToPanel) => { if (selectItems[0]?.id !== item.id) { setSelectItems([item]) setDisabled(false) } }, [selectItems], ) const handleClickClose = useCallback(() => { handleCloseModal() setSelectItems([]) }, [handleCloseModal]) const handleClickOk = useCallback(async () => { if (!validateFileNum()) { return } setConfirmLoading(true) submitSelect(selectItems) .then(() => { setSelectItems([]) }) .finally(() => { setConfirmLoading(false) }) }, [selectItems, submitSelect, validateFileNum]) const getListDate = useCallback( async (currentPage: number, totalPath: string, search?: string) => { setLoading(true) try { await getFileList(currentPage, totalPath, search) } catch (e) { } finally { setLoading(false) } }, [getFileList], ) const debounceHandleOnSearch = useMemo(() => { return debounce((value: string) => { getListDate(1, totalPath, value) }, 500) }, [getListDate, totalPath]) useEffect(() => { modalVisible && getListDate(1, totalPath) }, [getListDate, modalVisible, totalPath]) return ( <>
{t("widget.drive_picker.modal.files")}
{fileList.length > 0 ? ( ) : ( !loading && )}
{loading && }
) } export default FilesModalContent ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/FileListContent/style.ts ================================================ import { css } from "@emotion/react" import { FOLDER_LIST_CONTAINER_HEIGHT } from "../../constants" export const ModalTitleStyle = css` display: flex; justify-content: space-between; align-items: center; padding: 32px 32px 8px; & > span:first-of-type { font-weight: 600; font-size: 24px; } ` export const applyInnerFileListContainerStyle = (isLoading: boolean) => { const loadingStyle = css` opacity: 0.5; transition: opacity 0.3s; user-select: none; pointer-events: none; ` return css` height: 100%; width: 100%; ${isLoading && loadingStyle}; ` } export const fileListContainerStyle = css` height: ${FOLDER_LIST_CONTAINER_HEIGHT}px; width: 100%; position: relative; ` export const footerContainerStyle = css` display: flex; align-items: center; justify-content: flex-end; padding: 24px 24px 16px 24px; gap: 8px; ` export const headerContainerStyle = css` display: flex; gap: 16px; padding: 8px 24px; display: flex; flex-direction: column; align-items: flex-start; ` ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/LoadingState/index.tsx ================================================ import { FC } from "react" import { Spin } from "@illa-design/react" import { loadingContainerStyle } from "./style" export const LoadingState: FC<{ colorScheme: string }> = ({ colorScheme }) => { return (
) } ================================================ FILE: apps/builder/src/components/DriveFileSelect/components/LoadingState/style.ts ================================================ import { css } from "@emotion/react" import { FOLDER_LIST_CONTAINER_HEIGHT } from "../../constants" export const loadingContainerStyle = css` height: ${FOLDER_LIST_CONTAINER_HEIGHT}px; width: 100%; position: relative; display: flex; align-items: center; justify-content: center; position: absolute; top: 0; z-index: 4; ` ================================================ FILE: apps/builder/src/components/DriveFileSelect/constants.ts ================================================ export const FOLDER_LIST_CONTAINER_HEIGHT = 276 export const FOLDER_LIST_ITEM_HEIGHT = 46 export const MAX_SIZE_MESSAGE = "editor.inspect.setter_message.drive_builder.max_size" export const MIN_SIZE_MESSAGE = "editor.inspect.setter_message.drive_builder.min_size" export const MAX_FILE_NUM = "editor.inspect.setter_message.drive_builder.max_files" export const MIN_FILE_NUM = "editor.inspect.setter_message.drive_builder.min_files" export const ROOT_PATH = "root" ================================================ FILE: apps/builder/src/components/DriveFileSelect/context/index.tsx ================================================ import { createContext } from "react" import { IILLAFileInfo } from "@/services/drive" import { FileToPanel } from "../interface" interface Injected { modalVisible: boolean fileList: IILLAFileInfo[] currentPath: string totalPath: string sizeType?: "kb" | "mb" minSize?: number maxSize?: number minFileNum?: number maxFileNum?: number colorScheme: string singleSelect?: boolean updatePath: (changedPath: string) => void submitSelect: (selectIds: FileToPanel[]) => Promise setModalVisible: (visible: boolean) => void getFileList: ( currentPage: number, totalPath: string, search?: string, ) => Promise handleCloseModal: () => void } export const DriveFileSelectContext = createContext({} as Injected) ================================================ FILE: apps/builder/src/components/DriveFileSelect/hooks/usePath.tsx ================================================ import { useCallback, useEffect, useState } from "react" import { getCurrentPath, removeSuffixPath, } from "@/components/DriveFileSelect/utils" import { ROOT_PATH } from "../constants" export const usePath = ( path: string, allowAnonymousUse?: boolean | undefined, ) => { const [totalPath, setTotalPath] = useState(path || ROOT_PATH) const [currentPath, setCurrentPath] = useState( getCurrentPath(totalPath ?? "root"), ) const updatePath = useCallback( (changedPath: string) => { const curChangePath = removeSuffixPath(changedPath) setTotalPath(curChangePath) setCurrentPath(getCurrentPath(path, curChangePath)) }, [path], ) useEffect(() => { if (allowAnonymousUse) { setTotalPath(ROOT_PATH) setCurrentPath(ROOT_PATH) } else { setTotalPath(path || ROOT_PATH) setCurrentPath(getCurrentPath(path || ROOT_PATH)) } }, [allowAnonymousUse, path]) return { currentPath, updatePath, totalPath, } } ================================================ FILE: apps/builder/src/components/DriveFileSelect/index.tsx ================================================ import { FC, useContext } from "react" import { createPortal } from "react-dom" import { Modal } from "@illa-design/react" import FilesModalContent from "./components/FileListContent" import { DriveFileSelectContext } from "./context" const FilesModal: FC = () => { const { modalVisible, handleCloseModal } = useContext(DriveFileSelectContext) return createPortal( <> {modalVisible && ( )} , document.body, ) } export default FilesModal export { usePath } from "./hooks/usePath" export * from "./utils" export * from "./interface" export * from "./context" export * from "./constants" ================================================ FILE: apps/builder/src/components/DriveFileSelect/interface.ts ================================================ import { IILLAFileInfo } from "@/services/drive" export type FileToPanel = Pick< IILLAFileInfo, "id" | "lastModifiedAt" | "name" | "size" | "type" > ================================================ FILE: apps/builder/src/components/DriveFileSelect/utils.tsx ================================================ export const getCurrentPath = (limitPath: string, totalPath?: string) => { const curTotalPath = totalPath ?? limitPath const limitPathArr = limitPath.split("/") const limitRoot = limitPathArr[limitPathArr.length - 1] return removeSuffixPath(`${limitRoot}${curTotalPath.replace(limitPath, "")}`) } export const removeSuffixPath = (path: string): string => { const regex = /^\/?(.*?)\/?$/ return path?.match(regex)?.[1] || path } ================================================ FILE: apps/builder/src/components/EditableText/index.tsx ================================================ import { FC, useCallback, useRef, useState } from "react" import { useTranslation } from "react-i18next" import { Input, PenIcon, useMessage } from "@illa-design/react" import { DisplayNameGenerator } from "@/utils/generators/generateDisplayName" import { isValidDisplayName } from "@/utils/typeHelper" import { EditableTextProps } from "./interface" import { editableTextWrapperStyle, innerTextStyle, textStyle } from "./style" export const EditableText: FC = (props) => { const { displayName, updateDisplayNameByBlur, onMouseEnter, onClick, onBlur, onValidate, } = props const [inputValue, setInputValue] = useState(displayName) const [isFocusInput, setIsFocusInput] = useState(false) const { t } = useTranslation() const inputRef = useRef(null) const handleChangeInputValue = (value: string) => { setInputValue(value) } const handleClickOnSpan = () => { if (isFocusInput) return setIsFocusInput(true) onClick?.() setTimeout(() => { inputRef.current?.focus() }, 100) } const message = useMessage() const handleBlurInput = useCallback(() => { setIsFocusInput(false) if (displayName === inputValue) { return } onBlur?.(inputValue) if (!isValidDisplayName(inputValue)) { message.error({ content: t("editor.display_name.validate_error", { displayName: inputValue, }), }) onValidate?.("failed") setInputValue(displayName) return } if (DisplayNameGenerator.isAlreadyGenerate(inputValue)) { message.error({ content: t("editor.display_name.duplicate_error", { displayName: inputValue, }), }) onValidate?.("failed") setInputValue(displayName) return } onValidate?.("suc") updateDisplayNameByBlur(inputValue) }, [ displayName, inputValue, message, onBlur, onValidate, t, updateDisplayNameByBlur, ]) return (
{isFocusInput ? ( ) : ( {inputValue} )}
) } ================================================ FILE: apps/builder/src/components/EditableText/interface.ts ================================================ export interface EditableTextProps { displayName: string updateDisplayNameByBlur: (value: string) => void onMouseEnter?: () => void onClick?: () => void onBlur?: (value: string) => void onValidate?: (result: "suc" | "failed") => void } ================================================ FILE: apps/builder/src/components/EditableText/style.ts ================================================ import { css } from "@emotion/react" import { globalColor, illaPrefix } from "@illa-design/react" export const editableTextWrapperStyle = css` width: 100%; border-radius: 8px; display: flex; align-items: center; &:hover { background-color: ${globalColor(`--${illaPrefix}-grayBlue-09`)}; cursor: pointer; svg { opacity: 1; } .text-container { padding-left: 16px; } } transition: all 200ms; ` export const textStyle = css` height: 100%; display: inline-flex; min-height: 32px; font-size: 14px; align-items: center; box-sizing: border-box; max-lines: 1; white-space: nowrap; border-radius: 8px; color: ${globalColor(`--${illaPrefix}-grayBlue-02`)}; font-weight: 500; position: relative; svg { width: 14px; height: 14px; margin-left: 8px; opacity: 0; color: ${globalColor(`--${illaPrefix}-grayBlue-05`)}; transition: all 200ms; } transition: all 200ms; ` export const innerTextStyle = css` position: relative; display: flex; align-items: center; svg { position: absolute; right: -22px; } ` ================================================ FILE: apps/builder/src/components/ErrorBoundary/fallback/widget/index.tsx ================================================ import { FC } from "react" import { ErrorIcon } from "@illa-design/react" import { contentWrapperStyle, titleWrapperStyle, widgetBoundaryWrapperStyle, } from "./style" export const WidgetErrorBoundary: FC = () => { return (
Error
Configuration error, please modify
) } ================================================ FILE: apps/builder/src/components/ErrorBoundary/fallback/widget/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" export const widgetBoundaryWrapperStyle = css` width: 100%; height: 100%; background-color: ${getColor("red", "08")}; overflow: auto; ` export const titleWrapperStyle = css` display: flex; align-items: center; gap: 4px; color: ${getColor("red", "03")}; font-size: 14px; font-weight: 600; ` export const contentWrapperStyle = css` color: ${getColor("red", "03")}; font-size: 12px; line-height: 16px; ` ================================================ FILE: apps/builder/src/components/ErrorBoundary/index.tsx ================================================ import { Component } from "react" import { WidgetErrorBoundary } from "./fallback/widget" import { ErrorBoundaryProps, ErrorBoundaryState } from "./interface" class ErrorBoundary extends Component { constructor(props: ErrorBoundaryProps) { super(props) this.state = { hasError: false } } static defaultProps = { fallback: , } static getDerivedStateFromError() { return { hasError: true } } componentDidCatch(): void { this.setState({ hasError: true }) } render() { if (this.state.hasError) { return this.props.fallback } return this.props.children } } export default ErrorBoundary ================================================ FILE: apps/builder/src/components/ErrorBoundary/interface.ts ================================================ import { ReactNode } from "react" export interface ErrorBoundaryProps { children: ReactNode fallback?: ReactNode } export interface ErrorBoundaryState { hasError: boolean } ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/CreateFolderModal/index.tsx ================================================ import { DUPLICATION_HANDLER, GCS_OBJECT_TYPE } from "@illa-public/public-types" import { FC, useCallback, useContext, useState } from "react" import { useTranslation } from "react-i18next" import { Modal, useMessage } from "@illa-design/react" import { Input } from "@illa-design/react" import { fetchCheckFileExist, fetchGCSUploadPresignedURL, } from "@/services/drive" import { FolderOperateModalContext } from "../../context" import { SameNameModal } from "../SameNameModal" import { CreateFolderModalProps } from "./interface" import { invalidTipsStyle, messageStyle } from "./style" const availableFilenameRule = /^[\u4e00-\u9fa5a-zA-Z0-9=_~\-]+$/u const isInvalidFolderName = (folderName: string) => { return !availableFilenameRule.test(folderName) } const CreateFolderModal: FC = ({ currentFolderID }) => { const { currentFolderPath, createFolderVisible, setCreateFolderVisible, setCurrentFolderPath, } = useContext(FolderOperateModalContext) const { t } = useTranslation() const message = useMessage() const [folderName, setFolderName] = useState("") const [newFolderName, setNewFolderName] = useState("") const [isLoading, setIsLoading] = useState(false) const [sameModalVisible, setSameModalVisible] = useState(false) const isDisabled = !!folderName && isInvalidFolderName((folderName ?? "").trim()) const createFolder = useCallback( async (name: string, duplicationHandler = DUPLICATION_HANDLER.RENAME) => { try { const response = await fetchGCSUploadPresignedURL({ name: name, folderID: currentFolderID, type: GCS_OBJECT_TYPE.FOLDER, size: 0, resumable: false, duplicationHandler, contentType: "", }) setCreateFolderVisible(false) message.success({ content: t("drive.message.create_suc"), }) setCurrentFolderPath(`${currentFolderPath}/${response.data.name}`) } catch (e) { message.error({ content: t("drive.message.create_failed"), }) } }, [ currentFolderID, currentFolderPath, message, setCreateFolderVisible, setCurrentFolderPath, t, ], ) const handleClickCreate = useCallback(async () => { setIsLoading(true) try { const duplicateResponse = await fetchCheckFileExist([ { folderID: currentFolderID, name: folderName, type: GCS_OBJECT_TYPE.FOLDER, }, ]) const duplicateInfo = duplicateResponse.data[0] if (duplicateInfo.isDuplicated) { setNewFolderName(duplicateInfo.name) setSameModalVisible(true) return } await createFolder(folderName.trim()) } catch (e) { } finally { setIsLoading(false) } }, [createFolder, currentFolderID, folderName, setSameModalVisible]) return ( <> { setCreateFolderVisible(false) }} afterClose={() => { setFolderName("") setIsLoading(false) }} > {isDisabled ? ( {t("drive.create_modal.validate_failed")} ) : ( {t("drive.create_modal.validate")} )} ) } export default CreateFolderModal ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/CreateFolderModal/interface.ts ================================================ export interface CreateFolderModalProps { currentFolderID: string } ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/CreateFolderModal/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" export const createFolderModalMaskStyle = css` background-color: ${getColor("white", "05")}; backdrop-filter: blur(5px); ` export const invalidTipsStyle = css` display: inline-flex; color: ${getColor("orange", "03")}; font-size: 14px; margin-top: 4px; ` export const messageStyle = css` display: inline-flex; color: ${getColor("grayBlue", "04")}; font-size: 14px; margin-top: 4px; ` ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/Empty/index.tsx ================================================ import { FolderIcon } from "@illa-public/icon" import { FC } from "react" import { useTranslation } from "react-i18next" import { emptyContainerStyle } from "./style" const EmptyState: FC = () => { const { t } = useTranslation() return (
{t("drive.move_modal.no_folders")}
) } export default EmptyState ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/Empty/style.ts ================================================ import { css } from "@emotion/react" export const emptyContainerStyle = css` width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; ` ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/FolderList/index.tsx ================================================ import { AnonymousIcon, FolderIcon } from "@illa-public/icon" import { GCS_OBJECT_TYPE, IILLAFileInfo } from "@illa-public/public-types" import VirtualList from "rc-virtual-list" import { FC, useCallback, useContext, useRef } from "react" import { useTranslation } from "react-i18next" import { DoubtIcon, Trigger } from "@illa-design/react" import { FOLDER_LIST_CONTAINER_HEIGHT, FOLDER_LIST_ITEM_HEIGHT, } from "../../constants" import { FolderOperateModalContext } from "../../context" import { FolderListProps } from "./interface" import { doubtStyle, folderIconStyle, folderNameStyle, listItemContainerStyle, } from "./style" const FolderList: FC = (props) => { const { listData, updateListData } = props const { t } = useTranslation() const { currentFolderPath, setCurrentFolderPath } = useContext( FolderOperateModalContext, ) const handleClickItem = useCallback( (name: string) => { return () => { const path = `${currentFolderPath}/${name}` setCurrentFolderPath(path) } }, [currentFolderPath, setCurrentFolderPath], ) const currentPageIndexRef = useRef(1) const onScroll = (e: React.UIEvent) => { if ( e.currentTarget.scrollHeight - e.currentTarget.scrollTop === FOLDER_LIST_CONTAINER_HEIGHT ) { updateListData(++currentPageIndexRef.current, currentFolderPath) } } return ( {(item: IILLAFileInfo) => { return (
{item.type === GCS_OBJECT_TYPE.ANONYMOUS_FOLDER ? ( ) : ( )} {item.name} {item.type === GCS_OBJECT_TYPE.ANONYMOUS_FOLDER && ( )}
) }}
) } export default FolderList ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/FolderList/interface.ts ================================================ import { IILLAFileInfo } from "@/services/drive" export interface FolderListProps { listData: IILLAFileInfo[] updateListData: (page: number, path: string) => void } ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/FolderList/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" import { FOLDER_LIST_ITEM_HEIGHT } from "../../constants" export const listItemContainerStyle = css` display: flex; align-items: center; height: ${FOLDER_LIST_ITEM_HEIGHT}px; gap: 4px; cursor: pointer; ` export const folderIconStyle = css` width: 24px; height: 24px; ` export const folderNameStyle = css` font-size: 14px; color: ${getColor("grayBlue", "02")}; font-weight: 500; ` export const doubtStyle = css` display: flex; width: 16px; height: 16px; ` ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/FolderModalContent/index.tsx ================================================ import { DRIVE_FILE_TYPE, IILLAFileInfo, SORTED_TYPE, } from "@illa-public/public-types" import { FC, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react" import { useTranslation } from "react-i18next" import { Breadcrumb, BreadcrumbItem, Button, CloseIcon, } from "@illa-design/react" import { PlusIcon } from "@illa-design/react" import { fetchFileList } from "@/services/drive" import { FOLDER_LIST_LIMIT_IN_MODAL, ROOT_PATH } from "../../constants" import { FolderOperateModalContext } from "../../context" import CreateFolderModal from "../CreateFolderModal" import EmptyState from "../Empty" import FolderList from "../FolderList" import LoadingState from "../LoadingState" import { applyInnerFolderListContainerStyle, breadItemStyle, breadcrumbContainerStyle, closeStyle, containerStyle, contentHeaderStyle, folderListContainerStyle, footerContainerStyle, footerOperationsContainerStyle, newFolderButtonStyle, spanBreadcrumbStyle, } from "./style" const FolderModalContent: FC = () => { const { title, subTitle, currentFolderPath, setCurrentFolderPath, setFolderOperateVisible, setCreateFolderVisible, operateChildren, } = useContext(FolderOperateModalContext) const { t } = useTranslation() const [folderList, setFolderList] = useState([]) const [isLoading, setIsLoading] = useState(false) const totalRef = useRef(0) const currentFolderID = useRef("") const breadList = useMemo(() => { return currentFolderPath.split("/").map((item, index, array) => { const path = array.slice(0, index + 1).join("/") const isLast = index === array.length - 1 const isFirst = index === 0 if (isFirst) { return { title: t("drive.upload.modal.all"), path: ROOT_PATH, last: isLast, } } return { path, title: item, last: isLast, } }) }, [currentFolderPath, t]) const handleFetchFileList = useCallback( (pageIndex: number = 1, path: string) => { if (folderList.length >= totalRef.current) { return } setIsLoading(true) fetchFileList({ path: `/${path}`, page: pageIndex, limit: FOLDER_LIST_LIMIT_IN_MODAL, type: DRIVE_FILE_TYPE.FOLDER, sortedBy: "name", sortedType: SORTED_TYPE.ascend, }) .then((res) => { const folders = res.data.files ?? [] currentFolderID.current = res.data.currentFolderID totalRef.current = res.data.total setFolderList(folderList.concat(folders)) }) .finally(() => { setIsLoading(false) }) }, [folderList], ) const handleInitFIleList = useCallback( async (abortSignal: AbortSignal) => { setIsLoading(true) try { const res = await fetchFileList( { path: `/${currentFolderPath}`, page: 1, limit: FOLDER_LIST_LIMIT_IN_MODAL, type: DRIVE_FILE_TYPE.FOLDER, sortedBy: "name", sortedType: SORTED_TYPE.ascend, }, abortSignal, ) const folders = res.data.files ?? [] currentFolderID.current = res.data.currentFolderID totalRef.current = res.data.total setFolderList(folders) setIsLoading(false) } catch (e) { console.log("e", e) } }, [currentFolderPath, currentFolderID], ) useEffect(() => { const abortController = new AbortController() handleInitFIleList(abortController.signal) return () => { abortController.abort() } }, [handleInitFIleList]) return (
{title ?? t("drive.upload.modal.title")} setFolderOperateVisible(false)}>
{subTitle}: { !last && setCurrentFolderPath(path) }} > {breadList.map((item, index) => ( {item.title} ))}
{folderList.length > 0 ? ( ) : !isLoading ? ( ) : ( <> )}
{isLoading && }
{operateChildren}
) } export default FolderModalContent ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/FolderModalContent/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" import { FOLDER_LIST_CONTAINER_HEIGHT } from "../../constants" export const containerStyle = css` padding: 24px; ` export const contentHeaderStyle = css` width: 100%; display: flex; align-items: center; justify-content: space-between; padding-bottom: 8px; & > span { font-size: 16px; font-weight: 600; line-height: 32px; } ` export const applyInnerFolderListContainerStyle = (isLoading: boolean) => { const loadingStyle = css` opacity: 0.5; transition: opacity 0.3s; user-select: none; pointer-events: none; ` return css` height: 100%; width: 100%; ${isLoading && loadingStyle}; ` } export const breadcrumbContainerStyle = css` display: flex; align-items: center; gap: 16px; padding: 8px 0; ` export const folderListContainerStyle = css` height: ${FOLDER_LIST_CONTAINER_HEIGHT}px; width: 100%; position: relative; color: ${getColor("grayBlue", "02")}; ` export const footerContainerStyle = css` display: flex; align-items: center; justify-content: space-between; padding-top: 24px; ` export const footerOperationsContainerStyle = css` display: flex; align-items: center; gap: 8px; ` export const newFolderButtonStyle = css` color: ${getColor("grayBlue", "02")}; padding: 5px 8px !important; ` export const spanBreadcrumbStyle = css` font-size: 14px; font-weight: 500; ` export const closeStyle = css` display: flex; align-items: center; justify-content: center; padding: 6px; cursor: pointer; ` export const breadItemStyle = (isLast: boolean) => css` color: ${isLast ? getColor("techPurple", "03") : getColor("gray", "04")}; ` ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/LoadingState/index.tsx ================================================ import { FC } from "react" import { Loading } from "@illa-design/react" import { loadingContainerStyle } from "./style" const LoadingState: FC = () => { return (
) } export default LoadingState ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/LoadingState/style.ts ================================================ import { css } from "@emotion/react" import { FOLDER_LIST_CONTAINER_HEIGHT } from "../../constants" export const loadingContainerStyle = css` height: ${FOLDER_LIST_CONTAINER_HEIGHT}px; width: 100%; position: relative; display: flex; align-items: center; justify-content: center; position: absolute; top: 0; z-index: 4; ` ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/SameNameModal/content.tsx ================================================ import { DUPLICATION_HANDLER } from "@illa-public/public-types" import { FC, useCallback, useState } from "react" import { useTranslation } from "react-i18next" import { Button } from "@illa-design/react" import { SameNameModalContentProps } from "./interface" import { controlContainer } from "./style" const SameNameModalContent: FC = (props) => { const { objectName, onCancel, createFolder } = props const { t } = useTranslation() const [isLoading, setIsLoading] = useState(false) const createFolderEffect = useCallback( (duplicationHandler: DUPLICATION_HANDLER) => { return async () => { setIsLoading(true) try { await createFolder(objectName, duplicationHandler) onCancel() } catch (e) { console.log(e) } finally { setIsLoading(false) } } }, [createFolder, objectName, onCancel], ) return (
) } export default SameNameModalContent ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/SameNameModal/index.tsx ================================================ import { FC } from "react" import { useTranslation } from "react-i18next" import { Modal } from "@illa-design/react" import SameNameModalContent from "./content" import { SameNameModalProps } from "./interface" export const SameNameModal: FC = (props) => { const { objectName, sameModalVisible, setSameModalVisible, createFolder } = props const { t } = useTranslation() const onCancel = () => { setSameModalVisible(false) } return (
{ e.stopPropagation() }} >
) } ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/SameNameModal/interface.ts ================================================ import { DUPLICATION_HANDLER } from "@illa-public/public-types" export interface SameNameModalProps { sameModalVisible: boolean setSameModalVisible: (open: boolean) => void objectName: string createFolder: ( objectName: string, duplicationHandler: DUPLICATION_HANDLER, ) => Promise } export interface SameNameModalContentProps { objectName: string createFolder: ( objectName: string, duplicationHandler: DUPLICATION_HANDLER, ) => Promise onCancel: () => void } ================================================ FILE: apps/builder/src/components/FolderOperateModal/components/SameNameModal/style.ts ================================================ import { css } from "@emotion/react" export const controlContainer = css` display: flex; align-items: center; justify-content: flex-end; gap: 8px; ` export const hasApplyForAllContainer = css` display: flex; align-items: center; justify-content: flex-end; gap: 8px; margin-top: 8px; ` ================================================ FILE: apps/builder/src/components/FolderOperateModal/constants.ts ================================================ export const FOLDER_LIST_CONTAINER_HEIGHT = 224 export const FOLDER_LIST_ITEM_HEIGHT = 32 export const FOLDER_LIST_LIMIT_IN_MODAL = 10 export const ROOT_PATH = "root" ================================================ FILE: apps/builder/src/components/FolderOperateModal/context.ts ================================================ import { ReactNode, createContext } from "react" interface Injected { title?: string subTitle: string currentFolderPath: string folderOperateVisible: boolean createFolderVisible: boolean operateChildren: ReactNode setCurrentFolderPath: (path: string) => void setFolderOperateVisible: (v: boolean) => void setCreateFolderVisible: (v: boolean) => void } export const FolderOperateModalContext = createContext({} as Injected) ================================================ FILE: apps/builder/src/components/FolderOperateModal/index.tsx ================================================ import { FC, useContext } from "react" import { Modal } from "@illa-design/react" import FolderModalContent from "./components/FolderModalContent" import { FolderOperateModalContext } from "./context" const FolderOperateModal: FC = () => { const { folderOperateVisible, setFolderOperateVisible } = useContext( FolderOperateModalContext, ) return (
{ e.stopPropagation() }} > setFolderOperateVisible(false)} >
) } export default FolderOperateModal export * from "./constants" export * from "./context" ================================================ FILE: apps/builder/src/components/FullPageLoading/index.tsx ================================================ import { FC } from "react" import { Loading } from "@illa-design/react" import { fullPageLoadingWrapperStyle, maskStyle } from "./style" export const FullPageLoading: FC<{ hasMask?: boolean }> = (props) => { return (
{props.hasMask &&
}
) } FullPageLoading.displayName = "FullPageLoading" ================================================ FILE: apps/builder/src/components/FullPageLoading/style.ts ================================================ import { css } from "@emotion/react" export const fullPageLoadingWrapperStyle = css` width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; position: absolute; left: 0; top: 0; bottom: 0; right: 0; ` export const maskStyle = css` position: absolute; left: 0; top: 0; bottom: 0; right: 0; opacity: 0.7; background-color: white; ` ================================================ FILE: apps/builder/src/components/Guide/GuideCreateApp/CreateModal/index.tsx ================================================ import IconHotSpot from "@illa-public/icon-hot-spot" import { FC } from "react" import { createPortal } from "react-dom" import { useTranslation } from "react-i18next" import { AddIcon, CloseIcon, Modal, getColor } from "@illa-design/react" import { closeIconStyle, containerStyle, createOptionsContainerStyle, descStyle, headerStyle, iconStyle, operateContainerStyle, titleStyle, } from "./style" interface CreateModalProps { closeGuideCreateAppModal: () => void openCreateFromResourceModal: () => void openCreateFromTemplateModal: () => void } const CreateModal: FC = ({ closeGuideCreateAppModal, openCreateFromResourceModal, openCreateFromTemplateModal, }) => { const { t } = useTranslation() return createPortal(
{t("editor.tutorial.panel.onboarding_app.congratulations_title")} {t("new_dashboard.create_new.onboarding_cloud")}
{t("new_dashboard.create_new.create_from_template")}
{t("new_dashboard.create_new.generate_crud_short")}
, document.body, ) } export default CreateModal ================================================ FILE: apps/builder/src/components/Guide/GuideCreateApp/CreateModal/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" export const containerStyle = css` display: flex; flex-direction: column; gap: 16px; padding: 24px; position: relative; ` export const headerStyle = css` width: 100%; display: flex; flex-direction: column; gap: 8px; ` export const closeIconStyle = css` position: absolute; right: 24px; top: 24px; width: 24px; height: 24px; display: flex; justify-content: center; align-items: center; ` export const titleStyle = css` color: ${getColor("grayBlue", "02")}; font-size: 16px; font-weight: 500; line-height: 24px; ` export const descStyle = css` color: ${getColor("grayBlue", "03")}; font-size: 14px; font-weight: 400; line-height: 22px; ` export const operateContainerStyle = css` width: 100%; display: flex; gap: 16px; ` export const createOptionsContainerStyle = (bgColor: string) => css` display: flex; color: ${getColor("white", "01")}; border-radius: 8px; align-items: center; background-color: ${bgColor}; font-size: 14px; font-style: normal; font-weight: 500; line-height: 22px; cursor: pointer; height: 118px; width: 200px; padding: 24px; flex-direction: column; text-align: center; gap: 8px; ` export const iconStyle = css` display: flex; padding: 12px; width: 40px; height: 40px; justify-content: center; align-items: center; gap: 8px; border-radius: 50%; background-color: ${getColor("white", "07")}; position: relative; ` ================================================ FILE: apps/builder/src/components/Guide/GuideCreateApp/index.tsx ================================================ import { BuildActionInfo, CreateFromResourceModal, CreateFromTemplateModal, REPORT_PARAMETER, REPORT_TEMPLATE_STATUS, RESOURCE_TYPE, fetchBatchCreateAction, } from "@illa-public/create-app" import { ILLA_MIXPANEL_BUILDER_PAGE_NAME, ILLA_MIXPANEL_EVENT_TYPE, MixpanelTrackProvider, } from "@illa-public/mixpanel-utils" import { ComponentTreeNode, Resource } from "@illa-public/public-types" import { getAuthToken, getILLABuilderURL } from "@illa-public/utils" import { AnimatePresence } from "framer-motion" import { FC, useCallback, useState } from "react" import { useTranslation } from "react-i18next" import { useDispatch, useSelector } from "react-redux" import { useParams } from "react-router-dom" import { useMessage } from "@illa-design/react" import { guideActions } from "@/redux/guide/guideSlice" import { getAllResources } from "@/redux/resource/resourceSelector" import { resourceActions } from "@/redux/resource/resourceSlice" import { fetchCreateApp, fetchForkApp } from "@/services/apps" import { resourceContextHelper, track } from "@/utils/mixpanelHelper" import { getCurrentTeamID } from "@/utils/team" import CreateModal from "./CreateModal" const GuideCreateApp: FC = () => { const message = useMessage() const teamID = useSelector(getCurrentTeamID)! const { teamIdentifier } = useParams() const resourceList = useSelector(getAllResources) || [] const dispatch = useDispatch() const { t } = useTranslation() const [showCreateFromResourceModal, setShowCreateFromResourceModal] = useState(false) const [showCreateFromTemplateModal, setShowCreateFromTemplateModal] = useState(false) const closeGuideCreateAppModal = () => { dispatch(guideActions.updateGuideStatusReducer(false)) } const forkApp = async (appID: string) => { track?.( ILLA_MIXPANEL_EVENT_TYPE.CLICK, ILLA_MIXPANEL_BUILDER_PAGE_NAME.TUTORIAL, { element: "create_app_modal_use_template", parameter1: REPORT_PARAMETER.BLANK_TUTORIAL_APP, }, ) try { const resp = await fetchForkApp(appID) window.open( `${getILLABuilderURL(window.customDomain)}/${teamIdentifier}/app/${ resp.data.appId }?token=${getAuthToken()}`, "_blank", ) } catch (e) { message.error({ content: t("create_fail") }) } finally { closeGuideCreateAppModal() } } const handleUpdateResource = useCallback( (resource: Resource) => { dispatch(resourceActions.addResourceItemReducer(resource)) }, [dispatch], ) const createFromResource = async ( appInfo: ComponentTreeNode, actionsInfo: BuildActionInfo[], ) => { try { const resp = await fetchCreateApp({ appName: "Untitled app", initScheme: appInfo, }) await fetchBatchCreateAction(teamID, resp.data.appId, actionsInfo) window.open( `${getILLABuilderURL(window.customDomain)}/${teamIdentifier}/app/${ resp.data.appId }?token=${getAuthToken()}`, "_blank", ) } catch (e) { message.error({ content: t("create_fail") }) } finally { closeGuideCreateAppModal() } } return ( { track?.( ILLA_MIXPANEL_EVENT_TYPE.CLICK, ILLA_MIXPANEL_BUILDER_PAGE_NAME.TUTORIAL, { element: "create_app_modal_db", parameter1: REPORT_PARAMETER.BLANK_TUTORIAL_APP, }, ) setShowCreateFromResourceModal(true) }} openCreateFromTemplateModal={() => { track?.( ILLA_MIXPANEL_EVENT_TYPE.SHOW, ILLA_MIXPANEL_BUILDER_PAGE_NAME.TUTORIAL, { element: "create_app_modal", parameter1: REPORT_PARAMETER.CREATE_APP_MODAL, }, ) setShowCreateFromTemplateModal(true) }} /> {showCreateFromResourceModal && ( Object.values(RESOURCE_TYPE).includes( item?.resourceType as RESOURCE_TYPE, ), )} createCallBack={createFromResource} closeModal={() => setShowCreateFromResourceModal(false)} /> )} {showCreateFromTemplateModal && ( { track?.( ILLA_MIXPANEL_EVENT_TYPE.CLICK, ILLA_MIXPANEL_BUILDER_PAGE_NAME.TUTORIAL, { element: "create_app_modal_use_template", parameter1: REPORT_PARAMETER.CREATE_APP_MODAL, parameter2: REPORT_TEMPLATE_STATUS.IS_MODAL_TEMPLATE, parameter5: appID, }, ) await forkApp(appID) }} closeModal={() => setShowCreateFromTemplateModal(false)} /> )} ) } export default GuideCreateApp ================================================ FILE: apps/builder/src/components/Guide/GuideDraggablePopover/index.tsx ================================================ import { motion } from "framer-motion" import { FC, useMemo } from "react" import { createPortal } from "react-dom" import { applyPopoverStyle } from "@/components/Guide/GuideDraggablePopover/style" import { GuidePopover } from "@/components/Guide/GuidePopover" import { GUIDE_STEP } from "@/config/guide/config" export type CurrentMaskPosition = "top" | "bottom" | "right" export interface GuideCurrentMaskProps { currentStep: number position?: CurrentMaskPosition } export const GuideDraggablePopover: FC = (props) => { const { currentStep, position = "bottom" } = props const { selector, titleKey, descKey, hideExit, doItForMe } = GUIDE_STEP[currentStep] const isLastStep = useMemo( () => currentStep === GUIDE_STEP.length - 1, [currentStep], ) const domRect = useMemo(() => { if (selector) { const element = document.querySelector(selector) return element?.getBoundingClientRect() } }, [selector]) return createPortal( , document.body, ) } GuideDraggablePopover.displayName = "GuideDraggablePopover" ================================================ FILE: apps/builder/src/components/Guide/GuideDraggablePopover/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" import { CurrentMaskPosition } from "@/components/Guide/GuideDraggablePopover/index" const POPOVER_MARGIN = 14 const applyTriangleStyle = (position: CurrentMaskPosition) => { if (position === "right") return css`` // only show triangle for top and bottom const positionStyle = position === "top" ? css` bottom: -5px; border-width: 6px 6px 0 6px; border-color: ${getColor("techPurple", "03")} transparent transparent transparent; ` : css` top: -5px; border-width: 0 6px 6px 6px; border-color: transparent transparent ${getColor("techPurple", "03")} transparent; ` return css` &::before { content: ""; position: absolute; ${positionStyle}; left: 50%; transform: translateX(-50%); width: 0; height: 0; border-style: solid; } ` } export const applyPopoverStyle = ( position: CurrentMaskPosition, domRect?: DOMRect, ) => { const positionStyle = domRect ? position === "top" ? css` bottom: ${window.innerHeight - domRect?.top + POPOVER_MARGIN}px; left: ${domRect?.left - 60}px; ` : position === "right" ? css` top: ${domRect?.top + POPOVER_MARGIN}px; left: ${domRect?.left - domRect?.width}px; ` : css` top: ${domRect?.bottom + POPOVER_MARGIN}px; left: ${domRect?.left - domRect?.width}px; ` : css`` return css` cursor: move; z-index: 11; position: absolute; background-color: ${getColor("techPurple", "03")}; color: ${getColor("white", "01")}; padding: 8px 12px; border-radius: 2px; ${positionStyle}; ${applyTriangleStyle(position)}; ` } ================================================ FILE: apps/builder/src/components/Guide/GuidePoint/index.tsx ================================================ import Lottie from "lottie-react" import { FC, HTMLAttributes } from "react" import { popoverStyle } from "@/components/Guide/GuidePoint/style" import animationData from "@/components/Guide/assets/lottie/point.json" export const GuidePoint: FC> = (props) => { return (
) } GuidePoint.displayName = "GuidePoint" ================================================ FILE: apps/builder/src/components/Guide/GuidePoint/style.ts ================================================ import { css } from "@emotion/react" export const popoverStyle = css` width: 32px; height: 32px; z-index: 2; position: absolute; top: 0; left: 50%; transform: translateX(-50%); pointer-events: none; ` ================================================ FILE: apps/builder/src/components/Guide/GuidePopover/index.tsx ================================================ import { TextLink } from "@illa-public/text-link" import { FC, HTMLAttributes } from "react" import { Trans, useTranslation } from "react-i18next" import { useDispatch } from "react-redux" import { useModal } from "@illa-design/react" import { actionStyle, applyHiddenStyle, buttonStyle, decsStyle, guidePopoverStyle, linkStyle, titleStyle, } from "@/components/Guide/GuidePopover/style" import { guideActions } from "@/redux/guide/guideSlice" import { openDiscord } from "@/utils/navigate" export interface GuidePopoverProps extends HTMLAttributes { title: string description: string hideExit?: boolean isLastStep?: boolean onClickDoIt?: () => void } export const GuidePopover: FC = (props) => { const { title, description, hideExit, isLastStep, onClickDoIt, ...rest } = props const dispatch = useDispatch() const { t } = useTranslation() const modal = useModal() const handleExitGuide = () => { modal.show({ id: "exitGuide", title: t("tutorial.modal.tutorial.exit_confirm.title"), children: t("tutorial.modal.tutorial.exit_confirm.description"), cancelText: t("tutorial.modal.tutorial.exit_confirm.cancel"), okText: t("tutorial.modal.tutorial.exit_confirm.exit"), okButtonProps: { colorScheme: "techPurple", }, onOk: () => { dispatch(guideActions.updateGuideStatusReducer(false)) }, }) } return (
{t(title)}
, ]} />
{t("editor.tutorial.panel.onboarding_app.exit")} { onClickDoIt?.() }} > {isLastStep ? t("editor.tutorial.panel.onboarding_app.congratulations_button") : hideExit ? t("editor.tutorial.panel.onboarding_app.test_it_button") : t("editor.tutorial.panel.onboarding_app.do_it")}
) } GuidePopover.displayName = "GuidePopover" ================================================ FILE: apps/builder/src/components/Guide/GuidePopover/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" export const topStyle = css` position: absolute; top: 0; transform: translateY(calc(-100% - 20px)); z-index: 2; color: ${getColor("white", "01")}; padding: 16px; border-radius: 2px; ` export const bottomStyle = css` position: absolute; top: calc(100% + 10px); z-index: 2; color: ${getColor("white", "01")}; padding: 16px; border-radius: 2px; ` export const guidePopoverStyle = css` background-color: ${getColor("techPurple", "03")}; padding: 8px 4px; max-width: 264px; ` export const titleStyle = css` font-weight: 500; font-size: 16px; line-height: 24px; ` export const decsStyle = css` margin-top: 8px; margin-bottom: 16px; font-weight: 400; font-size: 14px; line-height: 22px; word-break: break-all; white-space: pre-wrap; text-overflow: ellipsis; overflow: hidden; ` export const linkStyle = css` color: ${getColor("white", "01")}; text-decoration: underline; ` export const actionStyle = css` display: flex; justify-content: space-between; ` export const triggerStyle = css` & > div > div { & > div { background-color: ${getColor("techPurple", "03")}; border-radius: 2px; } & > svg { color: ${getColor("techPurple", "03")}; } } ` export const applyHiddenStyle = (hide?: boolean) => { return css` visibility: ${hide ? "hidden" : "visible"}; ` } export const buttonStyle = css` padding: 0 2px; cursor: pointer; font-weight: 500; font-size: 14px; line-height: 22px; color: ${getColor("white", "01")}; ` ================================================ FILE: apps/builder/src/components/Guide/GuideSuccess/index.tsx ================================================ import Lottie from "lottie-react" import { FC, useState } from "react" import { createPortal } from "react-dom" import { popoverStyle } from "@/components/Guide/GuideSuccess/style" import animationData from "@/components/Guide/assets/lottie/success.json" export const GuideSuccess: FC = () => { const [showAnimation, setShowAnimation] = useState(true) const handleAnimationComplete = () => { setShowAnimation(false) } return showAnimation ? createPortal(
, document.body, ) : null } GuideSuccess.displayName = "GuideSuccess" ================================================ FILE: apps/builder/src/components/Guide/GuideSuccess/style.ts ================================================ import { css } from "@emotion/react" export const popoverStyle = css` position: absolute; top: 0; left: 50%; transform: translateX(-50%); z-index: 2; ` ================================================ FILE: apps/builder/src/components/Guide/WidgetStepMask/index.tsx ================================================ import { FC, useMemo } from "react" import { useTranslation } from "react-i18next" import { useSelector } from "react-redux" import { applyStepMaskStyle, applyStepMaskWrapperStyle, applyVisibleStyle, ellipsisStyle, moveIconStyle, stepFirstLineStyle, } from "@/components/Guide/WidgetStepMask/style" import MoveIcon from "@/components/Guide/assets/move.svg?react" import { GUIDE_SELECT_WIDGET } from "@/config/guide/config" import { DEFAULT_BODY_COLUMNS_NUMBER, UNIT_HEIGHT, } from "@/page/App/components/DotPanel/constant/canvas" import { getCanvasShape } from "@/redux/config/configSelector" import { widgetBuilder } from "@/widgetLibrary/widgetBuilder" export interface StepMaskProps { currentStep: number } export const WidgetStepMask: FC = (props) => { const { t } = useTranslation() const { currentStep } = props const canvasShape = useSelector(getCanvasShape) const unitWidth = useMemo(() => { return canvasShape.canvasWidth / DEFAULT_BODY_COLUMNS_NUMBER }, [canvasShape.canvasWidth]) const widgetShape = useMemo(() => { return GUIDE_SELECT_WIDGET.map((widget) => { const { w, h } = widgetBuilder(widget).config return { width: w * unitWidth, height: h * UNIT_HEIGHT, } }) }, [unitWidth]) const applyMaskStyle = (step: number) => { return [ applyStepMaskStyle(widgetShape[step]), applyVisibleStyle(currentStep <= step), ] } return (
{t("editor.tutorial.panel.onboarding_app.drag_input")}
{t("editor.tutorial.panel.onboarding_app.drag_button")}
{t("editor.tutorial.panel.onboarding_app.drag_table")}
) } WidgetStepMask.displayName = "WidgetStepMask" ================================================ FILE: apps/builder/src/components/Guide/WidgetStepMask/style.ts ================================================ import { css } from "@emotion/react" import { getColor } from "@illa-design/react" import { UNIT_HEIGHT } from "@/page/App/components/DotPanel/constant/canvas" export const applyStepMaskWrapperStyle = ( visible: boolean, unitWidth: number, ) => { return css` display: ${visible ? "flex" : "none"}; flex-direction: column; position: absolute; top: ${unitWidth * 5}px; left: 50%; transform: translate(-50%, 0); gap: ${UNIT_HEIGHT * 3}px; pointer-events: none; font-size: 14px; ` } export const stepMaskStyle = css` display: flex; justify-content: center; align-items: center; color: ${getColor("grayBlue", "04")}; background: ${getColor("techPurple", "08")}; border: 1px dashed ${getColor("techPurple", "03")}; ` // transform stepMaskStyle to function, set {width, height} export const applyStepMaskStyle = (shape: { width: number height: number }) => { const { width, height } = shape return css` width: ${width}px; height: ${height}px; display: flex; justify-content: center; align-items: center; color: ${getColor("grayBlue", "04")}; background: ${getColor("techPurple", "08")}; border: 1px dashed ${getColor("techPurple", "03")}; ` } export const moveIconStyle = css` width: 24px; height: 24px; margin-right: 4px; flex-shrink: 0; ` export const ellipsisStyle = css` white-space: nowrap; text-overflow: ellipsis; overflow: hidden; ` export const stepFirstLineStyle = css` display: flex; justify-content: space-between; ` // hidden function, use visible to control export const applyVisibleStyle = (visible: boolean) => { return css` visibility: ${visible ? "visible" : "hidden"}; ` } ================================================ FILE: apps/builder/src/components/Guide/assets/lottie/point.json ================================================ { "v": "5.8.1", "fr": 60, "ip": 0, "op": 90, "w": 32, "h": 32, "nm": "Lottie guide point", "ddd": 0, "assets": [], "layers": [ { "ddd": 0, "ind": 1, "ty": 4, "nm": "top", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [ 16, 16, 0 ], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6, "l": 2 } }, "ao": 0, "shapes": [ { "ty": "gr", "it": [ { "d": 1, "ty": "el", "s": { "a": 1, "k": [ { "i": { "x": [ 0.675, 0.675 ], "y": [ 0.573, 0.573 ] }, "o": { "x": [ 0.667, 0.667 ], "y": [ 0, 0 ] }, "t": 0, "s": [ 0, 0 ] }, { "i": { "x": [ 0.533, 0.533 ], "y": [ 1, 1 ] }, "o": { "x": [ 0.228, 0.228 ], "y": [ 0.299, 0.299 ] }, "t": 40, "s": [ 8, 8 ] }, { "t": 60, "s": [ 12, 12 ] } ], "ix": 2 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "nm": "椭圆路径 1", "mn": "ADBE Vector Shape - Ellipse", "hd": false }, { "ty": "fl", "c": { "a": 0, "k": [ 0.396077982585, 0.290195988674, 0.925490016563, 1 ], "ix": 4 }, "o": { "a": 1, "k": [ { "i": { "x": [ 0.4 ], "y": [ 1 ] }, "o": { "x": [ 0.6 ], "y": [ 0 ] }, "t": 40, "s": [ 100 ] }, { "t": 60, "s": [ 0 ] } ], "ix": 5 }, "r": 1, "bm": 0, "nm": "填充 1", "mn": "ADBE Vector Graphic - Fill", "hd": false }, { "ty": "tr", "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 6 }, "o": { "a": 0, "k": 100, "ix": 7 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "变换" } ], "nm": "椭圆 1", "np": 3, "cix": 2, "bm": 0, "ix": 1, "mn": "ADBE Vector Group", "hd": false } ], "ip": 0, "op": 180, "st": 0, "bm": 0 }, { "ddd": 0, "ind": 2, "ty": 4, "nm": "bottom", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [ 16, 16, 0 ], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6, "l": 2 } }, "ao": 0, "shapes": [ { "ty": "gr", "it": [ { "d": 1, "ty": "el", "s": { "a": 1, "k": [ { "i": { "x": [ 0.4, 0.4 ], "y": [ 1, 1 ] }, "o": { "x": [ 0.6, 0.6 ], "y": [ 0, 0 ] }, "t": 0, "s": [ 0, 0 ] }, { "t": 60, "s": [ 32, 32 ] } ], "ix": 2 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "nm": "椭圆路径 1", "mn": "ADBE Vector Shape - Ellipse", "hd": false }, { "ty": "fl", "c": { "a": 0, "k": [ 0.396077982585, 0.290195988674, 0.925490016563, 1 ], "ix": 4 }, "o": { "a": 1, "k": [ { "i": { "x": [ 0.4 ], "y": [ 1 ] }, "o": { "x": [ 0.6 ], "y": [ 0 ] }, "t": 40, "s": [ 16 ] }, { "t": 60, "s": [ 0 ] } ], "ix": 5 }, "r": 1, "bm": 0, "nm": "填充 1", "mn": "ADBE Vector Graphic - Fill", "hd": false }, { "ty": "tr", "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 6 }, "o": { "a": 0, "k": 100, "ix": 7 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "nm": "变换" } ], "nm": "椭圆 1", "np": 3, "cix": 2, "bm": 0, "ix": 1, "mn": "ADBE Vector Group", "hd": false } ], "ip": 0, "op": 180, "st": 0, "bm": 0 } ], "markers": [] } ================================================ FILE: apps/builder/src/components/Guide/assets/lottie/success.json ================================================ { "nm": "lottie (mobile)", "ddd": 0, "h": 812, "w": 609, "meta": { "g": "@lottiefiles/toolkit-js 0.25.4" }, "layers": [ { "ty": 0, "nm": "cannon (small - left)", "sr": 1, "st": 0, "op": 300, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 360, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 76, 451.99999999999994, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "w": 480, "h": 720, "refId": "comp_0", "ind": 1 }, { "ty": 0, "nm": "cannon (small - right)", "sr": 1, "st": 0, "op": 300, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 479.994, 360, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 533, 451.99999999999994, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "w": 480, "h": 720, "refId": "comp_2", "ind": 2 }, { "ty": 0, "nm": "cannon (small - top)", "sr": 1, "st": 0, "op": 300, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 400, 400, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 102, 102, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 304, 408, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "w": 800, "h": 800, "refId": "comp_3", "ind": 3 } ], "v": "5.5.6", "fr": 70, "op": 370, "ip": 0, "assets": [ { "nm": "", "id": "comp_0", "layers": [ { "ty": 0, "nm": "_small-side", "sr": 1, "st": 15, "op": 234, "ip": 15, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 400, 400, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ -100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 218, 320, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "w": 800, "h": 800, "refId": "comp_1", "ind": 1 } ] }, { "nm": "", "id": "comp_1", "layers": [ { "ty": 4, "nm": "streamer b", "sr": 1, "st": 9, "op": 58, "ip": 9, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ -157, -245, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 554, 664, 0 ], "ix": 2 }, "r": { "a": 0, "k": 166, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Shape 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": { "a": 0, "k": { "c": false, "i": [ [ 0, 0 ], [ -1.685, -13.314 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 0, -14.907 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 1.754, -14.206 ], [ -3.934, -9.465 ] ], "o": [ [ -3.895, 8.562 ], [ 1.872, 14.789 ], [ 0, 15.206 ], [ 0, 14.907 ], [ 0, 14.907 ], [ 0, 15.206 ], [ 0, 14.314 ], [ -1.803, 14.605 ], [ 0, 0 ] ], "v": [ [ -156.5, -406 ], [ -166.5, -367 ], [ -146.5, -327 ], [ -166.5, -286 ], [ -146.5, -246 ], [ -166.5, -206 ], [ -146.5, -165 ], [ -166.5, -127 ], [ -156.5, -84 ] ] }, "ix": 2 } }, { "ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 2, "ml": 1, "o": { "a": 0, "k": 100, "ix": 4 }, "w": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 4 ], "t": 9 }, { "s": [ 0.5 ], "t": 57 } ], "ix": 5 }, "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 3 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] }, { "ty": "tm", "bm": 0, "hd": false, "mn": "ADBE Vector Filter - Trim", "nm": "Trim Paths 1", "ix": 2, "e": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 9 }, { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 35 ], "t": 14 }, { "s": [ 100 ], "t": 57 } ], "ix": 2 }, "o": { "a": 0, "k": 0, "ix": 3 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 14 }, { "s": [ 100 ], "t": 57 } ], "ix": 1 }, "m": 1 } ], "ind": 1 }, { "ty": 4, "nm": "streamer a", "sr": 1, "st": 5, "op": 49, "ip": 5, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ -157, -245, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ -100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 532, 582, 0 ], "ix": 2 }, "r": { "a": 0, "k": 167, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Shape 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": { "a": 0, "k": { "c": false, "i": [ [ 0, 0 ], [ -1.685, -13.314 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 0, -14.907 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 1.754, -14.206 ], [ -3.934, -9.465 ] ], "o": [ [ -3.895, 8.562 ], [ 1.872, 14.789 ], [ 0, 15.206 ], [ 0, 14.907 ], [ 0, 14.907 ], [ 0, 15.206 ], [ 0, 14.314 ], [ -1.803, 14.605 ], [ 0, 0 ] ], "v": [ [ -156.5, -406 ], [ -166.5, -367 ], [ -146.5, -327 ], [ -166.5, -286 ], [ -146.5, -246 ], [ -166.5, -206 ], [ -146.5, -165 ], [ -166.5, -127 ], [ -156.5, -84 ] ] }, "ix": 2 } }, { "ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 2, "ml": 1, "o": { "a": 0, "k": 100, "ix": 4 }, "w": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 4 ], "t": 5 }, { "s": [ 0.5 ], "t": 48 } ], "ix": 5 }, "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 3 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] }, { "ty": "tm", "bm": 0, "hd": false, "mn": "ADBE Vector Filter - Trim", "nm": "Trim Paths 1", "ix": 2, "e": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 5 }, { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 35 ], "t": 10 }, { "s": [ 100 ], "t": 48 } ], "ix": 2 }, "o": { "a": 0, "k": 0, "ix": 3 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 10 }, { "s": [ 100 ], "t": 48 } ], "ix": 1 }, "m": 1 } ], "ind": 2 }, { "ty": 4, "nm": "circle a", "sr": 1, "st": 1, "op": 159, "ip": 1, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 50, 100, 100 ], "t": 1 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 29 }, { "s": [ 100, 50, 100 ], "t": 128 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 838, 0 ], "t": 1, "ti": [ 46.667, 0, 0 ], "to": [ -30, -106.667, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 419.5, 198, 0 ], "t": 29, "ti": [ 0, 0, 0 ], "to": [ -46.667, 0, 0 ] }, { "s": [ 319.5, 838, 0 ], "t": 158 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 1 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 321.019 ], "t": 29 }, { "s": [ 1800 ], "t": 158 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Ellipse 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "el", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Ellipse", "nm": "Ellipse Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 3 }, { "ty": 4, "nm": "circle b", "sr": 1, "st": 3, "op": 129, "ip": 3, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 50, 100, 100 ], "t": 3 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 21 }, { "s": [ 100, 50, 100 ], "t": 98 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 838, 0 ], "t": 3, "ti": [ 66.667, 0, 0 ], "to": [ -26.667, -93.333, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 439.5, 278, 0 ], "t": 21, "ti": [ 0, 0, 0 ], "to": [ -66.667, 0, 0 ] }, { "s": [ 199.5, 838, 0 ], "t": 128 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 3 }, { "s": [ 1440 ], "t": 128 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Ellipse 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "el", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Ellipse", "nm": "Ellipse Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 4 }, { "ty": 4, "nm": "star a", "sr": 1, "st": 1, "op": 159, "ip": 1, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 50, 100, 100 ], "t": 1 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 31 }, { "s": [ 100, 50, 100 ], "t": 128 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 596.087, 836.292, 0 ], "t": 1, "ti": [ 52.765, 0, 0 ], "to": [ -36.098, -100, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 379.5, 236.292, 0 ], "t": 31, "ti": [ 0, 0, 0 ], "to": [ -52.765, 0, 0 ] }, { "s": [ 279.5, 836.292, 0 ], "t": 158 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 1 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 343.949 ], "t": 31 }, { "s": [ 1800 ], "t": 158 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Polystar 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sr", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Star", "nm": "Polystar Path 1", "ix": 1, "d": 1, "ir": { "a": 0, "k": 5, "ix": 6 }, "is": { "a": 0, "k": 0, "ix": 8 }, "pt": { "a": 0, "k": 5, "ix": 3 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 4 }, "or": { "a": 0, "k": 12, "ix": 7 }, "os": { "a": 0, "k": 0, "ix": 9 }, "r": { "a": 0, "k": 0, "ix": 5 }, "sy": 1 }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 5 }, { "ty": 4, "nm": "star b", "sr": 1, "st": 3, "op": 129, "ip": 3, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 50, 100, 100 ], "t": 3 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 23 }, { "s": [ 100, 50, 100 ], "t": 98 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 596.087, 836.292, 0 ], "t": 3, "ti": [ 66.098, 1.667, 0 ], "to": [ -39.431, -113.333, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 359.5, 156.292, 0 ], "t": 23, "ti": [ 0, 0, 0 ], "to": [ -66.098, -1.667, 0 ] }, { "s": [ 199.5, 826.292, 0 ], "t": 128 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 3 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 288 ], "t": 23 }, { "s": [ 1800 ], "t": 128 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Polystar 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sr", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Star", "nm": "Polystar Path 1", "ix": 1, "d": 1, "ir": { "a": 0, "k": 5, "ix": 6 }, "is": { "a": 0, "k": 0, "ix": 8 }, "pt": { "a": 0, "k": 5, "ix": 3 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 4 }, "or": { "a": 0, "k": 12, "ix": 7 }, "os": { "a": 0, "k": 0, "ix": 9 }, "r": { "a": 0, "k": 0, "ix": 5 }, "sy": 1 }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 6 }, { "ty": 4, "nm": "rec a", "sr": 1, "st": 0, "op": 219, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 50, 100, 100 ], "t": 0 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 33 }, { "s": [ 100, 50, 100 ], "t": 188 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 842, 0 ], "t": 0, "ti": [ 41.333, 1.333, 0 ], "to": [ -23.333, -100, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 459.5, 242, 0 ], "t": 33, "ti": [ 0, 0, 0 ], "to": [ -41.333, -1.333, 0 ] }, { "s": [ 351.5, 834, 0 ], "t": 218 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 0 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 381.468 ], "t": 33 }, { "s": [ 2520 ], "t": 218 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 8 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 1, 0.698, 0 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 7 }, { "ty": 4, "nm": "rec b", "sr": 1, "st": 2, "op": 192, "ip": 2, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 50, 100, 100 ], "t": 2 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 25 }, { "s": [ 100, 50, 100 ], "t": 161 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 842, 0 ], "t": 2, "ti": [ 74, 5, 0 ], "to": [ -23.333, -113.333, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 459.5, 162, 0 ], "t": 25, "ti": [ 0, 0, 0 ], "to": [ -74, -5, 0 ] }, { "s": [ 155.5, 812, 0 ], "t": 191 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 2 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 262.857 ], "t": 25 }, { "s": [ 2160 ], "t": 191 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 8 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 8 }, { "ty": 4, "nm": "square a", "sr": 1, "st": 0, "op": 219, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 50, 100, 100 ], "t": 0 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 35 }, { "s": [ 100, 50, 100 ], "t": 188 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 838, 0 ], "t": 0, "ti": [ 60, 0, 0 ], "to": [ -43.333, -123.333, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 339.5, 98, 0 ], "t": 35, "ti": [ 0, 0, 0 ], "to": [ -60, 0, 0 ] }, { "s": [ 239.5, 838, 0 ], "t": 218 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 0 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 462.385 ], "t": 35 }, { "s": [ 2880 ], "t": 218 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 9 }, { "ty": 4, "nm": "square b", "sr": 1, "st": 2, "op": 192, "ip": 2, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 50, 100, 100 ], "t": 2 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 27 }, { "s": [ 100, 50, 100 ], "t": 161 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 838, 0 ], "t": 2, "ti": [ 75, 3.333, 0 ], "to": [ -30, -120, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 419.5, 118, 0 ], "t": 27, "ti": [ 0, 0, 0 ], "to": [ -75, -3.333, 0 ] }, { "s": [ 149.5, 818, 0 ], "t": 191 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 2 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 285.714 ], "t": 27 }, { "s": [ 2160 ], "t": 191 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 10 }, { "ty": 4, "nm": "streamer b 2", "sr": 1, "st": 13, "op": 62, "ip": 13, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ -157, -245, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 543, 427, 0 ], "ix": 2 }, "r": { "a": 0, "k": 171, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Shape 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": { "a": 0, "k": { "c": false, "i": [ [ 0, 0 ], [ -1.685, -13.314 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 0, -14.907 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 1.754, -14.206 ], [ -3.934, -9.465 ] ], "o": [ [ -3.895, 8.562 ], [ 1.872, 14.789 ], [ 0, 15.206 ], [ 0, 14.907 ], [ 0, 14.907 ], [ 0, 15.206 ], [ 0, 14.314 ], [ -1.803, 14.605 ], [ 0, 0 ] ], "v": [ [ -156.5, -406 ], [ -166.5, -367 ], [ -146.5, -327 ], [ -166.5, -286 ], [ -146.5, -246 ], [ -166.5, -206 ], [ -146.5, -165 ], [ -166.5, -127 ], [ -156.5, -84 ] ] }, "ix": 2 } }, { "ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 2, "ml": 1, "o": { "a": 0, "k": 100, "ix": 4 }, "w": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 4 ], "t": 13 }, { "s": [ 0.5 ], "t": 61 } ], "ix": 5 }, "c": { "a": 0, "k": [ 1, 0.3608, 0.7216 ], "ix": 3 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] }, { "ty": "tm", "bm": 0, "hd": false, "mn": "ADBE Vector Filter - Trim", "nm": "Trim Paths 1", "ix": 2, "e": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 13 }, { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 35 ], "t": 18 }, { "s": [ 100 ], "t": 61 } ], "ix": 2 }, "o": { "a": 0, "k": 0, "ix": 3 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 18 }, { "s": [ 100 ], "t": 61 } ], "ix": 1 }, "m": 1 } ], "ind": 11 }, { "ty": 4, "nm": "streamer a 2", "sr": 1, "st": 10, "op": 54, "ip": 10, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ -157, -245, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ -100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 454, 444, 0 ], "ix": 2 }, "r": { "a": 0, "k": 151, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Shape 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": { "a": 0, "k": { "c": false, "i": [ [ 0, 0 ], [ -1.685, -13.314 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 0, -14.907 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 1.754, -14.206 ], [ -3.934, -9.465 ] ], "o": [ [ -3.895, 8.562 ], [ 1.872, 14.789 ], [ 0, 15.206 ], [ 0, 14.907 ], [ 0, 14.907 ], [ 0, 15.206 ], [ 0, 14.314 ], [ -1.803, 14.605 ], [ 0, 0 ] ], "v": [ [ -156.5, -406 ], [ -166.5, -367 ], [ -146.5, -327 ], [ -166.5, -286 ], [ -146.5, -246 ], [ -166.5, -206 ], [ -146.5, -165 ], [ -166.5, -127 ], [ -156.5, -84 ] ] }, "ix": 2 } }, { "ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 2, "ml": 1, "o": { "a": 0, "k": 100, "ix": 4 }, "w": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 4 ], "t": 10 }, { "s": [ 0.5 ], "t": 53 } ], "ix": 5 }, "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 3 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] }, { "ty": "tm", "bm": 0, "hd": false, "mn": "ADBE Vector Filter - Trim", "nm": "Trim Paths 1", "ix": 2, "e": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 10 }, { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 35 ], "t": 15 }, { "s": [ 100 ], "t": 53 } ], "ix": 2 }, "o": { "a": 0, "k": 0, "ix": 3 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 15 }, { "s": [ 100 ], "t": 53 } ], "ix": 1 }, "m": 1 } ], "ind": 12 }, { "ty": 4, "nm": "circle a 2", "sr": 1, "st": 1, "op": 192, "ip": 1, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0 }, "i": { "x": 0.667, "y": 1 }, "s": [ 100, 50, 100 ], "t": 1 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 100, 100 ], "t": 29 }, { "s": [ 50, 100, 100 ], "t": 161 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 838, 0 ], "t": 1, "ti": [ 56.667, -3.333, 0 ], "to": [ -53.333, -113.333, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 279.5, 158, 0 ], "t": 29, "ti": [ 0, 0, 0 ], "to": [ -56.667, 3.333, 0 ] }, { "s": [ 259.5, 858, 0 ], "t": 191 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 1 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ -371.368 ], "t": 29 }, { "s": [ -2520 ], "t": 191 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Ellipse 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "el", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Ellipse", "nm": "Ellipse Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 1, 0.698, 0 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 13 }, { "ty": 4, "nm": "circle b 2", "sr": 1, "st": 3, "op": 159, "ip": 3, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0 }, "i": { "x": 0.667, "y": 1 }, "s": [ 100, 50, 100 ], "t": 3 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 100, 100 ], "t": 21 }, { "s": [ 50, 100, 100 ], "t": 128 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 838, 0 ], "t": 3, "ti": [ 63, -7, 0 ], "to": [ -53.333, -100, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 279.5, 238, 0 ], "t": 21, "ti": [ 0, 0, 0 ], "to": [ -63, 7, 0 ] }, { "s": [ 221.5, 880, 0 ], "t": 158 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 3 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ -250.839 ], "t": 21 }, { "s": [ -2160 ], "t": 158 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Ellipse 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "el", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Ellipse", "nm": "Ellipse Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 14 }, { "ty": 4, "nm": "star a 2", "sr": 1, "st": 1, "op": 192, "ip": 1, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0 }, "i": { "x": 0.667, "y": 1 }, "s": [ 100, 50, 100 ], "t": 1 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 100, 100 ], "t": 31 }, { "s": [ 50, 100, 100 ], "t": 161 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 596.087, 836.292, 0 ], "t": 1, "ti": [ 42.765, -3.333, 0 ], "to": [ -9.431, -113.333, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 539.5, 156.292, 0 ], "t": 31, "ti": [ 0, 0, 0 ], "to": [ -42.765, 3.333, 0 ] }, { "s": [ 339.5, 856.292, 0 ], "t": 191 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 1 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ -397.895 ], "t": 31 }, { "s": [ -2520 ], "t": 191 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Polystar 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sr", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Star", "nm": "Polystar Path 1", "ix": 1, "d": 1, "ir": { "a": 0, "k": 5, "ix": 6 }, "is": { "a": 0, "k": 0, "ix": 8 }, "pt": { "a": 0, "k": 5, "ix": 3 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 4 }, "or": { "a": 0, "k": 12, "ix": 7 }, "os": { "a": 0, "k": 0, "ix": 9 }, "r": { "a": 0, "k": 0, "ix": 5 }, "sy": 1 }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 15 }, { "ty": 4, "nm": "star b 2", "sr": 1, "st": 3, "op": 159, "ip": 3, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0 }, "i": { "x": 0.667, "y": 1 }, "s": [ 100, 50, 100 ], "t": 3 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 100, 100 ], "t": 23 }, { "s": [ 50, 100, 100 ], "t": 128 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 596.087, 836.292, 0 ], "t": 3, "ti": [ 52.765, -3.333, 0 ], "to": [ -12.765, -96.667, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 519.5, 256.292, 0 ], "t": 23, "ti": [ 0, 0, 0 ], "to": [ -52.765, 3.333, 0 ] }, { "s": [ 279.5, 856.292, 0 ], "t": 158 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 3 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ -278.71 ], "t": 23 }, { "s": [ -2160 ], "t": 158 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Polystar 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sr", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Star", "nm": "Polystar Path 1", "ix": 1, "d": 1, "ir": { "a": 0, "k": 5, "ix": 6 }, "is": { "a": 0, "k": 0, "ix": 8 }, "pt": { "a": 0, "k": 5, "ix": 3 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 4 }, "or": { "a": 0, "k": 12, "ix": 7 }, "os": { "a": 0, "k": 0, "ix": 9 }, "r": { "a": 0, "k": 0, "ix": 5 }, "sy": 1 }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 16 }, { "ty": 4, "nm": "rec a 2", "sr": 1, "st": 0, "op": 129, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0 }, "i": { "x": 0.667, "y": 1 }, "s": [ 100, 50, 100 ], "t": 0 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 1 }, "s": [ 100, 100, 100 ], "t": 33 }, { "s": [ 100, 50, 100 ], "t": 98 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 842, 0 ], "t": 0, "ti": [ 66.667, 0, 0 ], "to": [ -16.667, -120, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 499.5, 122, 0 ], "t": 33, "ti": [ 0, 0, 0 ], "to": [ -66.667, 0, 0 ] }, { "s": [ 199.5, 842, 0 ], "t": 128 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 0 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ -556.875 ], "t": 33 }, { "s": [ -2160 ], "t": 128 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 8 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 17 }, { "ty": 4, "nm": "rec b 2", "sr": 1, "st": 2, "op": 219, "ip": 2, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0 }, "i": { "x": 0.667, "y": 1 }, "s": [ 100, 50, 100 ], "t": 2 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 100, 100 ], "t": 25 }, { "s": [ 50, 100, 100 ], "t": 188 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 842, 0 ], "t": 2, "ti": [ 2.877, -2.055, 0 ], "to": [ -22.62, -109.87, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 339.5, 262, 0 ], "t": 25, "ti": [ 0, 0, 0 ], "to": [ -51.333, 36.667, 0 ] }, { "s": [ 219.5, 862, 0 ], "t": 218 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 2 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ -306.667 ], "t": 25 }, { "s": [ -2880 ], "t": 218 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 8 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 1, 0.3608, 0.7216 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 18 }, { "ty": 4, "nm": "square a 2", "sr": 1, "st": 0, "op": 129, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0 }, "i": { "x": 0.667, "y": 1 }, "s": [ 100, 50, 100 ], "t": 0 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 100, 100 ], "t": 35 }, { "s": [ 50, 100, 100 ], "t": 98 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 838, 0 ], "t": 0, "ti": [ 36.667, 0, 0 ], "to": [ -20, -90, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 479.5, 298, 0 ], "t": 35, "ti": [ 0, 0, 0 ], "to": [ -36.667, 0, 0 ] }, { "s": [ 379.5, 838, 0 ], "t": 128 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 0 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ -590.625 ], "t": 35 }, { "s": [ -2160 ], "t": 128 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 19 }, { "ty": 4, "nm": "square b 2", "sr": 1, "st": 2, "op": 219, "ip": 2, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0 }, "i": { "x": 0.667, "y": 1 }, "s": [ 100, 50, 100 ], "t": 2 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 100, 100 ], "t": 27 }, { "s": [ 50, 100, 100 ], "t": 188 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 599.5, 838, 0 ], "t": 2, "ti": [ 50, 0, 0 ], "to": [ -10, -103.333, 0 ] }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 539.5, 218, 0 ], "t": 27, "ti": [ 0, 0, 0 ], "to": [ -50, 0, 0 ] }, { "s": [ 299.5, 838, 0 ], "t": 218 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.667, "y": 1 }, "s": [ 0 ], "t": 2 }, { "o": { "x": 0.333, "y": 0 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ -333.333 ], "t": 27 }, { "s": [ -2880 ], "t": 218 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 20 } ] }, { "nm": "", "id": "comp_2", "layers": [ { "ty": 0, "nm": "_small-side", "sr": 1, "st": 0, "op": 219, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 400, 400, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 260, 320, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "w": 800, "h": 800, "refId": "comp_1", "ind": 1 } ] }, { "nm": "", "id": "comp_3", "layers": [ { "ty": 0, "nm": "left", "sr": 1, "st": 13, "op": 313, "ip": 13, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 400, 400, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 400, 400, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "w": 800, "h": 800, "refId": "comp_4", "ind": 1 }, { "ty": 0, "nm": "right", "sr": 1, "st": 30, "op": 330, "ip": 30, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 400, 400, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ -100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 0, "k": [ 400, 400, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "w": 800, "h": 800, "refId": "comp_4", "ind": 2 } ] }, { "nm": "", "id": "comp_4", "layers": [ { "ty": 4, "nm": "streamer a 4", "sr": 1, "st": 13, "op": 174, "ip": 13, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ -157, -245, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ -100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 219.178, -190.096, 0 ], "t": 13, "ti": [ 167.333, -560.667, 0 ], "to": [ -95.333, 426.667, 0 ] }, { "s": [ 179.178, 989.904, 0 ], "t": 173 } ], "ix": 2 }, "r": { "a": 0, "k": 14, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Shape 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": { "a": 0, "k": { "c": false, "i": [ [ 0, 0 ], [ -1.685, -13.314 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 0, -14.907 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 1.754, -14.206 ], [ -3.934, -9.465 ] ], "o": [ [ -3.895, 8.562 ], [ 1.872, 14.789 ], [ 0, 15.206 ], [ 0, 14.907 ], [ 0, 14.907 ], [ 0, 15.206 ], [ 0, 14.314 ], [ -1.803, 14.605 ], [ 0, 0 ] ], "v": [ [ -156.5, -406 ], [ -166.5, -367 ], [ -146.5, -327 ], [ -166.5, -286 ], [ -146.5, -246 ], [ -166.5, -206 ], [ -146.5, -165 ], [ -166.5, -127 ], [ -156.5, -84 ] ] }, "ix": 2 } }, { "ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 1, "lj": 1, "ml": 4, "o": { "a": 0, "k": 100, "ix": 4 }, "w": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 4 ], "t": 13 }, { "s": [ 0.5 ], "t": 176 } ], "ix": 5 }, "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 3 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] }, { "ty": "tm", "bm": 0, "hd": false, "mn": "ADBE Vector Filter - Trim", "nm": "Trim Paths 1", "ix": 2, "e": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 13 }, { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 40 ], "t": 18 }, { "s": [ 100 ], "t": 176 } ], "ix": 2 }, "o": { "a": 0, "k": 0, "ix": 3 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 18 }, { "s": [ 100 ], "t": 176 } ], "ix": 1 }, "m": 1 } ], "ind": 1 }, { "ty": 4, "nm": "streamer b 4", "sr": 1, "st": 5, "op": 174, "ip": 5, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ -157, -245, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 269.863, -175.455, 0 ], "t": 5, "ti": [ 216, -599.333, 0 ], "to": [ -110, 415.333, 0 ] }, { "s": [ 69.863, 984.545, 0 ], "t": 173 } ], "ix": 2 }, "r": { "a": 0, "k": -1.458, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Shape 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": { "a": 0, "k": { "c": false, "i": [ [ 0, 0 ], [ -1.685, -13.314 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 0, -14.907 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 1.754, -14.206 ], [ -3.934, -9.465 ] ], "o": [ [ -3.895, 8.562 ], [ 1.872, 14.789 ], [ 0, 15.206 ], [ 0, 14.907 ], [ 0, 14.907 ], [ 0, 15.206 ], [ 0, 14.314 ], [ -1.803, 14.605 ], [ 0, 0 ] ], "v": [ [ -156.5, -406 ], [ -166.5, -367 ], [ -146.5, -327 ], [ -166.5, -286 ], [ -146.5, -246 ], [ -166.5, -206 ], [ -146.5, -165 ], [ -166.5, -127 ], [ -156.5, -84 ] ] }, "ix": 2 } }, { "ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 1, "lj": 1, "ml": 4, "o": { "a": 0, "k": 100, "ix": 4 }, "w": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 4 ], "t": 5 }, { "s": [ 0.5 ], "t": 173 } ], "ix": 5 }, "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 3 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] }, { "ty": "tm", "bm": 0, "hd": false, "mn": "ADBE Vector Filter - Trim", "nm": "Trim Paths 1", "ix": 2, "e": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 5 }, { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 40 ], "t": 10 }, { "s": [ 100 ], "t": 173 } ], "ix": 2 }, "o": { "a": 0, "k": 0, "ix": 3 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 10 }, { "s": [ 100 ], "t": 173 } ], "ix": 1 }, "m": 1 } ], "ind": 2 }, { "ty": 4, "nm": "circle a 4", "sr": 1, "st": -7, "op": 156, "ip": 8, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 50, 100, 100 ], "t": 8 }, { "s": [ 100, 50, 100 ], "t": 155 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 325.643, -26.292, 0 ], "t": 8, "ti": [ 15.333, -507.667, 0 ], "to": [ -101.333, 75.667, 0 ] }, { "s": [ 125.643, 835.708, 0 ], "t": 155 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 8 }, { "s": [ 1800 ], "t": 155 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Ellipse 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "el", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Ellipse", "nm": "Ellipse Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 3 }, { "ty": 4, "nm": "circle b 4", "sr": 1, "st": -13, "op": 216, "ip": 2, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 50, 100, 100 ], "t": 2 }, { "s": [ 100, 50, 100 ], "t": 215 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 619.5, -26.292, 0 ], "t": 2, "ti": [ -2, -497.667, 0 ], "to": [ -138, 77.667, 0 ] }, { "s": [ 259.5, 835.708, 0 ], "t": 215 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 2 }, { "s": [ 2520 ], "t": 215 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Ellipse 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "el", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Ellipse", "nm": "Ellipse Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 4 }, { "ty": 4, "nm": "star a 4", "sr": 1, "st": -9, "op": 246, "ip": 6, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 50, 100, 100 ], "t": 6 }, { "s": [ 100, 50, 100 ], "t": 245 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 376.929, -28, 0 ], "t": 6, "ti": [ 173.333, -127.667, 0 ], "to": [ -213.333, 157.667, 0 ] }, { "s": [ 116.929, 834, 0 ], "t": 245 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 6 }, { "s": [ 2880 ], "t": 245 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Polystar 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sr", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Star", "nm": "Polystar Path 1", "ix": 1, "d": 1, "ir": { "a": 0, "k": 5, "ix": 6 }, "is": { "a": 0, "k": 0, "ix": 8 }, "pt": { "a": 0, "k": 5, "ix": 3 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 4 }, "or": { "a": 0, "k": 12, "ix": 7 }, "os": { "a": 0, "k": 0, "ix": 9 }, "r": { "a": 0, "k": 0, "ix": 5 }, "sy": 1 }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 5 }, { "ty": 4, "nm": "star b 4", "sr": 1, "st": -13, "op": 126, "ip": 2, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 50, 100, 100 ], "t": 2 }, { "s": [ 100, 50, 100 ], "t": 125 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 171.786, -28, 0 ], "t": 2, "ti": [ -161.333, -275.667, 0 ], "to": [ 0, 0, 0 ] }, { "s": [ 251.786, 834, 0 ], "t": 125 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 2 }, { "s": [ 1800 ], "t": 125 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Polystar 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sr", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Star", "nm": "Polystar Path 1", "ix": 1, "d": 1, "ir": { "a": 0, "k": 5, "ix": 6 }, "is": { "a": 0, "k": 0, "ix": 8 }, "pt": { "a": 0, "k": 5, "ix": 3 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 4 }, "or": { "a": 0, "k": 12, "ix": 7 }, "os": { "a": 0, "k": 0, "ix": 9 }, "r": { "a": 0, "k": 0, "ix": 5 }, "sy": 1 }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 6 }, { "ty": 4, "nm": "rec a 4", "sr": 1, "st": -11, "op": 186, "ip": 4, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 50, 100, 100 ], "t": 4 }, { "s": [ 100, 50, 100 ], "t": 185 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 428.214, -22.292, 0 ], "t": 4, "ti": [ -130.667, -315.667, 0 ], "to": [ -167.333, 119.667, 0 ] }, { "s": [ 228.214, 839.708, 0 ], "t": 185 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 4 }, { "s": [ 2520 ], "t": 185 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 8 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 1, 0.698, 0 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 7 }, { "ty": 4, "nm": "rec b 4", "sr": 1, "st": -9, "op": 246, "ip": 6, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 50, 100, 100 ], "t": 6 }, { "s": [ 100, 50, 100 ], "t": 245 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 223.071, -22.292, 0 ], "t": 6, "ti": [ -92.571, -383.708, 0 ], "to": [ 0, 0, 0 ] }, { "s": [ 223.071, 839.708, 0 ], "t": 245 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 6 }, { "s": [ 2880 ], "t": 245 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 8 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 8 }, { "ty": 4, "nm": "square a 4", "sr": 1, "st": -11, "op": 218, "ip": 4, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 50, 100, 100 ], "t": 4 }, { "s": [ 100, 50, 100 ], "t": 217 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 120.5, -26.292, 0 ], "t": 4, "ti": [ 52.221, -418.892, 0 ], "to": [ 13, 430.305, 0 ] }, { "s": [ 198.5, 833.708, 0 ], "t": 217 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 4 }, { "s": [ 2520 ], "t": 217 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 9 }, { "ty": 4, "nm": "square b 4", "sr": 1, "st": -7, "op": 216, "ip": 8, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 50, 100, 100 ], "t": 8 }, { "s": [ 100, 50, 100 ], "t": 215 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 274.357, -26.292, 0 ], "t": 8, "ti": [ 22.667, -253.667, 0 ], "to": [ 157.333, 415.667, 0 ] }, { "s": [ 114.357, 835.708, 0 ], "t": 215 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 8 }, { "s": [ 2520 ], "t": 215 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 10 }, { "ty": 4, "nm": "streamer a 3", "sr": 1, "st": 0, "op": 186, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ -157, -245, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ -100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 275.178, -173.096, 0 ], "t": 0, "ti": [ 177.333, -643.333, 0 ], "to": [ -87.333, 413.333, 0 ] }, { "s": [ 219.178, 974.904, 0 ], "t": 185 } ], "ix": 2 }, "r": { "a": 0, "k": 3, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Shape 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": { "a": 0, "k": { "c": false, "i": [ [ 0, 0 ], [ -1.685, -13.314 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 0, -14.907 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 1.754, -14.206 ], [ -3.934, -9.465 ] ], "o": [ [ -3.895, 8.562 ], [ 1.872, 14.789 ], [ 0, 15.206 ], [ 0, 14.907 ], [ 0, 14.907 ], [ 0, 15.206 ], [ 0, 14.314 ], [ -1.803, 14.605 ], [ 0, 0 ] ], "v": [ [ -156.5, -406 ], [ -166.5, -367 ], [ -146.5, -327 ], [ -166.5, -286 ], [ -146.5, -246 ], [ -166.5, -206 ], [ -146.5, -165 ], [ -166.5, -127 ], [ -156.5, -84 ] ] }, "ix": 2 } }, { "ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 2, "ml": 1, "o": { "a": 0, "k": 100, "ix": 4 }, "w": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 4 ], "t": 0 }, { "s": [ 0.5 ], "t": 177 } ], "ix": 5 }, "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 3 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] }, { "ty": "tm", "bm": 0, "hd": false, "mn": "ADBE Vector Filter - Trim", "nm": "Trim Paths 1", "ix": 2, "e": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 0 }, { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 40 ], "t": 5 }, { "s": [ 100 ], "t": 177 } ], "ix": 2 }, "o": { "a": 0, "k": 0, "ix": 3 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 5 }, { "s": [ 100 ], "t": 177 } ], "ix": 1 }, "m": 1 } ], "ind": 11 }, { "ty": 4, "nm": "streamer b 3", "sr": 1, "st": 11, "op": 218, "ip": 11, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ -157, -245, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100, 100 ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 199.863, 74.545, 0 ], "t": 11, "ti": [ 179.333, -430.667, 0 ], "to": [ -13.363, 405.455, 0 ] }, { "s": [ 139.863, 834.545, 0 ], "t": 217 } ], "ix": 2 }, "r": { "a": 0, "k": 9, "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Shape 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": { "a": 0, "k": { "c": false, "i": [ [ 0, 0 ], [ -1.685, -13.314 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 0, -14.907 ], [ 0, -14.907 ], [ 0, -15.206 ], [ 1.754, -14.206 ], [ -3.934, -9.465 ] ], "o": [ [ -3.895, 8.562 ], [ 1.872, 14.789 ], [ 0, 15.206 ], [ 0, 14.907 ], [ 0, 14.907 ], [ 0, 15.206 ], [ 0, 14.314 ], [ -1.803, 14.605 ], [ 0, 0 ] ], "v": [ [ -156.5, -406 ], [ -166.5, -367 ], [ -146.5, -327 ], [ -166.5, -286 ], [ -146.5, -246 ], [ -166.5, -206 ], [ -146.5, -165 ], [ -166.5, -127 ], [ -156.5, -84 ] ] }, "ix": 2 } }, { "ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 2, "ml": 1, "o": { "a": 0, "k": 100, "ix": 4 }, "w": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 4 ], "t": 11 }, { "s": [ 0.5 ], "t": 199 } ], "ix": 5 }, "c": { "a": 0, "k": [ 1, 0.3608, 0.7216 ], "ix": 3 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] }, { "ty": "tm", "bm": 0, "hd": false, "mn": "ADBE Vector Filter - Trim", "nm": "Trim Paths 1", "ix": 2, "e": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 11 }, { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 40 ], "t": 16 }, { "s": [ 100 ], "t": 199 } ], "ix": 2 }, "o": { "a": 0, "k": 0, "ix": 3 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 16 }, { "s": [ 100 ], "t": 199 } ], "ix": 1 }, "m": 1 } ], "ind": 12 }, { "ty": 4, "nm": "circle a 3", "sr": 1, "st": -13, "op": 126, "ip": 2, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 50, 100 ], "t": 2 }, { "s": [ 50, 100, 100 ], "t": 125 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 365.643, -26.292, 0 ], "t": 2, "ti": [ 15.333, -507.667, 0 ], "to": [ -101.333, 75.667, 0 ] }, { "s": [ 165.643, 835.708, 0 ], "t": 125 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 2 }, { "s": [ -1800 ], "t": 125 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Ellipse 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "el", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Ellipse", "nm": "Ellipse Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 1, 0.698, 0 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 13 }, { "ty": 4, "nm": "circle b 3", "sr": 1, "st": -7, "op": 246, "ip": 8, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 50, 100 ], "t": 8 }, { "s": [ 50, 100, 100 ], "t": 245 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 519.5, -26.292, 0 ], "t": 8, "ti": [ -2, -497.667, 0 ], "to": [ -138, 77.667, 0 ] }, { "s": [ 159.5, 835.708, 0 ], "t": 245 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 8 }, { "s": [ -2880 ], "t": 245 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Ellipse 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "el", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Ellipse", "nm": "Ellipse Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 14 }, { "ty": 4, "nm": "star a 3", "sr": 1, "st": -9, "op": 246, "ip": 6, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 50, 100 ], "t": 6 }, { "s": [ 50, 100, 100 ], "t": 245 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 416.929, -28, 0 ], "t": 6, "ti": [ 173.333, -127.667, 0 ], "to": [ -213.333, 157.667, 0 ] }, { "s": [ 156.929, 834, 0 ], "t": 245 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 6 }, { "s": [ -2880 ], "t": 245 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Polystar 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sr", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Star", "nm": "Polystar Path 1", "ix": 1, "d": 1, "ir": { "a": 0, "k": 5, "ix": 6 }, "is": { "a": 0, "k": 0, "ix": 8 }, "pt": { "a": 0, "k": 5, "ix": 3 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 4 }, "or": { "a": 0, "k": 12, "ix": 7 }, "os": { "a": 0, "k": 0, "ix": 9 }, "r": { "a": 0, "k": 0, "ix": 5 }, "sy": 1 }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 15 }, { "ty": 4, "nm": "star b 3", "sr": 1, "st": -7, "op": 156, "ip": 8, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 50, 100 ], "t": 8 }, { "s": [ 50, 100, 100 ], "t": 155 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 211.786, -28, 0 ], "t": 8, "ti": [ -161.333, -275.667, 0 ], "to": [ 0, 0, 0 ] }, { "s": [ 291.786, 834, 0 ], "t": 155 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 8 }, { "s": [ -2160 ], "t": 155 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Polystar 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "sr", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Star", "nm": "Polystar Path 1", "ix": 1, "d": 1, "ir": { "a": 0, "k": 5, "ix": 6 }, "is": { "a": 0, "k": 0, "ix": 8 }, "pt": { "a": 0, "k": 5, "ix": 3 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 4 }, "or": { "a": 0, "k": 12, "ix": 7 }, "os": { "a": 0, "k": 0, "ix": 9 }, "r": { "a": 0, "k": 0, "ix": 5 }, "sy": 1 }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 16 }, { "ty": 4, "nm": "rec a 3", "sr": 1, "st": -11, "op": 186, "ip": 4, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 50, 100 ], "t": 4 }, { "s": [ 50, 100, 100 ], "t": 185 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 468.214, -22.292, 0 ], "t": 4, "ti": [ -130.667, -315.667, 0 ], "to": [ -167.333, 119.667, 0 ] }, { "s": [ 268.214, 839.708, 0 ], "t": 185 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 4 }, { "s": [ -2160 ], "t": 185 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 8 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0, 0.9137, 0.9882 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 17 }, { "ty": 4, "nm": "rec b 3", "sr": 1, "st": -9, "op": 246, "ip": 6, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 50, 100 ], "t": 6 }, { "s": [ 50, 100, 100 ], "t": 245 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 263.071, -22.292, 0 ], "t": 6, "ti": [ -114.571, -267.708, 0 ], "to": [ 0, 143.667, 0 ] }, { "s": [ 263.071, 839.708, 0 ], "t": 245 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 6 }, { "s": [ -2880 ], "t": 245 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 8 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 1, 0.3608, 0.7216 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 18 }, { "ty": 4, "nm": "square a 3", "sr": 1, "st": -13, "op": 218, "ip": 2, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 50, 100 ], "t": 2 }, { "s": [ 50, 100, 100 ], "t": 217 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 160.5, -26.292, 0 ], "t": 2, "ti": [ 52.221, -418.892, 0 ], "to": [ 13, 430.305, 0 ] }, { "s": [ 238.5, 833.708, 0 ], "t": 217 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 2 }, { "s": [ -2520 ], "t": 217 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 19 }, { "ty": 4, "nm": "square b 3", "sr": 1, "st": -11, "op": 186, "ip": 4, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": { "a": { "a": 0, "k": [ 0, 0, 0 ], "ix": 1 }, "s": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 100, 50, 100 ], "t": 4 }, { "s": [ 50, 100, 100 ], "t": 185 } ], "ix": 6 }, "sk": { "a": 0, "k": 0 }, "p": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 314.357, -26.292, 0 ], "t": 4, "ti": [ 22.667, -253.667, 0 ], "to": [ 157.333, 415.667, 0 ] }, { "s": [ 154.357, 835.708, 0 ], "t": 185 } ], "ix": 2 }, "r": { "a": 1, "k": [ { "o": { "x": 0.167, "y": 0.167 }, "i": { "x": 0.833, "y": 0.833 }, "s": [ 0 ], "t": 4 }, { "s": [ -2160 ], "t": 185 } ], "ix": 10 }, "sa": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 50, "ix": 11 } }, "ef": [], "shapes": [ { "ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Rectangle 1", "ix": 1, "cix": 2, "np": 2, "it": [ { "ty": "rc", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Rect", "nm": "Rectangle Path 1", "d": 1, "p": { "a": 0, "k": [ 0, 0 ], "ix": 3 }, "r": { "a": 0, "k": 0, "ix": 4 }, "s": { "a": 0, "k": [ 16, 16 ], "ix": 2 } }, { "ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": { "a": 0, "k": [ 0.3961, 0.2902, 0.9255 ], "ix": 4 }, "r": 1, "o": { "a": 0, "k": 100, "ix": 5 } }, { "ty": "tr", "a": { "a": 0, "k": [ 0, 0 ], "ix": 1 }, "s": { "a": 0, "k": [ 100, 100 ], "ix": 3 }, "sk": { "a": 0, "k": 0, "ix": 4 }, "p": { "a": 0, "k": [ 0, 0 ], "ix": 2 }, "r": { "a": 0, "k": 0, "ix": 6 }, "sa": { "a": 0, "k": 0, "ix": 5 }, "o": { "a": 0, "k": 100, "ix": 7 } } ] } ], "ind": 20 } ] } ] } ================================================ FILE: apps/builder/src/components/Guide/index.tsx ================================================ import { Global } from "@emotion/react" import { isCloudVersion } from "@illa-public/utils" import { FC, RefObject, useEffect, useRef, useState } from "react" import { createPortal } from "react-dom" import { useSelector } from "react-redux" import { GuideDraggablePopover } from "@/components/Guide/GuideDraggablePopover" import { GuidePoint } from "@/components/Guide/GuidePoint" import { GuideSuccess } from "@/components/Guide/GuideSuccess" import { WidgetStepMask } from "@/components/Guide/WidgetStepMask" import { actionShiftStyle, applyGuideStyle, shiftStyle, } from "@/components/Guide/style" import { GUIDE_STEP } from "@/config/guide/config" import { getCurrentStep } from "@/redux/guide/guideSelector" import GuideCreateApp from "./GuideCreateApp" export interface GuideProps { canvasRef: RefObject } export const Guide: FC = (props) => { const { canvasRef } = props const currentStep = useSelector(getCurrentStep) const [firstStepElement, setFirstStepElement] = useState() const { selector } = GUIDE_STEP[currentStep] const postgresqlQuery = document.querySelector(".postgresql1-query") const currentElement = selector && document.querySelector(selector) const timeout = useRef() useEffect(() => { // get first step element if (currentStep === 0 && selector) { timeout.current = window.setTimeout(() => { const element = document.querySelector(selector) setFirstStepElement(element) }, 10) } return () => { window.clearTimeout(timeout.current) } }, [currentStep, selector]) return ( <> {canvasRef.current?.children?.[0] && createPortal( , canvasRef.current.children[0], )} {/* widget tip */} {currentStep === 0 && firstStepElement && ( <> {createPortal(, firstStepElement)} )} {/* action tip */} {(currentStep === 3 || currentStep === 4) && postgresqlQuery && ( )} {currentStep === 3 && postgresqlQuery && createPortal(, postgresqlQuery)} {currentStep === 11 && currentElement && ( )} {(currentStep === 4 || currentStep === 5 || currentStep === 7) && currentElement && createPortal(, currentElement)} {/* success tip */} {currentStep === 12 && } {currentStep === 12 && currentElement ? ( isCloudVersion ? ( ) : ( ) ) : null} ) } Guide.displayName = "Guide" ================================================ FILE: apps/builder/src/components/Guide/style.ts ================================================ import { css } from "@emotion/react" import { GUIDE_SELECT_WIDGET, SELECT_WIDGET_ITEM } from "@/config/guide/config" const applyHighlightStyle = (currentStep: number) => css` [data-onboarding-session="COMMON"] { ${GUIDE_SELECT_WIDGET.slice(currentStep).map((widget) => { const { highlightIcon } = SELECT_WIDGET_ITEM[widget] return css` [data-onboarding-icon=${widget}] { content: url(${highlightIcon}); } ` })} } ` export const applyGuideStyle = (currentStep: number) => { switch (currentStep) { case 0: case 1: case 2: return applyHighlightStyle(currentStep) default: return css`` } } export const shiftStyle = css` top: -15px; ` export const actionShiftStyle = css` left: 84px; ` ================================================ FILE: apps/builder/src/components/ILLAMarkdown/index.tsx ================================================ import { FC } from "react" import ReactMarkdown from "react-markdown" import remarkGfm from "remark-gfm" import { Link } from "@illa-design/react" import { ILLAMarkdownProps } from "@/components/ILLAMarkdown/interface" import { applyMarkdownPStyle } from "./style" export const ILLAMarkdown: FC = (props) => { const { textString, textColor = "white", urlColor = "white" } = props return ( ( {aProps.children} ), p: ({ children }) => ( {children} ), }} > {textString ?? ""} ) } ILLAMarkdown.displayName = "ILLAMarkdown" ================================================ FILE: apps/builder/src/components/ILLAMarkdown/interface.ts ================================================ export interface ILLAMarkdownProps { textString?: string textColor?: string urlColor?: string } ================================================ FILE: apps/builder/src/components/ILLAMarkdown/style.ts ================================================ import { css } from "@emotion/react" import { getSpecialThemeColor } from "@illa-design/react" export const applyMarkdownPStyle = (textColorScheme: string) => css` color: ${getSpecialThemeColor(textColorScheme)}; font-size: 14px; white-space: break-spaces; word-break: break-all; ` ================================================ FILE: apps/builder/src/components/Iframe/index.tsx ================================================ import { FC, IframeHTMLAttributes, useState } from "react" import { Loading } from "@illa-design/react" import { loadingStyle } from "./style" export const Iframe: FC> = (props) => { const [isLoading, setIsLoading] = useState(true) const onLoad = () => { setIsLoading(false) } return ( <> {isLoading && (
)}