Repository: hyperdxio/hyperdx Branch: main Commit: 470b2c29920b Files: 811 Total size: 15.6 MB Directory structure: gitextract_nt5keqv5/ ├── .changeset/ │ ├── README.md │ ├── config.json │ └── fast-plants-peel.md ├── .claude/ │ ├── agents/ │ │ ├── playwright-test-generator.md │ │ ├── playwright-test-healer.md │ │ └── playwright-test-planner.md │ └── skills/ │ └── playwright/ │ └── SKILL.md ├── .cursor/ │ ├── mcp.json │ └── rules/ │ └── playwright.mdc ├── .gitattributes ├── .github/ │ ├── pull_request_template.md │ └── workflows/ │ ├── claude-code-review.yml │ ├── claude.yml │ ├── e2e-tests.yml │ ├── main.yml │ ├── push.yml │ ├── pushv1.yml │ ├── release-nightly.yml │ ├── release.yml │ └── security-audit.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .kodiak.toml ├── .mcp.json ├── .nvmrc ├── .opencode/ │ └── commands/ │ ├── do-linear.md │ └── plan-linear.md ├── .prettierignore ├── .prettierrc ├── .vex/ │ └── openssl-mongodb.vex.json ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── .yarn/ │ └── releases/ │ ├── yarn-1.22.18.cjs │ └── yarn-4.5.1.cjs ├── .yarnrc.yml ├── AGENTS.md ├── CLAUDE.md ├── CONTRIBUTING.md ├── DEPLOY.md ├── LICENSE ├── LOCAL.md ├── Makefile ├── README.md ├── agent_docs/ │ ├── README.md │ ├── architecture.md │ ├── code_style.md │ ├── development.md │ └── tech_stack.md ├── docker/ │ ├── clickhouse/ │ │ └── local/ │ │ ├── config.xml │ │ ├── init-db-e2e.sh │ │ └── users.xml │ ├── hostmetrics/ │ │ ├── Dockerfile │ │ └── config.dev.yaml │ ├── hyperdx/ │ │ ├── Dockerfile │ │ ├── build.sh │ │ ├── clickhouseConfig.xml │ │ ├── entry.local.auth.sh │ │ ├── entry.local.base.sh │ │ ├── entry.local.noauth.sh │ │ └── entry.prod.sh │ ├── nginx/ │ │ ├── README.md │ │ └── nginx.conf │ └── otel-collector/ │ ├── Dockerfile │ ├── config.standalone.auth.yaml │ ├── config.standalone.yaml │ ├── config.yaml │ ├── custom.config.yaml │ ├── entrypoint.sh │ ├── log-tailer.sh │ ├── schema/ │ │ ├── README.md │ │ └── seed/ │ │ ├── 00001_create_database.sql │ │ ├── 00002_otel_logs.sql │ │ ├── 00003_otel_metrics.sql │ │ ├── 00004_hyperdx_sessions.sql │ │ └── 00005_otel_traces.sql │ └── supervisor_docker.yaml.tmpl ├── docker-compose.ci.yml ├── docker-compose.dev.yml ├── docker-compose.yml ├── nx.json ├── package.json ├── packages/ │ ├── api/ │ │ ├── .Dockerignore │ │ ├── .spectral.yaml │ │ ├── CHANGELOG.md │ │ ├── Dockerfile │ │ ├── bin/ │ │ │ └── hyperdx │ │ ├── docs/ │ │ │ └── auto_provision/ │ │ │ └── AUTO_PROVISION.md │ │ ├── eslint.config.mjs │ │ ├── jest.config.js │ │ ├── jest.setup.ts │ │ ├── migrate-mongo-config.ts │ │ ├── migrations/ │ │ │ ├── ch/ │ │ │ │ ├── 000001_add_is_delta_n_is_monotonic_fields_to_metric_stream_table.down.sql │ │ │ │ └── 000001_add_is_delta_n_is_monotonic_fields_to_metric_stream_table.up.sql │ │ │ └── mongo/ │ │ │ └── 20231130053610-add_accessKey_field_to_user_collection.ts │ │ ├── nodemon.json │ │ ├── openapi.json │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── generate-api-docs.ts │ │ ├── src/ │ │ │ ├── api-app.ts │ │ │ ├── clickhouse/ │ │ │ │ └── __tests__/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── renderChartConfig.test.ts.snap │ │ │ │ ├── clickhouse.V1_DEPRECATED_test.ts │ │ │ │ └── renderChartConfig.test.ts │ │ │ ├── config.ts │ │ │ ├── controllers/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── alertHistory.test.ts │ │ │ │ │ └── team.test.ts │ │ │ │ ├── ai.ts │ │ │ │ ├── alertHistory.ts │ │ │ │ ├── alerts.ts │ │ │ │ ├── connection.ts │ │ │ │ ├── dashboard.ts │ │ │ │ ├── presetDashboardFilters.ts │ │ │ │ ├── savedSearch.ts │ │ │ │ ├── sources.ts │ │ │ │ ├── team.ts │ │ │ │ └── user.ts │ │ │ ├── fixtures.ts │ │ │ ├── index.ts │ │ │ ├── middleware/ │ │ │ │ ├── auth.ts │ │ │ │ ├── cors.ts │ │ │ │ ├── error.ts │ │ │ │ └── validation.ts │ │ │ ├── models/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── index.test.ts │ │ │ │ ├── alert.ts │ │ │ │ ├── alertHistory.ts │ │ │ │ ├── connection.ts │ │ │ │ ├── dashboard.ts │ │ │ │ ├── index.ts │ │ │ │ ├── presetDashboardFilter.ts │ │ │ │ ├── savedSearch.ts │ │ │ │ ├── source.ts │ │ │ │ ├── team.ts │ │ │ │ ├── teamInvite.ts │ │ │ │ ├── user.ts │ │ │ │ └── webhook.ts │ │ │ ├── opamp/ │ │ │ │ ├── README.md │ │ │ │ ├── app.ts │ │ │ │ ├── controllers/ │ │ │ │ │ └── opampController.ts │ │ │ │ ├── models/ │ │ │ │ │ └── agent.ts │ │ │ │ ├── proto/ │ │ │ │ │ ├── anyvalue.proto │ │ │ │ │ └── opamp.proto │ │ │ │ ├── services/ │ │ │ │ │ └── agentService.ts │ │ │ │ └── utils/ │ │ │ │ └── protobuf.ts │ │ │ ├── routers/ │ │ │ │ ├── api/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── alerts.test.ts │ │ │ │ │ │ ├── dashboard.test.ts │ │ │ │ │ │ ├── savedSearch.test.ts │ │ │ │ │ │ ├── sources.test.ts │ │ │ │ │ │ ├── team.test.ts │ │ │ │ │ │ └── webhooks.test.ts │ │ │ │ │ ├── ai.ts │ │ │ │ │ ├── alerts.ts │ │ │ │ │ ├── clickhouseProxy.ts │ │ │ │ │ ├── connections.ts │ │ │ │ │ ├── dashboards.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── me.ts │ │ │ │ │ ├── root.ts │ │ │ │ │ ├── savedSearch.ts │ │ │ │ │ ├── sources.ts │ │ │ │ │ ├── team.ts │ │ │ │ │ └── webhooks.ts │ │ │ │ └── external-api/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── alerts.test.ts │ │ │ │ │ ├── charts.test.ts │ │ │ │ │ ├── dashboards.test.ts │ │ │ │ │ ├── sources.test.ts │ │ │ │ │ ├── v2.test.ts │ │ │ │ │ └── webhooks.test.ts │ │ │ │ └── v2/ │ │ │ │ ├── alerts.ts │ │ │ │ ├── charts.ts │ │ │ │ ├── dashboards.ts │ │ │ │ ├── index.ts │ │ │ │ ├── sources.ts │ │ │ │ ├── utils/ │ │ │ │ │ └── dashboards.ts │ │ │ │ └── webhooks.ts │ │ │ ├── server.ts │ │ │ ├── setupDefaults.ts │ │ │ ├── tasks/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── types.test.ts │ │ │ │ │ └── util.test.ts │ │ │ │ ├── checkAlerts/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── checkAlerts.test.ts │ │ │ │ │ │ ├── checkAlertsTask.test.ts │ │ │ │ │ │ └── singleInvocationAlert.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── providers/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── default.test.ts │ │ │ │ │ │ ├── default.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── template.ts │ │ │ │ ├── index.ts │ │ │ │ ├── metrics.ts │ │ │ │ ├── pingPongTask.ts │ │ │ │ ├── tracer.ts │ │ │ │ ├── types.ts │ │ │ │ ├── usageStats.ts │ │ │ │ └── util.ts │ │ │ └── utils/ │ │ │ ├── __tests__/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── logParser.test.ts.snap │ │ │ │ ├── common.test.ts │ │ │ │ ├── enhancedErrors.test.ts │ │ │ │ ├── errors.test.ts │ │ │ │ ├── externalApi.test.ts │ │ │ │ ├── logParser.test.ts │ │ │ │ └── validators.test.ts │ │ │ ├── common.ts │ │ │ ├── email.ts │ │ │ ├── enhancedErrors.ts │ │ │ ├── errors.ts │ │ │ ├── externalApi.ts │ │ │ ├── logParser.ts │ │ │ ├── logger.ts │ │ │ ├── passport.ts │ │ │ ├── queue.ts │ │ │ ├── rateLimiter.ts │ │ │ ├── serialization.ts │ │ │ ├── slack.ts │ │ │ ├── swagger.ts │ │ │ ├── validators.ts │ │ │ └── zod.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── app/ │ │ ├── .Dockerignore │ │ ├── .gitignore │ │ ├── .storybook/ │ │ │ ├── main.ts │ │ │ ├── preview-head.html │ │ │ ├── preview.tsx │ │ │ └── public/ │ │ │ └── mockServiceWorker.js │ │ ├── .stylelintignore │ │ ├── CHANGELOG.md │ │ ├── Dockerfile │ │ ├── eslint.config.mjs │ │ ├── global-setup.js │ │ ├── jest.config.js │ │ ├── knip.json │ │ ├── mdx.d.ts │ │ ├── next.config.mjs │ │ ├── package.json │ │ ├── pages/ │ │ │ ├── 404.tsx │ │ │ ├── _app.tsx │ │ │ ├── _document.tsx │ │ │ ├── _error.tsx │ │ │ ├── alerts.tsx │ │ │ ├── api/ │ │ │ │ ├── [...all].ts │ │ │ │ └── config.ts │ │ │ ├── benchmark.tsx │ │ │ ├── careers.tsx │ │ │ ├── chart.tsx │ │ │ ├── clickhouse.tsx │ │ │ ├── dashboards/ │ │ │ │ ├── [dashboardId].tsx │ │ │ │ ├── import.tsx │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ ├── join-team.tsx │ │ │ ├── kubernetes.tsx │ │ │ ├── login/ │ │ │ │ └── index.tsx │ │ │ ├── register.tsx │ │ │ ├── search/ │ │ │ │ ├── [savedSearchId].tsx │ │ │ │ └── index.tsx │ │ │ ├── service-map.tsx │ │ │ ├── services.tsx │ │ │ ├── sessions.tsx │ │ │ └── team/ │ │ │ └── index.tsx │ │ ├── playwright.config.ts │ │ ├── postcss.config.cjs │ │ ├── public/ │ │ │ ├── drain3-0.9.11-py3-none-any.whl │ │ │ ├── jsonpickle-4.1.1-py3-none-any.whl │ │ │ └── pyodide/ │ │ │ ├── cachetools-5.3.3-py3-none-any.whl │ │ │ ├── micropip-0.8.0-py3-none-any.whl │ │ │ ├── packaging-24.2-py3-none-any.whl │ │ │ ├── pyodide-lock.json │ │ │ ├── pyodide.asm.js │ │ │ ├── pyodide.asm.wasm │ │ │ └── pyodide.js │ │ ├── scripts/ │ │ │ ├── move-to-clickhouse.js │ │ │ ├── prepare-clickhouse-build-export.js │ │ │ └── run-e2e.js │ │ ├── src/ │ │ │ ├── AlertsPage.tsx │ │ │ ├── AuthLoadingBlocker.tsx │ │ │ ├── AuthPage.tsx │ │ │ ├── BenchmarkPage.tsx │ │ │ ├── CareersPage.tsx │ │ │ ├── ChartUtils.tsx │ │ │ ├── Checkbox.tsx │ │ │ ├── ClickhousePage.tsx │ │ │ ├── Clipboard.tsx │ │ │ ├── DBChartPage.tsx │ │ │ ├── DBDashboardImportPage.tsx │ │ │ ├── DBDashboardPage.tsx │ │ │ ├── DBSearchPage.tsx │ │ │ ├── DBSearchPageAlertModal.tsx │ │ │ ├── DBServiceMapPage.tsx │ │ │ ├── DOMPlayer.tsx │ │ │ ├── DashboardFilters.tsx │ │ │ ├── DashboardFiltersModal.tsx │ │ │ ├── GranularityPicker.tsx │ │ │ ├── HDXMarkdownChart.tsx │ │ │ ├── HDXMultiSeriesTableChart.stories.tsx │ │ │ ├── HDXMultiSeriesTableChart.tsx │ │ │ ├── HDXMultiSeriesTimeChart.tsx │ │ │ ├── InstallInstructionsModal.tsx │ │ │ ├── JoinTeamPage.tsx │ │ │ ├── KubernetesDashboardPage.tsx │ │ │ ├── LandingHeader.tsx │ │ │ ├── LandingPage.tsx │ │ │ ├── LogSidePanelElements.stories.tsx │ │ │ ├── LogSidePanelElements.tsx │ │ │ ├── NamespaceDetailsSidePanel.tsx │ │ │ ├── NodeDetailsSidePanel.tsx │ │ │ ├── OnboardingChecklist.tsx │ │ │ ├── PasswordCheck.tsx │ │ │ ├── Playbar.tsx │ │ │ ├── PlaybarSlider.tsx │ │ │ ├── PodDetailsSidePanel.tsx │ │ │ ├── SVGIcons.tsx │ │ │ ├── ServicesDashboardPage.tsx │ │ │ ├── SessionEventList.tsx │ │ │ ├── SessionSidePanel.tsx │ │ │ ├── SessionSubpanel.tsx │ │ │ ├── SessionsPage.tsx │ │ │ ├── Spotlights.tsx │ │ │ ├── TabBar.tsx │ │ │ ├── TabBarWithContent.tsx │ │ │ ├── TabItem.tsx │ │ │ ├── TeamPage.tsx │ │ │ ├── ThemeWrapper.tsx │ │ │ ├── UserPreferencesModal.tsx │ │ │ ├── __mocks__/ │ │ │ │ ├── ky-universal.ts │ │ │ │ └── react-json-tree.tsx │ │ │ ├── __tests__/ │ │ │ │ ├── ChartUtils.test.ts │ │ │ │ ├── DBSearchPage.test.tsx │ │ │ │ ├── DBSearchPageQueryKey.test.tsx │ │ │ │ ├── KubernetesDashboardPage.test.ts │ │ │ │ ├── ServicesDashboardPage.test.ts │ │ │ │ ├── Spotlights.test.tsx │ │ │ │ ├── dashboard.test.ts │ │ │ │ ├── dashboardSections.test.tsx │ │ │ │ ├── localStore.test.ts │ │ │ │ ├── otelSemanticConventions.test.ts │ │ │ │ ├── searchFilters.test.ts │ │ │ │ ├── serviceDashboard.test.ts │ │ │ │ ├── source.test.ts │ │ │ │ ├── timeQuery.test.tsx │ │ │ │ ├── useUserPreferences.test.tsx │ │ │ │ └── utils.test.ts │ │ │ ├── api.ts │ │ │ ├── clickhouse.ts │ │ │ ├── components/ │ │ │ │ ├── AggFnSelect.tsx │ │ │ │ ├── AlertPreviewChart.tsx │ │ │ │ ├── AlertScheduleFields.tsx │ │ │ │ ├── Alerts.tsx │ │ │ │ ├── AppNav/ │ │ │ │ │ ├── AppNav.components.tsx │ │ │ │ │ ├── AppNav.module.scss │ │ │ │ │ ├── AppNav.stories.tsx │ │ │ │ │ ├── AppNav.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ChartBox.tsx │ │ │ │ ├── ChartDisplaySettingsDrawer.tsx │ │ │ │ ├── ChartEditor/ │ │ │ │ │ ├── RawSqlChartEditor.tsx │ │ │ │ │ ├── RawSqlChartInstructions.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ ├── constants.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── ChartSQLPreview.tsx │ │ │ │ ├── ColorSwatchInput.stories.tsx │ │ │ │ ├── ColorSwatchInput.tsx │ │ │ │ ├── ConfirmDeleteMenu.tsx │ │ │ │ ├── ConnectionForm.tsx │ │ │ │ ├── ConnectionSelect.tsx │ │ │ │ ├── ContactSupportText.tsx │ │ │ │ ├── ContextSidePanel.tsx │ │ │ │ ├── CsvExportButton.tsx │ │ │ │ ├── DBDeltaChart.tsx │ │ │ │ ├── DBEditTimeChartForm.tsx │ │ │ │ ├── DBHeatmapChart.tsx │ │ │ │ ├── DBHighlightedAttributesList.tsx │ │ │ │ ├── DBHistogramChart.tsx │ │ │ │ ├── DBInfraPanel.tsx │ │ │ │ ├── DBListBarChart.tsx │ │ │ │ ├── DBNumberChart.tsx │ │ │ │ ├── DBPieChart.tsx │ │ │ │ ├── DBRowDataPanel.tsx │ │ │ │ ├── DBRowJsonViewer.test.tsx │ │ │ │ ├── DBRowJsonViewer.tsx │ │ │ │ ├── DBRowOverviewPanel.tsx │ │ │ │ ├── DBRowSidePanel.tsx │ │ │ │ ├── DBRowSidePanelHeader.tsx │ │ │ │ ├── DBRowTable.tsx │ │ │ │ ├── DBSearchPageFilters/ │ │ │ │ │ ├── NestedFilterGroup.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── DBSearchPageFilters.tsx │ │ │ │ ├── DBSessionPanel.tsx │ │ │ │ ├── DBSqlRowTableWithSidebar.tsx │ │ │ │ ├── DBTable/ │ │ │ │ │ ├── DBRowTableFieldWithPopover.tsx │ │ │ │ │ ├── DBRowTableIconButton.tsx │ │ │ │ │ ├── DBRowTableRowButtons.tsx │ │ │ │ │ ├── TableHeader.module.scss │ │ │ │ │ ├── TableHeader.tsx │ │ │ │ │ ├── TableSearchInput.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── TableSearchInput.test.tsx │ │ │ │ │ │ └── sorting.test.ts │ │ │ │ │ └── sorting.ts │ │ │ │ ├── DBTableChart.tsx │ │ │ │ ├── DBTableSelect.tsx │ │ │ │ ├── DBTimeChart.tsx │ │ │ │ ├── DBTracePanel.tsx │ │ │ │ ├── DBTraceWaterfallChart.tsx │ │ │ │ ├── DatabaseSelect.tsx │ │ │ │ ├── DrawerUtils.tsx │ │ │ │ ├── DynamicFavicon.tsx │ │ │ │ ├── Error/ │ │ │ │ │ ├── ErrorBoundary.stories.tsx │ │ │ │ │ ├── ErrorBoundary.tsx │ │ │ │ │ └── ErrorCollapse.tsx │ │ │ │ ├── EventTag.tsx │ │ │ │ ├── ExceptionSubpanel.stories.tsx │ │ │ │ ├── ExceptionSubpanel.tsx │ │ │ │ ├── ExpandableRowTable.tsx │ │ │ │ ├── FullscreenPanelModal.tsx │ │ │ │ ├── HyperJson.module.scss │ │ │ │ ├── HyperJson.stories.tsx │ │ │ │ ├── HyperJson.tsx │ │ │ │ ├── InputControlled.tsx │ │ │ │ ├── KubeComponents.tsx │ │ │ │ ├── KubernetesFilters.tsx │ │ │ │ ├── LogLevel.tsx │ │ │ │ ├── MaterializedViews/ │ │ │ │ │ ├── MVConfigSummary.tsx │ │ │ │ │ ├── MVOptimizationIndicator.tsx │ │ │ │ │ └── MVOptimizationModal.tsx │ │ │ │ ├── MetricAttributeHelperPanel.tsx │ │ │ │ ├── MetricNameSelect.tsx │ │ │ │ ├── NetworkPropertyPanel.tsx │ │ │ │ ├── NumberFormat.tsx │ │ │ │ ├── OnboardingModal.tsx │ │ │ │ ├── PageHeader.module.scss │ │ │ │ ├── PageHeader.tsx │ │ │ │ ├── PatternSidePanel.tsx │ │ │ │ ├── PatternTable.tsx │ │ │ │ ├── PropertyComparisonChart.tsx │ │ │ │ ├── SQLEditor/ │ │ │ │ │ ├── SQLEditor.stories.tsx │ │ │ │ │ ├── SQLEditor.tsx │ │ │ │ │ ├── SQLInlineEditor.module.scss │ │ │ │ │ ├── SQLInlineEditor.stories.tsx │ │ │ │ │ ├── SQLInlineEditor.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── SaveToDashboardModal.tsx │ │ │ │ ├── Search/ │ │ │ │ │ └── DBSearchHeatmapChart.tsx │ │ │ │ ├── SearchInput/ │ │ │ │ │ ├── AutocompleteInput.module.scss │ │ │ │ │ ├── AutocompleteInput.tsx │ │ │ │ │ ├── InputLanguageSwitch.tsx │ │ │ │ │ ├── SearchInputV2.module.scss │ │ │ │ │ ├── SearchInputV2.tsx │ │ │ │ │ ├── SearchWhereInput.module.scss │ │ │ │ │ ├── SearchWhereInput.stories.tsx │ │ │ │ │ ├── SearchWhereInput.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── SearchWhereInput.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SearchPageActionBar.tsx │ │ │ │ ├── SearchTotalCountChart.tsx │ │ │ │ ├── SectionHeader.tsx │ │ │ │ ├── SelectControlled.tsx │ │ │ │ ├── ServiceDashboardDbQuerySidePanel.tsx │ │ │ │ ├── ServiceDashboardEndpointPerformanceChart.tsx │ │ │ │ ├── ServiceDashboardEndpointSidePanel.tsx │ │ │ │ ├── ServiceDashboardSlowestEventsTile.tsx │ │ │ │ ├── ServiceMap/ │ │ │ │ │ ├── ServiceMap.module.scss │ │ │ │ │ ├── ServiceMap.tsx │ │ │ │ │ ├── ServiceMapEdge.tsx │ │ │ │ │ ├── ServiceMapNode.tsx │ │ │ │ │ ├── ServiceMapSidePanel.tsx │ │ │ │ │ ├── ServiceMapTooltip.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── SourceSchemaPreview.tsx │ │ │ │ ├── SourceSelect.tsx │ │ │ │ ├── Sources/ │ │ │ │ │ ├── SourceForm.stories.tsx │ │ │ │ │ ├── SourceForm.tsx │ │ │ │ │ ├── Sources.module.scss │ │ │ │ │ ├── SourcesList.stories.tsx │ │ │ │ │ ├── SourcesList.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SpanEventsSubpanel.tsx │ │ │ │ ├── StacktraceFrame.tsx │ │ │ │ ├── Table.module.scss │ │ │ │ ├── Table.tsx │ │ │ │ ├── Tags.module.scss │ │ │ │ ├── Tags.tsx │ │ │ │ ├── TeamSettings/ │ │ │ │ │ ├── ApiKeysSection.tsx │ │ │ │ │ ├── ConnectionsSection.tsx │ │ │ │ │ ├── IntegrationsSection.tsx │ │ │ │ │ ├── SecurityPoliciesSection.tsx │ │ │ │ │ ├── SourcesSection.tsx │ │ │ │ │ ├── TeamMembersSection.tsx │ │ │ │ │ ├── TeamQueryConfigSection.tsx │ │ │ │ │ ├── WebhookForm.tsx │ │ │ │ │ └── WebhooksSection.tsx │ │ │ │ ├── TimePicker/ │ │ │ │ │ ├── TimePicker.stories.tsx │ │ │ │ │ ├── TimePicker.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── useTimePickerForm.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── TimelineChart/ │ │ │ │ │ ├── TimelineChart.module.scss │ │ │ │ │ ├── TimelineChart.tsx │ │ │ │ │ ├── TimelineChartRowEvents.tsx │ │ │ │ │ ├── TimelineCursor.tsx │ │ │ │ │ ├── TimelineMouseCursor.tsx │ │ │ │ │ ├── TimelineSpanEventMarker.tsx │ │ │ │ │ ├── TimelineXAxis.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── WhereLanguageControlled.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── AppNavUserMenu.test.tsx │ │ │ │ │ ├── ConnectionForm.test.tsx │ │ │ │ │ ├── DBEditTimeChartForm.test.tsx │ │ │ │ │ ├── DBHistogramChart.test.tsx │ │ │ │ │ ├── DBListBarChart.test.tsx │ │ │ │ │ ├── DBNumberChart.test.tsx │ │ │ │ │ ├── DBPieChart.test.tsx │ │ │ │ │ ├── DBRowDataPanel.test.ts │ │ │ │ │ ├── DBRowTable.test.tsx │ │ │ │ │ ├── DBSearchPage.test.tsx │ │ │ │ │ ├── DBSearchPageFilters.test.tsx │ │ │ │ │ ├── DBTableChart.test.tsx │ │ │ │ │ ├── DBTimeChart.test.tsx │ │ │ │ │ ├── DBTraceWaterfallChart.test.tsx │ │ │ │ │ ├── DynamicFavicon.test.tsx │ │ │ │ │ ├── InputControlled.test.tsx │ │ │ │ │ ├── MetricNameSelect.test.ts │ │ │ │ │ ├── SourceForm.test.tsx │ │ │ │ │ ├── deltaChartFieldClassification.test.ts │ │ │ │ │ ├── deltaChartFilterKeys.test.ts │ │ │ │ │ ├── deltaChartSampling.test.ts │ │ │ │ │ ├── deltaChartScoring.test.ts │ │ │ │ │ ├── deltaChartUtils.test.ts │ │ │ │ │ └── heatmapBuckets.test.ts │ │ │ │ ├── charts/ │ │ │ │ │ ├── ChartContainer.tsx │ │ │ │ │ ├── ChartErrorState.tsx │ │ │ │ │ ├── ChartTooltip.tsx │ │ │ │ │ ├── DateRangeIndicator.tsx │ │ │ │ │ └── DisplaySwitcher.tsx │ │ │ │ └── deltaChartUtils.ts │ │ │ ├── config/ │ │ │ │ └── fonts.ts │ │ │ ├── config.ts │ │ │ ├── connection.ts │ │ │ ├── dashboard.ts │ │ │ ├── defaults.ts │ │ │ ├── fixtures.ts │ │ │ ├── fonts.ts │ │ │ ├── hdxMTViews.ts │ │ │ ├── hooks/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── useAutoCompleteOptions.test.tsx │ │ │ │ │ ├── useChartConfig.test.tsx │ │ │ │ │ ├── useCsvExport.test.tsx │ │ │ │ │ ├── useDashboardFilterValues.test.tsx │ │ │ │ │ ├── useDashboardFilters.test.tsx │ │ │ │ │ ├── useFieldExpressionGenerator.test.tsx │ │ │ │ │ ├── useMetadata.test.tsx │ │ │ │ │ ├── useOffsetPaginatedQuery.test.tsx │ │ │ │ │ ├── usePresetDashboardFilters.test.tsx │ │ │ │ │ ├── useResizable.test.tsx │ │ │ │ │ ├── useRowWhere.test.tsx │ │ │ │ │ ├── useServiceMap.test.ts │ │ │ │ │ ├── useSqlSuggestions.test.tsx │ │ │ │ │ └── useTableSearch.test.tsx │ │ │ │ ├── ai.ts │ │ │ │ ├── useAutoCompleteOptions.tsx │ │ │ │ ├── useChartConfig.tsx │ │ │ │ ├── useCsvExport.tsx │ │ │ │ ├── useDashboardFilterValues.tsx │ │ │ │ ├── useDashboardFilters.tsx │ │ │ │ ├── useDashboardRefresh.tsx │ │ │ │ ├── useDrag.ts │ │ │ │ ├── useExplainQuery.tsx │ │ │ │ ├── useFetchMetricAttributeValues.tsx │ │ │ │ ├── useFetchMetricMetadata.tsx │ │ │ │ ├── useFetchMetricResourceAttrs.tsx │ │ │ │ ├── useFieldExpressionGenerator.tsx │ │ │ │ ├── useMVOptimizationExplanation.tsx │ │ │ │ ├── useMetadata.tsx │ │ │ │ ├── useOffsetPaginatedQuery.tsx │ │ │ │ ├── usePatterns.tsx │ │ │ │ ├── usePresetDashboardFilters.tsx │ │ │ │ ├── useResizable.tsx │ │ │ │ ├── useRowWhere.tsx │ │ │ │ ├── useServiceMap.tsx │ │ │ │ ├── useSqlSuggestions.tsx │ │ │ │ ├── useStableCallback.ts │ │ │ │ ├── useTableSearch.ts │ │ │ │ ├── useVirtualList.tsx │ │ │ │ └── useWaterfallSearchState.tsx │ │ │ ├── instrumentation.ts │ │ │ ├── layout.tsx │ │ │ ├── localStore.ts │ │ │ ├── metadata.ts │ │ │ ├── mocks/ │ │ │ │ └── handlers.ts │ │ │ ├── otelSemanticConventions.ts │ │ │ ├── savedSearch.ts │ │ │ ├── searchFilters.tsx │ │ │ ├── serviceDashboard.ts │ │ │ ├── sessions.ts │ │ │ ├── setupTests.tsx │ │ │ ├── source.ts │ │ │ ├── stories/ │ │ │ │ ├── ActionIcon.stories.tsx │ │ │ │ └── Button.stories.tsx │ │ │ ├── tableUtils.tsx │ │ │ ├── theme/ │ │ │ │ ├── ChartColors.stories.tsx │ │ │ │ ├── SemanticColors.stories.tsx │ │ │ │ ├── ThemeProvider.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── ThemeProvider.test.tsx │ │ │ │ │ └── index.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── semanticColorsGrouped.ts │ │ │ │ ├── themes/ │ │ │ │ │ ├── _base-tokens.scss │ │ │ │ │ ├── clickstack/ │ │ │ │ │ │ ├── Logomark.tsx │ │ │ │ │ │ ├── Wordmark.tsx │ │ │ │ │ │ ├── _tokens.scss │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── mantineTheme.ts │ │ │ │ │ └── hyperdx/ │ │ │ │ │ ├── Logomark.tsx │ │ │ │ │ ├── Wordmark.tsx │ │ │ │ │ ├── _tokens.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ └── mantineTheme.ts │ │ │ │ └── types.ts │ │ │ ├── timeQuery.ts │ │ │ ├── types.ts │ │ │ ├── useConfirm.tsx │ │ │ ├── useFormatTime.tsx │ │ │ ├── useQueryParam.tsx │ │ │ ├── useSourceMappedFrame.tsx │ │ │ ├── useUserPreferences.tsx │ │ │ ├── utils/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── alerts.test.ts │ │ │ │ │ ├── highlightedAttributes.test.ts │ │ │ │ │ ├── materializedViews.test.ts │ │ │ │ │ └── queryParsers.test.ts │ │ │ │ ├── alerts.ts │ │ │ │ ├── curlGenerator.ts │ │ │ │ ├── highlightedAttributes.ts │ │ │ │ ├── materializedViews.ts │ │ │ │ ├── queryParsers.ts │ │ │ │ ├── searchWindows.ts │ │ │ │ ├── sessions.ts │ │ │ │ ├── tilePositioning.ts │ │ │ │ └── webhookIcons.tsx │ │ │ ├── utils.ts │ │ │ ├── vsc-dark-plus.ts │ │ │ └── zIndex.ts │ │ ├── stylelint.config.mjs │ │ ├── styles/ │ │ │ ├── AlertsPage.module.scss │ │ │ ├── DashboardFiltersModal.module.scss │ │ │ ├── EndpointSubpanel.module.scss │ │ │ ├── HDXLineChart.module.scss │ │ │ ├── Home.module.css │ │ │ ├── LogSidePanel.module.scss │ │ │ ├── LogTable.module.scss │ │ │ ├── PlaybarSlider.module.scss │ │ │ ├── ResizablePanel.module.scss │ │ │ ├── SearchPage.module.scss │ │ │ ├── SessionSubpanelV2.module.scss │ │ │ ├── SessionsPage.module.scss │ │ │ ├── SourceSelectControlled.module.scss │ │ │ ├── _bootstrap-utilities.scss │ │ │ ├── _utilities.scss │ │ │ ├── app.scss │ │ │ ├── focus.module.scss │ │ │ ├── globals.css │ │ │ └── variants.module.scss │ │ ├── tests/ │ │ │ └── e2e/ │ │ │ ├── README.md │ │ │ ├── components/ │ │ │ │ ├── ChartEditorComponent.ts │ │ │ │ ├── FilterComponent.ts │ │ │ │ ├── InfrastructurePanelComponent.ts │ │ │ │ ├── SavedSearchModalComponent.ts │ │ │ │ ├── SearchPageAlertModalComponent.ts │ │ │ │ ├── SidePanelComponent.ts │ │ │ │ ├── TableComponent.ts │ │ │ │ ├── TimePickerComponent.ts │ │ │ │ └── WebhookAlertModalComponent.ts │ │ │ ├── core/ │ │ │ │ └── navigation.spec.ts │ │ │ ├── docker-compose.yml │ │ │ ├── features/ │ │ │ │ ├── alerts.spec.ts │ │ │ │ ├── chart-explorer.spec.ts │ │ │ │ ├── dashboard-external-api-config.spec.ts │ │ │ │ ├── dashboard-external-api-series.spec.ts │ │ │ │ ├── dashboard.spec.ts │ │ │ │ ├── kubernetes.spec.ts │ │ │ │ ├── search/ │ │ │ │ │ ├── relative-time.spec.ts │ │ │ │ │ ├── saved-search.spec.ts │ │ │ │ │ ├── search-filters.spec.ts │ │ │ │ │ └── search.spec.ts │ │ │ │ ├── services-dashboard.spec.ts │ │ │ │ ├── sessions.spec.ts │ │ │ │ ├── shared/ │ │ │ │ │ └── multiline.spec.ts │ │ │ │ ├── sources.spec.ts │ │ │ │ ├── team.spec.ts │ │ │ │ └── traces-workflow.spec.ts │ │ │ ├── fixtures/ │ │ │ │ └── e2e-fixtures.json │ │ │ ├── global-setup-fullstack.ts │ │ │ ├── global-setup-local.ts │ │ │ ├── page-objects/ │ │ │ │ ├── AlertsPage.ts │ │ │ │ ├── ChartExplorerPage.ts │ │ │ │ ├── DashboardPage.ts │ │ │ │ ├── KubernetesPage.ts │ │ │ │ ├── SearchPage.ts │ │ │ │ ├── ServicesDashboardPage.ts │ │ │ │ ├── SessionsPage.ts │ │ │ │ └── TeamPage.ts │ │ │ ├── seed-clickhouse.ts │ │ │ └── utils/ │ │ │ ├── api-helpers.ts │ │ │ ├── base-test.ts │ │ │ ├── constants.ts │ │ │ └── locators.ts │ │ ├── tsconfig.build.json │ │ ├── tsconfig.json │ │ └── types/ │ │ └── crypto-randomuuid.d.ts │ ├── common-utils/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── jest.config.js │ │ ├── jest.int.config.js │ │ ├── jest.setup.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── __tests__/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── renderChartConfig.test.ts.snap │ │ │ │ ├── clickhouse.test.ts │ │ │ │ ├── macros.test.ts │ │ │ │ ├── metadata.int.test.ts │ │ │ │ ├── metadata.test.ts │ │ │ │ ├── queryParser.test.ts │ │ │ │ ├── rawSqlParams.test.ts │ │ │ │ ├── renderChartConfig.test.ts │ │ │ │ ├── sqlFormatter.test.ts │ │ │ │ ├── utils.test.ts │ │ │ │ └── validation.test.ts │ │ │ ├── clickhouse/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── index.test.ts │ │ │ │ │ └── materializedViews.test.ts │ │ │ │ ├── browser.ts │ │ │ │ ├── index.ts │ │ │ │ └── node.ts │ │ │ ├── core/ │ │ │ │ ├── histogram.ts │ │ │ │ ├── materializedViews.ts │ │ │ │ ├── metadata.ts │ │ │ │ ├── renderChartConfig.ts │ │ │ │ └── utils.ts │ │ │ ├── guards.ts │ │ │ ├── macros.ts │ │ │ ├── queryParser.ts │ │ │ ├── rawSqlParams.ts │ │ │ ├── sqlFormatter.ts │ │ │ ├── types.ts │ │ │ └── validation.ts │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ └── otel-collector/ │ ├── CHANGELOG.md │ ├── cmd/ │ │ └── migrate/ │ │ ├── main.go │ │ └── main_test.go │ ├── go.mod │ ├── go.sum │ └── package.json ├── proxy/ │ ├── README.md │ ├── nginx/ │ │ └── nginx.conf.template │ └── traefik/ │ ├── config.yml │ └── traefik.yml ├── scripts/ │ ├── test-e2e-ci.sh │ └── test-e2e.sh ├── smoke-tests/ │ └── otel-collector/ │ ├── README.md │ ├── auto-parse-json.bats │ ├── data/ │ │ ├── auto-parse/ │ │ │ ├── default/ │ │ │ │ ├── assert_query.sql │ │ │ │ ├── expected.snap │ │ │ │ └── input.json │ │ │ ├── json-string/ │ │ │ │ ├── assert_query.sql │ │ │ │ ├── expected.snap │ │ │ │ └── input.json │ │ │ └── otel-map/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ ├── normalize-severity/ │ │ │ └── text-case/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ └── severity-inference/ │ │ ├── infer-debug/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ ├── infer-error/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ ├── infer-fatal/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ ├── infer-info/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ ├── infer-superstring/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ ├── infer-trace/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ ├── infer-warn/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ ├── no-infer-substring/ │ │ │ ├── assert_query.sql │ │ │ ├── expected.snap │ │ │ └── input.json │ │ └── skip-infer/ │ │ ├── assert_query.sql │ │ ├── expected.snap │ │ └── input.json │ ├── docker-compose.yaml │ ├── normalize-severity.bats │ ├── receiver-config.yaml │ ├── setup_suite.bash │ ├── severity-inference.bats │ └── test_helpers/ │ ├── assertions.bash │ └── utilities.bash ├── tsconfig.base.json └── version.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .changeset/README.md ================================================ # Changesets Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works with multi-package repos, or single-package repos to help you version and publish your code. You can find the full documentation for it [in our repository](https://github.com/changesets/changesets) We have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) ================================================ FILE: .changeset/config.json ================================================ { "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", "changelog": "@changesets/cli/changelog", "commit": false, "fixed": [["@hyperdx/api", "@hyperdx/app", "@hyperdx/otel-collector"]], "linked": [], "access": "restricted", "baseBranch": "main", "updateInternalDependencies": "patch" } ================================================ FILE: .changeset/fast-plants-peel.md ================================================ --- "@hyperdx/api": patch "@hyperdx/app": patch "@hyperdx/otel-collector": patch --- ci: Replace QEMU with native ARM64 runners for release builds ================================================ FILE: .claude/agents/playwright-test-generator.md ================================================ --- name: playwright-test-generator description: 'Use this agent when you need to create automated browser tests using Playwright Examples: Context: User wants to generate a test for the test plan item. ' tools: Glob, Grep, Read, LS, mcp__playwright-test__browser_click, mcp__playwright-test__browser_drag, mcp__playwright-test__browser_evaluate, mcp__playwright-test__browser_file_upload, mcp__playwright-test__browser_handle_dialog, mcp__playwright-test__browser_hover, mcp__playwright-test__browser_navigate, mcp__playwright-test__browser_press_key, mcp__playwright-test__browser_select_option, mcp__playwright-test__browser_snapshot, mcp__playwright-test__browser_type, mcp__playwright-test__browser_verify_element_visible, mcp__playwright-test__browser_verify_list_visible, mcp__playwright-test__browser_verify_text_visible, mcp__playwright-test__browser_verify_value, mcp__playwright-test__browser_wait_for, mcp__playwright-test__generator_read_log, mcp__playwright-test__generator_setup_page, mcp__playwright-test__generator_write_test model: sonnet color: blue --- You are a Playwright Test Generator, an expert in browser automation and end-to-end testing. Your specialty is creating robust, reliable Playwright tests that accurately simulate user interactions and validate application behavior. # For each test you generate - Obtain the test plan with all the steps and verification specification - Run the `generator_setup_page` tool to set up page for the scenario - For each step and verification in the scenario, do the following: - Use Playwright tool to manually execute it in real-time. - Use the step description as the intent for each Playwright tool call. - Retrieve generator log via `generator_read_log` - Immediately after reading the test log, invoke `generator_write_test` with the generated source code - File should contain single test - File name must be fs-friendly scenario name - Test must be placed in a describe matching the top-level test plan item - Test title must match the scenario name - Includes a comment with the step text before each step execution. Do not duplicate comments if step requires multiple actions. - Always use best practices from the log when generating tests. ## HyperDX Project Conventions Apply these rules to ALL tests you generate for this project. ### File Structure - Specs: `packages/app/tests/e2e/features/` - Page objects: `packages/app/tests/e2e/page-objects/` - Components: `packages/app/tests/e2e/components/` - Base test import: `import { expect, test } from '../utils/base-test';` (NOT `@playwright/test`) ### Page Object Pattern (REQUIRED) - ALL UI interactions must go through page objects and components — no raw `page.getByTestId()`, `page.locator()`, or `page.getByRole()` directly in spec files - If a needed interaction doesn't exist in a page object, add it to the page object first, then use it in the spec ### Data Isolation (CRITICAL) Tests run in parallel and share a database. Use `Date.now()` for **every field the API uniqueness-checks**: ```typescript const ts = Date.now(); const name = `E2E Thing ${ts}`; const url = `https://example.com/thing-${ts}`; // URL too, not just name ``` The webhook API enforces uniqueness on `(team, service, url)`. Hardcoded URLs will collide. ### Assertions - Never assert global counts (`toHaveCount(N)`) — scope to the current test's data instead - Example: `pageContainer.getByRole('link').filter({ hasText: name })` not `getAlertCards().toHaveCount(1)` - Use `toBeVisible()` / `toBeHidden()` (web-first), never `waitForTimeout` - Assert successful chart loads by checking `.recharts-responsive-container` is visible ### Tags - `{ tag: '@full-stack' }` for tests requiring the backend (MongoDB + API) - Feature tags: `@dashboard`, `@alerts`, `@search`, etc. For following plan: ```markdown file=specs/plan.md ### 1. Adding New Todos **Seed:** `tests/seed.spec.ts` #### 1.1 Add Valid Todo **Steps:** 1. Click in the "What needs to be done?" input field #### 1.2 Add Multiple Todos ... ``` Following file is generated: ```ts file=add-valid-todo.spec.ts // spec: specs/plan.md // seed: tests/seed.spec.ts test.describe('Adding New Todos', () => { test('Add Valid Todo', async { page } => { // 1. Click in the "What needs to be done?" input field await page.click(...); ... }); }); ``` ================================================ FILE: .claude/agents/playwright-test-healer.md ================================================ --- name: playwright-test-healer description: Use this agent when you need to debug and fix failing Playwright tests tools: Glob, Grep, Read, LS, Edit, MultiEdit, Write, mcp__playwright-test__browser_console_messages, mcp__playwright-test__browser_evaluate, mcp__playwright-test__browser_generate_locator, mcp__playwright-test__browser_network_requests, mcp__playwright-test__browser_snapshot, mcp__playwright-test__test_debug, mcp__playwright-test__test_list, mcp__playwright-test__test_run model: sonnet color: red --- You are the Playwright Test Healer, an expert test automation engineer specializing in debugging and resolving Playwright test failures. Your mission is to systematically identify, diagnose, and fix broken Playwright tests using a methodical approach. Your workflow: 1. **Initial Execution**: Run all tests using `test_run` tool to identify failing tests 2. **Debug failed tests**: For each failing test run `test_debug`. 3. **Error Investigation**: When the test pauses on errors, use available Playwright MCP tools to: - Examine the error details - Capture page snapshot to understand the context - Analyze selectors, timing issues, or assertion failures 4. **Root Cause Analysis**: Determine the underlying cause of the failure by examining: - Element selectors that may have changed - Timing and synchronization issues - Data dependencies or test environment problems - Application changes that broke test assumptions 5. **Code Remediation**: Edit the test code to address identified issues, focusing on: - Updating selectors to match current application state - Fixing assertions and expected values - Improving test reliability and maintainability - For inherently dynamic data, utilize regular expressions to produce resilient locators 6. **Verification**: Restart the test after each fix to validate the changes 7. **Iteration**: Repeat the investigation and fixing process until the test passes cleanly Key principles: - Be systematic and thorough in your debugging approach - Document your findings and reasoning for each fix - Prefer robust, maintainable solutions over quick hacks - Use Playwright best practices for reliable test automation - If multiple errors exist, fix them one at a time and retest - Provide clear explanations of what was broken and how you fixed it - You will continue this process until the test runs successfully without any failures or errors. - If the error persists and you have high level of confidence that the test is correct, mark this test as test.fixme() so that it is skipped during the execution. Add a comment before the failing step explaining what is happening instead of the expected behavior. - Do not ask user questions, you are not interactive tool, do the most reasonable thing possible to pass the test. - Never wait for networkidle or use other discouraged or deprecated apis ## HyperDX Project Conventions ### Test Runner Always use this command — do NOT use `npx playwright test` directly: ```bash ./scripts/test-e2e.sh --quiet [--grep "\"\""] ``` ### Common Failure Patterns 1. **API 400 "already exists" — form won't close**: Check network requests first. The webhook API enforces uniqueness on `(team, service, url)`. Hardcoded URLs collide between parallel tests or retries. Fix: use `` `https://example.com/thing-${Date.now()}` `` for URLs, not just names. 2. **Strict mode violation — locator matches N elements**: A locator like `getByRole('link').filter({ hasText: name })` can match both a nav sidebar entry and a page content entry. Fix: scope to a container, e.g. `alertsPage.pageContainer.getByRole('link').filter({ hasText: name })`. 3. **Global count assertion fails — `toHaveCount(N)` receives more**: Other tests' data is in the shared DB. Fix: replace `toHaveCount(1)` with `filter({ hasText: uniqueName }).toBeVisible()`, and `toHaveCount(0)` with `filter({ hasText: uniqueName }).toBeHidden()`. 4. **`waitFor({ state: 'detached' })` times out**: Usually caused by a failed API call keeping a form open (see #1). Diagnose network first; fix the data issue rather than adjusting the wait. ### Page Object Pattern - Fix broken tests by correcting or extending page objects (`page-objects/`, `components/`) — not by adding raw `page.getByTestId()` calls to spec files - The spec file should only call methods/getters defined on page objects ================================================ FILE: .claude/agents/playwright-test-planner.md ================================================ --- name: playwright-test-planner description: Use this agent when you need to create comprehensive test plan for a web application or website tools: Glob, Grep, Read, LS, mcp__playwright-test__browser_click, mcp__playwright-test__browser_close, mcp__playwright-test__browser_console_messages, mcp__playwright-test__browser_drag, mcp__playwright-test__browser_evaluate, mcp__playwright-test__browser_file_upload, mcp__playwright-test__browser_handle_dialog, mcp__playwright-test__browser_hover, mcp__playwright-test__browser_navigate, mcp__playwright-test__browser_navigate_back, mcp__playwright-test__browser_network_requests, mcp__playwright-test__browser_press_key, mcp__playwright-test__browser_select_option, mcp__playwright-test__browser_snapshot, mcp__playwright-test__browser_take_screenshot, mcp__playwright-test__browser_type, mcp__playwright-test__browser_wait_for, mcp__playwright-test__planner_setup_page, mcp__playwright-test__planner_save_plan model: sonnet color: green --- You are an expert web test planner with extensive experience in quality assurance, user experience testing, and test scenario design. Your expertise includes functional testing, edge case identification, and comprehensive test coverage planning. You will: 1. **Navigate and Explore** - Invoke the `planner_setup_page` tool once to set up page before using any other tools - Explore the browser snapshot - Do not take screenshots unless absolutely necessary - Use `browser_*` tools to navigate and discover interface - Thoroughly explore the interface, identifying all interactive elements, forms, navigation paths, and functionality 2. **Analyze User Flows** - Map out the primary user journeys and identify critical paths through the application - Consider different user types and their typical behaviors 3. **Design Comprehensive Scenarios** Create detailed test scenarios that cover: - Happy path scenarios (normal user behavior) - Edge cases and boundary conditions - Error handling and validation 4. **Structure Test Plans** Each scenario must include: - Clear, descriptive title - Detailed step-by-step instructions - Expected outcomes where appropriate - Assumptions about starting state (always assume blank/fresh state) - Success criteria and failure conditions 5. **Create Documentation** Submit your test plan using `planner_save_plan` tool. **Quality Standards**: - Write steps that are specific enough for any tester to follow - Include negative testing scenarios - Ensure scenarios are independent and can be run in any order **Output Format**: Always save the complete test plan as a markdown file with clear headings, numbered steps, and professional formatting suitable for sharing with development and QA teams. ## HyperDX Project Context ### Application HyperDX is an observability platform. Key pages: `/search` (logs/traces), `/dashboards`, `/alerts`, `/metrics`, `/sessions`. ### Test File Locations - Plans: `specs/` - Specs: `packages/app/tests/e2e/features/` - Page objects: `packages/app/tests/e2e/page-objects/` - Components: `packages/app/tests/e2e/components/` ### Plan Requirements for HyperDX - Scenarios must be independent and assume a fresh DB state (the test runner clears MongoDB before each run) - Note when a scenario creates shared resources (e.g. webhooks, saved searches) that could conflict with parallel runs — flag these for data isolation - Reference existing page objects when describing steps so the generator agent knows what abstractions are available ================================================ FILE: .claude/skills/playwright/SKILL.md ================================================ --- name: playwright description: Writes end-to-end tests code using Playwright browser automation. --- # Playwright End-to-End Test Writer I am a Playwright End-to-End Test Writer. I generate test code that simulates user interactions with the HyperDX application in a real browser environment, allowing us to verify that the application behaves as expected from the user's perspective. I will write tests covering these requirements: $ARGUMENTS. If the requirements are empty or unclear, I will ask the user for a detailed description of the test they want. ## Workflow Use the agents below to carry out each phase. Do not write test code directly in the main context. ### 1. Test Generation Delegate to the **`playwright-test-generator`** agent (via the Agent tool). Pass it: - A full description of the test scenario including steps, expected outcomes, and edge cases - The target spec file path (`packages/app/tests/e2e/features/.spec.ts`) - Any relevant page object files that already exist for this feature The agent will drive a real browser, execute the steps live, and produce spec code that follows HyperDX conventions. Review the output before proceeding. ### 2. Test Execution After the generator agent writes the file, run the test: ```bash ./scripts/test-e2e.sh --quiet [--grep "\"\""] ``` Always run in full-stack mode (default). Do not ask the user about this. ### 3. Iterative Fixing If the test fails, delegate to the **`playwright-test-healer`** agent (via the Agent tool). Pass it: - The failing test file path - The error output - Any relevant context about what the test is supposed to do The healer agent will debug interactively, fix the code, and re-run until the test passes. ## HyperDX Project Conventions These conventions apply to ALL test code produced by any agent. Review generated output to ensure compliance. ### File Structure - Specs: `packages/app/tests/e2e/features/` - Page objects: `packages/app/tests/e2e/page-objects/` - Components: `packages/app/tests/e2e/components/` - Utilities: `packages/app/tests/e2e/utils/` - Base test (extends playwright with fixtures): `utils/base-test.ts` - Constants (source names): `utils/constants.ts` ### Page Object Pattern (REQUIRED) - ALL UI interactions in spec files must go through page objects (`page-objects/`) and components (`components/`) - No raw `page.getByTestId()`, `page.locator()`, or `page.getByRole()` calls directly in spec files - If a needed interaction doesn't exist in a page object, add it to the page object — don't work around it in the spec ### Data Isolation (CRITICAL) Tests run in parallel and share a database. Use `Date.now()` for **every field the API uniqueness-checks** — not just display names: ```typescript const ts = Date.now(); const name = `E2E Thing ${ts}`; const url = `https://example.com/thing-${ts}`; // URL too, not just name ``` The webhook API enforces uniqueness on `(team, service, url)`. A hardcoded URL will collide between parallel runs or retries. ### Assertions - Never assert global counts (`toHaveCount(N)`) — other tests' data pollutes the page - Scope assertions to the current test's data: `pageContainer.getByRole('link').filter({ hasText: name })` - Use web-first assertions (`toBeVisible()`, `toBeHidden()`) not imperative checks - Never use hardcoded waits (`waitForTimeout`) — wait for specific elements or conditions - Assert successful chart loads by checking `.recharts-responsive-container` is visible ### Tags - `{ tag: '@full-stack' }` — tests requiring MongoDB + API backend - Feature tags: `@dashboard`, `@alerts`, `@search`, etc. ### Imports Always import from the base test, not directly from `@playwright/test`: ```typescript import { expect, test } from '../utils/base-test'; ``` ### Mock ClickHouse Data - E2E tests run against a local Docker environment with seeded ClickHouse data - Update `packages/app/tests/e2e/seed-clickhouse.ts` only if the scenario requires specific data not already seeded ================================================ FILE: .cursor/mcp.json ================================================ { "mcpServers": { "playwright-test": { "command": "npx", "args": ["playwright", "run-test-mcp-server"] } } } ================================================ FILE: .cursor/rules/playwright.mdc ================================================ --- description: HyperDX Playwright E2E test conventions for writing, reviewing, and fixing tests. Use when creating, editing, or debugging any E2E test in this project. globs: alwaysApply: false --- When writing, reviewing, or fixing Playwright E2E tests for this project, follow the conventions in @.claude/skills/playwright/SKILL.md. To run tests: ```bash ./scripts/test-e2e.sh --quiet [--grep "\"\""] ``` ================================================ FILE: .gitattributes ================================================ /.yarn/releases/** binary ================================================ FILE: .github/pull_request_template.md ================================================ ## Summary ### Screenshots or video | Before | After | | :----- | :---- | | | | ### How to test locally or on Vercel 1. 2. 3. ### References - Linear Issue: - Related PRs: ================================================ FILE: .github/workflows/claude-code-review.yml ================================================ name: Claude Code Review on: pull_request_target: types: [opened, synchronize, ready_for_review] workflow_dispatch: inputs: pr_number: description: Pull request number to review required: true type: string # Optional: Only run on specific file changes # paths: # - "src/**/*.ts" # - "src/**/*.tsx" # - "src/**/*.js" # - "src/**/*.jsx" jobs: claude-review: if: github.event_name == 'workflow_dispatch' || github.event.action == 'ready_for_review' || !github.event.pull_request.draft # Optional: Filter by PR author # if: | # github.event.pull_request.user.login == 'external-contributor' || # github.event.pull_request.user.login == 'new-developer' || # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' runs-on: ubuntu-latest permissions: contents: write pull-requests: write issues: write id-token: write actions: read steps: # Resolve the PR head repo/ref first so both pull_request_target and # workflow_dispatch runs can checkout forked branches correctly. - name: Resolve PR metadata id: pr uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const prNumber = context.eventName === 'workflow_dispatch' ? Number('${{ inputs.pr_number }}') : context.payload.pull_request.number; const { data: pr } = await github.rest.pulls.get({ owner: context.repo.owner, repo: context.repo.repo, pull_number: prNumber, }); core.setOutput('number', String(pr.number)); core.setOutput('head_repo', pr.head.repo.full_name); core.setOutput('head_ref', pr.head.ref); # Checkout the fork's branch so Claude can read the actual PR code. # Using the PR head repo/ref works for both fork and non-fork PRs. - name: Checkout repository uses: actions/checkout@v4 with: repository: ${{ steps.pr.outputs.head_repo }} ref: ${{ steps.pr.outputs.head_ref }} fetch-depth: 0 - name: Run Claude Code Review id: claude-review uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} allowed_bots: cursor,cursor[bot],claude,claude[bot] github_token: ${{ secrets.GITHUB_TOKEN }} # Bypasses OIDC auth (required for pull_request_target) allowed_non_write_users: '*' # Allows fork contributors to trigger reviews prompt: | REPO: ${{ github.repository }} PR NUMBER: ${{ steps.pr.outputs.number }} Please review this pull request. Use the repository's CLAUDE.md for guidance on style and conventions. **IMPORTANT: Keep your review SHORT and ACTIONABLE.** Format your review as a concise bulleted list focusing ONLY on: - Critical bugs or security issues (if any) - Important code quality issues or violations of project patterns - Must-fix items before merge Skip minor style nitpicks, explanations of obvious issues, and lengthy justifications unless critical. Each item should be: **Issue** → **Fix** (one line each when possible). Example format: - ❌ Unvalidated user input in API endpoint → Add input validation - ⚠️ Missing error handling in async function → Wrap in try-catch - 🔒 Hardcoded credentials in config.ts → Move to environment variables If there are NO critical issues, simply say "✅ No critical issues found." Note: If the team wants a more thorough review, they can comment on the PR requesting one. CRITICAL OUTPUT REQUIREMENTS: 1. Return a JSON object with a single "review" field containing your full markdown review. 2. The review markdown must start with EXACTLY these two lines: ## PR Review 3. Do not post the review yourself using GitHub CLI or any comment tool. 4. The workflow will create or update the PR comment using your structured output. # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md # or https://docs.claude.com/en/docs/claude-code/sdk#command-line for available options claude_args: | --setting-sources user --allowedTools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)" --json-schema '{"type":"object","properties":{"review":{"type":"string","description":"Complete markdown review starting with on the first line and ## PR Review on the second line"}},"required":["review"]}' - name: Find existing Claude review uses: peter-evans/find-comment@v4 id: find-claude-comment with: issue-number: ${{ steps.pr.outputs.number }} comment-author: github-actions[bot] body-includes: '' direction: last - name: Post or update Claude review uses: peter-evans/create-or-update-comment@v5 with: comment-id: ${{ steps.find-claude-comment.outputs.comment-id }} issue-number: ${{ steps.pr.outputs.number }} body: ${{ fromJSON(steps.claude-review.outputs.structured_output).review }} edit-mode: replace ================================================ FILE: .github/workflows/claude.yml ================================================ name: Claude Code on: issue_comment: types: [created] pull_request_review_comment: types: [created] issues: types: [opened, assigned] pull_request_review: types: [submitted] jobs: claude: if: | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) runs-on: ubuntu-latest permissions: contents: write pull-requests: write issues: write id-token: write actions: read steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' cache: 'yarn' cache-dependency-path: 'yarn.lock' - name: Install dependencies run: yarn install - name: Build dependencies run: make ci-build - name: Run Claude Code id: claude uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} github_token: ${{ secrets.GITHUB_TOKEN }} use_sticky_comment: 'true' include_fix_links: 'true' claude_args: '--max-turns 20' ================================================ FILE: .github/workflows/e2e-tests.yml ================================================ name: E2E Tests on: workflow_call: jobs: e2e-tests: name: E2E Tests - Shard ${{ matrix.shard }} runs-on: ubuntu-24.04 timeout-minutes: 15 permissions: contents: read strategy: fail-fast: false matrix: shard: [1, 2, 3, 4] steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' cache-dependency-path: 'yarn.lock' cache: 'yarn' - name: Install dependencies run: yarn install - name: Build dependencies run: npx nx run-many -t ci:build - name: Install Playwright browsers run: cd packages/app && npx playwright install --with-deps chromium - name: Start E2E Docker Compose run: | docker compose -p e2e -f packages/app/tests/e2e/docker-compose.yml up -d echo "Waiting for MongoDB..." for i in $(seq 1 30); do if docker compose -p e2e -f packages/app/tests/e2e/docker-compose.yml exec -T db mongosh --port 29998 --quiet --eval "db.adminCommand({ping:1})" >/dev/null 2>&1; then echo "MongoDB is ready" break fi if [ "$i" -eq 30 ]; then echo "MongoDB failed to become ready after 30 seconds" exit 1 fi echo "Waiting for MongoDB... ($i/30)" sleep 1 done echo "Waiting for ClickHouse..." for i in $(seq 1 60); do if curl -sf http://localhost:8123/ping >/dev/null 2>&1; then echo "ClickHouse is ready" break fi if [ "$i" -eq 60 ]; then echo "ClickHouse failed to become ready after 60 seconds" exit 1 fi echo "Waiting for ClickHouse... ($i/60)" sleep 1 done - name: Run Playwright tests (full-stack mode) # E2E uses local docker-compose (MongoDB on 29998, ClickHouse on 8123) env: E2E_FULLSTACK: 'true' E2E_UNIQUE_USER: 'true' E2E_API_HEALTH_CHECK_MAX_RETRIES: '60' MONGO_URI: mongodb://localhost:29998/hyperdx-e2e run: | cd packages/app yarn test:e2e --shard=${{ matrix.shard }}/4 - name: Upload Playwright report uses: actions/upload-artifact@v4 if: always() with: name: playwright-report-${{ matrix.shard }} path: packages/app/playwright-report/ retention-days: 30 - name: Upload test results uses: actions/upload-artifact@v4 if: always() with: name: test-results-${{ matrix.shard }} path: packages/app/test-results/ retention-days: 30 - name: Stop E2E containers if: always() run: docker compose -p e2e -f packages/app/tests/e2e/docker-compose.yml down -v ================================================ FILE: .github/workflows/main.yml ================================================ name: Main on: push: branches: [main, v1] pull_request: branches: [main, v1] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: lint: timeout-minutes: 8 runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' cache-dependency-path: 'yarn.lock' cache: 'yarn' - name: Install root dependencies run: yarn install - name: Build dependencies run: make ci-build - name: Install core libs run: sudo apt-get install --yes curl bc - name: Run lint + type check run: make ci-lint unit: timeout-minutes: 8 runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' cache-dependency-path: 'yarn.lock' cache: 'yarn' - name: Install root dependencies run: yarn install - name: Build dependencies run: make ci-build - name: Run unit tests run: make ci-unit integration: timeout-minutes: 8 runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' cache-dependency-path: 'yarn.lock' cache: 'yarn' - name: Install root dependencies run: yarn install - name: Expose GitHub Runtime uses: crazy-max/ghaction-github-runtime@v2 - name: Spin up docker services run: | docker buildx create --use --driver=docker-container docker buildx bake -f ./docker-compose.ci.yml --set *.cache-to="type=gha" --set *.cache-from="type=gha" --load - name: Build dependencies run: make ci-build - name: Run integration tests run: make ci-int otel-unit-test: timeout-minutes: 8 runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 - name: Get changed files id: changed-files uses: tj-actions/changed-files@v46 with: files: | packages/otel-collector/** - name: Setup Go if: steps.changed-files.outputs.any_changed == 'true' uses: actions/setup-go@v5 with: go-version-file: packages/otel-collector/go.mod cache-dependency-path: packages/otel-collector/go.sum - name: Run unit tests if: steps.changed-files.outputs.any_changed == 'true' working-directory: ./packages/otel-collector run: go test ./... otel-smoke-test: timeout-minutes: 8 runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 - name: Get changed OTEL collector files id: changed-files uses: tj-actions/changed-files@v46 with: files: | docker/otel-collector/** smoke-tests/otel-ccollector/** - name: Install required tooling if: steps.changed-files.outputs.any_changed == 'true' env: DEBIAN_FRONTEND: noninteractive run: | sudo apt-get install -y apt-transport-https ca-certificates curl gnupg curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg ARCH=$(dpkg --print-architecture) echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg arch=${ARCH}] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list sudo apt-get update sudo apt-get install --yes curl bats clickhouse-client - name: Run Smoke Tests if: steps.changed-files.outputs.any_changed == 'true' working-directory: ./smoke-tests/otel-collector run: bats . e2e-tests: uses: ./.github/workflows/e2e-tests.yml permissions: contents: read e2e-report: name: End-to-End Tests if: always() needs: e2e-tests runs-on: ubuntu-24.04 permissions: contents: read pull-requests: write steps: - name: Download all test results uses: actions/download-artifact@v4 with: pattern: test-results-* path: all-test-results - name: Aggregate test results id: test-results if: github.event_name == 'pull_request' uses: actions/github-script@v7 with: result-encoding: string script: | const fs = require('fs'); const path = require('path'); let totalPassed = 0; let totalFailed = 0; let totalFlaky = 0; let totalSkipped = 0; let totalDuration = 0; let foundResults = false; try { const resultsDir = 'all-test-results'; const shards = fs.readdirSync(resultsDir); for (const shard of shards) { const resultsPath = path.join(resultsDir, shard, 'results.json'); if (fs.existsSync(resultsPath)) { foundResults = true; const results = JSON.parse(fs.readFileSync(resultsPath, 'utf8')); const { stats } = results; totalPassed += stats.expected || 0; totalFailed += stats.unexpected || 0; totalFlaky += stats.flaky || 0; totalSkipped += stats.skipped || 0; totalDuration += stats.duration || 0; } } if (foundResults) { const duration = Math.round(totalDuration / 1000); const summary = totalFailed > 0 ? `❌ **${totalFailed} test${totalFailed > 1 ? 's' : ''} failed**` : `✅ **All tests passed**`; return `## E2E Test Results ${summary} • ${totalPassed} passed • ${totalSkipped} skipped • ${duration}s | Status | Count | |--------|-------| | ✅ Passed | ${totalPassed} | | ❌ Failed | ${totalFailed} | | ⚠️ Flaky | ${totalFlaky} | | ⏭️ Skipped | ${totalSkipped} | Tests ran across ${shards.length} shards in parallel. [View full report →](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})`; } else { return `## E2E Test Results ❌ **Test results file not found** [View full report →](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})`; } } catch (error) { console.log('Could not parse test results:', error.message); return `## E2E Test Results ❌ **Error reading test results**: ${error.message} [View full report →](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})`; } - name: Comment PR with test results uses: mshick/add-pr-comment@v2 # Skip for fork PRs: GITHUB_TOKEN cannot write to the base repo if: always() && github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork != true with: message: ${{ steps.test-results.outputs.result }} message-id: e2e-test-results - name: Check test results id: check-results run: | total_failed=0 for dir in all-test-results/*/; do if [ -f "${dir}results.json" ]; then unexpected=$(jq -r '.stats.unexpected // 0' "${dir}results.json") total_failed=$((total_failed + unexpected)) fi done if [ "$total_failed" -gt 0 ]; then echo "::error::$total_failed E2E test(s) failed" exit 1 fi # Fail when any shard failed even if we couldn't read failure count from artifacts if [ "${{ needs.e2e-tests.result }}" = "failure" ]; then echo "::error::One or more E2E test shards failed" exit 1 fi clickhouse-static-build: name: ClickHouse Bundle Build runs-on: ubuntu-24.04 timeout-minutes: 10 permissions: contents: read strategy: fail-fast: false steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' cache-dependency-path: 'yarn.lock' cache: 'yarn' - name: Install dependencies run: yarn install - name: Build App run: yarn build:clickhouse - name: Verify output directory exists and has size run: | if [ ! -d "packages/app/out" ]; then echo "::error::Output directory 'packages/app/out' does not exist" exit 1 fi echo "✓ Output directory exists" # Calculate size in bytes and convert to MB size_kb=$(du -sk packages/app/out | cut -f1) size_mb=$((size_kb / 1024)) echo "Output directory size: ${size_mb} MB (${size_kb} KB)" if [ "$size_mb" -lt 10 ]; then echo "::error::Output directory is only ${size_mb} MB, expected at least 10 MB" exit 1 fi echo "✓ Output directory size check passed (${size_mb} MB)" ================================================ FILE: .github/workflows/push.yml ================================================ name: Push Downstream on: push: branches: [main] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: push-downstream: timeout-minutes: 5 runs-on: ubuntu-24.04 steps: - uses: actions/github-script@v7 env: ACTOR: ${{ github.actor }} AUTHOR: ${{ github.event.head_commit.author.name }} MESSAGE: ${{ github.event.head_commit.message }} SHA: ${{ github.sha }} with: github-token: ${{ secrets.DOWNSTREAM_TOKEN }} script: | const { ACTOR, AUTHOR, MESSAGE, SHA } = process.env; const result = await github.rest.actions.createWorkflowDispatch({ owner: '${{ secrets.DOWNSTREAM_OWNER }}', repo: '${{ secrets.DOWNSTREAM_REPO_V2 }}', workflow_id: '${{ secrets.DOWNSTREAM_WORKFLOW_ID_V2 }}', ref: 'main', inputs: { actor: ACTOR, author: AUTHOR, message: MESSAGE, sha: SHA } }); ================================================ FILE: .github/workflows/pushv1.yml ================================================ name: Push Downstream V1 on: push: branches: [v1] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: push-downstream: timeout-minutes: 5 runs-on: ubuntu-24.04 steps: - uses: actions/github-script@v7 env: ACTOR: ${{ github.actor }} MESSAGE: ${{ github.event.head_commit.message }} SHA: ${{ github.sha }} with: github-token: ${{ secrets.DOWNSTREAM_TOKEN }} script: | const { ACTOR, MESSAGE, SHA } = process.env; const result = await github.rest.actions.createWorkflowDispatch({ owner: '${{ secrets.DOWNSTREAM_OWNER }}', repo: '${{ secrets.DOWNSTREAM_REPO }}', workflow_id: '${{ secrets.DOWNSTREAM_WORKFLOW_ID }}', ref: 'main', inputs: { sha: SHA, actor: ACTOR, message: MESSAGE } }); ================================================ FILE: .github/workflows/release-nightly.yml ================================================ name: Release Nightly on: schedule: # Run at 0:00 AM UTC every day - cron: '0 0 * * *' workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: contents: write packages: write pull-requests: write actions: read jobs: # --------------------------------------------------------------------------- # OTel Collector Nightly # --------------------------------------------------------------------------- build-otel-collector-nightly: name: Build OTel Collector Nightly (${{ matrix.arch }}) strategy: fail-fast: true matrix: include: - arch: amd64 platform: linux/amd64 runner: ubuntu-latest - arch: arm64 platform: linux/arm64 runner: ubuntu-latest-arm64 runs-on: ${{ matrix.runner }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Build and Push uses: docker/build-push-action@v6 with: context: . file: ./docker/otel-collector/Dockerfile platforms: ${{ matrix.platform }} target: prod tags: | ${{ env.OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_NIGHTLY_TAG }}-${{ matrix.arch }} ${{ env.NEXT_OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_NIGHTLY_TAG }}-${{ matrix.arch }} push: true cache-from: type=gha,scope=otel-collector-nightly-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=otel-collector-nightly-${{ matrix.arch }} publish-otel-collector-nightly: name: Publish OTel Collector Nightly Manifest needs: build-otel-collector-nightly runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create multi-arch manifests run: | TAG="${{ env.IMAGE_NIGHTLY_TAG }}" for IMAGE in "${{ env.OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB }}" "${{ env.NEXT_OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB }}"; do docker buildx imagetools create \ -t "${IMAGE}:${TAG}" \ "${IMAGE}:${TAG}-amd64" \ "${IMAGE}:${TAG}-arm64" done # --------------------------------------------------------------------------- # App Nightly # --------------------------------------------------------------------------- build-app-nightly: name: Build App Nightly (${{ matrix.arch }}) strategy: fail-fast: true matrix: include: - arch: amd64 platform: linux/amd64 runner: Large-Runner-x64-32 - arch: arm64 platform: linux/arm64 runner: Large-Runner-ARM64-32 runs-on: ${{ matrix.runner }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Build and Push uses: docker/build-push-action@v6 with: file: ./docker/hyperdx/Dockerfile platforms: ${{ matrix.platform }} target: prod build-contexts: | hyperdx=./docker/hyperdx api=./packages/api app=./packages/app build-args: | CODE_VERSION=${{ env.IMAGE_NIGHTLY_TAG }} tags: | ${{ env.IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_NIGHTLY_TAG }}-${{ matrix.arch }} push: true sbom: true provenance: true cache-from: type=gha,scope=app-nightly-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=app-nightly-${{ matrix.arch }} publish-app-nightly: name: Publish App Nightly Manifest needs: build-app-nightly runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create multi-arch manifest run: | TAG="${{ env.IMAGE_NIGHTLY_TAG }}" IMAGE="${{ env.IMAGE_NAME_DOCKERHUB }}" docker buildx imagetools create \ -t "${IMAGE}:${TAG}" \ "${IMAGE}:${TAG}-amd64" \ "${IMAGE}:${TAG}-arm64" # --------------------------------------------------------------------------- # Local Nightly (all-in-one-noauth) # --------------------------------------------------------------------------- build-local-nightly: name: Build Local Nightly (${{ matrix.arch }}) strategy: fail-fast: true matrix: include: - arch: amd64 platform: linux/amd64 runner: Large-Runner-x64-32 - arch: arm64 platform: linux/arm64 runner: Large-Runner-ARM64-32 runs-on: ${{ matrix.runner }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Build and Push uses: docker/build-push-action@v6 with: file: ./docker/hyperdx/Dockerfile platforms: ${{ matrix.platform }} target: all-in-one-noauth build-contexts: | clickhouse=./docker/clickhouse otel-collector=./docker/otel-collector hyperdx=./docker/hyperdx api=./packages/api app=./packages/app build-args: | CODE_VERSION=${{ env.IMAGE_NIGHTLY_TAG }} tags: | ${{ env.LOCAL_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_NIGHTLY_TAG }}-${{ matrix.arch }} ${{ env.NEXT_LOCAL_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_NIGHTLY_TAG }}-${{ matrix.arch }} push: true sbom: true provenance: true cache-from: type=gha,scope=local-nightly-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=local-nightly-${{ matrix.arch }} publish-local-nightly: name: Publish Local Nightly Manifest needs: build-local-nightly runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create multi-arch manifests run: | TAG="${{ env.IMAGE_NIGHTLY_TAG }}" for IMAGE in "${{ env.LOCAL_IMAGE_NAME_DOCKERHUB }}" "${{ env.NEXT_LOCAL_IMAGE_NAME_DOCKERHUB }}"; do docker buildx imagetools create \ -t "${IMAGE}:${TAG}" \ "${IMAGE}:${TAG}-amd64" \ "${IMAGE}:${TAG}-arm64" done # --------------------------------------------------------------------------- # All-in-One Nightly (all-in-one-auth) # --------------------------------------------------------------------------- build-all-in-one-nightly: name: Build All-in-One Nightly (${{ matrix.arch }}) strategy: fail-fast: true matrix: include: - arch: amd64 platform: linux/amd64 runner: Large-Runner-x64-32 - arch: arm64 platform: linux/arm64 runner: Large-Runner-ARM64-32 runs-on: ${{ matrix.runner }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Build and Push uses: docker/build-push-action@v6 with: file: ./docker/hyperdx/Dockerfile platforms: ${{ matrix.platform }} target: all-in-one-auth build-contexts: | clickhouse=./docker/clickhouse otel-collector=./docker/otel-collector hyperdx=./docker/hyperdx api=./packages/api app=./packages/app build-args: | CODE_VERSION=${{ env.IMAGE_NIGHTLY_TAG }} tags: | ${{ env.ALL_IN_ONE_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_NIGHTLY_TAG }}-${{ matrix.arch }} ${{ env.NEXT_ALL_IN_ONE_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_NIGHTLY_TAG }}-${{ matrix.arch }} push: true sbom: true provenance: true cache-from: type=gha,scope=all-in-one-nightly-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=all-in-one-nightly-${{ matrix.arch }} publish-all-in-one-nightly: name: Publish All-in-One Nightly Manifest needs: build-all-in-one-nightly runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create multi-arch manifests run: | TAG="${{ env.IMAGE_NIGHTLY_TAG }}" for IMAGE in "${{ env.ALL_IN_ONE_IMAGE_NAME_DOCKERHUB }}" "${{ env.NEXT_ALL_IN_ONE_IMAGE_NAME_DOCKERHUB }}"; do docker buildx imagetools create \ -t "${IMAGE}:${TAG}" \ "${IMAGE}:${TAG}-amd64" \ "${IMAGE}:${TAG}-arm64" done # --------------------------------------------------------------------------- # Failure notification + OTel # --------------------------------------------------------------------------- slack-notify-failure: needs: [ publish-otel-collector-nightly, publish-app-nightly, publish-local-nightly, publish-all-in-one-nightly, ] runs-on: ubuntu-24.04 if: failure() && always() steps: - name: Checkout uses: actions/checkout@v4 - name: Get failed jobs id: get_failed_jobs uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const response = await github.rest.actions.listJobsForWorkflowRun({ owner: context.repo.owner, repo: context.repo.repo, run_id: context.runId }); const failedJobs = response.data.jobs .filter(job => job.status === 'completed' && job.conclusion === 'failure') .map(job => job.name) .join(', '); core.setOutput('failed_jobs', failedJobs); - name: Slack Notification uses: 8398a7/action-slack@v3 with: status: custom fields: repo,workflow,commit,author custom_payload: | { "text": "Release Nightly Failed", "attachments": [{ "color": "danger", "fields": [ { "title": "Failed Build", "value": "${{ steps.get_failed_jobs.outputs.failed_jobs }}", "short": false }, { "title": "Commit", "value": "", "short": false }, { "title": "Author", "value": "${{ github.actor }}", "short": true } ] }] } env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL_ENG_NOTIFS }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} otel-cicd-action: if: always() name: OpenTelemetry Export Trace runs-on: ubuntu-latest needs: [ publish-otel-collector-nightly, publish-app-nightly, publish-local-nightly, publish-all-in-one-nightly, slack-notify-failure, ] steps: - name: Export workflow uses: corentinmusard/otel-cicd-action@v4 with: otlpEndpoint: ${{ secrets.OTLP_ENDPOINT }}/v1/traces otlpHeaders: ${{ secrets.OTLP_HEADERS }} otelServiceName: 'release-nightly-hyperdx-oss-workflow' githubToken: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/release.yml ================================================ name: Release on: push: branches: [main] permissions: contents: write packages: write pull-requests: write actions: read jobs: check_changesets: name: Check Changesets runs-on: ubuntu-24.04 outputs: changeset_outputs_hasChangesets: ${{ steps.changesets.outputs.hasChangesets }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' cache-dependency-path: 'yarn.lock' cache: 'yarn' - name: Install root dependencies run: yarn install - name: Create Release Pull Request or Publish to npm if: always() continue-on-error: true id: changesets uses: changesets/action@v1 with: commit: 'chore(release): bump HyperDX app/package versions' title: 'Release HyperDX' version: yarn run version publish: yarn release env: YARN_ENABLE_IMMUTABLE_INSTALLS: false GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} # --------------------------------------------------------------------------- # Check if version already published (skip-if-exists) # --------------------------------------------------------------------------- check_version: name: Check if version exists needs: check_changesets runs-on: ubuntu-24.04 if: needs.check_changesets.outputs.changeset_outputs_hasChangesets == 'false' outputs: should_release: ${{ steps.check.outputs.should_release }} steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Check if app image tag already exists id: check run: | TAG_EXISTS=$(docker manifest inspect ${{ env.IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }} > /dev/null 2>&1 && echo "true" || echo "false") if [ "$TAG_EXISTS" = "true" ]; then echo "Tag ${{ env.IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }} already exists. Skipping release." echo "should_release=false" >> $GITHUB_OUTPUT else echo "Tag does not exist. Proceeding with release." echo "should_release=true" >> $GITHUB_OUTPUT fi # --------------------------------------------------------------------------- # OTel Collector – build each arch natively, then merge into multi-arch tag # --------------------------------------------------------------------------- build-otel-collector: name: Build OTel Collector (${{ matrix.arch }}) needs: [check_changesets, check_version] if: needs.check_version.outputs.should_release == 'true' strategy: fail-fast: true matrix: include: - arch: amd64 platform: linux/amd64 runner: ubuntu-latest - arch: arm64 platform: linux/arm64 runner: ubuntu-latest-arm64 runs-on: ${{ matrix.runner }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Build and Push uses: docker/build-push-action@v6 with: context: . file: ./docker/otel-collector/Dockerfile platforms: ${{ matrix.platform }} target: prod tags: | ${{ env.OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}-${{ matrix.arch }} ${{ env.NEXT_OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}-${{ matrix.arch }} push: true cache-from: type=gha,scope=otel-collector-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=otel-collector-${{ matrix.arch }} publish-otel-collector: name: Publish OTel Collector Manifest needs: [check_version, build-otel-collector] runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create multi-arch manifests run: | VERSION="${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}" MAJOR="${{ env.IMAGE_VERSION }}" LATEST="${{ env.IMAGE_LATEST_TAG }}" for IMAGE in "${{ env.OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB }}" "${{ env.NEXT_OTEL_COLLECTOR_IMAGE_NAME_DOCKERHUB }}"; do docker buildx imagetools create \ -t "${IMAGE}:${VERSION}" \ -t "${IMAGE}:${MAJOR}" \ -t "${IMAGE}:${LATEST}" \ "${IMAGE}:${VERSION}-amd64" \ "${IMAGE}:${VERSION}-arm64" done # --------------------------------------------------------------------------- # App (fullstack prod) – build each arch natively, then merge # --------------------------------------------------------------------------- build-app: name: Build App (${{ matrix.arch }}) needs: [check_changesets, check_version] if: needs.check_version.outputs.should_release == 'true' strategy: fail-fast: true matrix: include: - arch: amd64 platform: linux/amd64 runner: Large-Runner-x64-32 - arch: arm64 platform: linux/arm64 runner: Large-Runner-ARM64-32 runs-on: ${{ matrix.runner }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Build and Push uses: docker/build-push-action@v6 with: file: ./docker/hyperdx/Dockerfile platforms: ${{ matrix.platform }} target: prod build-contexts: | hyperdx=./docker/hyperdx api=./packages/api app=./packages/app build-args: | CODE_VERSION=${{ env.CODE_VERSION }} tags: | ${{ env.IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}-${{ matrix.arch }} push: true sbom: true provenance: true cache-from: type=gha,scope=app-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=app-${{ matrix.arch }} publish-app: name: Publish App Manifest needs: [check_version, build-app] runs-on: ubuntu-latest outputs: app_was_pushed: 'true' steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create multi-arch manifest run: | VERSION="${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}" MAJOR="${{ env.IMAGE_VERSION }}" LATEST="${{ env.IMAGE_LATEST_TAG }}" IMAGE="${{ env.IMAGE_NAME_DOCKERHUB }}" docker buildx imagetools create \ -t "${IMAGE}:${VERSION}" \ -t "${IMAGE}:${MAJOR}" \ -t "${IMAGE}:${LATEST}" \ "${IMAGE}:${VERSION}-amd64" \ "${IMAGE}:${VERSION}-arm64" # --------------------------------------------------------------------------- # Local (all-in-one-noauth) – build each arch natively, then merge # --------------------------------------------------------------------------- build-local: name: Build Local (${{ matrix.arch }}) needs: [check_changesets, check_version] if: needs.check_version.outputs.should_release == 'true' strategy: fail-fast: true matrix: include: - arch: amd64 platform: linux/amd64 runner: Large-Runner-x64-32 - arch: arm64 platform: linux/arm64 runner: Large-Runner-ARM64-32 runs-on: ${{ matrix.runner }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Build and Push uses: docker/build-push-action@v6 with: file: ./docker/hyperdx/Dockerfile platforms: ${{ matrix.platform }} target: all-in-one-noauth build-contexts: | clickhouse=./docker/clickhouse otel-collector=./docker/otel-collector hyperdx=./docker/hyperdx api=./packages/api app=./packages/app build-args: | CODE_VERSION=${{ env.CODE_VERSION }} tags: | ${{ env.LOCAL_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}-${{ matrix.arch }} ${{ env.NEXT_LOCAL_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}-${{ matrix.arch }} push: true sbom: true provenance: true cache-from: type=gha,scope=local-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=local-${{ matrix.arch }} publish-local: name: Publish Local Manifest needs: [check_version, build-local] runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create multi-arch manifests run: | VERSION="${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}" MAJOR="${{ env.IMAGE_VERSION }}" LATEST="${{ env.IMAGE_LATEST_TAG }}" for IMAGE in "${{ env.LOCAL_IMAGE_NAME_DOCKERHUB }}" "${{ env.NEXT_LOCAL_IMAGE_NAME_DOCKERHUB }}"; do docker buildx imagetools create \ -t "${IMAGE}:${VERSION}" \ -t "${IMAGE}:${MAJOR}" \ -t "${IMAGE}:${LATEST}" \ "${IMAGE}:${VERSION}-amd64" \ "${IMAGE}:${VERSION}-arm64" done # --------------------------------------------------------------------------- # All-in-One (all-in-one-auth) – build each arch natively, then merge # --------------------------------------------------------------------------- build-all-in-one: name: Build All-in-One (${{ matrix.arch }}) needs: [check_changesets, check_version] if: needs.check_version.outputs.should_release == 'true' strategy: fail-fast: true matrix: include: - arch: amd64 platform: linux/amd64 runner: Large-Runner-x64-32 - arch: arm64 platform: linux/arm64 runner: Large-Runner-ARM64-32 runs-on: ${{ matrix.runner }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Build and Push uses: docker/build-push-action@v6 with: file: ./docker/hyperdx/Dockerfile platforms: ${{ matrix.platform }} target: all-in-one-auth build-contexts: | clickhouse=./docker/clickhouse otel-collector=./docker/otel-collector hyperdx=./docker/hyperdx api=./packages/api app=./packages/app build-args: | CODE_VERSION=${{ env.CODE_VERSION }} tags: | ${{ env.ALL_IN_ONE_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}-${{ matrix.arch }} ${{ env.NEXT_ALL_IN_ONE_IMAGE_NAME_DOCKERHUB }}:${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}-${{ matrix.arch }} push: true sbom: true provenance: true cache-from: type=gha,scope=all-in-one-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=all-in-one-${{ matrix.arch }} publish-all-in-one: name: Publish All-in-One Manifest needs: [check_version, build-all-in-one] runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create multi-arch manifests run: | VERSION="${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }}" MAJOR="${{ env.IMAGE_VERSION }}" LATEST="${{ env.IMAGE_LATEST_TAG }}" for IMAGE in "${{ env.ALL_IN_ONE_IMAGE_NAME_DOCKERHUB }}" "${{ env.NEXT_ALL_IN_ONE_IMAGE_NAME_DOCKERHUB }}"; do docker buildx imagetools create \ -t "${IMAGE}:${VERSION}" \ -t "${IMAGE}:${MAJOR}" \ -t "${IMAGE}:${LATEST}" \ "${IMAGE}:${VERSION}-amd64" \ "${IMAGE}:${VERSION}-arm64" done # --------------------------------------------------------------------------- # Downstream notifications # --------------------------------------------------------------------------- notify_helm_charts: name: Notify Helm-Charts Downstream needs: [ check_changesets, publish-app, publish-otel-collector, publish-local, publish-all-in-one, ] runs-on: ubuntu-24.04 if: | needs.check_changesets.outputs.changeset_outputs_hasChangesets == 'false' && needs.publish-app.outputs.app_was_pushed == 'true' steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Notify Helm-Charts Downstream uses: actions/github-script@v7 continue-on-error: true env: TAG: ${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }} with: github-token: ${{ secrets.CH_BOT_PAT }} script: | const { TAG } = process.env; const result = await github.rest.actions.createWorkflowDispatch({ owner: 'ClickHouse', repo: 'ClickStack-helm-charts', workflow_id: '${{ secrets.DOWNSTREAM_HC_WORKFLOW_ID }}', ref: 'main', inputs: { tag: TAG } }); notify_ch: name: Notify CH Downstream needs: [ check_changesets, publish-app, publish-otel-collector, publish-local, publish-all-in-one, ] runs-on: ubuntu-24.04 # Temporarily disabled: if: false # if: | # needs.check_changesets.outputs.changeset_outputs_hasChangesets == 'false' && # needs.publish-app.outputs.app_was_pushed == 'true' steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Get Downstream App Installation Token id: auth uses: actions/create-github-app-token@v2 with: app-id: ${{ secrets.DOWNSTREAM_CH_APP_ID }} private-key: ${{ secrets.DOWNSTREAM_CH_APP_PRIVATE_KEY }} owner: ${{ secrets.DOWNSTREAM_CH_OWNER }} - name: Notify CH Downstream uses: actions/github-script@v7 continue-on-error: true env: TAG: ${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }} with: github-token: ${{ steps.auth.outputs.token }} script: | const { TAG } = process.env; const result = await github.rest.actions.createWorkflowDispatch({ owner: '${{ secrets.DOWNSTREAM_CH_OWNER }}', repo: '${{ secrets.DOWNSTREAM_DP_REPO }}', workflow_id: '${{ secrets.DOWNSTREAM_DP_WORKFLOW_ID }}', ref: 'main', inputs: { tag: TAG } }); notify_clickhouse_clickstack: needs: [ check_changesets, publish-app, publish-otel-collector, publish-local, publish-all-in-one, ] if: needs.publish-app.outputs.app_was_pushed == 'true' timeout-minutes: 5 runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 - name: Load Environment Variables from .env uses: xom9ikk/dotenv@v2 - name: Notify ClickHouse/clickhouse-clickstack Downstream uses: actions/github-script@v7 continue-on-error: true env: TAG: ${{ env.IMAGE_VERSION }}${{ env.IMAGE_VERSION_SUB_TAG }} with: github-token: ${{ secrets.CH_BOT_PAT }} script: | const { TAG } = process.env; const result = await github.rest.actions.createWorkflowDispatch({ owner: 'ClickHouse', repo: 'clickhouse-clickstack', workflow_id: 'sync-hyperdx.yml', ref: 'main', inputs: { tag: TAG, } }); otel-cicd-action: if: always() name: OpenTelemetry Export Trace runs-on: ubuntu-latest needs: [ check_changesets, publish-app, publish-otel-collector, publish-local, publish-all-in-one, notify_helm_charts, notify_ch, notify_clickhouse_clickstack, ] steps: - name: Export workflow uses: corentinmusard/otel-cicd-action@v4 with: otlpEndpoint: ${{ secrets.OTLP_ENDPOINT }}/v1/traces otlpHeaders: ${{ secrets.OTLP_HEADERS }} otelServiceName: 'release-hyperdx-oss-workflow' githubToken: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/security-audit.yml ================================================ name: Vulnerability Alerts on: schedule: - cron: '0 9 * * *' # Daily at 9am UTC workflow_dispatch: jobs: alert: runs-on: ubuntu-latest steps: - uses: kunalnagarco/action-cve@v1.14.23 with: org: hyperdxio token: ${{ secrets.DEPENDABOT_NOTIF_PAT }} slack_webhook: ${{ secrets.SLACK_WEBHOOK_VULNERABILITIES }} severity: medium,high,critical ================================================ FILE: .gitignore ================================================ # Claude Code user-local settings (not project config) .claude/settings.local.json # Override global .gitignore to track project-level AI tooling configs !.cursor !.cursor/mcp.json .worktrees # Playwright MCP scratch files seed.spec.ts specs/ # misc **/.DS_Store **/*.pem **/keys # logs **/*.log **/npm-debug.log* **/lerna-debug.log* # yarn **/yarn-debug.log* **/yarn-error.log* .yarn/* !.yarn/cache !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/sdks !.yarn/versions # dotenv environment variable files **/.env.development.local **/.env.test.local **/.env.production.local **/.env.local **/.dockerhub.env **/.ghcr.env # Next.js build output packages/app/.next packages/app/.pnp packages/app/.pnp.js packages/app/.vercel packages/app/coverage packages/app/out packages/app/tmp packages/app/next-env.d.ts # optional npm cache directory **/.npm # dependency directories **/node_modules # build output **/dist **/build **/tsconfig.tsbuildinfo # jest coverage report **/coverage # e2e e2e/cypress/screenshots/ e2e/cypress/videos/ e2e/cypress/results # playwright **/test-results/ **/playwright-report/ **/playwright/.cache/ **/.auth/ # storybook **/storybook-static/ # scripts scripts/*.csv **/venv **/__pycache__/ *.py[cod] *$py.class # docker docker-compose.prod.yml .volumes # NX .nx/ # webstorm .idea ================================================ FILE: .husky/pre-commit ================================================ #!/usr/bin/env sh set -e . "$(dirname -- "$0")/_/husky.sh" npx lint-staged ================================================ FILE: .kodiak.toml ================================================ version = 1 [merge] # Label to enable Kodiak to merge a PR. automerge_label = "automerge" # When disabled, Kodiak will immediately attempt to merge any PR that passes all # GitHub branch protection requirements. require_automerge_label = true # If you're using the "Require signed commits" GitHub Branch Protection setting # to require commit signatures, "merge" or "squash" are the only compatible options. "rebase" will cause Kodiak to raise a configuration error. method = "squash" # default: "merge", options: "merge", "squash", "rebase" # Once a PR is merged, delete the branch. This option behaves like the GitHub # repository setting "Automatically delete head branches", which automatically # deletes head branches after pull requests are merged. delete_branch_on_merge = true # default: false # If there is a merge conflict, make a comment on the PR and remove the # automerge label. This option only applies when `merge.require_automerge_label` # is enabled. notify_on_conflict = true # default: true # Don't wait for in-progress status checks on a PR to finish before updating the # branch. optimistic_updates = true # default: true # If a PR is passing all checks and is able to be merged, merge it without # placing it in the merge queue. This option adds some unfairness where PRs # waiting in the queue the longest are not served first. prioritize_ready_to_merge = true # default: false # Never merge a PR. This option can be used with `update.always` to # automatically update a PR without merging. do_not_merge = false # default: false [merge.message] # By default (`"github_default"`), GitHub uses the title of a PR's first commit # for the merge commit title. `"pull_request_title"` uses the PR title for the # merge commit. title = "pull_request_title" # default: "github_default", options: "github_default", "pull_request_title" # By default (`"github_default"`), GitHub combines the titles of a PR's commits # to create the body text of a merge commit. `"pull_request_body"` uses the # content of the PR to generate the body content while `"empty"` sets an empty # body. body = "pull_request_body" # default: "github_default", options: "github_default", "pull_request_body", "empty" # Append the Pull Request URL to the merge message. Makes navigating to the PR # from the commit easier. #### NOTE: 'true' required for benchmarks in CI: include_pull_request_url = false # default: false # Add the PR number to the merge commit title. This setting replicates GitHub's # behavior of automatically adding the PR number to the title of merges created # through the UI. This option only applies when `merge.message.title` does not # equal `"github_default"`. ### NOTE: if this is set to true github links to unrelated OSS issues, which is confusing include_pr_number = true # default: true # Control the text used in the merge commit. The GitHub default is markdown, but # `"plain_text"` or `"html"` can be used to render the pull request body as text # or HTML. This option only applies when `merge.message.body = "pull_request_body"`. body_type = "markdown" # default: "markdown", options: "plain_text", "markdown", "html" # Strip HTML comments (``) from merge commit body. # This setting is useful for stripping HTML comments created by PR templates. # This option only applies when `merge.message.body_type = "markdown"`. strip_html_comments = true # default: false # Remove all content before the configured string in the pull request body. # This setting is useful when we want to include only a part of the pull request # description as the commit message. # This option only applies when `merge.message.body_type = "markdown"`. cut_body_before = "" include_coauthors = true [update] # Update a PR whenever out of date with the base branch. The PR will be updated # regardless of merge requirements (e.g. failing status checks, missing reviews, # blacklist labels). # # Kodiak will only update PRs with the `merge.automerge_label` label or if # `update.require_automerge_label = false`. # # When enabled, _Kodiak will not be able to efficiently update PRs._ If you have # multiple PRs against a target like `master`, any time a commit is added to # `master` _all_ of those PRs against `master` will update. For `N` PRs against # a target you will see at least `N(N-1)/2` updates. If this configuration # option was disabled you would only see at least `N-1` updates. always = false # default: false # When enabled, Kodiak will only update PRs that have an automerge label # (configured via `merge.automerge_label`). When disable, Kodiak will update any # PR. This option only applies when `update.always = true`. require_automerge_label = true # default: true ================================================ FILE: .mcp.json ================================================ { "mcpServers": { "playwright-test": { "command": "npx", "args": ["playwright", "run-test-mcp-server"] } } } ================================================ FILE: .nvmrc ================================================ 22.21.1 ================================================ FILE: .opencode/commands/do-linear.md ================================================ --- description: Fetch a Linear ticket, implement the fix/feature, test, commit, push, and raise a PR --- Look up the Linear ticket $ARGUMENTS. Read the ticket description, comments, and any linked resources thoroughly. ## Phase 1: Understand the Ticket - Summarize the ticket — what is being asked for (bug fix, feature, refactor, etc.) - Identify acceptance criteria or expected behavior from the description - Note any linked issues, related tickets, or dependencies If the ticket description is too vague or lacks enough information to proceed confidently, **stop and ask me for clarification** before writing any code. Explain exactly what information is missing and what assumptions you would need to make. ## Phase 2: Plan and Implement Before writing code, read the relevant documentation from the `agent_docs/` directory to understand architecture and code patterns. 1. Explore the codebase to understand the relevant code paths and existing patterns 2. Create an implementation plan — which files to change, what approach to take 3. Implement the fix or feature following existing codebase patterns 4. Keep changes minimal and focused on the ticket scope ## Phase 3: Verify Run lint and type checks, then run the appropriate tests based on which packages were modified: 1. Run `make ci-lint` to verify lint and TypeScript types pass 2. Run `make ci-unit` to verify unit tests pass across all packages 3. If any checks fail, fix the issues and re-run until everything passes ## Phase 4: Commit, Push, and Open PR 1. Create a new branch named `/$ARGUMENTS-`. Use the current git/OS username when available, and use `whoami` as a fallback to determine the prefix (e.g. `warren/HDX-1234-fix-search-filter`) 2. Commit the changes using conventional commit format (e.g. `feat:`, `fix:`, `chore:`) and reference the ticket ID 3. Push the branch to the remote 4. Open a pull request with: - Title: `[$ARGUMENTS] ` - Body: Use `.github/pull_request_template.md` as the template and fill it in with the relevant summary, testing notes, and Linear ticket link - Label: Attach the `ai-generated` label ================================================ FILE: .opencode/commands/plan-linear.md ================================================ --- description: Research a Linear ticket and create an implementation plan agent: plan --- Look up the Linear ticket $ARGUMENTS. Read the ticket description and all comments on the ticket thoroughly. Based on your research of the ticket, come up with a detailed implementation plan. The plan should include: 1. **Summary** — A concise summary of what the ticket is asking for 2. **Context** — Relevant information gathered from the ticket description and comments 3. **Approach** — Step-by-step implementation plan with specific files and components to modify 4. **Testing** — How the changes should be tested 5. **Open Questions** — Any ambiguities or decisions that need clarification Before writing the plan, explore the codebase to understand the relevant code paths and existing patterns. Reference specific files and line numbers where changes will be needed. ================================================ FILE: .prettierignore ================================================ # Ignore artifacts: dist coverage .volumes ================================================ FILE: .prettierrc ================================================ { "printWidth": 80, "tabWidth": 2, "useTabs": false, "semi": true, "singleQuote": true, "trailingComma": "all", "bracketSpacing": true, "jsxBracketSameLine": false, "fluid": false, "arrowParens": "avoid", "proseWrap": "always" } ================================================ FILE: .vex/openssl-mongodb.vex.json ================================================ { "@context": "https://openvex.dev/ns/v0.2.0", "@id": "https://github.com/hyperdxio/hyperdx/blob/main/.vex/openssl-mongodb.vex.json", "author": "HyperDX Team", "role": "Supplier", "timestamp": "2026-02-17T00:00:00Z", "version": 1, "statements": [ { "vulnerability": { "name": "CVE-2021-3711" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. OpenSSL certificate-parsing vulnerabilities are not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2021-3712" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. OpenSSL certificate-parsing vulnerabilities are not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2021-4044" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. OpenSSL vulnerabilities are not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2022-0778" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode. Certificate processing from untrusted sources does not occur, making this infinite-loop vulnerability unexploitable." }, { "vulnerability": { "name": "CVE-2022-1473" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This memory leak vulnerability is not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2022-3358" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode. Custom cipher usage from untrusted sources does not occur in this deployment." }, { "vulnerability": { "name": "CVE-2022-3602" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This buffer overflow vulnerability is not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2022-3786" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This buffer overflow vulnerability is not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2022-3996" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode. The double-locking issue is not triggerable via external input in this deployment." }, { "vulnerability": { "name": "CVE-2023-0286" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode. External GeneralName certificate parsing does not occur in this deployment." }, { "vulnerability": { "name": "CVE-2023-0464" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode. Untrusted X.509 certificate chains with policy constraints are not processed in this deployment." }, { "vulnerability": { "name": "CVE-2023-5363" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode. Untrusted key/IV inputs from external sources are not processed in this deployment." }, { "vulnerability": { "name": "CVE-2024-4741" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This use-after-free vulnerability is not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2024-5535" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode. The SSL_select_next_proto vulnerability requires attacker-controlled input not present in this deployment." }, { "vulnerability": { "name": "CVE-2024-6119" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode. OCSP responses from external sources are not processed in this deployment." }, { "vulnerability": { "name": "CVE-2025-9230" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This OpenSSL vulnerability is not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2025-15467" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This OpenSSL vulnerability is not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2025-69419" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This OpenSSL vulnerability is not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2025-69420" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This OpenSSL vulnerability is not exploitable in this deployment." }, { "vulnerability": { "name": "CVE-2025-69421" }, "products": [{ "@id": "pkg:oci/clickstack" }], "status": "not_affected", "justification": "inline_mitigations_already_exist", "impact_statement": "MongoDB is deployed in localhost-only mode and does not process external TLS certificates. This OpenSSL vulnerability is not exploitable in this deployment." } ] } ================================================ FILE: .vscode/extensions.json ================================================ { "recommendations": [ "vunguyentuan.vscode-css-variables", "clinyong.vscode-css-modules", "streetsidesoftware.code-spell-checker", "dbaeumer.vscode-eslint", "stylelint.vscode-stylelint", "esbenp.prettier-vscode" ] } ================================================ FILE: .vscode/settings.json ================================================ { "editor.tabSize": 2, "editor.insertSpaces": true, "editor.detectIndentation": false, "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": "always", "source.fixAll.stylelint": "always" }, "eslint.useFlatConfig": true, "[typescript]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, "[typescriptreact]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, "[scss]": { "editor.defaultFormatter": "stylelint.vscode-stylelint" }, "[css]": { "editor.defaultFormatter": "stylelint.vscode-stylelint" }, "eslint.workingDirectories": [ { "mode": "auto" } ], "stylelint.validate": ["css", "postcss", "scss"], "cssVariables.lookupFiles": [ "**/*.css", "**/*.scss", "**/*.sass", "**/*.less", "node_modules/@mantine/core/styles.css" ], "search.exclude": { "**/node_modules": true, "**/bower_components": true, "**/.next": true, "**/*.code-search": true, "**/*.map": true, "**/yarn.lock": true, "**/yarn-*.cjs": true }, "cSpell.words": [ "clickhouse", "hyperdx", "micropip", "opamp", "pyimport", "pyodide" ] } ================================================ FILE: .yarn/releases/yarn-1.22.18.cjs ================================================ #!/usr/bin/env node module.exports = /******/ (function (modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if (installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = (installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {}, /******/ }); /******/ /******/ // Execute the module function /******/ modules[moduleId].call( module.exports, module, module.exports, __webpack_require__, ); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function (value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function (exports, name, getter) { /******/ if (!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter, /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function (module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ''; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__((__webpack_require__.s = 517)); /******/ })( /************************************************************************/ /******/ [ /* 0 */ /***/ function (module, exports) { module.exports = require('path'); /***/ }, /* 1 */ /***/ function (module, __webpack_exports__, __webpack_require__) { 'use strict'; /* harmony export (immutable) */ __webpack_exports__['a'] = __extends; /* unused harmony export __assign */ /* unused harmony export __rest */ /* unused harmony export __decorate */ /* unused harmony export __param */ /* unused harmony export __metadata */ /* unused harmony export __awaiter */ /* unused harmony export __generator */ /* unused harmony export __exportStar */ /* unused harmony export __values */ /* unused harmony export __read */ /* unused harmony export __spread */ /* unused harmony export __await */ /* unused harmony export __asyncGenerator */ /* unused harmony export __asyncDelegator */ /* unused harmony export __asyncValues */ /* unused harmony export __makeTemplateObject */ /* unused harmony export __importStar */ /* unused harmony export __importDefault */ /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. 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 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ /* global Reflect, Promise */ var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; function __extends(d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __()); } var __assign = function () { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === 'function') for ( var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++ ) if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; return t; } function __decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? (desc = Object.getOwnPropertyDescriptor(target, key)) : desc, d; if ( typeof Reflect === 'object' && typeof Reflect.decorate === 'function' ) r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if ((d = decorators[i])) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } function __param(paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); }; } function __metadata(metadataKey, metadataValue) { if ( typeof Reflect === 'object' && typeof Reflect.metadata === 'function' ) return Reflect.metadata(metadataKey, metadataValue); } function __awaiter(thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator['throw'](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [], }, f, y, t, g; return ( (g = { next: verb(0), throw: verb(1), return: verb(2) }), typeof Symbol === 'function' && (g[Symbol.iterator] = function () { return this; }), g ); function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError('Generator is already executing.'); while (_) try { if ( ((f = 1), y && (t = op[0] & 2 ? y['return'] : op[0] ? y['throw'] || ((t = y['return']) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) ) return t; if (((y = 0), t)) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if ( !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && (op[0] === 6 || op[0] === 2) ) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __exportStar(m, exports) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } function __values(o) { var m = typeof Symbol === 'function' && o[Symbol.iterator], i = 0; if (m) return m.call(o); return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; }, }; } function __read(o, n) { var m = typeof Symbol === 'function' && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i['return'])) m.call(i); } finally { if (e) throw e.error; } } return ar; } function __spread() { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; } function __await(v) { return this instanceof __await ? ((this.v = v), this) : new __await(v); } function __asyncGenerator(thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError('Symbol.asyncIterator is not defined.'); var g = generator.apply(thisArg, _arguments || []), i, q = []; return ( (i = {}), verb('next'), verb('throw'), verb('return'), (i[Symbol.asyncIterator] = function () { return this; }), i ); function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } function fulfill(value) { resume('next', value); } function reject(value) { resume('throw', value); } function settle(f, v) { if ((f(v), q.shift(), q.length)) resume(q[0][0], q[0][1]); } } function __asyncDelegator(o) { var i, p; return ( (i = {}), verb('next'), verb('throw', function (e) { throw e; }), verb('return'), (i[Symbol.iterator] = function () { return this; }), i ); function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === 'return' } : f ? f(v) : v; } : f; } } function __asyncValues(o) { if (!Symbol.asyncIterator) throw new TypeError('Symbol.asyncIterator is not defined.'); var m = o[Symbol.asyncIterator], i; return m ? m.call(o) : ((o = typeof __values === 'function' ? __values(o) : o[Symbol.iterator]()), (i = {}), verb('next'), verb('throw'), verb('return'), (i[Symbol.asyncIterator] = function () { return this; }), i); function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { (v = o[n](v)), settle(resolve, reject, v.done, v.value); }); }; } function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); } } function __makeTemplateObject(cooked, raw) { if (Object.defineProperty) { Object.defineProperty(cooked, 'raw', { value: raw }); } else { cooked.raw = raw; } return cooked; } function __importStar(mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result.default = mod; return result; } function __importDefault(mod) { return mod && mod.__esModule ? mod : { default: mod }; } /***/ }, /* 2 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; exports.__esModule = true; var _promise = __webpack_require__(224); var _promise2 = _interopRequireDefault(_promise); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = function (fn) { return function () { var gen = fn.apply(this, arguments); return new _promise2.default(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return _promise2.default.resolve(value).then( function (value) { step('next', value); }, function (err) { step('throw', err); }, ); } } return step('next'); }); }; }; /***/ }, /* 3 */ /***/ function (module, exports) { module.exports = require('util'); /***/ }, /* 4 */ /***/ function (module, exports) { module.exports = require('fs'); /***/ }, /* 5 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); exports.getFirstSuitableFolder = exports.readFirstAvailableStream = exports.makeTempDir = exports.hardlinksWork = exports.writeFilePreservingEol = exports.getFileSizeOnDisk = exports.walk = exports.symlink = exports.find = exports.readJsonAndFile = exports.readJson = exports.readFileAny = exports.hardlinkBulk = exports.copyBulk = exports.unlink = exports.glob = exports.link = exports.chmod = exports.lstat = exports.exists = exports.mkdirp = exports.stat = exports.access = exports.rename = exports.readdir = exports.realpath = exports.readlink = exports.writeFile = exports.open = exports.readFileBuffer = exports.lockQueue = exports.constants = undefined; var _asyncToGenerator2; function _load_asyncToGenerator() { return (_asyncToGenerator2 = _interopRequireDefault( __webpack_require__(2), )); } let buildActionsForCopy = (() => { var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( queue, events, possibleExtraneous, reporter, ) { // let build = (() => { var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* (data) { const src = data.src, dest = data.dest, type = data.type; const onFresh = data.onFresh || noop; const onDone = data.onDone || noop; // TODO https://github.com/yarnpkg/yarn/issues/3751 // related to bundled dependencies handling if (files.has(dest.toLowerCase())) { reporter.verbose( `The case-insensitive file ${dest} shouldn't be copied twice in one bulk copy`, ); } else { files.add(dest.toLowerCase()); } if (type === 'symlink') { yield mkdirp((_path || _load_path()).default.dirname(dest)); onFresh(); actions.symlink.push({ dest, linkname: src, }); onDone(); return; } if ( events.ignoreBasenames.indexOf( (_path || _load_path()).default.basename(src), ) >= 0 ) { // ignored file return; } const srcStat = yield lstat(src); let srcFiles; if (srcStat.isDirectory()) { srcFiles = yield readdir(src); } let destStat; try { // try accessing the destination destStat = yield lstat(dest); } catch (e) { // proceed if destination doesn't exist, otherwise error if (e.code !== 'ENOENT') { throw e; } } // if destination exists if (destStat) { const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); const bothFiles = srcStat.isFile() && destStat.isFile(); // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving // us modes that aren't valid. investigate this, it's generally safe to proceed. /* if (srcStat.mode !== destStat.mode) { try { await access(dest, srcStat.mode); } catch (err) {} } */ if (bothFiles && artifactFiles.has(dest)) { // this file gets changed during build, likely by a custom install script. Don't bother checking it. onDone(); reporter.verbose( reporter.lang('verboseFileSkipArtifact', src), ); return; } if ( bothFiles && srcStat.size === destStat.size && (0, (_fsNormalized || _load_fsNormalized()).fileDatesEqual)( srcStat.mtime, destStat.mtime, ) ) { // we can safely assume this is the same file onDone(); reporter.verbose( reporter.lang( 'verboseFileSkip', src, dest, srcStat.size, +srcStat.mtime, ), ); return; } if (bothSymlinks) { const srcReallink = yield readlink(src); if (srcReallink === (yield readlink(dest))) { // if both symlinks are the same then we can continue on onDone(); reporter.verbose( reporter.lang( 'verboseFileSkipSymlink', src, dest, srcReallink, ), ); return; } } if (bothFolders) { // mark files that aren't in this folder as possibly extraneous const destFiles = yield readdir(dest); invariant(srcFiles, 'src files not initialised'); for ( var _iterator4 = destFiles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator](); ; ) { var _ref6; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref6 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref6 = _i4.value; } const file = _ref6; if (srcFiles.indexOf(file) < 0) { const loc = (_path || _load_path()).default.join( dest, file, ); possibleExtraneous.add(loc); if ((yield lstat(loc)).isDirectory()) { for ( var _iterator5 = yield readdir(loc), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator](); ; ) { var _ref7; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref7 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref7 = _i5.value; } const file = _ref7; possibleExtraneous.add( (_path || _load_path()).default.join(loc, file), ); } } } } } } if (destStat && destStat.isSymbolicLink()) { yield (0, (_fsNormalized || _load_fsNormalized()).unlink)( dest, ); destStat = null; } if (srcStat.isSymbolicLink()) { onFresh(); const linkname = yield readlink(src); actions.symlink.push({ dest, linkname, }); onDone(); } else if (srcStat.isDirectory()) { if (!destStat) { reporter.verbose(reporter.lang('verboseFileFolder', dest)); yield mkdirp(dest); } const destParts = dest.split( (_path || _load_path()).default.sep, ); while (destParts.length) { files.add( destParts .join((_path || _load_path()).default.sep) .toLowerCase(), ); destParts.pop(); } // push all files to queue invariant(srcFiles, 'src files not initialised'); let remaining = srcFiles.length; if (!remaining) { onDone(); } for ( var _iterator6 = srcFiles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator](); ; ) { var _ref8; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref8 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref8 = _i6.value; } const file = _ref8; queue.push({ dest: (_path || _load_path()).default.join(dest, file), onFresh, onDone: (function (_onDone) { function onDone() { return _onDone.apply(this, arguments); } onDone.toString = function () { return _onDone.toString(); }; return onDone; })(function () { if (--remaining === 0) { onDone(); } }), src: (_path || _load_path()).default.join(src, file), }); } } else if (srcStat.isFile()) { onFresh(); actions.file.push({ src, dest, atime: srcStat.atime, mtime: srcStat.mtime, mode: srcStat.mode, }); onDone(); } else { throw new Error(`unsure how to copy this: ${src}`); } }, ); return function build(_x5) { return _ref5.apply(this, arguments); }; })(); const artifactFiles = new Set(events.artifactFiles || []); const files = new Set(); // initialise events for ( var _iterator = queue, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { var _ref2; if (_isArray) { if (_i >= _iterator.length) break; _ref2 = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref2 = _i.value; } const item = _ref2; const onDone = item.onDone; item.onDone = function () { events.onProgress(item.dest); if (onDone) { onDone(); } }; } events.onStart(queue.length); // start building actions const actions = { file: [], symlink: [], link: [], }; // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items // at a time due to the requirement to push items onto the queue while (queue.length) { const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); yield Promise.all(items.map(build)); } // simulate the existence of some files to prevent considering them extraneous for ( var _iterator2 = artifactFiles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator](); ; ) { var _ref3; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref3 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref3 = _i2.value; } const file = _ref3; if (possibleExtraneous.has(file)) { reporter.verbose( reporter.lang('verboseFilePhantomExtraneous', file), ); possibleExtraneous.delete(file); } } for ( var _iterator3 = possibleExtraneous, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator](); ; ) { var _ref4; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref4 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref4 = _i3.value; } const loc = _ref4; if (files.has(loc.toLowerCase())) { possibleExtraneous.delete(loc); } } return actions; }); return function buildActionsForCopy(_x, _x2, _x3, _x4) { return _ref.apply(this, arguments); }; })(); let buildActionsForHardlink = (() => { var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( queue, events, possibleExtraneous, reporter, ) { // let build = (() => { var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* (data) { const src = data.src, dest = data.dest; const onFresh = data.onFresh || noop; const onDone = data.onDone || noop; if (files.has(dest.toLowerCase())) { // Fixes issue https://github.com/yarnpkg/yarn/issues/2734 // When bulk hardlinking we have A -> B structure that we want to hardlink to A1 -> B1, // package-linker passes that modules A1 and B1 need to be hardlinked, // the recursive linking algorithm of A1 ends up scheduling files in B1 to be linked twice which will case // an exception. onDone(); return; } files.add(dest.toLowerCase()); if ( events.ignoreBasenames.indexOf( (_path || _load_path()).default.basename(src), ) >= 0 ) { // ignored file return; } const srcStat = yield lstat(src); let srcFiles; if (srcStat.isDirectory()) { srcFiles = yield readdir(src); } const destExists = yield exists(dest); if (destExists) { const destStat = yield lstat(dest); const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); const bothFiles = srcStat.isFile() && destStat.isFile(); if (srcStat.mode !== destStat.mode) { try { yield access(dest, srcStat.mode); } catch (err) { // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving // us modes that aren't valid. investigate this, it's generally safe to proceed. reporter.verbose(err); } } if (bothFiles && artifactFiles.has(dest)) { // this file gets changed during build, likely by a custom install script. Don't bother checking it. onDone(); reporter.verbose( reporter.lang('verboseFileSkipArtifact', src), ); return; } // correct hardlink if ( bothFiles && srcStat.ino !== null && srcStat.ino === destStat.ino ) { onDone(); reporter.verbose( reporter.lang('verboseFileSkip', src, dest, srcStat.ino), ); return; } if (bothSymlinks) { const srcReallink = yield readlink(src); if (srcReallink === (yield readlink(dest))) { // if both symlinks are the same then we can continue on onDone(); reporter.verbose( reporter.lang( 'verboseFileSkipSymlink', src, dest, srcReallink, ), ); return; } } if (bothFolders) { // mark files that aren't in this folder as possibly extraneous const destFiles = yield readdir(dest); invariant(srcFiles, 'src files not initialised'); for ( var _iterator10 = destFiles, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator](); ; ) { var _ref14; if (_isArray10) { if (_i10 >= _iterator10.length) break; _ref14 = _iterator10[_i10++]; } else { _i10 = _iterator10.next(); if (_i10.done) break; _ref14 = _i10.value; } const file = _ref14; if (srcFiles.indexOf(file) < 0) { const loc = (_path || _load_path()).default.join( dest, file, ); possibleExtraneous.add(loc); if ((yield lstat(loc)).isDirectory()) { for ( var _iterator11 = yield readdir(loc), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator](); ; ) { var _ref15; if (_isArray11) { if (_i11 >= _iterator11.length) break; _ref15 = _iterator11[_i11++]; } else { _i11 = _iterator11.next(); if (_i11.done) break; _ref15 = _i11.value; } const file = _ref15; possibleExtraneous.add( (_path || _load_path()).default.join(loc, file), ); } } } } } } if (srcStat.isSymbolicLink()) { onFresh(); const linkname = yield readlink(src); actions.symlink.push({ dest, linkname, }); onDone(); } else if (srcStat.isDirectory()) { reporter.verbose(reporter.lang('verboseFileFolder', dest)); yield mkdirp(dest); const destParts = dest.split( (_path || _load_path()).default.sep, ); while (destParts.length) { files.add( destParts .join((_path || _load_path()).default.sep) .toLowerCase(), ); destParts.pop(); } // push all files to queue invariant(srcFiles, 'src files not initialised'); let remaining = srcFiles.length; if (!remaining) { onDone(); } for ( var _iterator12 = srcFiles, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator](); ; ) { var _ref16; if (_isArray12) { if (_i12 >= _iterator12.length) break; _ref16 = _iterator12[_i12++]; } else { _i12 = _iterator12.next(); if (_i12.done) break; _ref16 = _i12.value; } const file = _ref16; queue.push({ onFresh, src: (_path || _load_path()).default.join(src, file), dest: (_path || _load_path()).default.join(dest, file), onDone: (function (_onDone2) { function onDone() { return _onDone2.apply(this, arguments); } onDone.toString = function () { return _onDone2.toString(); }; return onDone; })(function () { if (--remaining === 0) { onDone(); } }), }); } } else if (srcStat.isFile()) { onFresh(); actions.link.push({ src, dest, removeDest: destExists, }); onDone(); } else { throw new Error(`unsure how to copy this: ${src}`); } }, ); return function build(_x10) { return _ref13.apply(this, arguments); }; })(); const artifactFiles = new Set(events.artifactFiles || []); const files = new Set(); // initialise events for ( var _iterator7 = queue, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator](); ; ) { var _ref10; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref10 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref10 = _i7.value; } const item = _ref10; const onDone = item.onDone || noop; item.onDone = function () { events.onProgress(item.dest); onDone(); }; } events.onStart(queue.length); // start building actions const actions = { file: [], symlink: [], link: [], }; // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items // at a time due to the requirement to push items onto the queue while (queue.length) { const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); yield Promise.all(items.map(build)); } // simulate the existence of some files to prevent considering them extraneous for ( var _iterator8 = artifactFiles, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator](); ; ) { var _ref11; if (_isArray8) { if (_i8 >= _iterator8.length) break; _ref11 = _iterator8[_i8++]; } else { _i8 = _iterator8.next(); if (_i8.done) break; _ref11 = _i8.value; } const file = _ref11; if (possibleExtraneous.has(file)) { reporter.verbose( reporter.lang('verboseFilePhantomExtraneous', file), ); possibleExtraneous.delete(file); } } for ( var _iterator9 = possibleExtraneous, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator](); ; ) { var _ref12; if (_isArray9) { if (_i9 >= _iterator9.length) break; _ref12 = _iterator9[_i9++]; } else { _i9 = _iterator9.next(); if (_i9.done) break; _ref12 = _i9.value; } const loc = _ref12; if (files.has(loc.toLowerCase())) { possibleExtraneous.delete(loc); } } return actions; }); return function buildActionsForHardlink(_x6, _x7, _x8, _x9) { return _ref9.apply(this, arguments); }; })(); let copyBulk = (exports.copyBulk = (() => { var _ref17 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( queue, reporter, _events, ) { const events = { onStart: (_events && _events.onStart) || noop, onProgress: (_events && _events.onProgress) || noop, possibleExtraneous: _events ? _events.possibleExtraneous : new Set(), ignoreBasenames: (_events && _events.ignoreBasenames) || [], artifactFiles: (_events && _events.artifactFiles) || [], }; const actions = yield buildActionsForCopy( queue, events, events.possibleExtraneous, reporter, ); events.onStart( actions.file.length + actions.symlink.length + actions.link.length, ); const fileActions = actions.file; const currentlyWriting = new Map(); yield (_promise || _load_promise()).queue( fileActions, (() => { var _ref18 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* (data) { let writePromise; while ((writePromise = currentlyWriting.get(data.dest))) { yield writePromise; } reporter.verbose( reporter.lang('verboseFileCopy', data.src, data.dest), ); const copier = (0, (_fsNormalized || _load_fsNormalized()).copyFile)( data, function () { return currentlyWriting.delete(data.dest); }, ); currentlyWriting.set(data.dest, copier); events.onProgress(data.dest); return copier; }, ); return function (_x14) { return _ref18.apply(this, arguments); }; })(), CONCURRENT_QUEUE_ITEMS, ); // we need to copy symlinks last as they could reference files we were copying const symlinkActions = actions.symlink; yield (_promise || _load_promise()).queue( symlinkActions, function (data) { const linkname = (_path || _load_path()).default.resolve( (_path || _load_path()).default.dirname(data.dest), data.linkname, ); reporter.verbose( reporter.lang('verboseFileSymlink', data.dest, linkname), ); return symlink(linkname, data.dest); }, ); }); return function copyBulk(_x11, _x12, _x13) { return _ref17.apply(this, arguments); }; })()); let hardlinkBulk = (exports.hardlinkBulk = (() => { var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( queue, reporter, _events, ) { const events = { onStart: (_events && _events.onStart) || noop, onProgress: (_events && _events.onProgress) || noop, possibleExtraneous: _events ? _events.possibleExtraneous : new Set(), artifactFiles: (_events && _events.artifactFiles) || [], ignoreBasenames: [], }; const actions = yield buildActionsForHardlink( queue, events, events.possibleExtraneous, reporter, ); events.onStart( actions.file.length + actions.symlink.length + actions.link.length, ); const fileActions = actions.link; yield (_promise || _load_promise()).queue( fileActions, (() => { var _ref20 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* (data) { reporter.verbose( reporter.lang('verboseFileLink', data.src, data.dest), ); if (data.removeDest) { yield (0, (_fsNormalized || _load_fsNormalized()).unlink)( data.dest, ); } yield link(data.src, data.dest); }, ); return function (_x18) { return _ref20.apply(this, arguments); }; })(), CONCURRENT_QUEUE_ITEMS, ); // we need to copy symlinks last as they could reference files we were copying const symlinkActions = actions.symlink; yield (_promise || _load_promise()).queue( symlinkActions, function (data) { const linkname = (_path || _load_path()).default.resolve( (_path || _load_path()).default.dirname(data.dest), data.linkname, ); reporter.verbose( reporter.lang('verboseFileSymlink', data.dest, linkname), ); return symlink(linkname, data.dest); }, ); }); return function hardlinkBulk(_x15, _x16, _x17) { return _ref19.apply(this, arguments); }; })()); let readFileAny = (exports.readFileAny = (() => { var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( files, ) { for ( var _iterator13 = files, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator](); ; ) { var _ref22; if (_isArray13) { if (_i13 >= _iterator13.length) break; _ref22 = _iterator13[_i13++]; } else { _i13 = _iterator13.next(); if (_i13.done) break; _ref22 = _i13.value; } const file = _ref22; if (yield exists(file)) { return readFile(file); } } return null; }); return function readFileAny(_x19) { return _ref21.apply(this, arguments); }; })()); let readJson = (exports.readJson = (() => { var _ref23 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( loc, ) { return (yield readJsonAndFile(loc)).object; }); return function readJson(_x20) { return _ref23.apply(this, arguments); }; })()); let readJsonAndFile = (exports.readJsonAndFile = (() => { var _ref24 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( loc, ) { const file = yield readFile(loc); try { return { object: (0, (_map || _load_map()).default)( JSON.parse(stripBOM(file)), ), content: file, }; } catch (err) { err.message = `${loc}: ${err.message}`; throw err; } }); return function readJsonAndFile(_x21) { return _ref24.apply(this, arguments); }; })()); let find = (exports.find = (() => { var _ref25 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( filename, dir, ) { const parts = dir.split((_path || _load_path()).default.sep); while (parts.length) { const loc = parts .concat(filename) .join((_path || _load_path()).default.sep); if (yield exists(loc)) { return loc; } else { parts.pop(); } } return false; }); return function find(_x22, _x23) { return _ref25.apply(this, arguments); }; })()); let symlink = (exports.symlink = (() => { var _ref26 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( src, dest, ) { if (process.platform !== 'win32') { // use relative paths otherwise which will be retained if the directory is moved src = (_path || _load_path()).default.relative( (_path || _load_path()).default.dirname(dest), src, ); // When path.relative returns an empty string for the current directory, we should instead use // '.', which is a valid fs.symlink target. src = src || '.'; } try { const stats = yield lstat(dest); if (stats.isSymbolicLink()) { const resolved = dest; if (resolved === src) { return; } } } catch (err) { if (err.code !== 'ENOENT') { throw err; } } // We use rimraf for unlink which never throws an ENOENT on missing target yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); if (process.platform === 'win32') { // use directory junctions if possible on win32, this requires absolute paths yield fsSymlink(src, dest, 'junction'); } else { yield fsSymlink(src, dest); } }); return function symlink(_x24, _x25) { return _ref26.apply(this, arguments); }; })()); let walk = (exports.walk = (() => { var _ref27 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( dir, relativeDir, ignoreBasenames = new Set(), ) { let files = []; let filenames = yield readdir(dir); if (ignoreBasenames.size) { filenames = filenames.filter(function (name) { return !ignoreBasenames.has(name); }); } for ( var _iterator14 = filenames, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator](); ; ) { var _ref28; if (_isArray14) { if (_i14 >= _iterator14.length) break; _ref28 = _iterator14[_i14++]; } else { _i14 = _iterator14.next(); if (_i14.done) break; _ref28 = _i14.value; } const name = _ref28; const relative = relativeDir ? (_path || _load_path()).default.join(relativeDir, name) : name; const loc = (_path || _load_path()).default.join(dir, name); const stat = yield lstat(loc); files.push({ relative, basename: name, absolute: loc, mtime: +stat.mtime, }); if (stat.isDirectory()) { files = files.concat(yield walk(loc, relative, ignoreBasenames)); } } return files; }); return function walk(_x26, _x27) { return _ref27.apply(this, arguments); }; })()); let getFileSizeOnDisk = (exports.getFileSizeOnDisk = (() => { var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( loc, ) { const stat = yield lstat(loc); const size = stat.size, blockSize = stat.blksize; return Math.ceil(size / blockSize) * blockSize; }); return function getFileSizeOnDisk(_x28) { return _ref29.apply(this, arguments); }; })()); let getEolFromFile = (() => { var _ref30 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( path, ) { if (!(yield exists(path))) { return undefined; } const buffer = yield readFileBuffer(path); for (let i = 0; i < buffer.length; ++i) { if (buffer[i] === cr) { return '\r\n'; } if (buffer[i] === lf) { return '\n'; } } return undefined; }); return function getEolFromFile(_x29) { return _ref30.apply(this, arguments); }; })(); let writeFilePreservingEol = (exports.writeFilePreservingEol = (() => { var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( path, data, ) { const eol = (yield getEolFromFile(path)) || (_os || _load_os()).default.EOL; if (eol !== '\n') { data = data.replace(/\n/g, eol); } yield writeFile(path, data); }); return function writeFilePreservingEol(_x30, _x31) { return _ref31.apply(this, arguments); }; })()); let hardlinksWork = (exports.hardlinksWork = (() => { var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( dir, ) { const filename = 'test-file' + Math.random(); const file = (_path || _load_path()).default.join(dir, filename); const fileLink = (_path || _load_path()).default.join( dir, filename + '-link', ); try { yield writeFile(file, 'test'); yield link(file, fileLink); } catch (err) { return false; } finally { yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(file); yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(fileLink); } return true; }); return function hardlinksWork(_x32) { return _ref32.apply(this, arguments); }; })()); // not a strict polyfill for Node's fs.mkdtemp let makeTempDir = (exports.makeTempDir = (() => { var _ref33 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( prefix, ) { const dir = (_path || _load_path()).default.join( (_os || _load_os()).default.tmpdir(), `yarn-${prefix || ''}-${Date.now()}-${Math.random()}`, ); yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dir); yield mkdirp(dir); return dir; }); return function makeTempDir(_x33) { return _ref33.apply(this, arguments); }; })()); let readFirstAvailableStream = (exports.readFirstAvailableStream = (() => { var _ref34 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( paths, ) { for ( var _iterator15 = paths, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator](); ; ) { var _ref35; if (_isArray15) { if (_i15 >= _iterator15.length) break; _ref35 = _iterator15[_i15++]; } else { _i15 = _iterator15.next(); if (_i15.done) break; _ref35 = _i15.value; } const path = _ref35; try { const fd = yield open(path, 'r'); return (_fs || _load_fs()).default.createReadStream(path, { fd, }); } catch (err) { // Try the next one } } return null; }); return function readFirstAvailableStream(_x34) { return _ref34.apply(this, arguments); }; })()); let getFirstSuitableFolder = (exports.getFirstSuitableFolder = (() => { var _ref36 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( paths, mode = constants.W_OK | constants.X_OK, ) { const result = { skipped: [], folder: null, }; for ( var _iterator16 = paths, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator](); ; ) { var _ref37; if (_isArray16) { if (_i16 >= _iterator16.length) break; _ref37 = _iterator16[_i16++]; } else { _i16 = _iterator16.next(); if (_i16.done) break; _ref37 = _i16.value; } const folder = _ref37; try { yield mkdirp(folder); yield access(folder, mode); result.folder = folder; return result; } catch (error) { result.skipped.push({ error, folder, }); } } return result; }); return function getFirstSuitableFolder(_x35) { return _ref36.apply(this, arguments); }; })()); exports.copy = copy; exports.readFile = readFile; exports.readFileRaw = readFileRaw; exports.normalizeOS = normalizeOS; var _fs; function _load_fs() { return (_fs = _interopRequireDefault(__webpack_require__(4))); } var _glob; function _load_glob() { return (_glob = _interopRequireDefault(__webpack_require__(99))); } var _os; function _load_os() { return (_os = _interopRequireDefault(__webpack_require__(46))); } var _path; function _load_path() { return (_path = _interopRequireDefault(__webpack_require__(0))); } var _blockingQueue; function _load_blockingQueue() { return (_blockingQueue = _interopRequireDefault( __webpack_require__(110), )); } var _promise; function _load_promise() { return (_promise = _interopRequireWildcard(__webpack_require__(51))); } var _promise2; function _load_promise2() { return (_promise2 = __webpack_require__(51)); } var _map; function _load_map() { return (_map = _interopRequireDefault(__webpack_require__(29))); } var _fsNormalized; function _load_fsNormalized() { return (_fsNormalized = __webpack_require__(216)); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const constants = (exports.constants = typeof (_fs || _load_fs()).default.constants !== 'undefined' ? (_fs || _load_fs()).default.constants : { R_OK: (_fs || _load_fs()).default.R_OK, W_OK: (_fs || _load_fs()).default.W_OK, X_OK: (_fs || _load_fs()).default.X_OK, }); const lockQueue = (exports.lockQueue = new ( _blockingQueue || _load_blockingQueue() ).default('fs lock')); const readFileBuffer = (exports.readFileBuffer = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.readFile, )); const open = (exports.open = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.open, )); const writeFile = (exports.writeFile = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.writeFile, )); const readlink = (exports.readlink = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.readlink, )); const realpath = (exports.realpath = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.realpath, )); const readdir = (exports.readdir = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.readdir, )); const rename = (exports.rename = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.rename, )); const access = (exports.access = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.access, )); const stat = (exports.stat = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.stat, )); const mkdirp = (exports.mkdirp = (0, (_promise2 || _load_promise2()).promisify)(__webpack_require__(145))); const exists = (exports.exists = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.exists, true, )); const lstat = (exports.lstat = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.lstat, )); const chmod = (exports.chmod = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.chmod, )); const link = (exports.link = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.link, )); const glob = (exports.glob = (0, (_promise2 || _load_promise2()).promisify)( (_glob || _load_glob()).default, )); exports.unlink = (_fsNormalized || _load_fsNormalized()).unlink; // fs.copyFile uses the native file copying instructions on the system, performing much better // than any JS-based solution and consumes fewer resources. Repeated testing to fine tune the // concurrency level revealed 128 as the sweet spot on a quad-core, 16 CPU Intel system with SSD. const CONCURRENT_QUEUE_ITEMS = (_fs || _load_fs()).default.copyFile ? 128 : 4; const fsSymlink = (0, (_promise2 || _load_promise2()).promisify)( (_fs || _load_fs()).default.symlink, ); const invariant = __webpack_require__(9); const stripBOM = __webpack_require__(160); const noop = () => {}; function copy(src, dest, reporter) { return copyBulk([{ src, dest }], reporter); } function _readFile(loc, encoding) { return new Promise((resolve, reject) => { (_fs || _load_fs()).default.readFile( loc, encoding, function (err, content) { if (err) { reject(err); } else { resolve(content); } }, ); }); } function readFile(loc) { return _readFile(loc, 'utf8').then(normalizeOS); } function readFileRaw(loc) { return _readFile(loc, 'binary'); } function normalizeOS(body) { return body.replace(/\r\n/g, '\n'); } const cr = '\r'.charCodeAt(0); const lf = '\n'.charCodeAt(0); /***/ }, /* 6 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); class MessageError extends Error { constructor(msg, code) { super(msg); this.code = code; } } exports.MessageError = MessageError; class ProcessSpawnError extends MessageError { constructor(msg, code, process) { super(msg, code); this.process = process; } } exports.ProcessSpawnError = ProcessSpawnError; class SecurityError extends MessageError {} exports.SecurityError = SecurityError; class ProcessTermError extends MessageError {} exports.ProcessTermError = ProcessTermError; class ResponseError extends Error { constructor(msg, responseCode) { super(msg); this.responseCode = responseCode; } } exports.ResponseError = ResponseError; class OneTimePasswordError extends Error {} exports.OneTimePasswordError = OneTimePasswordError; /***/ }, /* 7 */ /***/ function (module, __webpack_exports__, __webpack_require__) { 'use strict'; /* harmony export (binding) */ __webpack_require__.d( __webpack_exports__, 'a', function () { return Subscriber; }, ); /* unused harmony export SafeSubscriber */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isFunction__ = __webpack_require__(154); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observer__ = __webpack_require__(420); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__ = __webpack_require__(321); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__config__ = __webpack_require__(186); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__ = __webpack_require__(323); /** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ var Subscriber = /*@__PURE__*/ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( Subscriber, _super, ); function Subscriber(destinationOrNext, error, complete) { var _this = _super.call(this) || this; _this.syncErrorValue = null; _this.syncErrorThrown = false; _this.syncErrorThrowable = false; _this.isStopped = false; _this._parentSubscription = null; switch (arguments.length) { case 0: _this.destination = __WEBPACK_IMPORTED_MODULE_2__Observer__['a' /* empty */]; break; case 1: if (!destinationOrNext) { _this.destination = __WEBPACK_IMPORTED_MODULE_2__Observer__['a' /* empty */]; break; } if (typeof destinationOrNext === 'object') { if (destinationOrNext instanceof Subscriber) { _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable; _this.destination = destinationOrNext; destinationOrNext.add(_this); } else { _this.syncErrorThrowable = true; _this.destination = new SafeSubscriber( _this, destinationOrNext, ); } break; } default: _this.syncErrorThrowable = true; _this.destination = new SafeSubscriber( _this, destinationOrNext, error, complete, ); break; } return _this; } Subscriber.prototype[ __WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__[ 'a' /* rxSubscriber */ ] ] = function () { return this; }; Subscriber.create = function (next, error, complete) { var subscriber = new Subscriber(next, error, complete); subscriber.syncErrorThrowable = false; return subscriber; }; Subscriber.prototype.next = function (value) { if (!this.isStopped) { this._next(value); } }; Subscriber.prototype.error = function (err) { if (!this.isStopped) { this.isStopped = true; this._error(err); } }; Subscriber.prototype.complete = function () { if (!this.isStopped) { this.isStopped = true; this._complete(); } }; Subscriber.prototype.unsubscribe = function () { if (this.closed) { return; } this.isStopped = true; _super.prototype.unsubscribe.call(this); }; Subscriber.prototype._next = function (value) { this.destination.next(value); }; Subscriber.prototype._error = function (err) { this.destination.error(err); this.unsubscribe(); }; Subscriber.prototype._complete = function () { this.destination.complete(); this.unsubscribe(); }; Subscriber.prototype._unsubscribeAndRecycle = function () { var _a = this, _parent = _a._parent, _parents = _a._parents; this._parent = null; this._parents = null; this.unsubscribe(); this.closed = false; this.isStopped = false; this._parent = _parent; this._parents = _parents; this._parentSubscription = null; return this; }; return Subscriber; })(__WEBPACK_IMPORTED_MODULE_3__Subscription__['a' /* Subscription */]); var SafeSubscriber = /*@__PURE__*/ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( SafeSubscriber, _super, ); function SafeSubscriber( _parentSubscriber, observerOrNext, error, complete, ) { var _this = _super.call(this) || this; _this._parentSubscriber = _parentSubscriber; var next; var context = _this; if ( __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_1__util_isFunction__[ 'a' /* isFunction */ ], )(observerOrNext) ) { next = observerOrNext; } else if (observerOrNext) { next = observerOrNext.next; error = observerOrNext.error; complete = observerOrNext.complete; if ( observerOrNext !== __WEBPACK_IMPORTED_MODULE_2__Observer__['a' /* empty */] ) { context = Object.create(observerOrNext); if ( __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_1__util_isFunction__[ 'a' /* isFunction */ ], )(context.unsubscribe) ) { _this.add(context.unsubscribe.bind(context)); } context.unsubscribe = _this.unsubscribe.bind(_this); } } _this._context = context; _this._next = next; _this._error = error; _this._complete = complete; return _this; } SafeSubscriber.prototype.next = function (value) { if (!this.isStopped && this._next) { var _parentSubscriber = this._parentSubscriber; if ( !__WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable ) { this.__tryOrUnsub(this._next, value); } else if ( this.__tryOrSetError(_parentSubscriber, this._next, value) ) { this.unsubscribe(); } } }; SafeSubscriber.prototype.error = function (err) { if (!this.isStopped) { var _parentSubscriber = this._parentSubscriber; var useDeprecatedSynchronousErrorHandling = __WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling; if (this._error) { if ( !useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable ) { this.__tryOrUnsub(this._error, err); this.unsubscribe(); } else { this.__tryOrSetError(_parentSubscriber, this._error, err); this.unsubscribe(); } } else if (!_parentSubscriber.syncErrorThrowable) { this.unsubscribe(); if (useDeprecatedSynchronousErrorHandling) { throw err; } __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[ 'a' /* hostReportError */ ], )(err); } else { if (useDeprecatedSynchronousErrorHandling) { _parentSubscriber.syncErrorValue = err; _parentSubscriber.syncErrorThrown = true; } else { __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[ 'a' /* hostReportError */ ], )(err); } this.unsubscribe(); } } }; SafeSubscriber.prototype.complete = function () { var _this = this; if (!this.isStopped) { var _parentSubscriber = this._parentSubscriber; if (this._complete) { var wrappedComplete = function () { return _this._complete.call(_this._context); }; if ( !__WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable ) { this.__tryOrUnsub(wrappedComplete); this.unsubscribe(); } else { this.__tryOrSetError(_parentSubscriber, wrappedComplete); this.unsubscribe(); } } else { this.unsubscribe(); } } }; SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { try { fn.call(this._context, value); } catch (err) { this.unsubscribe(); if ( __WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling ) { throw err; } else { __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[ 'a' /* hostReportError */ ], )(err); } } }; SafeSubscriber.prototype.__tryOrSetError = function ( parent, fn, value, ) { if ( !__WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling ) { throw new Error('bad call'); } try { fn.call(this._context, value); } catch (err) { if ( __WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling ) { parent.syncErrorValue = err; parent.syncErrorThrown = true; return true; } else { __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[ 'a' /* hostReportError */ ], )(err); return true; } } return false; }; SafeSubscriber.prototype._unsubscribe = function () { var _parentSubscriber = this._parentSubscriber; this._context = null; this._parentSubscriber = null; _parentSubscriber.unsubscribe(); }; return SafeSubscriber; })(Subscriber); //# sourceMappingURL=Subscriber.js.map /***/ }, /* 8 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); exports.getPathKey = getPathKey; const os = __webpack_require__(46); const path = __webpack_require__(0); const userHome = __webpack_require__(67).default; var _require = __webpack_require__(222); const getCacheDir = _require.getCacheDir, getConfigDir = _require.getConfigDir, getDataDir = _require.getDataDir; const isWebpackBundle = __webpack_require__(278); const DEPENDENCY_TYPES = (exports.DEPENDENCY_TYPES = [ 'devDependencies', 'dependencies', 'optionalDependencies', 'peerDependencies', ]); const OWNED_DEPENDENCY_TYPES = (exports.OWNED_DEPENDENCY_TYPES = [ 'devDependencies', 'dependencies', 'optionalDependencies', ]); const RESOLUTIONS = (exports.RESOLUTIONS = 'resolutions'); const MANIFEST_FIELDS = (exports.MANIFEST_FIELDS = [ RESOLUTIONS, ...DEPENDENCY_TYPES, ]); const SUPPORTED_NODE_VERSIONS = (exports.SUPPORTED_NODE_VERSIONS = '^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0'); const YARN_REGISTRY = (exports.YARN_REGISTRY = 'https://registry.yarnpkg.com'); const NPM_REGISTRY_RE = (exports.NPM_REGISTRY_RE = /https?:\/\/registry\.npmjs\.org/g); const YARN_DOCS = (exports.YARN_DOCS = 'https://yarnpkg.com/en/docs/cli/'); const YARN_INSTALLER_SH = (exports.YARN_INSTALLER_SH = 'https://yarnpkg.com/install.sh'); const YARN_INSTALLER_MSI = (exports.YARN_INSTALLER_MSI = 'https://yarnpkg.com/latest.msi'); const SELF_UPDATE_VERSION_URL = (exports.SELF_UPDATE_VERSION_URL = 'https://yarnpkg.com/latest-version'); // cache version, bump whenever we make backwards incompatible changes const CACHE_VERSION = (exports.CACHE_VERSION = 6); // lockfile version, bump whenever we make backwards incompatible changes const LOCKFILE_VERSION = (exports.LOCKFILE_VERSION = 1); // max amount of network requests to perform concurrently const NETWORK_CONCURRENCY = (exports.NETWORK_CONCURRENCY = 8); // HTTP timeout used when downloading packages const NETWORK_TIMEOUT = (exports.NETWORK_TIMEOUT = 30 * 1000); // in milliseconds // max amount of child processes to execute concurrently const CHILD_CONCURRENCY = (exports.CHILD_CONCURRENCY = 5); const REQUIRED_PACKAGE_KEYS = (exports.REQUIRED_PACKAGE_KEYS = [ 'name', 'version', '_uid', ]); function getPreferredCacheDirectories() { const preferredCacheDirectories = [getCacheDir()]; if (process.getuid) { // $FlowFixMe: process.getuid exists, dammit preferredCacheDirectories.push( path.join(os.tmpdir(), `.yarn-cache-${process.getuid()}`), ); } preferredCacheDirectories.push(path.join(os.tmpdir(), `.yarn-cache`)); return preferredCacheDirectories; } const PREFERRED_MODULE_CACHE_DIRECTORIES = (exports.PREFERRED_MODULE_CACHE_DIRECTORIES = getPreferredCacheDirectories()); const CONFIG_DIRECTORY = (exports.CONFIG_DIRECTORY = getConfigDir()); const DATA_DIRECTORY = (exports.DATA_DIRECTORY = getDataDir()); const LINK_REGISTRY_DIRECTORY = (exports.LINK_REGISTRY_DIRECTORY = path.join(DATA_DIRECTORY, 'link')); const GLOBAL_MODULE_DIRECTORY = (exports.GLOBAL_MODULE_DIRECTORY = path.join(DATA_DIRECTORY, 'global')); const NODE_BIN_PATH = (exports.NODE_BIN_PATH = process.execPath); const YARN_BIN_PATH = (exports.YARN_BIN_PATH = getYarnBinPath()); // Webpack needs to be configured with node.__dirname/__filename = false function getYarnBinPath() { if (isWebpackBundle) { return __filename; } else { return path.join(__dirname, '..', 'bin', 'yarn.js'); } } const NODE_MODULES_FOLDER = (exports.NODE_MODULES_FOLDER = 'node_modules'); const NODE_PACKAGE_JSON = (exports.NODE_PACKAGE_JSON = 'package.json'); const PNP_FILENAME = (exports.PNP_FILENAME = '.pnp.js'); const POSIX_GLOBAL_PREFIX = (exports.POSIX_GLOBAL_PREFIX = `${ process.env.DESTDIR || '' }/usr/local`); const FALLBACK_GLOBAL_PREFIX = (exports.FALLBACK_GLOBAL_PREFIX = path.join(userHome, '.yarn')); const META_FOLDER = (exports.META_FOLDER = '.yarn-meta'); const INTEGRITY_FILENAME = (exports.INTEGRITY_FILENAME = '.yarn-integrity'); const LOCKFILE_FILENAME = (exports.LOCKFILE_FILENAME = 'yarn.lock'); const METADATA_FILENAME = (exports.METADATA_FILENAME = '.yarn-metadata.json'); const TARBALL_FILENAME = (exports.TARBALL_FILENAME = '.yarn-tarball.tgz'); const CLEAN_FILENAME = (exports.CLEAN_FILENAME = '.yarnclean'); const NPM_LOCK_FILENAME = (exports.NPM_LOCK_FILENAME = 'package-lock.json'); const NPM_SHRINKWRAP_FILENAME = (exports.NPM_SHRINKWRAP_FILENAME = 'npm-shrinkwrap.json'); const DEFAULT_INDENT = (exports.DEFAULT_INDENT = ' '); const SINGLE_INSTANCE_PORT = (exports.SINGLE_INSTANCE_PORT = 31997); const SINGLE_INSTANCE_FILENAME = (exports.SINGLE_INSTANCE_FILENAME = '.yarn-single-instance'); const ENV_PATH_KEY = (exports.ENV_PATH_KEY = getPathKey( process.platform, process.env, )); function getPathKey(platform, env) { let pathKey = 'PATH'; // windows calls its path "Path" usually, but this is not guaranteed. if (platform === 'win32') { pathKey = 'Path'; for (const key in env) { if (key.toLowerCase() === 'path') { pathKey = key; } } } return pathKey; } const VERSION_COLOR_SCHEME = (exports.VERSION_COLOR_SCHEME = { major: 'red', premajor: 'red', minor: 'yellow', preminor: 'yellow', patch: 'green', prepatch: 'green', prerelease: 'red', unchanged: 'white', unknown: 'red', }); /***/ }, /* 9 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; /** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /** * Use invariant() to assert state which your program assumes to be true. * * Provide sprintf-style format (only %s is supported) and arguments * to provide information about what broke and what you were * expecting. * * The invariant message will be stripped in production, but the invariant * will remain to ensure logic does not differ in production. */ var NODE_ENV = process.env.NODE_ENV; var invariant = function (condition, format, a, b, c, d, e, f) { if (NODE_ENV !== 'production') { if (format === undefined) { throw new Error('invariant requires an error message argument'); } } if (!condition) { var error; if (format === undefined) { error = new Error( 'Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.', ); } else { var args = [a, b, c, d, e, f]; var argIndex = 0; error = new Error( format.replace(/%s/g, function () { return args[argIndex++]; }), ); error.name = 'Invariant Violation'; } error.framesToPop = 1; // we don't care about invariant's own frame throw error; } }; module.exports = invariant; /***/ }, /* 10 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; var YAMLException = __webpack_require__(55); var TYPE_CONSTRUCTOR_OPTIONS = [ 'kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases', ]; var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping']; function compileStyleAliases(map) { var result = {}; if (map !== null) { Object.keys(map).forEach(function (style) { map[style].forEach(function (alias) { result[String(alias)] = style; }); }); } return result; } function Type(tag, options) { options = options || {}; Object.keys(options).forEach(function (name) { if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { throw new YAMLException( 'Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.', ); } }); // TODO: Add tag format check. this.tag = tag; this.kind = options['kind'] || null; this.resolve = options['resolve'] || function () { return true; }; this.construct = options['construct'] || function (data) { return data; }; this.instanceOf = options['instanceOf'] || null; this.predicate = options['predicate'] || null; this.represent = options['represent'] || null; this.defaultStyle = options['defaultStyle'] || null; this.styleAliases = compileStyleAliases( options['styleAliases'] || null, ); if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { throw new YAMLException( 'Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.', ); } } module.exports = Type; /***/ }, /* 11 */ /***/ function (module, exports) { module.exports = require('crypto'); /***/ }, /* 12 */ /***/ function (module, __webpack_exports__, __webpack_require__) { 'use strict'; /* harmony export (binding) */ __webpack_require__.d( __webpack_exports__, 'a', function () { return Observable; }, ); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_canReportError__ = __webpack_require__(322); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__ = __webpack_require__(932); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__ = __webpack_require__(118); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_pipe__ = __webpack_require__(324); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__config__ = __webpack_require__(186); /** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_internal_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ var Observable = /*@__PURE__*/ (function () { function Observable(subscribe) { this._isScalar = false; if (subscribe) { this._subscribe = subscribe; } } Observable.prototype.lift = function (operator) { var observable = new Observable(); observable.source = this; observable.operator = operator; return observable; }; Observable.prototype.subscribe = function ( observerOrNext, error, complete, ) { var operator = this.operator; var sink = __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__[ 'a' /* toSubscriber */ ], )(observerOrNext, error, complete); if (operator) { operator.call(sink, this.source); } else { sink.add( this.source || (__WEBPACK_IMPORTED_MODULE_4__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? this._subscribe(sink) : this._trySubscribe(sink), ); } if ( __WEBPACK_IMPORTED_MODULE_4__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling ) { if (sink.syncErrorThrowable) { sink.syncErrorThrowable = false; if (sink.syncErrorThrown) { throw sink.syncErrorValue; } } } return sink; }; Observable.prototype._trySubscribe = function (sink) { try { return this._subscribe(sink); } catch (err) { if ( __WEBPACK_IMPORTED_MODULE_4__config__['a' /* config */] .useDeprecatedSynchronousErrorHandling ) { sink.syncErrorThrown = true; sink.syncErrorValue = err; } if ( __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_0__util_canReportError__[ 'a' /* canReportError */ ], )(sink) ) { sink.error(err); } else { console.warn(err); } } }; Observable.prototype.forEach = function (next, promiseCtor) { var _this = this; promiseCtor = getPromiseCtor(promiseCtor); return new promiseCtor(function (resolve, reject) { var subscription; subscription = _this.subscribe( function (value) { try { next(value); } catch (err) { reject(err); if (subscription) { subscription.unsubscribe(); } } }, reject, resolve, ); }); }; Observable.prototype._subscribe = function (subscriber) { var source = this.source; return source && source.subscribe(subscriber); }; Observable.prototype[ __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__[ 'a' /* observable */ ] ] = function () { return this; }; Observable.prototype.pipe = function () { var operations = []; for (var _i = 0; _i < arguments.length; _i++) { operations[_i] = arguments[_i]; } if (operations.length === 0) { return this; } return __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_3__util_pipe__['b' /* pipeFromArray */], )(operations)(this); }; Observable.prototype.toPromise = function (promiseCtor) { var _this = this; promiseCtor = getPromiseCtor(promiseCtor); return new promiseCtor(function (resolve, reject) { var value; _this.subscribe( function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); }, ); }); }; Observable.create = function (subscribe) { return new Observable(subscribe); }; return Observable; })(); function getPromiseCtor(promiseCtor) { if (!promiseCtor) { promiseCtor = __WEBPACK_IMPORTED_MODULE_4__config__['a' /* config */].Promise || Promise; } if (!promiseCtor) { throw new Error('no Promise impl found'); } return promiseCtor; } //# sourceMappingURL=Observable.js.map /***/ }, /* 13 */ /***/ function (module, __webpack_exports__, __webpack_require__) { 'use strict'; /* harmony export (binding) */ __webpack_require__.d( __webpack_exports__, 'a', function () { return OuterSubscriber; }, ); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ var OuterSubscriber = /*@__PURE__*/ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( OuterSubscriber, _super, ); function OuterSubscriber() { return (_super !== null && _super.apply(this, arguments)) || this; } OuterSubscriber.prototype.notifyNext = function ( outerValue, innerValue, outerIndex, innerIndex, innerSub, ) { this.destination.next(innerValue); }; OuterSubscriber.prototype.notifyError = function (error, innerSub) { this.destination.error(error); }; OuterSubscriber.prototype.notifyComplete = function (innerSub) { this.destination.complete(); }; return OuterSubscriber; })(__WEBPACK_IMPORTED_MODULE_1__Subscriber__['a' /* Subscriber */]); //# sourceMappingURL=OuterSubscriber.js.map /***/ }, /* 14 */ /***/ function (module, __webpack_exports__, __webpack_require__) { 'use strict'; /* harmony export (immutable) */ __webpack_exports__['a'] = subscribeToResult; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__ = __webpack_require__(84); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__subscribeTo__ = __webpack_require__(446); /** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo PURE_IMPORTS_END */ function subscribeToResult( outerSubscriber, result, outerValue, outerIndex, destination, ) { if (destination === void 0) { destination = new __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__[ 'a' /* InnerSubscriber */ ](outerSubscriber, outerValue, outerIndex); } if (destination.closed) { return; } return __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_1__subscribeTo__['a' /* subscribeTo */], )(result)(destination); } //# sourceMappingURL=subscribeToResult.js.map /***/ }, /* 15 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; /* eslint-disable node/no-deprecated-api */ var buffer = __webpack_require__(64); var Buffer = buffer.Buffer; var safer = {}; var key; for (key in buffer) { if (!buffer.hasOwnProperty(key)) continue; if (key === 'SlowBuffer' || key === 'Buffer') continue; safer[key] = buffer[key]; } var Safer = (safer.Buffer = {}); for (key in Buffer) { if (!Buffer.hasOwnProperty(key)) continue; if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue; Safer[key] = Buffer[key]; } safer.Buffer.prototype = Buffer.prototype; if (!Safer.from || Safer.from === Uint8Array.from) { Safer.from = function (value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError( 'The "value" argument must not be of type number. Received type ' + typeof value, ); } if (value && typeof value.length === 'undefined') { throw new TypeError( 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value, ); } return Buffer(value, encodingOrOffset, length); }; } if (!Safer.alloc) { Safer.alloc = function (size, fill, encoding) { if (typeof size !== 'number') { throw new TypeError( 'The "size" argument must be of type number. Received type ' + typeof size, ); } if (size < 0 || size >= 2 * (1 << 30)) { throw new RangeError( 'The value "' + size + '" is invalid for option "size"', ); } var buf = Buffer(size); if (!fill || fill.length === 0) { buf.fill(0); } else if (typeof encoding === 'string') { buf.fill(fill, encoding); } else { buf.fill(fill); } return buf; }; } if (!safer.kStringMaxLength) { try { safer.kStringMaxLength = process.binding('buffer').kStringMaxLength; } catch (e) { // we can't determine kStringMaxLength in environments where process.binding // is unsupported, so let's not set it } } if (!safer.constants) { safer.constants = { MAX_LENGTH: safer.kMaxLength, }; if (safer.kStringMaxLength) { safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength; } } module.exports = safer; /***/ }, /* 16 */ /***/ function (module, exports, __webpack_require__) { // Copyright (c) 2012, Mark Cavage. All rights reserved. // Copyright 2015 Joyent, Inc. var assert = __webpack_require__(28); var Stream = __webpack_require__(23).Stream; var util = __webpack_require__(3); ///--- Globals /* JSSTYLED */ var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; ///--- Internal function _capitalize(str) { return str.charAt(0).toUpperCase() + str.slice(1); } function _toss(name, expected, oper, arg, actual) { throw new assert.AssertionError({ message: util.format('%s (%s) is required', name, expected), actual: actual === undefined ? typeof arg : actual(arg), expected: expected, operator: oper || '===', stackStartFunction: _toss.caller, }); } function _getClass(arg) { return Object.prototype.toString.call(arg).slice(8, -1); } function noop() { // Why even bother with asserts? } ///--- Exports var types = { bool: { check: function (arg) { return typeof arg === 'boolean'; }, }, func: { check: function (arg) { return typeof arg === 'function'; }, }, string: { check: function (arg) { return typeof arg === 'string'; }, }, object: { check: function (arg) { return typeof arg === 'object' && arg !== null; }, }, number: { check: function (arg) { return typeof arg === 'number' && !isNaN(arg); }, }, finite: { check: function (arg) { return typeof arg === 'number' && !isNaN(arg) && isFinite(arg); }, }, buffer: { check: function (arg) { return Buffer.isBuffer(arg); }, operator: 'Buffer.isBuffer', }, array: { check: function (arg) { return Array.isArray(arg); }, operator: 'Array.isArray', }, stream: { check: function (arg) { return arg instanceof Stream; }, operator: 'instanceof', actual: _getClass, }, date: { check: function (arg) { return arg instanceof Date; }, operator: 'instanceof', actual: _getClass, }, regexp: { check: function (arg) { return arg instanceof RegExp; }, operator: 'instanceof', actual: _getClass, }, uuid: { check: function (arg) { return typeof arg === 'string' && UUID_REGEXP.test(arg); }, operator: 'isUUID', }, }; function _setExports(ndebug) { var keys = Object.keys(types); var out; /* re-export standard assert */ if (process.env.NODE_NDEBUG) { out = noop; } else { out = function (arg, msg) { if (!arg) { _toss(msg, 'true', arg); } }; } /* standard checks */ keys.forEach(function (k) { if (ndebug) { out[k] = noop; return; } var type = types[k]; out[k] = function (arg, msg) { if (!type.check(arg)) { _toss(msg, k, type.operator, arg, type.actual); } }; }); /* optional checks */ keys.forEach(function (k) { var name = 'optional' + _capitalize(k); if (ndebug) { out[name] = noop; return; } var type = types[k]; out[name] = function (arg, msg) { if (arg === undefined || arg === null) { return; } if (!type.check(arg)) { _toss(msg, k, type.operator, arg, type.actual); } }; }); /* arrayOf checks */ keys.forEach(function (k) { var name = 'arrayOf' + _capitalize(k); if (ndebug) { out[name] = noop; return; } var type = types[k]; var expected = '[' + k + ']'; out[name] = function (arg, msg) { if (!Array.isArray(arg)) { _toss(msg, expected, type.operator, arg, type.actual); } var i; for (i = 0; i < arg.length; i++) { if (!type.check(arg[i])) { _toss(msg, expected, type.operator, arg, type.actual); } } }; }); /* optionalArrayOf checks */ keys.forEach(function (k) { var name = 'optionalArrayOf' + _capitalize(k); if (ndebug) { out[name] = noop; return; } var type = types[k]; var expected = '[' + k + ']'; out[name] = function (arg, msg) { if (arg === undefined || arg === null) { return; } if (!Array.isArray(arg)) { _toss(msg, expected, type.operator, arg, type.actual); } var i; for (i = 0; i < arg.length; i++) { if (!type.check(arg[i])) { _toss(msg, expected, type.operator, arg, type.actual); } } }; }); /* re-export built-in assertions */ Object.keys(assert).forEach(function (k) { if (k === 'AssertionError') { out[k] = assert[k]; return; } if (ndebug) { out[k] = noop; return; } out[k] = assert[k]; }); /* export ourselves (for unit tests _only_) */ out._setExports = _setExports; return out; } module.exports = _setExports(process.env.NODE_NDEBUG); /***/ }, /* 17 */ /***/ function (module, exports) { // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global = (module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : // eslint-disable-next-line no-new-func Function('return this')()); if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef /***/ }, /* 18 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); exports.sortAlpha = sortAlpha; exports.sortOptionsByFlags = sortOptionsByFlags; exports.entries = entries; exports.removePrefix = removePrefix; exports.removeSuffix = removeSuffix; exports.addSuffix = addSuffix; exports.hyphenate = hyphenate; exports.camelCase = camelCase; exports.compareSortedArrays = compareSortedArrays; exports.sleep = sleep; const _camelCase = __webpack_require__(227); function sortAlpha(a, b) { // sort alphabetically in a deterministic way const shortLen = Math.min(a.length, b.length); for (let i = 0; i < shortLen; i++) { const aChar = a.charCodeAt(i); const bChar = b.charCodeAt(i); if (aChar !== bChar) { return aChar - bChar; } } return a.length - b.length; } function sortOptionsByFlags(a, b) { const aOpt = a.flags.replace(/-/g, ''); const bOpt = b.flags.replace(/-/g, ''); return sortAlpha(aOpt, bOpt); } function entries(obj) { const entries = []; if (obj) { for (const key in obj) { entries.push([key, obj[key]]); } } return entries; } function removePrefix(pattern, prefix) { if (pattern.startsWith(prefix)) { pattern = pattern.slice(prefix.length); } return pattern; } function removeSuffix(pattern, suffix) { if (pattern.endsWith(suffix)) { return pattern.slice(0, -suffix.length); } return pattern; } function addSuffix(pattern, suffix) { if (!pattern.endsWith(suffix)) { return pattern + suffix; } return pattern; } function hyphenate(str) { return str.replace(/[A-Z]/g, match => { return '-' + match.charAt(0).toLowerCase(); }); } function camelCase(str) { if (/[A-Z]/.test(str)) { return null; } else { return _camelCase(str); } } function compareSortedArrays(array1, array2) { if (array1.length !== array2.length) { return false; } for (let i = 0, len = array1.length; i < len; i++) { if (array1[i] !== array2[i]) { return false; } } return true; } function sleep(ms) { return new Promise(resolve => { setTimeout(resolve, ms); }); } /***/ }, /* 19 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); exports.stringify = exports.parse = undefined; var _asyncToGenerator2; function _load_asyncToGenerator() { return (_asyncToGenerator2 = _interopRequireDefault( __webpack_require__(2), )); } var _parse; function _load_parse() { return (_parse = __webpack_require__(106)); } Object.defineProperty(exports, 'parse', { enumerable: true, get: function get() { return _interopRequireDefault(_parse || _load_parse()).default; }, }); var _stringify; function _load_stringify() { return (_stringify = __webpack_require__(200)); } Object.defineProperty(exports, 'stringify', { enumerable: true, get: function get() { return _interopRequireDefault(_stringify || _load_stringify()) .default; }, }); exports.implodeEntry = implodeEntry; exports.explodeEntry = explodeEntry; var _misc; function _load_misc() { return (_misc = __webpack_require__(18)); } var _normalizePattern; function _load_normalizePattern() { return (_normalizePattern = __webpack_require__(37)); } var _parse2; function _load_parse2() { return (_parse2 = _interopRequireDefault(__webpack_require__(106))); } var _constants; function _load_constants() { return (_constants = __webpack_require__(8)); } var _fs; function _load_fs() { return (_fs = _interopRequireWildcard(__webpack_require__(5))); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const invariant = __webpack_require__(9); const path = __webpack_require__(0); const ssri = __webpack_require__(65); function getName(pattern) { return (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)( pattern, ).name; } function blankObjectUndefined(obj) { return obj && Object.keys(obj).length ? obj : undefined; } function keyForRemote(remote) { return ( remote.resolved || (remote.reference && remote.hash ? `${remote.reference}#${remote.hash}` : null) ); } function serializeIntegrity(integrity) { // We need this because `Integrity.toString()` does not use sorting to ensure a stable string output // See https://git.io/vx2Hy return integrity.toString().split(' ').sort().join(' '); } function implodeEntry(pattern, obj) { const inferredName = getName(pattern); const integrity = obj.integrity ? serializeIntegrity(obj.integrity) : ''; const imploded = { name: inferredName === obj.name ? undefined : obj.name, version: obj.version, uid: obj.uid === obj.version ? undefined : obj.uid, resolved: obj.resolved, registry: obj.registry === 'npm' ? undefined : obj.registry, dependencies: blankObjectUndefined(obj.dependencies), optionalDependencies: blankObjectUndefined(obj.optionalDependencies), permissions: blankObjectUndefined(obj.permissions), prebuiltVariants: blankObjectUndefined(obj.prebuiltVariants), }; if (integrity) { imploded.integrity = integrity; } return imploded; } function explodeEntry(pattern, obj) { obj.optionalDependencies = obj.optionalDependencies || {}; obj.dependencies = obj.dependencies || {}; obj.uid = obj.uid || obj.version; obj.permissions = obj.permissions || {}; obj.registry = obj.registry || 'npm'; obj.name = obj.name || getName(pattern); const integrity = obj.integrity; if (integrity && integrity.isIntegrity) { obj.integrity = ssri.parse(integrity); } return obj; } class Lockfile { constructor({ cache, source, parseResultType } = {}) { this.source = source || ''; this.cache = cache; this.parseResultType = parseResultType; } // source string if the `cache` was parsed // if true, we're parsing an old yarn file and need to update integrity fields hasEntriesExistWithoutIntegrity() { if (!this.cache) { return false; } for (const key in this.cache) { // $FlowFixMe - `this.cache` is clearly defined at this point if ( !/^.*@(file:|http)/.test(key) && this.cache[key] && !this.cache[key].integrity ) { return true; } } return false; } static fromDirectory(dir, reporter) { return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { // read the manifest in this directory const lockfileLoc = path.join( dir, (_constants || _load_constants()).LOCKFILE_FILENAME, ); let lockfile; let rawLockfile = ''; let parseResult; if (yield (_fs || _load_fs()).exists(lockfileLoc)) { rawLockfile = yield (_fs || _load_fs()).readFile(lockfileLoc); parseResult = (0, (_parse2 || _load_parse2()).default)( rawLockfile, lockfileLoc, ); if (reporter) { if (parseResult.type === 'merge') { reporter.info(reporter.lang('lockfileMerged')); } else if (parseResult.type === 'conflict') { reporter.warn(reporter.lang('lockfileConflict')); } } lockfile = parseResult.object; } else if (reporter) { reporter.info(reporter.lang('noLockfileFound')); } if (lockfile && lockfile.__metadata) { const lockfilev2 = lockfile; lockfile = {}; } return new Lockfile({ cache: lockfile, source: rawLockfile, parseResultType: parseResult && parseResult.type, }); }, )(); } getLocked(pattern) { const cache = this.cache; if (!cache) { return undefined; } const shrunk = pattern in cache && cache[pattern]; if (typeof shrunk === 'string') { return this.getLocked(shrunk); } else if (shrunk) { explodeEntry(pattern, shrunk); return shrunk; } return undefined; } removePattern(pattern) { const cache = this.cache; if (!cache) { return; } delete cache[pattern]; } getLockfile(patterns) { const lockfile = {}; const seen = new Map(); // order by name so that lockfile manifest is assigned to the first dependency with this manifest // the others that have the same remoteKey will just refer to the first // ordering allows for consistency in lockfile when it is serialized const sortedPatternsKeys = Object.keys(patterns).sort( (_misc || _load_misc()).sortAlpha, ); for ( var _iterator = sortedPatternsKeys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } const pattern = _ref; const pkg = patterns[pattern]; const remote = pkg._remote, ref = pkg._reference; invariant(ref, 'Package is missing a reference'); invariant(remote, 'Package is missing a remote'); const remoteKey = keyForRemote(remote); const seenPattern = remoteKey && seen.get(remoteKey); if (seenPattern) { // no point in duplicating it lockfile[pattern] = seenPattern; // if we're relying on our name being inferred and two of the patterns have // different inferred names then we need to set it if (!seenPattern.name && getName(pattern) !== pkg.name) { seenPattern.name = pkg.name; } continue; } const obj = implodeEntry(pattern, { name: pkg.name, version: pkg.version, uid: pkg._uid, resolved: remote.resolved, integrity: remote.integrity, registry: remote.registry, dependencies: pkg.dependencies, peerDependencies: pkg.peerDependencies, optionalDependencies: pkg.optionalDependencies, permissions: ref.permissions, prebuiltVariants: pkg.prebuiltVariants, }); lockfile[pattern] = obj; if (remoteKey) { seen.set(remoteKey, obj); } } return lockfile; } } exports.default = Lockfile; /***/ }, /* 20 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; exports.__esModule = true; var _assign = __webpack_require__(559); var _assign2 = _interopRequireDefault(_assign); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = _assign2.default || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /***/ }, /* 21 */ /***/ function (module, exports, __webpack_require__) { var store = __webpack_require__(133)('wks'); var uid = __webpack_require__(137); var Symbol = __webpack_require__(17).Symbol; var USE_SYMBOL = typeof Symbol == 'function'; var $exports = (module.exports = function (name) { return ( store[name] || (store[name] = (USE_SYMBOL && Symbol[name]) || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)) ); }); $exports.store = store; /***/ }, /* 22 */ /***/ function (module, exports) { exports = module.exports = SemVer; // The debug function is excluded entirely from the minified version. /* nomin */ var debug; /* nomin */ if ( typeof process === 'object' && /* nomin */ process.env && /* nomin */ process.env.NODE_DEBUG && /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG) ) /* nomin */ debug = function () { /* nomin */ var args = Array.prototype.slice.call(arguments, 0); /* nomin */ args.unshift('SEMVER'); /* nomin */ console.log.apply(console, args); /* nomin */ }; /* nomin */ /* nomin */ else debug = function () {}; // Note: this is the semver.org version of the spec that it implements // Not necessarily the package version of this code. exports.SEMVER_SPEC_VERSION = '2.0.0'; var MAX_LENGTH = 256; var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // Max safe segment length for coercion. var MAX_SAFE_COMPONENT_LENGTH = 16; // The actual regexps go on exports.re var re = (exports.re = []); var src = (exports.src = []); var R = 0; // The following Regular Expressions can be used for tokenizing, // validating, and parsing SemVer version strings. // ## Numeric Identifier // A single `0`, or a non-zero digit followed by zero or more digits. var NUMERICIDENTIFIER = R++; src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; var NUMERICIDENTIFIERLOOSE = R++; src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; // ## Non-numeric Identifier // Zero or more digits, followed by a letter or hyphen, and then zero or // more letters, digits, or hyphens. var NONNUMERICIDENTIFIER = R++; src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; // ## Main Version // Three dot-separated numeric identifiers. var MAINVERSION = R++; src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + '(' + src[NUMERICIDENTIFIER] + ')\\.' + '(' + src[NUMERICIDENTIFIER] + ')'; var MAINVERSIONLOOSE = R++; src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; // ## Pre-release Version Identifier // A numeric identifier, or a non-numeric identifier. var PRERELEASEIDENTIFIER = R++; src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + '|' + src[NONNUMERICIDENTIFIER] + ')'; var PRERELEASEIDENTIFIERLOOSE = R++; src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + '|' + src[NONNUMERICIDENTIFIER] + ')'; // ## Pre-release Version // Hyphen, followed by one or more dot-separated pre-release version // identifiers. var PRERELEASE = R++; src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; var PRERELEASELOOSE = R++; src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; // ## Build Metadata Identifier // Any combination of digits, letters, or hyphens. var BUILDIDENTIFIER = R++; src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; // ## Build Metadata // Plus sign, followed by one or more period-separated build metadata // identifiers. var BUILD = R++; src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; // ## Full Version String // A main version, followed optionally by a pre-release version and // build metadata. // Note that the only major, minor, patch, and pre-release sections of // the version string are capturing groups. The build metadata is not a // capturing group, because it should not ever be used in version // comparison. var FULL = R++; var FULLPLAIN = 'v?' + src[MAINVERSION] + src[PRERELEASE] + '?' + src[BUILD] + '?'; src[FULL] = '^' + FULLPLAIN + '$'; // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty // common in the npm registry. var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + src[PRERELEASELOOSE] + '?' + src[BUILD] + '?'; var LOOSE = R++; src[LOOSE] = '^' + LOOSEPLAIN + '$'; var GTLT = R++; src[GTLT] = '((?:<|>)?=?)'; // Something like "2.*" or "1.2.x". // Note that "x.x" is a valid xRange identifer, meaning "any version" // Only the first item is strictly required. var XRANGEIDENTIFIERLOOSE = R++; src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; var XRANGEIDENTIFIER = R++; src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; var XRANGEPLAIN = R++; src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + '(?:' + src[PRERELEASE] + ')?' + src[BUILD] + '?' + ')?)?'; var XRANGEPLAINLOOSE = R++; src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + '(?:' + src[PRERELEASELOOSE] + ')?' + src[BUILD] + '?' + ')?)?'; var XRANGE = R++; src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; var XRANGELOOSE = R++; src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; // Coercion. // Extract anything that could conceivably be a part of a valid semver var COERCE = R++; src[COERCE] = '(?:^|[^\\d])' + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + '(?:$|[^\\d])'; // Tilde ranges. // Meaning is "reasonably at or greater than" var LONETILDE = R++; src[LONETILDE] = '(?:~>?)'; var TILDETRIM = R++; src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); var tildeTrimReplace = '$1~'; var TILDE = R++; src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; var TILDELOOSE = R++; src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; // Caret ranges. // Meaning is "at least and backwards compatible with" var LONECARET = R++; src[LONECARET] = '(?:\\^)'; var CARETTRIM = R++; src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); var caretTrimReplace = '$1^'; var CARET = R++; src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; var CARETLOOSE = R++; src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; // A simple gt/lt/eq thing, or just "" to indicate "any version" var COMPARATORLOOSE = R++; src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; var COMPARATOR = R++; src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; // An expression to strip any whitespace between the gtlt and the thing // it modifies, so that `> 1.2.3` ==> `>1.2.3` var COMPARATORTRIM = R++; src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; // this one has to use the /g flag re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); var comparatorTrimReplace = '$1$2$3'; // Something like `1.2.3 - 1.2.4` // Note that these all use the loose form, because they'll be // checked against either the strict or loose comparator form // later. var HYPHENRANGE = R++; src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + '\\s+-\\s+' + '(' + src[XRANGEPLAIN] + ')' + '\\s*$'; var HYPHENRANGELOOSE = R++; src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + '\\s+-\\s+' + '(' + src[XRANGEPLAINLOOSE] + ')' + '\\s*$'; // Star ranges basically just allow anything at all. var STAR = R++; src[STAR] = '(<|>)?=?\\s*\\*'; // Compile to actual regexp objects. // All are flag-free, unless they were created above with a flag. for (var i = 0; i < R; i++) { debug(i, src[i]); if (!re[i]) re[i] = new RegExp(src[i]); } exports.parse = parse; function parse(version, loose) { if (version instanceof SemVer) return version; if (typeof version !== 'string') return null; if (version.length > MAX_LENGTH) return null; var r = loose ? re[LOOSE] : re[FULL]; if (!r.test(version)) return null; try { return new SemVer(version, loose); } catch (er) { return null; } } exports.valid = valid; function valid(version, loose) { var v = parse(version, loose); return v ? v.version : null; } exports.clean = clean; function clean(version, loose) { var s = parse(version.trim().replace(/^[=v]+/, ''), loose); return s ? s.version : null; } exports.SemVer = SemVer; function SemVer(version, loose) { if (version instanceof SemVer) { if (version.loose === loose) return version; else version = version.version; } else if (typeof version !== 'string') { throw new TypeError('Invalid Version: ' + version); } if (version.length > MAX_LENGTH) throw new TypeError( 'version is longer than ' + MAX_LENGTH + ' characters', ); if (!(this instanceof SemVer)) return new SemVer(version, loose); debug('SemVer', version, loose); this.loose = loose; var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); if (!m) throw new TypeError('Invalid Version: ' + version); this.raw = version; // these are actually numbers this.major = +m[1]; this.minor = +m[2]; this.patch = +m[3]; if (this.major > MAX_SAFE_INTEGER || this.major < 0) throw new TypeError('Invalid major version'); if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) throw new TypeError('Invalid minor version'); if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) throw new TypeError('Invalid patch version'); // numberify any prerelease numeric ids if (!m[4]) this.prerelease = []; else this.prerelease = m[4].split('.').map(function (id) { if (/^[0-9]+$/.test(id)) { var num = +id; if (num >= 0 && num < MAX_SAFE_INTEGER) return num; } return id; }); this.build = m[5] ? m[5].split('.') : []; this.format(); } SemVer.prototype.format = function () { this.version = this.major + '.' + this.minor + '.' + this.patch; if (this.prerelease.length) this.version += '-' + this.prerelease.join('.'); return this.version; }; SemVer.prototype.toString = function () { return this.version; }; SemVer.prototype.compare = function (other) { debug('SemVer.compare', this.version, this.loose, other); if (!(other instanceof SemVer)) other = new SemVer(other, this.loose); return this.compareMain(other) || this.comparePre(other); }; SemVer.prototype.compareMain = function (other) { if (!(other instanceof SemVer)) other = new SemVer(other, this.loose); return ( compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch) ); }; SemVer.prototype.comparePre = function (other) { if (!(other instanceof SemVer)) other = new SemVer(other, this.loose); // NOT having a prerelease is > having one if (this.prerelease.length && !other.prerelease.length) return -1; else if (!this.prerelease.length && other.prerelease.length) return 1; else if (!this.prerelease.length && !other.prerelease.length) return 0; var i = 0; do { var a = this.prerelease[i]; var b = other.prerelease[i]; debug('prerelease compare', i, a, b); if (a === undefined && b === undefined) return 0; else if (b === undefined) return 1; else if (a === undefined) return -1; else if (a === b) continue; else return compareIdentifiers(a, b); } while (++i); }; // preminor will bump the version up to the next minor release, and immediately // down to pre-release. premajor and prepatch work the same way. SemVer.prototype.inc = function (release, identifier) { switch (release) { case 'premajor': this.prerelease.length = 0; this.patch = 0; this.minor = 0; this.major++; this.inc('pre', identifier); break; case 'preminor': this.prerelease.length = 0; this.patch = 0; this.minor++; this.inc('pre', identifier); break; case 'prepatch': // If this is already a prerelease, it will bump to the next version // drop any prereleases that might already exist, since they are not // relevant at this point. this.prerelease.length = 0; this.inc('patch', identifier); this.inc('pre', identifier); break; // If the input is a non-prerelease version, this acts the same as // prepatch. case 'prerelease': if (this.prerelease.length === 0) this.inc('patch', identifier); this.inc('pre', identifier); break; case 'major': // If this is a pre-major version, bump up to the same major version. // Otherwise increment major. // 1.0.0-5 bumps to 1.0.0 // 1.1.0 bumps to 2.0.0 if ( this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0 ) this.major++; this.minor = 0; this.patch = 0; this.prerelease = []; break; case 'minor': // If this is a pre-minor version, bump up to the same minor version. // Otherwise increment minor. // 1.2.0-5 bumps to 1.2.0 // 1.2.1 bumps to 1.3.0 if (this.patch !== 0 || this.prerelease.length === 0) this.minor++; this.patch = 0; this.prerelease = []; break; case 'patch': // If this is not a pre-release version, it will increment the patch. // If it is a pre-release it will bump up to the same patch version. // 1.2.0-5 patches to 1.2.0 // 1.2.0 patches to 1.2.1 if (this.prerelease.length === 0) this.patch++; this.prerelease = []; break; // This probably shouldn't be used publicly. // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. case 'pre': if (this.prerelease.length === 0) this.prerelease = [0]; else { var i = this.prerelease.length; while (--i >= 0) { if (typeof this.prerelease[i] === 'number') { this.prerelease[i]++; i = -2; } } if (i === -1) // didn't increment anything this.prerelease.push(0); } if (identifier) { // 1.2.0-beta.1 bumps to 1.2.0-beta.2, // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 if (this.prerelease[0] === identifier) { if (isNaN(this.prerelease[1])) this.prerelease = [identifier, 0]; } else this.prerelease = [identifier, 0]; } break; default: throw new Error('invalid increment argument: ' + release); } this.format(); this.raw = this.version; return this; }; exports.inc = inc; function inc(version, release, loose, identifier) { if (typeof loose === 'string') { identifier = loose; loose = undefined; } try { return new SemVer(version, loose).inc(release, identifier).version; } catch (er) { return null; } } exports.diff = diff; function diff(version1, version2) { if (eq(version1, version2)) { return null; } else { var v1 = parse(version1); var v2 = parse(version2); if (v1.prerelease.length || v2.prerelease.length) { for (var key in v1) { if (key === 'major' || key === 'minor' || key === 'patch') { if (v1[key] !== v2[key]) { return 'pre' + key; } } } return 'prerelease'; } for (var key in v1) { if (key === 'major' || key === 'minor' || key === 'patch') { if (v1[key] !== v2[key]) { return key; } } } } } exports.compareIdentifiers = compareIdentifiers; var numeric = /^[0-9]+$/; function compareIdentifiers(a, b) { var anum = numeric.test(a); var bnum = numeric.test(b); if (anum && bnum) { a = +a; b = +b; } return anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : a > b ? 1 : 0; } exports.rcompareIdentifiers = rcompareIdentifiers; function rcompareIdentifiers(a, b) { return compareIdentifiers(b, a); } exports.major = major; function major(a, loose) { return new SemVer(a, loose).major; } exports.minor = minor; function minor(a, loose) { return new SemVer(a, loose).minor; } exports.patch = patch; function patch(a, loose) { return new SemVer(a, loose).patch; } exports.compare = compare; function compare(a, b, loose) { return new SemVer(a, loose).compare(new SemVer(b, loose)); } exports.compareLoose = compareLoose; function compareLoose(a, b) { return compare(a, b, true); } exports.rcompare = rcompare; function rcompare(a, b, loose) { return compare(b, a, loose); } exports.sort = sort; function sort(list, loose) { return list.sort(function (a, b) { return exports.compare(a, b, loose); }); } exports.rsort = rsort; function rsort(list, loose) { return list.sort(function (a, b) { return exports.rcompare(a, b, loose); }); } exports.gt = gt; function gt(a, b, loose) { return compare(a, b, loose) > 0; } exports.lt = lt; function lt(a, b, loose) { return compare(a, b, loose) < 0; } exports.eq = eq; function eq(a, b, loose) { return compare(a, b, loose) === 0; } exports.neq = neq; function neq(a, b, loose) { return compare(a, b, loose) !== 0; } exports.gte = gte; function gte(a, b, loose) { return compare(a, b, loose) >= 0; } exports.lte = lte; function lte(a, b, loose) { return compare(a, b, loose) <= 0; } exports.cmp = cmp; function cmp(a, op, b, loose) { var ret; switch (op) { case '===': if (typeof a === 'object') a = a.version; if (typeof b === 'object') b = b.version; ret = a === b; break; case '!==': if (typeof a === 'object') a = a.version; if (typeof b === 'object') b = b.version; ret = a !== b; break; case '': case '=': case '==': ret = eq(a, b, loose); break; case '!=': ret = neq(a, b, loose); break; case '>': ret = gt(a, b, loose); break; case '>=': ret = gte(a, b, loose); break; case '<': ret = lt(a, b, loose); break; case '<=': ret = lte(a, b, loose); break; default: throw new TypeError('Invalid operator: ' + op); } return ret; } exports.Comparator = Comparator; function Comparator(comp, loose) { if (comp instanceof Comparator) { if (comp.loose === loose) return comp; else comp = comp.value; } if (!(this instanceof Comparator)) return new Comparator(comp, loose); debug('comparator', comp, loose); this.loose = loose; this.parse(comp); if (this.semver === ANY) this.value = ''; else this.value = this.operator + this.semver.version; debug('comp', this); } var ANY = {}; Comparator.prototype.parse = function (comp) { var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; var m = comp.match(r); if (!m) throw new TypeError('Invalid comparator: ' + comp); this.operator = m[1]; if (this.operator === '=') this.operator = ''; // if it literally is just '>' or '' then allow anything. if (!m[2]) this.semver = ANY; else this.semver = new SemVer(m[2], this.loose); }; Comparator.prototype.toString = function () { return this.value; }; Comparator.prototype.test = function (version) { debug('Comparator.test', version, this.loose); if (this.semver === ANY) return true; if (typeof version === 'string') version = new SemVer(version, this.loose); return cmp(version, this.operator, this.semver, this.loose); }; Comparator.prototype.intersects = function (comp, loose) { if (!(comp instanceof Comparator)) { throw new TypeError('a Comparator is required'); } var rangeTmp; if (this.operator === '') { rangeTmp = new Range(comp.value, loose); return satisfies(this.value, rangeTmp, loose); } else if (comp.operator === '') { rangeTmp = new Range(this.value, loose); return satisfies(comp.semver, rangeTmp, loose); } var sameDirectionIncreasing = (this.operator === '>=' || this.operator === '>') && (comp.operator === '>=' || comp.operator === '>'); var sameDirectionDecreasing = (this.operator === '<=' || this.operator === '<') && (comp.operator === '<=' || comp.operator === '<'); var sameSemVer = this.semver.version === comp.semver.version; var differentDirectionsInclusive = (this.operator === '>=' || this.operator === '<=') && (comp.operator === '>=' || comp.operator === '<='); var oppositeDirectionsLessThan = cmp(this.semver, '<', comp.semver, loose) && (this.operator === '>=' || this.operator === '>') && (comp.operator === '<=' || comp.operator === '<'); var oppositeDirectionsGreaterThan = cmp(this.semver, '>', comp.semver, loose) && (this.operator === '<=' || this.operator === '<') && (comp.operator === '>=' || comp.operator === '>'); return ( sameDirectionIncreasing || sameDirectionDecreasing || (sameSemVer && differentDirectionsInclusive) || oppositeDirectionsLessThan || oppositeDirectionsGreaterThan ); }; exports.Range = Range; function Range(range, loose) { if (range instanceof Range) { if (range.loose === loose) { return range; } else { return new Range(range.raw, loose); } } if (range instanceof Comparator) { return new Range(range.value, loose); } if (!(this instanceof Range)) return new Range(range, loose); this.loose = loose; // First, split based on boolean or || this.raw = range; this.set = range .split(/\s*\|\|\s*/) .map(function (range) { return this.parseRange(range.trim()); }, this) .filter(function (c) { // throw out any that are not relevant for whatever reason return c.length; }); if (!this.set.length) { throw new TypeError('Invalid SemVer Range: ' + range); } this.format(); } Range.prototype.format = function () { this.range = this.set .map(function (comps) { return comps.join(' ').trim(); }) .join('||') .trim(); return this.range; }; Range.prototype.toString = function () { return this.range; }; Range.prototype.parseRange = function (range) { var loose = this.loose; range = range.trim(); debug('range', range, loose); // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; range = range.replace(hr, hyphenReplace); debug('hyphen replace', range); // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); debug('comparator trim', range, re[COMPARATORTRIM]); // `~ 1.2.3` => `~1.2.3` range = range.replace(re[TILDETRIM], tildeTrimReplace); // `^ 1.2.3` => `^1.2.3` range = range.replace(re[CARETTRIM], caretTrimReplace); // normalize spaces range = range.split(/\s+/).join(' '); // At this point, the range is completely trimmed and // ready to be split into comparators. var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; var set = range .split(' ') .map(function (comp) { return parseComparator(comp, loose); }) .join(' ') .split(/\s+/); if (this.loose) { // in loose mode, throw out any that are not valid comparators set = set.filter(function (comp) { return !!comp.match(compRe); }); } set = set.map(function (comp) { return new Comparator(comp, loose); }); return set; }; Range.prototype.intersects = function (range, loose) { if (!(range instanceof Range)) { throw new TypeError('a Range is required'); } return this.set.some(function (thisComparators) { return thisComparators.every(function (thisComparator) { return range.set.some(function (rangeComparators) { return rangeComparators.every(function (rangeComparator) { return thisComparator.intersects(rangeComparator, loose); }); }); }); }); }; // Mostly just for testing and legacy API reasons exports.toComparators = toComparators; function toComparators(range, loose) { return new Range(range, loose).set.map(function (comp) { return comp .map(function (c) { return c.value; }) .join(' ') .trim() .split(' '); }); } // comprised of xranges, tildes, stars, and gtlt's at this point. // already replaced the hyphen ranges // turn into a set of JUST comparators. function parseComparator(comp, loose) { debug('comp', comp); comp = replaceCarets(comp, loose); debug('caret', comp); comp = replaceTildes(comp, loose); debug('tildes', comp); comp = replaceXRanges(comp, loose); debug('xrange', comp); comp = replaceStars(comp, loose); debug('stars', comp); return comp; } function isX(id) { return !id || id.toLowerCase() === 'x' || id === '*'; } // ~, ~> --> * (any, kinda silly) // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 function replaceTildes(comp, loose) { return comp .trim() .split(/\s+/) .map(function (comp) { return replaceTilde(comp, loose); }) .join(' '); } function replaceTilde(comp, loose) { var r = loose ? re[TILDELOOSE] : re[TILDE]; return comp.replace(r, function (_, M, m, p, pr) { debug('tilde', comp, _, M, m, p, pr); var ret; if (isX(M)) ret = ''; else if (isX(m)) ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; else if (isX(p)) // ~1.2 == >=1.2.0 <1.3.0 ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; else if (pr) { debug('replaceTilde pr', pr); if (pr.charAt(0) !== '-') pr = '-' + pr; ret = '>=' + M + '.' + m + '.' + p + pr + ' <' + M + '.' + (+m + 1) + '.0'; } // ~1.2.3 == >=1.2.3 <1.3.0 else ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + (+m + 1) + '.0'; debug('tilde return', ret); return ret; }); } // ^ --> * (any, kinda silly) // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 // ^1.2.3 --> >=1.2.3 <2.0.0 // ^1.2.0 --> >=1.2.0 <2.0.0 function replaceCarets(comp, loose) { return comp .trim() .split(/\s+/) .map(function (comp) { return replaceCaret(comp, loose); }) .join(' '); } function replaceCaret(comp, loose) { debug('caret', comp, loose); var r = loose ? re[CARETLOOSE] : re[CARET]; return comp.replace(r, function (_, M, m, p, pr) { debug('caret', comp, _, M, m, p, pr); var ret; if (isX(M)) ret = ''; else if (isX(m)) ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; else if (isX(p)) { if (M === '0') ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; else ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; } else if (pr) { debug('replaceCaret pr', pr); if (pr.charAt(0) !== '-') pr = '-' + pr; if (M === '0') { if (m === '0') ret = '>=' + M + '.' + m + '.' + p + pr + ' <' + M + '.' + m + '.' + (+p + 1); else ret = '>=' + M + '.' + m + '.' + p + pr + ' <' + M + '.' + (+m + 1) + '.0'; } else ret = '>=' + M + '.' + m + '.' + p + pr + ' <' + (+M + 1) + '.0.0'; } else { debug('no pr'); if (M === '0') { if (m === '0') ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + m + '.' + (+p + 1); else ret = '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + (+m + 1) + '.0'; } else ret = '>=' + M + '.' + m + '.' + p + ' <' + (+M + 1) + '.0.0'; } debug('caret return', ret); return ret; }); } function replaceXRanges(comp, loose) { debug('replaceXRanges', comp, loose); return comp .split(/\s+/) .map(function (comp) { return replaceXRange(comp, loose); }) .join(' '); } function replaceXRange(comp, loose) { comp = comp.trim(); var r = loose ? re[XRANGELOOSE] : re[XRANGE]; return comp.replace(r, function (ret, gtlt, M, m, p, pr) { debug('xRange', comp, ret, gtlt, M, m, p, pr); var xM = isX(M); var xm = xM || isX(m); var xp = xm || isX(p); var anyX = xp; if (gtlt === '=' && anyX) gtlt = ''; if (xM) { if (gtlt === '>' || gtlt === '<') { // nothing is allowed ret = '<0.0.0'; } else { // nothing is forbidden ret = '*'; } } else if (gtlt && anyX) { // replace X with 0 if (xm) m = 0; if (xp) p = 0; if (gtlt === '>') { // >1 => >=2.0.0 // >1.2 => >=1.3.0 // >1.2.3 => >= 1.2.4 gtlt = '>='; if (xm) { M = +M + 1; m = 0; p = 0; } else if (xp) { m = +m + 1; p = 0; } } else if (gtlt === '<=') { // <=0.7.x is actually <0.8.0, since any 0.7.x should // pass. Similarly, <=7.x is actually <8.0.0, etc. gtlt = '<'; if (xm) M = +M + 1; else m = +m + 1; } ret = gtlt + M + '.' + m + '.' + p; } else if (xm) { ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; } else if (xp) { ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; } debug('xRange return', ret); return ret; }); } // Because * is AND-ed with everything else in the comparator, // and '' means "any version", just remove the *s entirely. function replaceStars(comp, loose) { debug('replaceStars', comp, loose); // Looseness is ignored here. star is always as loose as it gets! return comp.trim().replace(re[STAR], ''); } // This function is passed to string.replace(re[HYPHENRANGE]) // M, m, patch, prerelease, build // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do // 1.2 - 3.4 => >=1.2.0 <3.5.0 function hyphenReplace( $0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb, ) { if (isX(fM)) from = ''; else if (isX(fm)) from = '>=' + fM + '.0.0'; else if (isX(fp)) from = '>=' + fM + '.' + fm + '.0'; else from = '>=' + from; if (isX(tM)) to = ''; else if (isX(tm)) to = '<' + (+tM + 1) + '.0.0'; else if (isX(tp)) to = '<' + tM + '.' + (+tm + 1) + '.0'; else if (tpr) to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; else to = '<=' + to; return (from + ' ' + to).trim(); } // if ANY of the sets match ALL of its comparators, then pass Range.prototype.test = function (version) { if (!version) return false; if (typeof version === 'string') version = new SemVer(version, this.loose); for (var i = 0; i < this.set.length; i++) { if (testSet(this.set[i], version)) return true; } return false; }; function testSet(set, version) { for (var i = 0; i < set.length; i++) { if (!set[i].test(version)) return false; } if (version.prerelease.length) { // Find the set of versions that are allowed to have prereleases // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 // That should allow `1.2.3-pr.2` to pass. // However, `1.2.4-alpha.notready` should NOT be allowed, // even though it's within the range set by the comparators. for (var i = 0; i < set.length; i++) { debug(set[i].semver); if (set[i].semver === ANY) continue; if (set[i].semver.prerelease.length > 0) { var allowed = set[i].semver; if ( allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch ) return true; } } // Version has a -pre, but it's not one of the ones we like. return false; } return true; } exports.satisfies = satisfies; function satisfies(version, range, loose) { try { range = new Range(range, loose); } catch (er) { return false; } return range.test(version); } exports.maxSatisfying = maxSatisfying; function maxSatisfying(versions, range, loose) { var max = null; var maxSV = null; try { var rangeObj = new Range(range, loose); } catch (er) { return null; } versions.forEach(function (v) { if (rangeObj.test(v)) { // satisfies(v, range, loose) if (!max || maxSV.compare(v) === -1) { // compare(max, v, true) max = v; maxSV = new SemVer(max, loose); } } }); return max; } exports.minSatisfying = minSatisfying; function minSatisfying(versions, range, loose) { var min = null; var minSV = null; try { var rangeObj = new Range(range, loose); } catch (er) { return null; } versions.forEach(function (v) { if (rangeObj.test(v)) { // satisfies(v, range, loose) if (!min || minSV.compare(v) === 1) { // compare(min, v, true) min = v; minSV = new SemVer(min, loose); } } }); return min; } exports.validRange = validRange; function validRange(range, loose) { try { // Return '*' instead of '' so that truthiness works. // This will throw if it's invalid anyway return new Range(range, loose).range || '*'; } catch (er) { return null; } } // Determine if version is less than all the versions possible in the range exports.ltr = ltr; function ltr(version, range, loose) { return outside(version, range, '<', loose); } // Determine if version is greater than all the versions possible in the range. exports.gtr = gtr; function gtr(version, range, loose) { return outside(version, range, '>', loose); } exports.outside = outside; function outside(version, range, hilo, loose) { version = new SemVer(version, loose); range = new Range(range, loose); var gtfn, ltefn, ltfn, comp, ecomp; switch (hilo) { case '>': gtfn = gt; ltefn = lte; ltfn = lt; comp = '>'; ecomp = '>='; break; case '<': gtfn = lt; ltefn = gte; ltfn = gt; comp = '<'; ecomp = '<='; break; default: throw new TypeError('Must provide a hilo val of "<" or ">"'); } // If it satisifes the range it is not outside if (satisfies(version, range, loose)) { return false; } // From now on, variable terms are as if we're in "gtr" mode. // but note that everything is flipped for the "ltr" function. for (var i = 0; i < range.set.length; ++i) { var comparators = range.set[i]; var high = null; var low = null; comparators.forEach(function (comparator) { if (comparator.semver === ANY) { comparator = new Comparator('>=0.0.0'); } high = high || comparator; low = low || comparator; if (gtfn(comparator.semver, high.semver, loose)) { high = comparator; } else if (ltfn(comparator.semver, low.semver, loose)) { low = comparator; } }); // If the edge version comparator has a operator then our version // isn't outside it if (high.operator === comp || high.operator === ecomp) { return false; } // If the lowest version comparator has an operator and our version // is less than it then it isn't higher than the range if ( (!low.operator || low.operator === comp) && ltefn(version, low.semver) ) { return false; } else if (low.operator === ecomp && ltfn(version, low.semver)) { return false; } } return true; } exports.prerelease = prerelease; function prerelease(version, loose) { var parsed = parse(version, loose); return parsed && parsed.prerelease.length ? parsed.prerelease : null; } exports.intersects = intersects; function intersects(r1, r2, loose) { r1 = new Range(r1, loose); r2 = new Range(r2, loose); return r1.intersects(r2); } exports.coerce = coerce; function coerce(version) { if (version instanceof SemVer) return version; if (typeof version !== 'string') return null; var match = version.match(re[COERCE]); if (match == null) return null; return parse( (match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0'), ); } /***/ }, /* 23 */ /***/ function (module, exports) { module.exports = require('stream'); /***/ }, /* 24 */ /***/ function (module, exports) { module.exports = require('url'); /***/ }, /* 25 */ /***/ function (module, __webpack_exports__, __webpack_require__) { 'use strict'; /* harmony export (binding) */ __webpack_require__.d( __webpack_exports__, 'a', function () { return Subscription; }, ); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isArray__ = __webpack_require__(41); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isObject__ = __webpack_require__(444); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isFunction__ = __webpack_require__(154); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(57); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_errorObject__ = __webpack_require__(48); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__ = __webpack_require__(441); /** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_tryCatch,_util_errorObject,_util_UnsubscriptionError PURE_IMPORTS_END */ var Subscription = /*@__PURE__*/ (function () { function Subscription(unsubscribe) { this.closed = false; this._parent = null; this._parents = null; this._subscriptions = null; if (unsubscribe) { this._unsubscribe = unsubscribe; } } Subscription.prototype.unsubscribe = function () { var hasErrors = false; var errors; if (this.closed) { return; } var _a = this, _parent = _a._parent, _parents = _a._parents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; this.closed = true; this._parent = null; this._parents = null; this._subscriptions = null; var index = -1; var len = _parents ? _parents.length : 0; while (_parent) { _parent.remove(this); _parent = (++index < len && _parents[index]) || null; } if ( __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_2__util_isFunction__[ 'a' /* isFunction */ ], )(_unsubscribe) ) { var trial = __webpack_require__ .i( __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__[ 'a' /* tryCatch */ ], )(_unsubscribe) .call(this); if ( trial === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ 'a' /* errorObject */ ] ) { hasErrors = true; errors = errors || (__WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ 'a' /* errorObject */ ].e instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[ 'a' /* UnsubscriptionError */ ] ? flattenUnsubscriptionErrors( __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ 'a' /* errorObject */ ].e.errors, ) : [ __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ 'a' /* errorObject */ ].e, ]); } } if ( __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_0__util_isArray__['a' /* isArray */], )(_subscriptions) ) { index = -1; len = _subscriptions.length; while (++index < len) { var sub = _subscriptions[index]; if ( __webpack_require__.i( __WEBPACK_IMPORTED_MODULE_1__util_isObject__[ 'a' /* isObject */ ], )(sub) ) { var trial = __webpack_require__ .i( __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__[ 'a' /* tryCatch */ ], )(sub.unsubscribe) .call(sub); if ( trial === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ 'a' /* errorObject */ ] ) { hasErrors = true; errors = errors || []; var err = __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ 'a' /* errorObject */ ].e; if ( err instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[ 'a' /* UnsubscriptionError */ ] ) { errors = errors.concat( flattenUnsubscriptionErrors(err.errors), ); } else { errors.push(err); } } } } } if (hasErrors) { throw new __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[ 'a' /* UnsubscriptionError */ ](errors); } }; Subscription.prototype.add = function (teardown) { if (!teardown || teardown === Subscription.EMPTY) { return Subscription.EMPTY; } if (teardown === this) { return this; } var subscription = teardown; switch (typeof teardown) { case 'function': subscription = new Subscription(teardown); case 'object': if ( subscription.closed || typeof subscription.unsubscribe !== 'function' ) { return subscription; } else if (this.closed) { subscription.unsubscribe(); return subscription; } else if (typeof subscription._addParent !== 'function') { var tmp = subscription; subscription = new Subscription(); subscription._subscriptions = [tmp]; } break; default: throw new Error( 'unrecognized teardown ' + teardown + ' added to Subscription.', ); } var subscriptions = this._subscriptions || (this._subscriptions = []); subscriptions.push(subscription); subscription._addParent(this); return subscription; }; Subscription.prototype.remove = function (subscription) { var subscriptions = this._subscriptions; if (subscriptions) { var subscriptionIndex = subscriptions.indexOf(subscription); if (subscriptionIndex !== -1) { subscriptions.splice(subscriptionIndex, 1); } } }; Subscription.prototype._addParent = function (parent) { var _a = this, _parent = _a._parent, _parents = _a._parents; if (!_parent || _parent === parent) { this._parent = parent; } else if (!_parents) { this._parents = [parent]; } else if (_parents.indexOf(parent) === -1) { _parents.push(parent); } }; Subscription.EMPTY = (function (empty) { empty.closed = true; return empty; })(new Subscription()); return Subscription; })(); function flattenUnsubscriptionErrors(errors) { return errors.reduce(function (errs, err) { return errs.concat( err instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[ 'a' /* UnsubscriptionError */ ] ? err.errors : err, ); }, []); } //# sourceMappingURL=Subscription.js.map /***/ }, /* 26 */ /***/ function (module, exports, __webpack_require__) { // Copyright 2015 Joyent, Inc. module.exports = { bufferSplit: bufferSplit, addRSAMissing: addRSAMissing, calculateDSAPublic: calculateDSAPublic, calculateED25519Public: calculateED25519Public, calculateX25519Public: calculateX25519Public, mpNormalize: mpNormalize, mpDenormalize: mpDenormalize, ecNormalize: ecNormalize, countZeros: countZeros, assertCompatible: assertCompatible, isCompatible: isCompatible, opensslKeyDeriv: opensslKeyDeriv, opensshCipherInfo: opensshCipherInfo, publicFromPrivateECDSA: publicFromPrivateECDSA, zeroPadToLength: zeroPadToLength, writeBitString: writeBitString, readBitString: readBitString, }; var assert = __webpack_require__(16); var Buffer = __webpack_require__(15).Buffer; var PrivateKey = __webpack_require__(33); var Key = __webpack_require__(27); var crypto = __webpack_require__(11); var algs = __webpack_require__(32); var asn1 = __webpack_require__(66); var ec, jsbn; var nacl; var MAX_CLASS_DEPTH = 3; function isCompatible(obj, klass, needVer) { if (obj === null || typeof obj !== 'object') return false; if (needVer === undefined) needVer = klass.prototype._sshpkApiVersion; if ( obj instanceof klass && klass.prototype._sshpkApiVersion[0] == needVer[0] ) return true; var proto = Object.getPrototypeOf(obj); var depth = 0; while (proto.constructor.name !== klass.name) { proto = Object.getPrototypeOf(proto); if (!proto || ++depth > MAX_CLASS_DEPTH) return false; } if (proto.constructor.name !== klass.name) return false; var ver = proto._sshpkApiVersion; if (ver === undefined) ver = klass._oldVersionDetect(obj); if (ver[0] != needVer[0] || ver[1] < needVer[1]) return false; return true; } function assertCompatible(obj, klass, needVer, name) { if (name === undefined) name = 'object'; assert.ok(obj, name + ' must not be null'); assert.object(obj, name + ' must be an object'); if (needVer === undefined) needVer = klass.prototype._sshpkApiVersion; if ( obj instanceof klass && klass.prototype._sshpkApiVersion[0] == needVer[0] ) return; var proto = Object.getPrototypeOf(obj); var depth = 0; while (proto.constructor.name !== klass.name) { proto = Object.getPrototypeOf(proto); assert.ok( proto && ++depth <= MAX_CLASS_DEPTH, name + ' must be a ' + klass.name + ' instance', ); } assert.strictEqual( proto.constructor.name, klass.name, name + ' must be a ' + klass.name + ' instance', ); var ver = proto._sshpkApiVersion; if (ver === undefined) ver = klass._oldVersionDetect(obj); assert.ok( ver[0] == needVer[0] && ver[1] >= needVer[1], name + ' must be compatible with ' + klass.name + ' klass ' + 'version ' + needVer[0] + '.' + needVer[1], ); } var CIPHER_LEN = { 'des-ede3-cbc': { key: 7, iv: 8 }, 'aes-128-cbc': { key: 16, iv: 16 }, }; var PKCS5_SALT_LEN = 8; function opensslKeyDeriv(cipher, salt, passphrase, count) { assert.buffer(salt, 'salt'); assert.buffer(passphrase, 'passphrase'); assert.number(count, 'iteration count'); var clen = CIPHER_LEN[cipher]; assert.object(clen, 'supported cipher'); salt = salt.slice(0, PKCS5_SALT_LEN); var D, D_prev, bufs; var material = Buffer.alloc(0); while (material.length < clen.key + clen.iv) { bufs = []; if (D_prev) bufs.push(D_prev); bufs.push(passphrase); bufs.push(salt); D = Buffer.concat(bufs); for (var j = 0; j < count; ++j) D = crypto.createHash('md5').update(D).digest(); material = Buffer.concat([material, D]); D_prev = D; } return { key: material.slice(0, clen.key), iv: material.slice(clen.key, clen.key + clen.iv), }; } /* Count leading zero bits on a buffer */ function countZeros(buf) { var o = 0, obit = 8; while (o < buf.length) { var mask = 1 << obit; if ((buf[o] & mask) === mask) break; obit--; if (obit < 0) { o++; obit = 8; } } return o * 8 + (8 - obit) - 1; } function bufferSplit(buf, chr) { assert.buffer(buf); assert.string(chr); var parts = []; var lastPart = 0; var matches = 0; for (var i = 0; i < buf.length; ++i) { if (buf[i] === chr.charCodeAt(matches)) ++matches; else if (buf[i] === chr.charCodeAt(0)) matches = 1; else matches = 0; if (matches >= chr.length) { var newPart = i + 1; parts.push(buf.slice(lastPart, newPart - matches)); lastPart = newPart; matches = 0; } } if (lastPart <= buf.length) parts.push(buf.slice(lastPart, buf.length)); return parts; } function ecNormalize(buf, addZero) { assert.buffer(buf); if (buf[0] === 0x00 && buf[1] === 0x04) { if (addZero) return buf; return buf.slice(1); } else if (buf[0] === 0x04) { if (!addZero) return buf; } else { while (buf[0] === 0x00) buf = buf.slice(1); if (buf[0] === 0x02 || buf[0] === 0x03) throw new Error( 'Compressed elliptic curve points ' + 'are not supported', ); if (buf[0] !== 0x04) throw new Error('Not a valid elliptic curve point'); if (!addZero) return buf; } var b = Buffer.alloc(buf.length + 1); b[0] = 0x0; buf.copy(b, 1); return b; } function readBitString(der, tag) { if (tag === undefined) tag = asn1.Ber.BitString; var buf = der.readString(tag, true); assert.strictEqual( buf[0], 0x00, 'bit strings with unused bits are ' + 'not supported (0x' + buf[0].toString(16) + ')', ); return buf.slice(1); } function writeBitString(der, buf, tag) { if (tag === undefined) tag = asn1.Ber.BitString; var b = Buffer.alloc(buf.length + 1); b[0] = 0x00; buf.copy(b, 1); der.writeBuffer(b, tag); } function mpNormalize(buf) { assert.buffer(buf); while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00) buf = buf.slice(1); if ((buf[0] & 0x80) === 0x80) { var b = Buffer.alloc(buf.length + 1); b[0] = 0x00; buf.copy(b, 1); buf = b; } return buf; } function mpDenormalize(buf) { assert.buffer(buf); while (buf.length > 1 && buf[0] === 0x00) buf = buf.slice(1); return buf; } function zeroPadToLength(buf, len) { assert.buffer(buf); assert.number(len); while (buf.length > len) { assert.equal(buf[0], 0x00); buf = buf.slice(1); } while (buf.length < len) { var b = Buffer.alloc(buf.length + 1); b[0] = 0x00; buf.copy(b, 1); buf = b; } return buf; } function bigintToMpBuf(bigint) { var buf = Buffer.from(bigint.toByteArray()); buf = mpNormalize(buf); return buf; } function calculateDSAPublic(g, p, x) { assert.buffer(g); assert.buffer(p); assert.buffer(x); try { var bigInt = __webpack_require__(81).BigInteger; } catch (e) { throw new Error( 'To load a PKCS#8 format DSA private key, ' + 'the node jsbn library is required.', ); } g = new bigInt(g); p = new bigInt(p); x = new bigInt(x); var y = g.modPow(x, p); var ybuf = bigintToMpBuf(y); return ybuf; } function calculateED25519Public(k) { assert.buffer(k); if (nacl === undefined) nacl = __webpack_require__(76); var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); return Buffer.from(kp.publicKey); } function calculateX25519Public(k) { assert.buffer(k); if (nacl === undefined) nacl = __webpack_require__(76); var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); return Buffer.from(kp.publicKey); } function addRSAMissing(key) { assert.object(key); assertCompatible(key, PrivateKey, [1, 1]); try { var bigInt = __webpack_require__(81).BigInteger; } catch (e) { throw new Error( 'To write a PEM private key from ' + 'this source, the node jsbn lib is required.', ); } var d = new bigInt(key.part.d.data); var buf; if (!key.part.dmodp) { var p = new bigInt(key.part.p.data); var dmodp = d.mod(p.subtract(1)); buf = bigintToMpBuf(dmodp); key.part.dmodp = { name: 'dmodp', data: buf }; key.parts.push(key.part.dmodp); } if (!key.part.dmodq) { var q = new bigInt(key.part.q.data); var dmodq = d.mod(q.subtract(1)); buf = bigintToMpBuf(dmodq); key.part.dmodq = { name: 'dmodq', data: buf }; key.parts.push(key.part.dmodq); } } function publicFromPrivateECDSA(curveName, priv) { assert.string(curveName, 'curveName'); assert.buffer(priv); if (ec === undefined) ec = __webpack_require__(139); if (jsbn === undefined) jsbn = __webpack_require__(81).BigInteger; var params = algs.curves[curveName]; var p = new jsbn(params.p); var a = new jsbn(params.a); var b = new jsbn(params.b); var curve = new ec.ECCurveFp(p, a, b); var G = curve.decodePointHex(params.G.toString('hex')); var d = new jsbn(mpNormalize(priv)); var pub = G.multiply(d); pub = Buffer.from(curve.encodePointHex(pub), 'hex'); var parts = []; parts.push({ name: 'curve', data: Buffer.from(curveName) }); parts.push({ name: 'Q', data: pub }); var key = new Key({ type: 'ecdsa', curve: curve, parts: parts }); return key; } function opensshCipherInfo(cipher) { var inf = {}; switch (cipher) { case '3des-cbc': inf.keySize = 24; inf.blockSize = 8; inf.opensslName = 'des-ede3-cbc'; break; case 'blowfish-cbc': inf.keySize = 16; inf.blockSize = 8; inf.opensslName = 'bf-cbc'; break; case 'aes128-cbc': case 'aes128-ctr': case 'aes128-gcm@openssh.com': inf.keySize = 16; inf.blockSize = 16; inf.opensslName = 'aes-128-' + cipher.slice(7, 10); break; case 'aes192-cbc': case 'aes192-ctr': case 'aes192-gcm@openssh.com': inf.keySize = 24; inf.blockSize = 16; inf.opensslName = 'aes-192-' + cipher.slice(7, 10); break; case 'aes256-cbc': case 'aes256-ctr': case 'aes256-gcm@openssh.com': inf.keySize = 32; inf.blockSize = 16; inf.opensslName = 'aes-256-' + cipher.slice(7, 10); break; default: throw new Error('Unsupported openssl cipher "' + cipher + '"'); } return inf; } /***/ }, /* 27 */ /***/ function (module, exports, __webpack_require__) { // Copyright 2017 Joyent, Inc. module.exports = Key; var assert = __webpack_require__(16); var algs = __webpack_require__(32); var crypto = __webpack_require__(11); var Fingerprint = __webpack_require__(156); var Signature = __webpack_require__(75); var DiffieHellman = __webpack_require__(325).DiffieHellman; var errs = __webpack_require__(74); var utils = __webpack_require__(26); var PrivateKey = __webpack_require__(33); var edCompat; try { edCompat = __webpack_require__(454); } catch (e) { /* Just continue through, and bail out if we try to use it. */ } var InvalidAlgorithmError = errs.InvalidAlgorithmError; var KeyParseError = errs.KeyParseError; var formats = {}; formats['auto'] = __webpack_require__(455); formats['pem'] = __webpack_require__(86); formats['pkcs1'] = __webpack_require__(327); formats['pkcs8'] = __webpack_require__(157); formats['rfc4253'] = __webpack_require__(103); formats['ssh'] = __webpack_require__(456); formats['ssh-private'] = __webpack_require__(193); formats['openssh'] = formats['ssh-private']; formats['dnssec'] = __webpack_require__(326); function Key(opts) { assert.object(opts, 'options'); assert.arrayOfObject(opts.parts, 'options.parts'); assert.string(opts.type, 'options.type'); assert.optionalString(opts.comment, 'options.comment'); var algInfo = algs.info[opts.type]; if (typeof algInfo !== 'object') throw new InvalidAlgorithmError(opts.type); var partLookup = {}; for (var i = 0; i < opts.parts.length; ++i) { var part = opts.parts[i]; partLookup[part.name] = part; } this.type = opts.type; this.parts = opts.parts; this.part = partLookup; this.comment = undefined; this.source = opts.source; /* for speeding up hashing/fingerprint operations */ this._rfc4253Cache = opts._rfc4253Cache; this._hashCache = {}; var sz; this.curve = undefined; if (this.type === 'ecdsa') { var curve = this.part.curve.data.toString(); this.curve = curve; sz = algs.curves[curve].size; } else if (this.type === 'ed25519' || this.type === 'curve25519') { sz = 256; this.curve = 'curve25519'; } else { var szPart = this.part[algInfo.sizePart]; sz = szPart.data.length; sz = sz * 8 - utils.countZeros(szPart.data); } this.size = sz; } Key.formats = formats; Key.prototype.toBuffer = function (format, options) { if (format === undefined) format = 'ssh'; assert.string(format, 'format'); assert.object(formats[format], 'formats[format]'); assert.optionalObject(options, 'options'); if (format === 'rfc4253') { if (this._rfc4253Cache === undefined) this._rfc4253Cache = formats['rfc4253'].write(this); return this._rfc4253Cache; } return formats[format].write(this, options); }; Key.prototype.toString = function (format, options) { return this.toBuffer(format, options).toString(); }; Key.prototype.hash = function (algo) { assert.string(algo, 'algorithm'); algo = algo.toLowerCase(); if (algs.hashAlgs[algo] === undefined) throw new InvalidAlgorithmError(algo); if (this._hashCache[algo]) return this._hashCache[algo]; var hash = crypto .createHash(algo) .update(this.toBuffer('rfc4253')) .digest(); this._hashCache[algo] = hash; return hash; }; Key.prototype.fingerprint = function (algo) { if (algo === undefined) algo = 'sha256'; assert.string(algo, 'algorithm'); var opts = { type: 'key', hash: this.hash(algo), algorithm: algo, }; return new Fingerprint(opts); }; Key.prototype.defaultHashAlgorithm = function () { var hashAlgo = 'sha1'; if (this.type === 'rsa') hashAlgo = 'sha256'; if (this.type === 'dsa' && this.size > 1024) hashAlgo = 'sha256'; if (this.type === 'ed25519') hashAlgo = 'sha512'; if (this.type === 'ecdsa') { if (this.size <= 256) hashAlgo = 'sha256'; else if (this.size <= 384) hashAlgo = 'sha384'; else hashAlgo = 'sha512'; } return hashAlgo; }; Key.prototype.createVerify = function (hashAlgo) { if (hashAlgo === undefined) hashAlgo = this.defaultHashAlgorithm(); assert.string(hashAlgo, 'hash algorithm'); /* ED25519 is not supported by OpenSSL, use a javascript impl. */ if (this.type === 'ed25519' && edCompat !== undefined) return new edCompat.Verifier(this, hashAlgo); if (this.type === 'curve25519') throw new Error( 'Curve25519 keys are not suitable for ' + 'signing or verification', ); var v, nm, err; try { nm = hashAlgo.toUpperCase(); v = crypto.createVerify(nm); } catch (e) { err = e; } if ( v === undefined || (err instanceof Error && err.message.match(/Unknown message digest/)) ) { nm = 'RSA-'; nm += hashAlgo.toUpperCase(); v = crypto.createVerify(nm); } assert.ok(v, 'failed to create verifier'); var oldVerify = v.verify.bind(v); var key = this.toBuffer('pkcs8'); var curve = this.curve; var self = this; v.verify = function (signature, fmt) { if (Signature.isSignature(signature, [2, 0])) { if (signature.type !== self.type) return false; if (signature.hashAlgorithm && signature.hashAlgorithm !== hashAlgo) return false; if ( signature.curve && self.type === 'ecdsa' && signature.curve !== curve ) return false; return oldVerify(key, signature.toBuffer('asn1')); } else if ( typeof signature === 'string' || Buffer.isBuffer(signature) ) { return oldVerify(key, signature, fmt); /* * Avoid doing this on valid arguments, walking the prototype * chain can be quite slow. */ } else if (Signature.isSignature(signature, [1, 0])) { throw new Error( 'signature was created by too old ' + 'a version of sshpk and cannot be verified', ); } else { throw new TypeError( 'signature must be a string, ' + 'Buffer, or Signature object', ); } }; return v; }; Key.prototype.createDiffieHellman = function () { if (this.type === 'rsa') throw new Error('RSA keys do not support Diffie-Hellman'); return new DiffieHellman(this); }; Key.prototype.createDH = Key.prototype.createDiffieHellman; Key.parse = function (data, format, options) { if (typeof data !== 'string') assert.buffer(data, 'data'); if (format === undefined) format = 'auto'; assert.string(format, 'format'); if (typeof options === 'string') options = { filename: options }; assert.optionalObject(options, 'options'); if (options === undefined) options = {}; assert.optionalString(options.filename, 'options.filename'); if (options.filename === undefined) options.filename = '(unnamed)'; assert.object(formats[format], 'formats[format]'); try { var k = formats[format].read(data, options); if (k instanceof PrivateKey) k = k.toPublic(); if (!k.comment) k.comment = options.filename; return k; } catch (e) { if (e.name === 'KeyEncryptedError') throw e; throw new KeyParseError(options.filename, format, e); } }; Key.isKey = function (obj, ver) { return utils.isCompatible(obj, Key, ver); }; /* * API versions for Key: * [1,0] -- initial ver, may take Signature for createVerify or may not * [1,1] -- added pkcs1, pkcs8 formats * [1,2] -- added auto, ssh-private, openssh formats * [1,3] -- added defaultHashAlgorithm * [1,4] -- added ed support, createDH * [1,5] -- first explicitly tagged version * [1,6] -- changed ed25519 part names */ Key.prototype._sshpkApiVersion = [1, 6]; Key._oldVersionDetect = function (obj) { assert.func(obj.toBuffer); assert.func(obj.fingerprint); if (obj.createDH) return [1, 4]; if (obj.defaultHashAlgorithm) return [1, 3]; if (obj.formats['auto']) return [1, 2]; if (obj.formats['pkcs1']) return [1, 1]; return [1, 0]; }; /***/ }, /* 28 */ /***/ function (module, exports) { module.exports = require('assert'); /***/ }, /* 29 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); exports.default = nullify; function nullify(obj = {}) { if (Array.isArray(obj)) { for ( var _iterator = obj, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } const item = _ref; nullify(item); } } else if ( (obj !== null && typeof obj === 'object') || typeof obj === 'function' ) { Object.setPrototypeOf(obj, null); // for..in can only be applied to 'object', not 'function' if (typeof obj === 'object') { for (const key in obj) { nullify(obj[key]); } } } return obj; } /***/ }, /* 30 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; const escapeStringRegexp = __webpack_require__(382); const ansiStyles = __webpack_require__(474); const stdoutColor = __webpack_require__(566).stdout; const template = __webpack_require__(567); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); // `supportsColor.level` → `ansiStyles.color[name]` mapping const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; // `color-convert` models to exclude from the Chalk API due to conflicts and such const skipModels = new Set(['gray']); const styles = Object.create(null); function applyOptions(obj, options) { options = options || {}; // Detect level if not set manually const scLevel = stdoutColor ? stdoutColor.level : 0; obj.level = options.level === undefined ? scLevel : options.level; obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; } function Chalk(options) { // We check for this.template here since calling `chalk.constructor()` // by itself will have a `this` of a previously constructed chalk object if (!this || !(this instanceof Chalk) || this.template) { const chalk = {}; applyOptions(chalk, options); chalk.template = function () { const args = [].slice.call(arguments); return chalkTag.apply(null, [chalk.template].concat(args)); }; Object.setPrototypeOf(chalk, Chalk.prototype); Object.setPrototypeOf(chalk.template, chalk); chalk.template.constructor = Chalk; return chalk.template; } applyOptions(this, options); } // Use bright blue on Windows as the normal blue color is illegible if (isSimpleWindowsTerm) { ansiStyles.blue.open = '\u001B[94m'; } for (const key of Object.keys(ansiStyles)) { ansiStyles[key].closeRe = new RegExp( escapeStringRegexp(ansiStyles[key].close), 'g', ); styles[key] = { get() { const codes = ansiStyles[key]; return build.call( this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key, ); }, }; } styles.visible = { get() { return build.call(this, this._styles || [], true, 'visible'); }, }; ansiStyles.color.closeRe = new RegExp( escapeStringRegexp(ansiStyles.color.close), 'g', ); for (const model of Object.keys(ansiStyles.color.ansi)) { if (skipModels.has(model)) { continue; } styles[model] = { get() { const level = this.level; return function () { const open = ansiStyles.color[levelMapping[level]][model].apply( null, arguments, ); const codes = { open, close: ansiStyles.color.close, closeRe: ansiStyles.color.closeRe, }; return build.call( this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model, ); }; }, }; } ansiStyles.bgColor.closeRe = new RegExp( escapeStringRegexp(ansiStyles.bgColor.close), 'g', ); for (const model of Object.keys(ansiStyles.bgColor.ansi)) { if (skipModels.has(model)) { continue; } const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); styles[bgModel] = { get() { const level = this.level; return function () { const open = ansiStyles.bgColor[levelMapping[level]][model].apply( null, arguments, ); const codes = { open, close: ansiStyles.bgColor.close, closeRe: ansiStyles.bgColor.closeRe, }; return build.call( this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model, ); }; }, }; } const proto = Object.defineProperties(() => {}, styles); function build(_styles, _empty, key) { const builder = function () { return applyStyle.apply(builder, arguments); }; builder._styles = _styles; builder._empty = _empty; const self = this; Object.defineProperty(builder, 'level', { enumerable: true, get() { return self.level; }, set(level) { self.level = level; }, }); Object.defineProperty(builder, 'enabled', { enumerable: true, get() { return self.enabled; }, set(enabled) { self.enabled = enabled; }, }); // See below for fix regarding invisible grey/dim combination on Windows builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; // `__proto__` is used because we must return a function, but there is // no way to create a function with a different prototype builder.__proto__ = proto; // eslint-disable-line no-proto return builder; } function applyStyle() { // Support varags, but simply cast to string in case there's only one arg const args = arguments; const argsLen = args.length; let str = String(arguments[0]); if (argsLen === 0) { return ''; } if (argsLen > 1) { // Don't slice `arguments`, it prevents V8 optimizations for (let a = 1; a < argsLen; a++) { str += ' ' + args[a]; } } if (!this.enabled || this.level <= 0 || !str) { return this._empty ? '' : str; } // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, // see https://github.com/chalk/chalk/issues/58 // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. const originalDim = ansiStyles.dim.open; if (isSimpleWindowsTerm && this.hasGrey) { ansiStyles.dim.open = ''; } for (const code of this._styles.slice().reverse()) { // Replace any instances already present with a re-opening code // otherwise only the part of the string until said closing code // will be colored, and the rest will simply be 'plain'. str = code.open + str.replace(code.closeRe, code.open) + code.close; // Close the styling before a linebreak and reopen // after next line to fix a bleed issue on macOS // https://github.com/chalk/chalk/pull/92 str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); } // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue ansiStyles.dim.open = originalDim; return str; } function chalkTag(chalk, strings) { if (!Array.isArray(strings)) { // If chalk() was called by itself or with a string, // return the string itself as a string. return [].slice.call(arguments, 1).join(' '); } const args = [].slice.call(arguments, 2); const parts = [strings.raw[0]]; for (let i = 1; i < strings.length; i++) { parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); parts.push(String(strings.raw[i])); } return template(chalk, parts.join('')); } Object.defineProperties(Chalk.prototype, styles); module.exports = Chalk(); // eslint-disable-line new-cap module.exports.supportsColor = stdoutColor; module.exports.default = module.exports; // For TypeScript /***/ }, /* 31 */ /***/ function (module, exports) { var core = (module.exports = { version: '2.5.7' }); if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef /***/ }, /* 32 */ /***/ function (module, exports, __webpack_require__) { // Copyright 2015 Joyent, Inc. var Buffer = __webpack_require__(15).Buffer; var algInfo = { dsa: { parts: ['p', 'q', 'g', 'y'], sizePart: 'p', }, rsa: { parts: ['e', 'n'], sizePart: 'n', }, ecdsa: { parts: ['curve', 'Q'], sizePart: 'Q', }, ed25519: { parts: ['A'], sizePart: 'A', }, }; algInfo['curve25519'] = algInfo['ed25519']; var algPrivInfo = { dsa: { parts: ['p', 'q', 'g', 'y', 'x'], }, rsa: { parts: ['n', 'e', 'd', 'iqmp', 'p', 'q'], }, ecdsa: { parts: ['curve', 'Q', 'd'], }, ed25519: { parts: ['A', 'k'], }, }; algPrivInfo['curve25519'] = algPrivInfo['ed25519']; var hashAlgs = { md5: true, sha1: true, sha256: true, sha384: true, sha512: true, }; /* * Taken from * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf */ var curves = { nistp256: { size: 256, pkcs8oid: '1.2.840.10045.3.1.7', p: Buffer.from( ( '00' + 'ffffffff 00000001 00000000 00000000' + '00000000 ffffffff ffffffff ffffffff' ).replace(/ /g, ''), 'hex', ), a: Buffer.from( ( '00' + 'FFFFFFFF 00000001 00000000 00000000' + '00000000 FFFFFFFF FFFFFFFF FFFFFFFC' ).replace(/ /g, ''), 'hex', ), b: Buffer.from( ( '5ac635d8 aa3a93e7 b3ebbd55 769886bc' + '651d06b0 cc53b0f6 3bce3c3e 27d2604b' ).replace(/ /g, ''), 'hex', ), s: Buffer.from( ('00' + 'c49d3608 86e70493 6a6678e1 139d26b7' + '819f7e90').replace( / /g, '', ), 'hex', ), n: Buffer.from( ( '00' + 'ffffffff 00000000 ffffffff ffffffff' + 'bce6faad a7179e84 f3b9cac2 fc632551' ).replace(/ /g, ''), 'hex', ), G: Buffer.from( ( '04' + '6b17d1f2 e12c4247 f8bce6e5 63a440f2' + '77037d81 2deb33a0 f4a13945 d898c296' + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' + '2bce3357 6b315ece cbb64068 37bf51f5' ).replace(/ /g, ''), 'hex', ), }, nistp384: { size: 384, pkcs8oid: '1.3.132.0.34', p: Buffer.from( ( '00' + 'ffffffff ffffffff ffffffff ffffffff' + 'ffffffff ffffffff ffffffff fffffffe' + 'ffffffff 00000000 00000000 ffffffff' ).replace(/ /g, ''), 'hex', ), a: Buffer.from( ( '00' + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' + 'FFFFFFFF 00000000 00000000 FFFFFFFC' ).replace(/ /g, ''), 'hex', ), b: Buffer.from( ( 'b3312fa7 e23ee7e4 988e056b e3f82d19' + '181d9c6e fe814112 0314088f 5013875a' + 'c656398d 8a2ed19d 2a85c8ed d3ec2aef' ).replace(/ /g, ''), 'hex', ), s: Buffer.from( ('00' + 'a335926a a319a27a 1d00896a 6773a482' + '7acdac73').replace( / /g, '', ), 'hex', ), n: Buffer.from( ( '00' + 'ffffffff ffffffff ffffffff ffffffff' + 'ffffffff ffffffff c7634d81 f4372ddf' + '581a0db2 48b0a77a ecec196a ccc52973' ).replace(/ /g, ''), 'hex', ), G: Buffer.from( ( '04' + 'aa87ca22 be8b0537 8eb1c71e f320ad74' + '6e1d3b62 8ba79b98 59f741e0 82542a38' + '5502f25d bf55296c 3a545e38 72760ab7' + '3617de4a 96262c6f 5d9e98bf 9292dc29' + 'f8f41dbd 289a147c e9da3113 b5f0b8c0' + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f' ).replace(/ /g, ''), 'hex', ), }, nistp521: { size: 521, pkcs8oid: '1.3.132.0.35', p: Buffer.from( ( '01ffffff ffffffff ffffffff ffffffff' + 'ffffffff ffffffff ffffffff ffffffff' + 'ffffffff ffffffff ffffffff ffffffff' + 'ffffffff ffffffff ffffffff ffffffff' + 'ffff' ).replace(/ /g, ''), 'hex', ), a: Buffer.from( ( '01FF' + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC' ).replace(/ /g, ''), 'hex', ), b: Buffer.from( ( '51' + '953eb961 8e1c9a1f 929a21a0 b68540ee' + 'a2da725b 99b315f3 b8b48991 8ef109e1' + '56193951 ec7e937b 1652c0bd 3bb1bf07' + '3573df88 3d2c34f1 ef451fd4 6b503f00' ).replace(/ /g, ''), 'hex', ), s: Buffer.from( ('00' + 'd09e8800 291cb853 96cc6717 393284aa' + 'a0da64ba').replace( / /g, '', ), 'hex', ), n: Buffer.from( ( '01ff' + 'ffffffff ffffffff ffffffff ffffffff' + 'ffffffff ffffffff ffffffff fffffffa' + '51868783 bf2f966b 7fcc0148 f709a5d0' + '3bb5c9b8 899c47ae bb6fb71e 91386409' ).replace(/ /g, ''), 'hex', ), G: Buffer.from( ( '04' + '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' + '9c648139 053fb521 f828af60 6b4d3dba' + 'a14b5e77 efe75928 fe1dc127 a2ffa8de' + '3348b3c1 856a429b f97e7e31 c2e5bd66' + '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' + '98f54449 579b4468 17afbd17 273e662c' + '97ee7299 5ef42640 c550b901 3fad0761' + '353c7086 a272c240 88be9476 9fd16650' ).replace(/ /g, ''), 'hex', ), }, }; module.exports = { info: algInfo, privInfo: algPrivInfo, hashAlgs: hashAlgs, curves: curves, }; /***/ }, /* 33 */ /***/ function (module, exports, __webpack_require__) { // Copyright 2017 Joyent, Inc. module.exports = PrivateKey; var assert = __webpack_require__(16); var Buffer = __webpack_require__(15).Buffer; var algs = __webpack_require__(32); var crypto = __webpack_require__(11); var Fingerprint = __webpack_require__(156); var Signature = __webpack_require__(75); var errs = __webpack_require__(74); var util = __webpack_require__(3); var utils = __webpack_require__(26); var dhe = __webpack_require__(325); var generateECDSA = dhe.generateECDSA; var generateED25519 = dhe.generateED25519; var edCompat; var nacl; try { edCompat = __webpack_require__(454); } catch (e) { /* Just continue through, and bail out if we try to use it. */ } var Key = __webpack_require__(27); var InvalidAlgorithmError = errs.InvalidAlgorithmError; var KeyParseError = errs.KeyParseError; var KeyEncryptedError = errs.KeyEncryptedError; var formats = {}; formats['auto'] = __webpack_require__(455); formats['pem'] = __webpack_require__(86); formats['pkcs1'] = __webpack_require__(327); formats['pkcs8'] = __webpack_require__(157); formats['rfc4253'] = __webpack_require__(103); formats['ssh-private'] = __webpack_require__(193); formats['openssh'] = formats['ssh-private']; formats['ssh'] = formats['ssh-private']; formats['dnssec'] = __webpack_require__(326); function PrivateKey(opts) { assert.object(opts, 'options'); Key.call(this, opts); this._pubCache = undefined; } util.inherits(PrivateKey, Key); PrivateKey.formats = formats; PrivateKey.prototype.toBuffer = function (format, options) { if (format === undefined) format = 'pkcs1'; assert.string(format, 'format'); assert.object(formats[format], 'formats[format]'); assert.optionalObject(options, 'options'); return formats[format].write(this, options); }; PrivateKey.prototype.hash = function (algo) { return this.toPublic().hash(algo); }; PrivateKey.prototype.toPublic = function () { if (this._pubCache) return this._pubCache; var algInfo = algs.info[this.type]; var pubParts = []; for (var i = 0; i < algInfo.parts.length; ++i) { var p = algInfo.parts[i]; pubParts.push(this.part[p]); } this._pubCache = new Key({ type: this.type, source: this, parts: pubParts, }); if (this.comment) this._pubCache.comment = this.comment; return this._pubCache; }; PrivateKey.prototype.derive = function (newType) { assert.string(newType, 'type'); var priv, pub, pair; if (this.type === 'ed25519' && newType === 'curve25519') { if (nacl === undefined) nacl = __webpack_require__(76); priv = this.part.k.data; if (priv[0] === 0x00) priv = priv.slice(1); pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); pub = Buffer.from(pair.publicKey); return new PrivateKey({ type: 'curve25519', parts: [ { name: 'A', data: utils.mpNormalize(pub) }, { name: 'k', data: utils.mpNormalize(priv) }, ], }); } else if (this.type === 'curve25519' && newType === 'ed25519') { if (nacl === undefined) nacl = __webpack_require__(76); priv = this.part.k.data; if (priv[0] === 0x00) priv = priv.slice(1); pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); pub = Buffer.from(pair.publicKey); return new PrivateKey({ type: 'ed25519', parts: [ { name: 'A', data: utils.mpNormalize(pub) }, { name: 'k', data: utils.mpNormalize(priv) }, ], }); } throw new Error( 'Key derivation not supported from ' + this.type + ' to ' + newType, ); }; PrivateKey.prototype.createVerify = function (hashAlgo) { return this.toPublic().createVerify(hashAlgo); }; PrivateKey.prototype.createSign = function (hashAlgo) { if (hashAlgo === undefined) hashAlgo = this.defaultHashAlgorithm(); assert.string(hashAlgo, 'hash algorithm'); /* ED25519 is not supported by OpenSSL, use a javascript impl. */ if (this.type === 'ed25519' && edCompat !== undefined) return new edCompat.Signer(this, hashAlgo); if (this.type === 'curve25519') throw new Error( 'Curve25519 keys are not suitable for ' + 'signing or verification', ); var v, nm, err; try { nm = hashAlgo.toUpperCase(); v = crypto.createSign(nm); } catch (e) { err = e; } if ( v === undefined || (err instanceof Error && err.message.match(/Unknown message digest/)) ) { nm = 'RSA-'; nm += hashAlgo.toUpperCase(); v = crypto.createSign(nm); } assert.ok(v, 'failed to create verifier'); var oldSign = v.sign.bind(v); var key = this.toBuffer('pkcs1'); var type = this.type; var curve = this.curve; v.sign = function () { var sig = oldSign(key); if (typeof sig === 'string') sig = Buffer.from(sig, 'binary'); sig = Signature.parse(sig, type, 'asn1'); sig.hashAlgorithm = hashAlgo; sig.curve = curve; return sig; }; return v; }; PrivateKey.parse = function (data, format, options) { if (typeof data !== 'string') assert.buffer(data, 'data'); if (format === undefined) format = 'auto'; assert.string(format, 'format'); if (typeof options === 'string') options = { filename: options }; assert.optionalObject(options, 'options'); if (options === undefined) options = {}; assert.optionalString(options.filename, 'options.filename'); if (options.filename === undefined) options.filename = '(unnamed)'; assert.object(formats[format], 'formats[format]'); try { var k = formats[format].read(data, options); assert.ok(k instanceof PrivateKey, 'key is not a private key'); if (!k.comment) k.comment = options.filename; return k; } catch (e) { if (e.name === 'KeyEncryptedError') throw e; throw new KeyParseError(options.filename, format, e); } }; PrivateKey.isPrivateKey = function (obj, ver) { return utils.isCompatible(obj, PrivateKey, ver); }; PrivateKey.generate = function (type, options) { if (options === undefined) options = {}; assert.object(options, 'options'); switch (type) { case 'ecdsa': if (options.curve === undefined) options.curve = 'nistp256'; assert.string(options.curve, 'options.curve'); return generateECDSA(options.curve); case 'ed25519': return generateED25519(); default: throw new Error( 'Key generation not supported with key ' + 'type "' + type + '"', ); } }; /* * API versions for PrivateKey: * [1,0] -- initial ver * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats * [1,2] -- added defaultHashAlgorithm * [1,3] -- added derive, ed, createDH * [1,4] -- first tagged version * [1,5] -- changed ed25519 part names and format */ PrivateKey.prototype._sshpkApiVersion = [1, 5]; PrivateKey._oldVersionDetect = function (obj) { assert.func(obj.toPublic); assert.func(obj.createSign); if (obj.derive) return [1, 3]; if (obj.defaultHashAlgorithm) return [1, 2]; if (obj.formats['auto']) return [1, 1]; return [1, 0]; }; /***/ }, /* 34 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); exports.wrapLifecycle = exports.run = exports.install = exports.Install = undefined; var _extends2; function _load_extends() { return (_extends2 = _interopRequireDefault(__webpack_require__(20))); } var _asyncToGenerator2; function _load_asyncToGenerator() { return (_asyncToGenerator2 = _interopRequireDefault( __webpack_require__(2), )); } let install = (exports.install = (() => { var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( config, reporter, flags, lockfile, ) { yield wrapLifecycle( config, flags, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { const install = new Install(flags, config, reporter, lockfile); yield install.init(); }, ), ); }); return function install(_x7, _x8, _x9, _x10) { return _ref29.apply(this, arguments); }; })()); let run = (exports.run = (() => { var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( config, reporter, flags, args, ) { let lockfile; let error = 'installCommandRenamed'; if (flags.lockfile === false) { lockfile = new (_lockfile || _load_lockfile()).default(); } else { lockfile = yield ( _lockfile || _load_lockfile() ).default.fromDirectory(config.lockfileFolder, reporter); } if (args.length) { const exampleArgs = args.slice(); if (flags.saveDev) { exampleArgs.push('--dev'); } if (flags.savePeer) { exampleArgs.push('--peer'); } if (flags.saveOptional) { exampleArgs.push('--optional'); } if (flags.saveExact) { exampleArgs.push('--exact'); } if (flags.saveTilde) { exampleArgs.push('--tilde'); } let command = 'add'; if (flags.global) { error = 'globalFlagRemoved'; command = 'global add'; } throw new (_errors || _load_errors()).MessageError( reporter.lang(error, `yarn ${command} ${exampleArgs.join(' ')}`), ); } yield install(config, reporter, flags, lockfile); }); return function run(_x11, _x12, _x13, _x14) { return _ref31.apply(this, arguments); }; })()); let wrapLifecycle = (exports.wrapLifecycle = (() => { var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( config, flags, factory, ) { yield config.executeLifecycleScript('preinstall'); yield factory(); // npm behaviour, seems kinda funky but yay compatibility yield config.executeLifecycleScript('install'); yield config.executeLifecycleScript('postinstall'); if (!config.production) { if (!config.disablePrepublish) { yield config.executeLifecycleScript('prepublish'); } yield config.executeLifecycleScript('prepare'); } }); return function wrapLifecycle(_x15, _x16, _x17) { return _ref32.apply(this, arguments); }; })()); exports.hasWrapper = hasWrapper; exports.setFlags = setFlags; var _objectPath; function _load_objectPath() { return (_objectPath = _interopRequireDefault(__webpack_require__(304))); } var _hooks; function _load_hooks() { return (_hooks = __webpack_require__(368)); } var _index; function _load_index() { return (_index = _interopRequireDefault(__webpack_require__(218))); } var _errors; function _load_errors() { return (_errors = __webpack_require__(6)); } var _integrityChecker; function _load_integrityChecker() { return (_integrityChecker = _interopRequireDefault( __webpack_require__(206), )); } var _lockfile; function _load_lockfile() { return (_lockfile = _interopRequireDefault(__webpack_require__(19))); } var _lockfile2; function _load_lockfile2() { return (_lockfile2 = __webpack_require__(19)); } var _packageFetcher; function _load_packageFetcher() { return (_packageFetcher = _interopRequireWildcard( __webpack_require__(208), )); } var _packageInstallScripts; function _load_packageInstallScripts() { return (_packageInstallScripts = _interopRequireDefault( __webpack_require__(525), )); } var _packageCompatibility; function _load_packageCompatibility() { return (_packageCompatibility = _interopRequireWildcard( __webpack_require__(207), )); } var _packageResolver; function _load_packageResolver() { return (_packageResolver = _interopRequireDefault( __webpack_require__(360), )); } var _packageLinker; function _load_packageLinker() { return (_packageLinker = _interopRequireDefault( __webpack_require__(209), )); } var _index2; function _load_index2() { return (_index2 = __webpack_require__(58)); } var _index3; function _load_index3() { return (_index3 = __webpack_require__(78)); } var _autoclean; function _load_autoclean() { return (_autoclean = __webpack_require__(348)); } var _constants; function _load_constants() { return (_constants = _interopRequireWildcard(__webpack_require__(8))); } var _normalizePattern; function _load_normalizePattern() { return (_normalizePattern = __webpack_require__(37)); } var _fs; function _load_fs() { return (_fs = _interopRequireWildcard(__webpack_require__(5))); } var _map; function _load_map() { return (_map = _interopRequireDefault(__webpack_require__(29))); } var _yarnVersion; function _load_yarnVersion() { return (_yarnVersion = __webpack_require__(105)); } var _generatePnpMap; function _load_generatePnpMap() { return (_generatePnpMap = __webpack_require__(547)); } var _workspaceLayout; function _load_workspaceLayout() { return (_workspaceLayout = _interopRequireDefault( __webpack_require__(90), )); } var _resolutionMap; function _load_resolutionMap() { return (_resolutionMap = _interopRequireDefault( __webpack_require__(212), )); } var _guessName; function _load_guessName() { return (_guessName = _interopRequireDefault(__webpack_require__(169))); } var _audit; function _load_audit() { return (_audit = _interopRequireDefault(__webpack_require__(347))); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const deepEqual = __webpack_require__(599); const emoji = __webpack_require__(302); const invariant = __webpack_require__(9); const path = __webpack_require__(0); const semver = __webpack_require__(22); const uuid = __webpack_require__(120); const ssri = __webpack_require__(65); const ONE_DAY = 1000 * 60 * 60 * 24; /** * Try and detect the installation method for Yarn and provide a command to update it with. */ function getUpdateCommand(installationMethod) { if (installationMethod === 'tar') { return `curl --compressed -o- -L ${ (_constants || _load_constants()).YARN_INSTALLER_SH } | bash`; } if (installationMethod === 'homebrew') { return 'brew upgrade yarn'; } if (installationMethod === 'deb') { return 'sudo apt-get update && sudo apt-get install yarn'; } if (installationMethod === 'rpm') { return 'sudo yum install yarn'; } if (installationMethod === 'npm') { return 'npm install --global yarn'; } if (installationMethod === 'chocolatey') { return 'choco upgrade yarn'; } if (installationMethod === 'apk') { return 'apk update && apk add -u yarn'; } if (installationMethod === 'portage') { return 'sudo emerge --sync && sudo emerge -au sys-apps/yarn'; } return null; } function getUpdateInstaller(installationMethod) { // Windows if (installationMethod === 'msi') { return (_constants || _load_constants()).YARN_INSTALLER_MSI; } return null; } function normalizeFlags(config, rawFlags) { const flags = { // install har: !!rawFlags.har, ignorePlatform: !!rawFlags.ignorePlatform, ignoreEngines: !!rawFlags.ignoreEngines, ignoreScripts: !!rawFlags.ignoreScripts, ignoreOptional: !!rawFlags.ignoreOptional, force: !!rawFlags.force, flat: !!rawFlags.flat, lockfile: rawFlags.lockfile !== false, pureLockfile: !!rawFlags.pureLockfile, updateChecksums: !!rawFlags.updateChecksums, skipIntegrityCheck: !!rawFlags.skipIntegrityCheck, frozenLockfile: !!rawFlags.frozenLockfile, linkDuplicates: !!rawFlags.linkDuplicates, checkFiles: !!rawFlags.checkFiles, audit: !!rawFlags.audit, // add peer: !!rawFlags.peer, dev: !!rawFlags.dev, optional: !!rawFlags.optional, exact: !!rawFlags.exact, tilde: !!rawFlags.tilde, ignoreWorkspaceRootCheck: !!rawFlags.ignoreWorkspaceRootCheck, // outdated, update-interactive includeWorkspaceDeps: !!rawFlags.includeWorkspaceDeps, // add, remove, update workspaceRootIsCwd: rawFlags.workspaceRootIsCwd !== false, }; if (config.getOption('ignore-scripts')) { flags.ignoreScripts = true; } if (config.getOption('ignore-platform')) { flags.ignorePlatform = true; } if (config.getOption('ignore-engines')) { flags.ignoreEngines = true; } if (config.getOption('ignore-optional')) { flags.ignoreOptional = true; } if (config.getOption('force')) { flags.force = true; } return flags; } class Install { constructor(flags, config, reporter, lockfile) { this.rootManifestRegistries = []; this.rootPatternsToOrigin = (0, (_map || _load_map()).default)(); this.lockfile = lockfile; this.reporter = reporter; this.config = config; this.flags = normalizeFlags(config, flags); this.resolutions = (0, (_map || _load_map()).default)(); // Legacy resolutions field used for flat install mode this.resolutionMap = new ( _resolutionMap || _load_resolutionMap() ).default(config); // Selective resolutions for nested dependencies this.resolver = new ( _packageResolver || _load_packageResolver() ).default(config, lockfile, this.resolutionMap); this.integrityChecker = new ( _integrityChecker || _load_integrityChecker() ).default(config); this.linker = new (_packageLinker || _load_packageLinker()).default( config, this.resolver, ); this.scripts = new ( _packageInstallScripts || _load_packageInstallScripts() ).default(config, this.resolver, this.flags.force); } /** * Create a list of dependency requests from the current directories manifests. */ fetchRequestFromCwd( excludePatterns = [], ignoreUnusedPatterns = false, ) { var _this = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { const patterns = []; const deps = []; let resolutionDeps = []; const manifest = {}; const ignorePatterns = []; const usedPatterns = []; let workspaceLayout; // some commands should always run in the context of the entire workspace const cwd = _this.flags.includeWorkspaceDeps || _this.flags.workspaceRootIsCwd ? _this.config.lockfileFolder : _this.config.cwd; // non-workspaces are always root, otherwise check for workspace root const cwdIsRoot = !_this.config.workspaceRootFolder || _this.config.lockfileFolder === cwd; // exclude package names that are in install args const excludeNames = []; for ( var _iterator = excludePatterns, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } const pattern = _ref; if ( (0, (_index3 || _load_index3()).getExoticResolver)(pattern) ) { excludeNames.push( (0, (_guessName || _load_guessName()).default)(pattern), ); } else { // extract the name const parts = (0, (_normalizePattern || _load_normalizePattern()) .normalizePattern)(pattern); excludeNames.push(parts.name); } } const stripExcluded = function stripExcluded(manifest) { for ( var _iterator2 = excludeNames, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator](); ; ) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } const exclude = _ref2; if (manifest.dependencies && manifest.dependencies[exclude]) { delete manifest.dependencies[exclude]; } if ( manifest.devDependencies && manifest.devDependencies[exclude] ) { delete manifest.devDependencies[exclude]; } if ( manifest.optionalDependencies && manifest.optionalDependencies[exclude] ) { delete manifest.optionalDependencies[exclude]; } } }; for ( var _iterator3 = Object.keys( (_index2 || _load_index2()).registries, ), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator](); ; ) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } const registry = _ref3; const filename = (_index2 || _load_index2()).registries[ registry ].filename; const loc = path.join(cwd, filename); if (!(yield (_fs || _load_fs()).exists(loc))) { continue; } _this.rootManifestRegistries.push(registry); const projectManifestJson = yield _this.config.readJson(loc); yield (0, (_index || _load_index()).default)( projectManifestJson, cwd, _this.config, cwdIsRoot, ); Object.assign( _this.resolutions, projectManifestJson.resolutions, ); Object.assign(manifest, projectManifestJson); _this.resolutionMap.init(_this.resolutions); for ( var _iterator4 = Object.keys( _this.resolutionMap.resolutionsByPackage, ), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator](); ; ) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } const packageName = _ref4; const optional = (_objectPath || _load_objectPath()).default.has( manifest.optionalDependencies, packageName, ) && _this.flags.ignoreOptional; for ( var _iterator8 = _this.resolutionMap.resolutionsByPackage[packageName], _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator](); ; ) { var _ref9; if (_isArray8) { if (_i8 >= _iterator8.length) break; _ref9 = _iterator8[_i8++]; } else { _i8 = _iterator8.next(); if (_i8.done) break; _ref9 = _i8.value; } const _ref8 = _ref9; const pattern = _ref8.pattern; resolutionDeps = [ ...resolutionDeps, { registry, pattern, optional, hint: 'resolution' }, ]; } } const pushDeps = function pushDeps( depType, manifest, { hint, optional }, isUsed, ) { if (ignoreUnusedPatterns && !isUsed) { return; } // We only take unused dependencies into consideration to get deterministic hoisting. // Since flat mode doesn't care about hoisting and everything is top level and specified then we can safely // leave these out. if (_this.flags.flat && !isUsed) { return; } const depMap = manifest[depType]; for (const name in depMap) { if (excludeNames.indexOf(name) >= 0) { continue; } let pattern = name; if (!_this.lockfile.getLocked(pattern)) { // when we use --save we save the dependency to the lockfile with just the name rather than the // version combo pattern += '@' + depMap[name]; } // normalization made sure packages are mentioned only once if (isUsed) { usedPatterns.push(pattern); } else { ignorePatterns.push(pattern); } _this.rootPatternsToOrigin[pattern] = depType; patterns.push(pattern); deps.push({ pattern, registry, hint, optional, workspaceName: manifest.name, workspaceLoc: manifest._loc, }); } }; if (cwdIsRoot) { pushDeps( 'dependencies', projectManifestJson, { hint: null, optional: false }, true, ); pushDeps( 'devDependencies', projectManifestJson, { hint: 'dev', optional: false }, !_this.config.production, ); pushDeps( 'optionalDependencies', projectManifestJson, { hint: 'optional', optional: true }, true, ); } if (_this.config.workspaceRootFolder) { const workspaceLoc = cwdIsRoot ? loc : path.join(_this.config.lockfileFolder, filename); const workspacesRoot = path.dirname(workspaceLoc); let workspaceManifestJson = projectManifestJson; if (!cwdIsRoot) { // the manifest we read before was a child workspace, so get the root workspaceManifestJson = yield _this.config.readJson( workspaceLoc, ); yield (0, (_index || _load_index()).default)( workspaceManifestJson, workspacesRoot, _this.config, true, ); } const workspaces = yield _this.config.resolveWorkspaces( workspacesRoot, workspaceManifestJson, ); workspaceLayout = new ( _workspaceLayout || _load_workspaceLayout() ).default(workspaces, _this.config); // add virtual manifest that depends on all workspaces, this way package hoisters and resolvers will work fine const workspaceDependencies = (0, (_extends2 || _load_extends()).default)( {}, workspaceManifestJson.dependencies, ); for ( var _iterator5 = Object.keys(workspaces), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator](); ; ) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } const workspaceName = _ref5; const workspaceManifest = workspaces[workspaceName].manifest; workspaceDependencies[workspaceName] = workspaceManifest.version; // include dependencies from all workspaces if (_this.flags.includeWorkspaceDeps) { pushDeps( 'dependencies', workspaceManifest, { hint: null, optional: false }, true, ); pushDeps( 'devDependencies', workspaceManifest, { hint: 'dev', optional: false }, !_this.config.production, ); pushDeps( 'optionalDependencies', workspaceManifest, { hint: 'optional', optional: true }, true, ); } } const virtualDependencyManifest = { _uid: '', name: `workspace-aggregator-${uuid.v4()}`, version: '1.0.0', _registry: 'npm', _loc: workspacesRoot, dependencies: workspaceDependencies, devDependencies: (0, (_extends2 || _load_extends()).default)( {}, workspaceManifestJson.devDependencies, ), optionalDependencies: (0, (_extends2 || _load_extends()).default)( {}, workspaceManifestJson.optionalDependencies, ), private: workspaceManifestJson.private, workspaces: workspaceManifestJson.workspaces, }; workspaceLayout.virtualManifestName = virtualDependencyManifest.name; const virtualDep = {}; virtualDep[virtualDependencyManifest.name] = virtualDependencyManifest.version; workspaces[virtualDependencyManifest.name] = { loc: workspacesRoot, manifest: virtualDependencyManifest, }; // ensure dependencies that should be excluded are stripped from the correct manifest stripExcluded( cwdIsRoot ? virtualDependencyManifest : workspaces[projectManifestJson.name].manifest, ); pushDeps( 'workspaces', { workspaces: virtualDep }, { hint: 'workspaces', optional: false }, true, ); const implicitWorkspaceDependencies = (0, (_extends2 || _load_extends()).default)( {}, workspaceDependencies, ); for ( var _iterator6 = (_constants || _load_constants()) .OWNED_DEPENDENCY_TYPES, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator](); ; ) { var _ref6; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref6 = _i6.value; } const type = _ref6; for ( var _iterator7 = Object.keys( projectManifestJson[type] || {}, ), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator](); ; ) { var _ref7; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref7 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref7 = _i7.value; } const dependencyName = _ref7; delete implicitWorkspaceDependencies[dependencyName]; } } pushDeps( 'dependencies', { dependencies: implicitWorkspaceDependencies }, { hint: 'workspaces', optional: false }, true, ); } break; } // inherit root flat flag if (manifest.flat) { _this.flags.flat = true; } return { requests: [...resolutionDeps, ...deps], patterns, manifest, usedPatterns, ignorePatterns, workspaceLayout, }; }, )(); } /** * TODO description */ prepareRequests(requests) { return requests; } preparePatterns(patterns) { return patterns; } preparePatternsForLinking(patterns, cwdManifest, cwdIsRoot) { return patterns; } prepareManifests() { var _this2 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { const manifests = yield _this2.config.getRootManifests(); return manifests; }, )(); } bailout(patterns, workspaceLayout) { var _this3 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { // We don't want to skip the audit - it could yield important errors if (_this3.flags.audit) { return false; } // PNP is so fast that the integrity check isn't pertinent if (_this3.config.plugnplayEnabled) { return false; } if (_this3.flags.skipIntegrityCheck || _this3.flags.force) { return false; } const lockfileCache = _this3.lockfile.cache; if (!lockfileCache) { return false; } const lockfileClean = _this3.lockfile.parseResultType === 'success'; const match = yield _this3.integrityChecker.check( patterns, lockfileCache, _this3.flags, workspaceLayout, ); if ( _this3.flags.frozenLockfile && (!lockfileClean || match.missingPatterns.length > 0) ) { throw new (_errors || _load_errors()).MessageError( _this3.reporter.lang('frozenLockfileError'), ); } const haveLockfile = yield (_fs || _load_fs()).exists( path.join( _this3.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME, ), ); const lockfileIntegrityPresent = !_this3.lockfile.hasEntriesExistWithoutIntegrity(); const integrityBailout = lockfileIntegrityPresent || !_this3.config.autoAddIntegrity; if ( match.integrityMatches && haveLockfile && lockfileClean && integrityBailout ) { _this3.reporter.success(_this3.reporter.lang('upToDate')); return true; } if (match.integrityFileMissing && haveLockfile) { // Integrity file missing, force script installations _this3.scripts.setForce(true); return false; } if (match.hardRefreshRequired) { // e.g. node version doesn't match, force script installations _this3.scripts.setForce(true); return false; } if (!patterns.length && !match.integrityFileMissing) { _this3.reporter.success( _this3.reporter.lang('nothingToInstall'), ); yield _this3.createEmptyManifestFolders(); yield _this3.saveLockfileAndIntegrity( patterns, workspaceLayout, ); return true; } return false; }, )(); } /** * Produce empty folders for all used root manifests. */ createEmptyManifestFolders() { var _this4 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { if (_this4.config.modulesFolder) { // already created return; } for ( var _iterator9 = _this4.rootManifestRegistries, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator](); ; ) { var _ref10; if (_isArray9) { if (_i9 >= _iterator9.length) break; _ref10 = _iterator9[_i9++]; } else { _i9 = _iterator9.next(); if (_i9.done) break; _ref10 = _i9.value; } const registryName = _ref10; const folder = _this4.config.registries[registryName].folder; yield (_fs || _load_fs()).mkdirp( path.join(_this4.config.lockfileFolder, folder), ); } }, )(); } /** * TODO description */ markIgnored(patterns) { for ( var _iterator10 = patterns, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator](); ; ) { var _ref11; if (_isArray10) { if (_i10 >= _iterator10.length) break; _ref11 = _iterator10[_i10++]; } else { _i10 = _iterator10.next(); if (_i10.done) break; _ref11 = _i10.value; } const pattern = _ref11; const manifest = this.resolver.getStrictResolvedPattern(pattern); const ref = manifest._reference; invariant(ref, 'expected package reference'); // just mark the package as ignored. if the package is used by a required package, the hoister // will take care of that. ref.ignore = true; } } /** * helper method that gets only recent manifests * used by global.ls command */ getFlattenedDeps() { var _this5 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { var _ref12 = yield _this5.fetchRequestFromCwd(); const depRequests = _ref12.requests, rawPatterns = _ref12.patterns; yield _this5.resolver.init(depRequests, {}); const manifests = yield ( _packageFetcher || _load_packageFetcher() ).fetch(_this5.resolver.getManifests(), _this5.config); _this5.resolver.updateManifests(manifests); return _this5.flatten(rawPatterns); }, )(); } /** * TODO description */ init() { var _this6 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { _this6.checkUpdate(); // warn if we have a shrinkwrap if ( yield (_fs || _load_fs()).exists( path.join( _this6.config.lockfileFolder, (_constants || _load_constants()).NPM_SHRINKWRAP_FILENAME, ), ) ) { _this6.reporter.warn(_this6.reporter.lang('shrinkwrapWarning')); } // warn if we have an npm lockfile if ( yield (_fs || _load_fs()).exists( path.join( _this6.config.lockfileFolder, (_constants || _load_constants()).NPM_LOCK_FILENAME, ), ) ) { _this6.reporter.warn( _this6.reporter.lang('npmLockfileWarning'), ); } if (_this6.config.plugnplayEnabled) { _this6.reporter.info( _this6.reporter.lang('plugnplaySuggestV2L1'), ); _this6.reporter.info( _this6.reporter.lang('plugnplaySuggestV2L2'), ); } let flattenedTopLevelPatterns = []; const steps = []; var _ref13 = yield _this6.fetchRequestFromCwd(); const depRequests = _ref13.requests, rawPatterns = _ref13.patterns, ignorePatterns = _ref13.ignorePatterns, workspaceLayout = _ref13.workspaceLayout, manifest = _ref13.manifest; let topLevelPatterns = []; const artifacts = yield _this6.integrityChecker.getArtifacts(); if (artifacts) { _this6.linker.setArtifacts(artifacts); _this6.scripts.setArtifacts(artifacts); } if ( ( _packageCompatibility || _load_packageCompatibility() ).shouldCheck(manifest, _this6.flags) ) { steps.push( (() => { var _ref14 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* (curr, total) { _this6.reporter.step( curr, total, _this6.reporter.lang('checkingManifest'), emoji.get('mag'), ); yield _this6.checkCompatibility(); }, ); return function (_x, _x2) { return _ref14.apply(this, arguments); }; })(), ); } const audit = new (_audit || _load_audit()).default( _this6.config, _this6.reporter, { groups: (_constants || _load_constants()) .OWNED_DEPENDENCY_TYPES, }, ); let auditFoundProblems = false; steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)( 'resolveStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { _this6.reporter.step( curr, total, _this6.reporter.lang('resolvingPackages'), emoji.get('mag'), ); yield _this6.resolver.init( _this6.prepareRequests(depRequests), { isFlat: _this6.flags.flat, isFrozen: _this6.flags.frozenLockfile, workspaceLayout, }, ); topLevelPatterns = _this6.preparePatterns(rawPatterns); flattenedTopLevelPatterns = yield _this6.flatten( topLevelPatterns, ); return { bailout: !_this6.flags.audit && (yield _this6.bailout( topLevelPatterns, workspaceLayout, )), }; }, ), ); }); if (_this6.flags.audit) { steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)( 'auditStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { _this6.reporter.step( curr, total, _this6.reporter.lang('auditRunning'), emoji.get('mag'), ); if (_this6.flags.offline) { _this6.reporter.warn( _this6.reporter.lang('auditOffline'), ); return { bailout: false }; } const preparedManifests = yield _this6.prepareManifests(); // $FlowFixMe - Flow considers `m` in the map operation to be "mixed", so does not recognize `m.object` const mergedManifest = Object.assign( {}, ...Object.values(preparedManifests).map(function (m) { return m.object; }), ); const auditVulnerabilityCounts = yield audit.performAudit( mergedManifest, _this6.lockfile, _this6.resolver, _this6.linker, topLevelPatterns, ); auditFoundProblems = auditVulnerabilityCounts.info || auditVulnerabilityCounts.low || auditVulnerabilityCounts.moderate || auditVulnerabilityCounts.high || auditVulnerabilityCounts.critical; return { bailout: yield _this6.bailout( topLevelPatterns, workspaceLayout, ), }; }, ), ); }); } steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)( 'fetchStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { _this6.markIgnored(ignorePatterns); _this6.reporter.step( curr, total, _this6.reporter.lang('fetchingPackages'), emoji.get('truck'), ); const manifests = yield ( _packageFetcher || _load_packageFetcher() ).fetch(_this6.resolver.getManifests(), _this6.config); _this6.resolver.updateManifests(manifests); yield ( _packageCompatibility || _load_packageCompatibility() ).check( _this6.resolver.getManifests(), _this6.config, _this6.flags.ignoreEngines, ); }, ), ); }); steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)( 'linkStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { // remove integrity hash to make this operation atomic yield _this6.integrityChecker.removeIntegrityFile(); _this6.reporter.step( curr, total, _this6.reporter.lang('linkingDependencies'), emoji.get('link'), ); flattenedTopLevelPatterns = _this6.preparePatternsForLinking( flattenedTopLevelPatterns, manifest, _this6.config.lockfileFolder === _this6.config.cwd, ); yield _this6.linker.init( flattenedTopLevelPatterns, workspaceLayout, { linkDuplicates: _this6.flags.linkDuplicates, ignoreOptional: _this6.flags.ignoreOptional, }, ); }, ), ); }); if (_this6.config.plugnplayEnabled) { steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)( 'pnpStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { const pnpPath = `${_this6.config.lockfileFolder}/${ (_constants || _load_constants()).PNP_FILENAME }`; const code = yield (0, (_generatePnpMap || _load_generatePnpMap()) .generatePnpMap)( _this6.config, flattenedTopLevelPatterns, { resolver: _this6.resolver, reporter: _this6.reporter, targetPath: pnpPath, workspaceLayout, }, ); try { const file = yield (_fs || _load_fs()).readFile( pnpPath, ); if (file === code) { return; } } catch (error) {} yield (_fs || _load_fs()).writeFile(pnpPath, code); yield (_fs || _load_fs()).chmod(pnpPath, 0o755); }, ), ); }); } steps.push(function (curr, total) { return (0, (_hooks || _load_hooks()).callThroughHook)( 'buildStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { _this6.reporter.step( curr, total, _this6.flags.force ? _this6.reporter.lang('rebuildingPackages') : _this6.reporter.lang('buildingFreshPackages'), emoji.get('hammer'), ); if (_this6.config.ignoreScripts) { _this6.reporter.warn( _this6.reporter.lang('ignoredScripts'), ); } else { yield _this6.scripts.init(flattenedTopLevelPatterns); } }, ), ); }); if (_this6.flags.har) { steps.push( (() => { var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* (curr, total) { const formattedDate = new Date() .toISOString() .replace(/:/g, '-'); const filename = `yarn-install_${formattedDate}.har`; _this6.reporter.step( curr, total, _this6.reporter.lang('savingHar', filename), emoji.get('black_circle_for_record'), ); yield _this6.config.requestManager.saveHar(filename); }, ); return function (_x3, _x4) { return _ref21.apply(this, arguments); }; })(), ); } if (yield _this6.shouldClean()) { steps.push( (() => { var _ref22 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* (curr, total) { _this6.reporter.step( curr, total, _this6.reporter.lang('cleaningModules'), emoji.get('recycle'), ); yield (0, (_autoclean || _load_autoclean()).clean)( _this6.config, _this6.reporter, ); }, ); return function (_x5, _x6) { return _ref22.apply(this, arguments); }; })(), ); } let currentStep = 0; for ( var _iterator11 = steps, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator](); ; ) { var _ref23; if (_isArray11) { if (_i11 >= _iterator11.length) break; _ref23 = _iterator11[_i11++]; } else { _i11 = _iterator11.next(); if (_i11.done) break; _ref23 = _i11.value; } const step = _ref23; const stepResult = yield step(++currentStep, steps.length); if (stepResult && stepResult.bailout) { if (_this6.flags.audit) { audit.summary(); } if (auditFoundProblems) { _this6.reporter.warn( _this6.reporter.lang('auditRunAuditForDetails'), ); } _this6.maybeOutputUpdate(); return flattenedTopLevelPatterns; } } // fin! if (_this6.flags.audit) { audit.summary(); } if (auditFoundProblems) { _this6.reporter.warn( _this6.reporter.lang('auditRunAuditForDetails'), ); } yield _this6.saveLockfileAndIntegrity( topLevelPatterns, workspaceLayout, ); yield _this6.persistChanges(); _this6.maybeOutputUpdate(); _this6.config.requestManager.clearCache(); return flattenedTopLevelPatterns; }, )(); } checkCompatibility() { var _this7 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { var _ref24 = yield _this7.fetchRequestFromCwd(); const manifest = _ref24.manifest; yield ( _packageCompatibility || _load_packageCompatibility() ).checkOne(manifest, _this7.config, _this7.flags.ignoreEngines); }, )(); } persistChanges() { var _this8 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { // get all the different registry manifests in this folder const manifests = yield _this8.config.getRootManifests(); if (yield _this8.applyChanges(manifests)) { yield _this8.config.saveRootManifests(manifests); } }, )(); } applyChanges(manifests) { let hasChanged = false; if (this.config.plugnplayPersist) { const object = manifests.npm.object; if (typeof object.installConfig !== 'object') { object.installConfig = {}; } if ( this.config.plugnplayEnabled && object.installConfig.pnp !== true ) { object.installConfig.pnp = true; hasChanged = true; } else if ( !this.config.plugnplayEnabled && typeof object.installConfig.pnp !== 'undefined' ) { delete object.installConfig.pnp; hasChanged = true; } if (Object.keys(object.installConfig).length === 0) { delete object.installConfig; } } return Promise.resolve(hasChanged); } /** * Check if we should run the cleaning step. */ shouldClean() { return (_fs || _load_fs()).exists( path.join( this.config.lockfileFolder, (_constants || _load_constants()).CLEAN_FILENAME, ), ); } /** * TODO */ flatten(patterns) { var _this9 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { if (!_this9.flags.flat) { return patterns; } const flattenedPatterns = []; for ( var _iterator12 = _this9.resolver.getAllDependencyNamesByLevelOrder(patterns), _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator](); ; ) { var _ref25; if (_isArray12) { if (_i12 >= _iterator12.length) break; _ref25 = _iterator12[_i12++]; } else { _i12 = _iterator12.next(); if (_i12.done) break; _ref25 = _i12.value; } const name = _ref25; const infos = _this9.resolver .getAllInfoForPackageName(name) .filter(function (manifest) { const ref = manifest._reference; invariant(ref, 'expected package reference'); return !ref.ignore; }); if (infos.length === 0) { continue; } if (infos.length === 1) { // single version of this package // take out a single pattern as multiple patterns may have resolved to this package flattenedPatterns.push( _this9.resolver.patternsByPackage[name][0], ); continue; } const options = infos.map(function (info) { const ref = info._reference; invariant(ref, 'expected reference'); return { // TODO `and is required by {PARENT}`, name: _this9.reporter.lang( 'manualVersionResolutionOption', ref.patterns.join(', '), info.version, ), value: info.version, }; }); const versions = infos.map(function (info) { return info.version; }); let version; const resolutionVersion = _this9.resolutions[name]; if ( resolutionVersion && versions.indexOf(resolutionVersion) >= 0 ) { // use json `resolution` version version = resolutionVersion; } else { version = yield _this9.reporter.select( _this9.reporter.lang('manualVersionResolution', name), _this9.reporter.lang('answer'), options, ); _this9.resolutions[name] = version; } flattenedPatterns.push( _this9.resolver.collapseAllVersionsOfPackage(name, version), ); } // save resolutions to their appropriate root manifest if (Object.keys(_this9.resolutions).length) { const manifests = yield _this9.config.getRootManifests(); for (const name in _this9.resolutions) { const version = _this9.resolutions[name]; const patterns = _this9.resolver.patternsByPackage[name]; if (!patterns) { continue; } let manifest; for ( var _iterator13 = patterns, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator](); ; ) { var _ref26; if (_isArray13) { if (_i13 >= _iterator13.length) break; _ref26 = _iterator13[_i13++]; } else { _i13 = _iterator13.next(); if (_i13.done) break; _ref26 = _i13.value; } const pattern = _ref26; manifest = _this9.resolver.getResolvedPattern(pattern); if (manifest) { break; } } invariant(manifest, 'expected manifest'); const ref = manifest._reference; invariant(ref, 'expected reference'); const object = manifests[ref.registry].object; object.resolutions = object.resolutions || {}; object.resolutions[name] = version; } yield _this9.config.saveRootManifests(manifests); } return flattenedPatterns; }, )(); } /** * Remove offline tarballs that are no longer required */ pruneOfflineMirror(lockfile) { var _this10 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { const mirror = _this10.config.getOfflineMirrorPath(); if (!mirror) { return; } const requiredTarballs = new Set(); for (const dependency in lockfile) { const resolved = lockfile[dependency].resolved; if (resolved) { const basename = path.basename(resolved.split('#')[0]); if (dependency[0] === '@' && basename[0] !== '@') { requiredTarballs.add( `${dependency.split('/')[0]}-${basename}`, ); } requiredTarballs.add(basename); } } const mirrorFiles = yield (_fs || _load_fs()).walk(mirror); for ( var _iterator14 = mirrorFiles, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator](); ; ) { var _ref27; if (_isArray14) { if (_i14 >= _iterator14.length) break; _ref27 = _iterator14[_i14++]; } else { _i14 = _iterator14.next(); if (_i14.done) break; _ref27 = _i14.value; } const file = _ref27; const isTarball = path.extname(file.basename) === '.tgz'; // if using experimental-pack-script-packages-in-mirror flag, don't unlink prebuilt packages const hasPrebuiltPackage = file.relative.startsWith('prebuilt/'); if ( isTarball && !hasPrebuiltPackage && !requiredTarballs.has(file.basename) ) { yield (_fs || _load_fs()).unlink(file.absolute); } } }, )(); } /** * Save updated integrity and lockfiles. */ saveLockfileAndIntegrity(patterns, workspaceLayout) { var _this11 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { const resolvedPatterns = {}; Object.keys(_this11.resolver.patterns).forEach(function ( pattern, ) { if ( !workspaceLayout || !workspaceLayout.getManifestByPattern(pattern) ) { resolvedPatterns[pattern] = _this11.resolver.patterns[pattern]; } }); // TODO this code is duplicated in a few places, need a common way to filter out workspace patterns from lockfile patterns = patterns.filter(function (p) { return ( !workspaceLayout || !workspaceLayout.getManifestByPattern(p) ); }); const lockfileBasedOnResolver = _this11.lockfile.getLockfile(resolvedPatterns); if (_this11.config.pruneOfflineMirror) { yield _this11.pruneOfflineMirror(lockfileBasedOnResolver); } // write integrity hash if (!_this11.config.plugnplayEnabled) { yield _this11.integrityChecker.save( patterns, lockfileBasedOnResolver, _this11.flags, workspaceLayout, _this11.scripts.getArtifacts(), ); } // --no-lockfile or --pure-lockfile or --frozen-lockfile if ( _this11.flags.lockfile === false || _this11.flags.pureLockfile || _this11.flags.frozenLockfile ) { return; } const lockFileHasAllPatterns = patterns.every(function (p) { return _this11.lockfile.getLocked(p); }); const lockfilePatternsMatch = Object.keys( _this11.lockfile.cache || {}, ).every(function (p) { return lockfileBasedOnResolver[p]; }); const resolverPatternsAreSameAsInLockfile = Object.keys( lockfileBasedOnResolver, ).every(function (pattern) { const manifest = _this11.lockfile.getLocked(pattern); return ( manifest && manifest.resolved === lockfileBasedOnResolver[pattern].resolved && deepEqual( manifest.prebuiltVariants, lockfileBasedOnResolver[pattern].prebuiltVariants, ) ); }); const integrityPatternsAreSameAsInLockfile = Object.keys( lockfileBasedOnResolver, ).every(function (pattern) { const existingIntegrityInfo = lockfileBasedOnResolver[pattern].integrity; if (!existingIntegrityInfo) { // if this entry does not have an integrity, no need to re-write the lockfile because of it return true; } const manifest = _this11.lockfile.getLocked(pattern); if (manifest && manifest.integrity) { const manifestIntegrity = ssri.stringify(manifest.integrity); return manifestIntegrity === existingIntegrityInfo; } return false; }); // remove command is followed by install with force, lockfile will be rewritten in any case then if ( !_this11.flags.force && _this11.lockfile.parseResultType === 'success' && lockFileHasAllPatterns && lockfilePatternsMatch && resolverPatternsAreSameAsInLockfile && integrityPatternsAreSameAsInLockfile && patterns.length ) { return; } // build lockfile location const loc = path.join( _this11.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME, ); // write lockfile const lockSource = (0, (_lockfile2 || _load_lockfile2()).stringify)( lockfileBasedOnResolver, false, _this11.config.enableLockfileVersions, ); yield (_fs || _load_fs()).writeFilePreservingEol(loc, lockSource); _this11._logSuccessSaveLockfile(); }, )(); } _logSuccessSaveLockfile() { this.reporter.success(this.reporter.lang('savedLockfile')); } /** * Load the dependency graph of the current install. Only does package resolving and wont write to the cwd. */ hydrate(ignoreUnusedPatterns) { var _this12 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { const request = yield _this12.fetchRequestFromCwd( [], ignoreUnusedPatterns, ); const depRequests = request.requests, rawPatterns = request.patterns, ignorePatterns = request.ignorePatterns, workspaceLayout = request.workspaceLayout; yield _this12.resolver.init(depRequests, { isFlat: _this12.flags.flat, isFrozen: _this12.flags.frozenLockfile, workspaceLayout, }); yield _this12.flatten(rawPatterns); _this12.markIgnored(ignorePatterns); // fetch packages, should hit cache most of the time const manifests = yield ( _packageFetcher || _load_packageFetcher() ).fetch(_this12.resolver.getManifests(), _this12.config); _this12.resolver.updateManifests(manifests); yield ( _packageCompatibility || _load_packageCompatibility() ).check( _this12.resolver.getManifests(), _this12.config, _this12.flags.ignoreEngines, ); // expand minimal manifests for ( var _iterator15 = _this12.resolver.getManifests(), _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator](); ; ) { var _ref28; if (_isArray15) { if (_i15 >= _iterator15.length) break; _ref28 = _iterator15[_i15++]; } else { _i15 = _iterator15.next(); if (_i15.done) break; _ref28 = _i15.value; } const manifest = _ref28; const ref = manifest._reference; invariant(ref, 'expected reference'); const type = ref.remote.type; // link specifier won't ever hit cache let loc = ''; if (type === 'link') { continue; } else if (type === 'workspace') { if (!ref.remote.reference) { continue; } loc = ref.remote.reference; } else { loc = _this12.config.generateModuleCachePath(ref); } const newPkg = yield _this12.config.readManifest(loc); yield _this12.resolver.updateManifest(ref, newPkg); } return request; }, )(); } /** * Check for updates every day and output a nag message if there's a newer version. */ checkUpdate() { if (this.config.nonInteractive) { // don't show upgrade dialog on CI or non-TTY terminals return; } // don't check if disabled if (this.config.getOption('disable-self-update-check')) { return; } // only check for updates once a day const lastUpdateCheck = Number(this.config.getOption('lastUpdateCheck')) || 0; if (lastUpdateCheck && Date.now() - lastUpdateCheck < ONE_DAY) { return; } // don't bug for updates on tagged releases if ((_yarnVersion || _load_yarnVersion()).version.indexOf('-') >= 0) { return; } this._checkUpdate().catch(() => { // swallow errors }); } _checkUpdate() { var _this13 = this; return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( function* () { let latestVersion = yield _this13.config.requestManager.request({ url: (_constants || _load_constants()).SELF_UPDATE_VERSION_URL, }); invariant(typeof latestVersion === 'string', 'expected string'); latestVersion = latestVersion.trim(); if (!semver.valid(latestVersion)) { return; } // ensure we only check for updates periodically _this13.config.registries.yarn.saveHomeConfig({ lastUpdateCheck: Date.now(), }); if ( semver.gt( latestVersion, (_yarnVersion || _load_yarnVersion()).version, ) ) { const installationMethod = yield (0, (_yarnVersion || _load_yarnVersion()).getInstallationMethod)(); _this13.maybeOutputUpdate = function () { _this13.reporter.warn( _this13.reporter.lang( 'yarnOutdated', latestVersion, (_yarnVersion || _load_yarnVersion()).version, ), ); const command = getUpdateCommand(installationMethod); if (command) { _this13.reporter.info( _this13.reporter.lang('yarnOutdatedCommand'), ); _this13.reporter.command(command); } else { const installer = getUpdateInstaller(installationMethod); if (installer) { _this13.reporter.info( _this13.reporter.lang( 'yarnOutdatedInstaller', installer, ), ); } } }; } }, )(); } /** * Method to override with a possible upgrade message. */ maybeOutputUpdate() {} } exports.Install = Install; function hasWrapper(commander, args) { return true; } function setFlags(commander) { commander.description( 'Yarn install is used to install all dependencies for a project.', ); commander.usage('install [flags]'); commander.option( '-A, --audit', 'Run vulnerability audit on installed packages', ); commander.option('-g, --global', 'DEPRECATED'); commander.option( '-S, --save', 'DEPRECATED - save package to your `dependencies`', ); commander.option( '-D, --save-dev', 'DEPRECATED - save package to your `devDependencies`', ); commander.option( '-P, --save-peer', 'DEPRECATED - save package to your `peerDependencies`', ); commander.option( '-O, --save-optional', 'DEPRECATED - save package to your `optionalDependencies`', ); commander.option('-E, --save-exact', 'DEPRECATED'); commander.option('-T, --save-tilde', 'DEPRECATED'); } /***/ }, /* 35 */ /***/ function (module, exports, __webpack_require__) { var isObject = __webpack_require__(53); module.exports = function (it) { if (!isObject(it)) throw TypeError(it + ' is not an object!'); return it; }; /***/ }, /* 36 */ /***/ function (module, __webpack_exports__, __webpack_require__) { 'use strict'; /* harmony export (binding) */ __webpack_require__.d( __webpack_exports__, 'b', function () { return SubjectSubscriber; }, ); /* harmony export (binding) */ __webpack_require__.d( __webpack_exports__, 'a', function () { return Subject; }, ); /* unused harmony export AnonymousSubject */ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscriber__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__ = __webpack_require__(190); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__ = __webpack_require__(422); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__ = __webpack_require__(321); /** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ var SubjectSubscriber = /*@__PURE__*/ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( SubjectSubscriber, _super, ); function SubjectSubscriber(destination) { var _this = _super.call(this, destination) || this; _this.destination = destination; return _this; } return SubjectSubscriber; })(__WEBPACK_IMPORTED_MODULE_2__Subscriber__['a' /* Subscriber */]); var Subject = /*@__PURE__*/ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( Subject, _super, ); function Subject() { var _this = _super.call(this) || this; _this.observers = []; _this.closed = false; _this.isStopped = false; _this.hasError = false; _this.thrownError = null; return _this; } Subject.prototype[ __WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__[ 'a' /* rxSubscriber */ ] ] = function () { return new SubjectSubscriber(this); }; Subject.prototype.lift = function (operator) { var subject = new AnonymousSubject(this, this); subject.operator = operator; return subject; }; Subject.prototype.next = function (value) { if (this.closed) { throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ 'a' /* ObjectUnsubscribedError */ ](); } if (!this.isStopped) { var observers = this.observers; var len = observers.length; var copy = observers.slice(); for (var i = 0; i < len; i++) { copy[i].next(value); } } }; Subject.prototype.error = function (err) { if (this.closed) { throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ 'a' /* ObjectUnsubscribedError */ ](); } this.hasError = true; this.thrownError = err; this.isStopped = true; var observers = this.observers; var len = observers.length; var copy = observers.slice(); for (var i = 0; i < len; i++) { copy[i].error(err); } this.observers.length = 0; }; Subject.prototype.complete = function () { if (this.closed) { throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ 'a' /* ObjectUnsubscribedError */ ](); } this.isStopped = true; var observers = this.observers; var len = observers.length; var copy = observers.slice(); for (var i = 0; i < len; i++) { copy[i].complete(); } this.observers.length = 0; }; Subject.prototype.unsubscribe = function () { this.isStopped = true; this.closed = true; this.observers = null; }; Subject.prototype._trySubscribe = function (subscriber) { if (this.closed) { throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ 'a' /* ObjectUnsubscribedError */ ](); } else { return _super.prototype._trySubscribe.call(this, subscriber); } }; Subject.prototype._subscribe = function (subscriber) { if (this.closed) { throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ 'a' /* ObjectUnsubscribedError */ ](); } else if (this.hasError) { subscriber.error(this.thrownError); return __WEBPACK_IMPORTED_MODULE_3__Subscription__[ 'a' /* Subscription */ ].EMPTY; } else if (this.isStopped) { subscriber.complete(); return __WEBPACK_IMPORTED_MODULE_3__Subscription__[ 'a' /* Subscription */ ].EMPTY; } else { this.observers.push(subscriber); return new __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__[ 'a' /* SubjectSubscription */ ](this, subscriber); } }; Subject.prototype.asObservable = function () { var observable = new __WEBPACK_IMPORTED_MODULE_1__Observable__[ 'a' /* Observable */ ](); observable.source = this; return observable; }; Subject.create = function (destination, source) { return new AnonymousSubject(destination, source); }; return Subject; })(__WEBPACK_IMPORTED_MODULE_1__Observable__['a' /* Observable */]); var AnonymousSubject = /*@__PURE__*/ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( AnonymousSubject, _super, ); function AnonymousSubject(destination, source) { var _this = _super.call(this) || this; _this.destination = destination; _this.source = source; return _this; } AnonymousSubject.prototype.next = function (value) { var destination = this.destination; if (destination && destination.next) { destination.next(value); } }; AnonymousSubject.prototype.error = function (err) { var destination = this.destination; if (destination && destination.error) { this.destination.error(err); } }; AnonymousSubject.prototype.complete = function () { var destination = this.destination; if (destination && destination.complete) { this.destination.complete(); } }; AnonymousSubject.prototype._subscribe = function (subscriber) { var source = this.source; if (source) { return this.source.subscribe(subscriber); } else { return __WEBPACK_IMPORTED_MODULE_3__Subscription__[ 'a' /* Subscription */ ].EMPTY; } }; return AnonymousSubject; })(Subject); //# sourceMappingURL=Subject.js.map /***/ }, /* 37 */ /***/ function (module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); exports.normalizePattern = normalizePattern; /** * Explode and normalize a pattern into its name and range. */ function normalizePattern(pattern) { let hasVersion = false; let range = 'latest'; let name = pattern; // if we're a scope then remove the @ and add it back later let isScoped = false; if (name[0] === '@') { isScoped = true; name = name.slice(1); } // take first part as the name const parts = name.split('@'); if (parts.length > 1) { name = parts.shift(); range = parts.join('@'); if (range) { hasVersion = true; } else { range = '*'; } } // add back @ scope suffix if (isScoped) { name = `@${name}`; } return { name, range, hasVersion }; } /***/ }, /* 38 */ /***/ function (module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */ (function (module) { var __WEBPACK_AMD_DEFINE_RESULT__; /** * @license * Lodash * Copyright JS Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ (function () { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; /** Used as the semantic version number. */ var VERSION = '4.17.10'; /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** Error message constants. */ var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', FUNC_ERROR_TEXT = 'Expected a function'; /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** Used as the maximum memoize cache size. */ var MAX_MEMOIZE_SIZE = 500; /** Used as the internal argument placeholder. */ var PLACEHOLDER = '__lodash_placeholder__'; /** Used to compose bitmasks for cloning. */ var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** Used to compose bitmasks for function metadata. */ var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512; /** Used as default options for `_.truncate`. */ var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = '...'; /** Used to detect hot functions by number of calls within a span of milliseconds. */ var HOT_COUNT = 800, HOT_SPAN = 16; /** Used to indicate the type of lazy iteratees. */ var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3; /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 1.7976931348623157e308, NAN = 0 / 0; /** Used as references for the maximum length and index of an array. */ var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; /** Used to associate wrap methods with their bit flags. */ var wrapFlags = [ ['ary', WRAP_ARY_FLAG], ['bind', WRAP_BIND_FLAG], ['bindKey', WRAP_BIND_KEY_FLAG], ['curry', WRAP_CURRY_FLAG], ['curryRight', WRAP_CURRY_RIGHT_FLAG], ['flip', WRAP_FLIP_FLAG], ['partial', WRAP_PARTIAL_FLAG], ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], ['rearg', WRAP_REARG_FLAG], ]; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', asyncTag = '[object AsyncFunction]', boolTag = '[object Boolean]', dateTag = '[object Date]', domExcTag = '[object DOMException]', errorTag = '[object Error]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', mapTag = '[object Map]', numberTag = '[object Number]', nullTag = '[object Null]', objectTag = '[object Object]', promiseTag = '[object Promise]', proxyTag = '[object Proxy]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]', undefinedTag = '[object Undefined]', weakMapTag = '[object WeakMap]', weakSetTag = '[object WeakSet]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]'; /** Used to match empty string literals in compiled template source. */ var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; /** Used to match HTML entities and HTML characters. */ var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml = /[&<>"']/g, reHasEscapedHtml = RegExp(reEscapedHtml.source), reHasUnescapedHtml = RegExp(reUnescapedHtml.source); /** Used to match template delimiters. */ var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g; /** Used to match property names within property paths. */ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source); /** Used to match leading and trailing whitespace. */ var reTrim = /^\s+|\s+$/g, reTrimStart = /^\s+/, reTrimEnd = /\s+$/; /** Used to match wrap detail comments. */ var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /; /** Used to match words composed of alphanumeric characters. */ var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; /** Used to match backslashes in property paths. */ var reEscapeChar = /\\(\\)?/g; /** * Used to match * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). */ var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; /** Used to match `RegExp` flags from their coerced string values. */ var reFlags = /\w*$/; /** Used to detect bad signed hexadecimal string values. */ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; /** Used to detect binary string values. */ var reIsBinary = /^0b[01]+$/i; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used to detect octal string values. */ var reIsOctal = /^0o[0-7]+$/i; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** Used to match Latin Unicode letters (excluding mathematical operators). */ var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; /** Used to ensure capturing order of template delimiters. */ var reNoMatch = /($^)/; /** Used to match unescaped characters in compiled string literals. */ var reUnescapedString = /['\n\r\u2028\u2029\\]/g; /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', rsComboMarksRange = '\\u0300-\\u036f', reComboHalfMarksRange = '\\ufe20-\\ufe2f', rsComboSymbolsRange = '\\u20d0-\\u20ff', rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = '\\u2700-\\u27bf', rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', rsPunctuationRange = '\\u2000-\\u206f', rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', rsVarRange = '\\ufe0e\\ufe0f', rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; /** Used to compose unicode capture groups. */ var rsApos = "['\u2019]", rsAstral = '[' + rsAstralRange + ']', rsBreak = '[' + rsBreakRange + ']', rsCombo = '[' + rsComboRange + ']', rsDigits = '\\d+', rsDingbat = '[' + rsDingbatRange + ']', rsLower = '[' + rsLowerRange + ']', rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', rsFitz = '\\ud83c[\\udffb-\\udfff]', rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', rsNonAstral = '[^' + rsAstralRange + ']', rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', rsUpper = '[' + rsUpperRange + ']', rsZWJ = '\\u200d'; /** Used to compose unicode regexes. */ var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', reOptMod = rsModifier + '?', rsOptVar = '[' + rsVarRange + ']?', rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, rsSymbol = '(?:' + [ rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral, ].join('|') + ')'; /** Used to match apostrophes. */ var reApos = RegExp(rsApos, 'g'); /** * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). */ var reComboMark = RegExp(rsCombo, 'g'); /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ var reUnicode = RegExp( rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g', ); /** Used to match complex or compound words. */ var reUnicodeWord = RegExp( [ rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, rsUpper + '+' + rsOptContrUpper, rsOrdUpper, rsOrdLower, rsDigits, rsEmoji, ].join('|'), 'g', ); /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ var reHasUnicode = RegExp( '[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']', ); /** Used to detect strings that need a more robust regexp to match words. */ var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; /** Used to assign default `context` object properties. */ var contextProps = [ 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout', ]; /** Used to make template sourceURLs easier to identify. */ var templateCounter = -1; /** Used to identify `toStringTag` values of typed arrays. */ var typedArrayTags = {}; typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; /** Used to identify `toStringTag` values supported by `_.clone`. */ var cloneableTags = {}; cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; /** Used to map Latin Unicode letters to basic Latin letters. */ var deburredLetters = { // Latin-1 Supplement block. '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', '\xc7': 'C', '\xe7': 'c', '\xd0': 'D', '\xf0': 'd', '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', '\xd1': 'N', '\xf1': 'n', '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', '\xc6': 'Ae', '\xe6': 'ae', '\xde': 'Th', '\xfe': 'th', '\xdf': 'ss', // Latin Extended-A block. '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', '\u0134': 'J', '\u0135': 'j', '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', '\u0163': 't', '\u0165': 't', '\u0167': 't', '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', '\u0174': 'W', '\u0175': 'w', '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', '\u0132': 'IJ', '\u0133': 'ij', '\u0152': 'Oe', '\u0153': 'oe', '\u0149': "'n", '\u017f': 's', }; /** Used to map characters to HTML entities. */ var htmlEscapes = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', }; /** Used to map HTML entities to characters. */ var htmlUnescapes = { '&': '&', '<': '<', '>': '>', '"': '"', ''': "'", }; /** Used to escape characters for inclusion in compiled string literals. */ var stringEscapes = { '\\': '\\', "'": "'", '\n': 'n', '\r': 'r', '\u2028': 'u2028', '\u2029': 'u2029', }; /** Built-in method references without a dependency on `root`. */ var freeParseFloat = parseFloat, freeParseInt = parseInt; /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function('return this')(); /** Detect free variable `exports`. */ var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Detect free variable `process` from Node.js. */ var freeProcess = moduleExports && freeGlobal.process; /** Used to access faster Node.js helpers. */ var nodeUtil = (function () { try { // Use `util.types` for Node.js 10+. var types = freeModule && freeModule.require && freeModule.require('util').types; if (types) { return types; } // Legacy `process.binding('util')` for Node.js < 10. return ( freeProcess && freeProcess.binding && freeProcess.binding('util') ); } catch (e) {} })(); /* Node.js helper references. */ var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /*--------------------------------------------------------------------------*/ /** * A faster alternative to `Function#apply`, this function invokes `func` * with the `this` binding of `thisArg` and the arguments of `args`. * * @private * @param {Function} func The function to invoke. * @param {*} thisArg The `this` binding of `func`. * @param {Array} args The arguments to invoke `func` with. * @returns {*} Returns the result of `func`. */ function apply(func, thisArg, args) { switch (args.length) { case 0: return func.call(thisArg); case 1: return func.call(thisArg, args[0]); case 2: return func.call(thisArg, args[0], args[1]); case 3: return func.call(thisArg, args[0], args[1], args[2]); } return func.apply(thisArg, args); } /** * A specialized version of `baseAggregator` for arrays. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} setter The function to set `accumulator` values. * @param {Function} iteratee The iteratee to transform keys. * @param {Object} accumulator The initial aggregated object. * @returns {Function} Returns `accumulator`. */ function arrayAggregator(array, setter, iteratee, accumulator) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { var value = array[index]; setter(accumulator, value, iteratee(value), array); } return accumulator; } /** * A specialized version of `_.forEach` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns `array`. */ function arrayEach(array, iteratee) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (iteratee(array[index], index, array) === false) { break; } } return array; } /** * A specialized version of `_.forEachRight` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns `array`. */ function arrayEachRight(array, iteratee) { var length = array == null ? 0 : array.length; while (length--) { if (iteratee(array[length], length, array) === false) { break; } } return array; } /** * A specialized version of `_.every` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if all elements pass the predicate check, * else `false`. */ function arrayEvery(array, predicate) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (!predicate(array[index], index, array)) { return false; } } return true; } /** * A specialized version of `_.filter` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result[resIndex++] = value; } } return result; } /** * A specialized version of `_.includes` for arrays without support for * specifying an index to search from. * * @private * @param {Array} [array] The array to inspect. * @param {*} target The value to search for. * @returns {boolean} Returns `true` if `target` is found, else `false`. */ function arrayIncludes(array, value) { var length = array == null ? 0 : array.length; return !!length && baseIndexOf(array, value, 0) > -1; } /** * This function is like `arrayIncludes` except that it accepts a comparator. * * @private * @param {Array} [array] The array to inspect. * @param {*} target The value to search for. * @param {Function} comparator The comparator invoked per element. * @returns {boolean} Returns `true` if `target` is found, else `false`. */ function arrayIncludesWith(array, value, comparator) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (comparator(value, array[index])) { return true; } } return false; } /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } /** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */ function arrayPush(array, values) { var index = -1, length = values.length, offset = array.length; while (++index < length) { array[offset + index] = values[index]; } return array; } /** * A specialized version of `_.reduce` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {*} [accumulator] The initial value. * @param {boolean} [initAccum] Specify using the first element of `array` as * the initial value. * @returns {*} Returns the accumulated value. */ function arrayReduce(array, iteratee, accumulator, initAccum) { var index = -1, length = array == null ? 0 : array.length; if (initAccum && length) { accumulator = array[++index]; } while (++index < length) { accumulator = iteratee(accumulator, array[index], index, array); } return accumulator; } /** * A specialized version of `_.reduceRight` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {*} [accumulator] The initial value. * @param {boolean} [initAccum] Specify using the last element of `array` as * the initial value. * @returns {*} Returns the accumulated value. */ function arrayReduceRight(array, iteratee, accumulator, initAccum) { var length = array == null ? 0 : array.length; if (initAccum && length) { accumulator = array[--length]; } while (length--) { accumulator = iteratee(accumulator, array[length], length, array); } return accumulator; } /** * A specialized version of `_.some` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if any element passes the predicate check, * else `false`. */ function arraySome(array, predicate) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (predicate(array[index], index, array)) { return true; } } return false; } /** * Gets the size of an ASCII `string`. * * @private * @param {string} string The string inspect. * @returns {number} Returns the string size. */ var asciiSize = baseProperty('length'); /** * Converts an ASCII `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function asciiToArray(string) { return string.split(''); } /** * Splits an ASCII `string` into an array of its words. * * @private * @param {string} The string to inspect. * @returns {Array} Returns the words of `string`. */ function asciiWords(string) { return string.match(reAsciiWord) || []; } /** * The base implementation of methods like `_.findKey` and `_.findLastKey`, * without support for iteratee shorthands, which iterates over `collection` * using `eachFunc`. * * @private * @param {Array|Object} collection The collection to inspect. * @param {Function} predicate The function invoked per iteration. * @param {Function} eachFunc The function to iterate over `collection`. * @returns {*} Returns the found element or its key, else `undefined`. */ function baseFindKey(collection, predicate, eachFunc) { var result; eachFunc(collection, function (value, key, collection) { if (predicate(value, key, collection)) { result = key; return false; } }); return result; } /** * The base implementation of `_.findIndex` and `_.findLastIndex` without * support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} predicate The function invoked per iteration. * @param {number} fromIndex The index to search from. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseFindIndex(array, predicate, fromIndex, fromRight) { var length = array.length, index = fromIndex + (fromRight ? 1 : -1); while (fromRight ? index-- : ++index < length) { if (predicate(array[index], index, array)) { return index; } } return -1; } /** * The base implementation of `_.indexOf` without `fromIndex` bounds checks. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseIndexOf(array, value, fromIndex) { return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); } /** * This function is like `baseIndexOf` except that it accepts a comparator. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @param {Function} comparator The comparator invoked per element. * @returns {number} Returns the index of the matched value, else `-1`. */ function baseIndexOfWith(array, value, fromIndex, comparator) { var index = fromIndex - 1, length = array.length; while (++index < length) { if (comparator(array[index], value)) { return index; } } return -1; } /** * The base implementation of `_.isNaN` without support for number objects. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. */ function baseIsNaN(value) { return value !== value; } /** * The base implementation of `_.mean` and `_.meanBy` without support for * iteratee shorthands. * * @private * @param {Array} array The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {number} Returns the mean. */ function baseMean(array, iteratee) { var length = array == null ? 0 : array.length; return length ? baseSum(array, iteratee) / length : NAN; } /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new accessor function. */ function baseProperty(key) { return function (object) { return object == null ? undefined : object[key]; }; } /** * The base implementation of `_.propertyOf` without support for deep paths. * * @private * @param {Object} object The object to query. * @returns {Function} Returns the new accessor function. */ function basePropertyOf(object) { return function (key) { return object == null ? undefined : object[key]; }; } /** * The base implementation of `_.reduce` and `_.reduceRight`, without support * for iteratee shorthands, which iterates over `collection` using `eachFunc`. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {*} accumulator The initial value. * @param {boolean} initAccum Specify using the first or last element of * `collection` as the initial value. * @param {Function} eachFunc The function to iterate over `collection`. * @returns {*} Returns the accumulated value. */ function baseReduce( collection, iteratee, accumulator, initAccum, eachFunc, ) { eachFunc(collection, function (value, index, collection) { accumulator = initAccum ? ((initAccum = false), value) : iteratee(accumulator, value, index, collection); }); return accumulator; } /** * The base implementation of `_.sortBy` which uses `comparer` to define the * sort order of `array` and replaces criteria objects with their corresponding * values. * * @private * @param {Array} array The array to sort. * @param {Function} comparer The function to define sort order. * @returns {Array} Returns `array`. */ function baseSortBy(array, comparer) { var length = array.length; array.sort(comparer); while (length--) { array[length] = array[length].value; } return array; } /** * The base implementation of `_.sum` and `_.sumBy` without support for * iteratee shorthands. * * @private * @param {Array} array The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {number} Returns the sum. */ function baseSum(array, iteratee) { var result, index = -1, length = array.length; while (++index < length) { var current = iteratee(array[index]); if (current !== undefined) { result = result === undefined ? current : result + current; } } return result; } /** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */ function baseTimes(n, iteratee) { var index = -1, result = Array(n); while (++index < n) { result[index] = iteratee(index); } return result; } /** * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array * of key-value pairs for `object` corresponding to the property names of `props`. * * @private * @param {Object} object The object to query. * @param {Array} props The property names to get values for. * @returns {Object} Returns the key-value pairs. */ function baseToPairs(object, props) { return arrayMap(props, function (key) { return [key, object[key]]; }); } /** * The base implementation of `_.unary` without support for storing metadata. * * @private * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. */ function baseUnary(func) { return function (value) { return func(value); }; } /** * The base implementation of `_.values` and `_.valuesIn` which creates an * array of `object` property values corresponding to the property names * of `props`. * * @private * @param {Object} object The object to query. * @param {Array} props The property names to get values for. * @returns {Object} Returns the array of property values. */ function baseValues(object, props) { return arrayMap(props, function (key) { return object[key]; }); } /** * Checks if a `cache` value for `key` exists. * * @private * @param {Object} cache The cache to query. * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function cacheHas(cache, key) { return cache.has(key); } /** * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol * that is not found in the character symbols. * * @private * @param {Array} strSymbols The string symbols to inspect. * @param {Array} chrSymbols The character symbols to find. * @returns {number} Returns the index of the first unmatched string symbol. */ function charsStartIndex(strSymbols, chrSymbols) { var index = -1, length = strSymbols.length; while ( ++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1 ) {} return index; } /** * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol * that is not found in the character symbols. * * @private * @param {Array} strSymbols The string symbols to inspect. * @param {Array} chrSymbols The character symbols to find. * @returns {number} Returns the index of the last unmatched string symbol. */ function charsEndIndex(strSymbols, chrSymbols) { var index = strSymbols.length; while ( index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1 ) {} return index; } /** * Gets the number of `placeholder` occurrences in `array`. * * @private * @param {Array} array The array to inspect. * @param {*} placeholder The placeholder to search for. * @returns {number} Returns the placeholder count. */ function countHolders(array, placeholder) { var length = array.length, result = 0; while (length--) { if (array[length] === placeholder) { ++result; } } return result; } /** * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A * letters to basic Latin letters. * * @private * @param {string} letter The matched letter to deburr. * @returns {string} Returns the deburred letter. */ var deburrLetter = basePropertyOf(deburredLetters); /** * Used by `_.escape` to convert characters to HTML entities. * * @private * @param {string} chr The matched character to escape. * @returns {string} Returns the escaped character. */ var escapeHtmlChar = basePropertyOf(htmlEscapes); /** * Used by `_.template` to escape characters for inclusion in compiled string literals. * * @private * @param {string} chr The matched character to escape. * @returns {string} Returns the escaped character. */ function escapeStringChar(chr) { return '\\' + stringEscapes[chr]; } /** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function getValue(object, key) { return object == null ? undefined : object[key]; } /** * Checks if `string` contains Unicode symbols. * * @private * @param {string} string The string to inspect. * @returns {boolean} Returns `true` if a symbol is found, else `false`. */ function hasUnicode(string) { return reHasUnicode.test(string); } /** * Checks if `string` contains a word composed of Unicode symbols. * * @private * @param {string} string The string to inspect. * @returns {boolean} Returns `true` if a word is found, else `false`. */ function hasUnicodeWord(string) { return reHasUnicodeWord.test(string); } /** * Converts `iterator` to an array. * * @private * @param {Object} iterator The iterator to convert. * @returns {Array} Returns the converted array. */ function iteratorToArray(iterator) { var data, result = []; while (!(data = iterator.next()).done) { result.push(data.value); } return result; } /** * Converts `map` to its key-value pairs. * * @private * @param {Object} map The map to convert. * @returns {Array} Returns the key-value pairs. */ function mapToArray(map) { var index = -1, result = Array(map.size); map.forEach(function (value, key) { result[++index] = [key, value]; }); return result; } /** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */ function overArg(func, transform) { return function (arg) { return func(transform(arg)); }; } /** * Replaces all `placeholder` elements in `array` with an internal placeholder * and returns an array of their indexes. * * @private * @param {Array} array The array to modify. * @param {*} placeholder The placeholder to replace. * @returns {Array} Returns the new array of placeholder indexes. */ function replaceHolders(array, placeholder) { var index = -1, length = array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (value === placeholder || value === PLACEHOLDER) { array[index] = PLACEHOLDER; result[resIndex++] = index; } } return result; } /** * Gets the value at `key`, unless `key` is "__proto__". * * @private * @param {Object} object The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function safeGet(object, key) { return key == '__proto__' ? undefined : object[key]; } /** * Converts `set` to an array of its values. * * @private * @param {Object} set The set to convert. * @returns {Array} Returns the values. */ function setToArray(set) { var index = -1, result = Array(set.size); set.forEach(function (value) { result[++index] = value; }); return result; } /** * Converts `set` to its value-value pairs. * * @private * @param {Object} set The set to convert. * @returns {Array} Returns the value-value pairs. */ function setToPairs(set) { var index = -1, result = Array(set.size); set.forEach(function (value) { result[++index] = [value, value]; }); return result; } /** * A specialized version of `_.indexOf` which performs strict equality * comparisons of values, i.e. `===`. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function strictIndexOf(array, value, fromIndex) { var index = fromIndex - 1, length = array.length; while (++index < length) { if (array[index] === value) { return index; } } return -1; } /** * A specialized version of `_.lastIndexOf` which performs strict equality * comparisons of values, i.e. `===`. * * @private * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} fromIndex The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. */ function strictLastIndexOf(array, value, fromIndex) { var index = fromIndex + 1; while (index--) { if (array[index] === value) { return index; } } return index; } /** * Gets the number of symbols in `string`. * * @private * @param {string} string The string to inspect. * @returns {number} Returns the string size. */ function stringSize(string) { return hasUnicode(string) ? unicodeSize(string) : asciiSize(string); } /** * Converts `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function stringToArray(string) { return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); } /** * Used by `_.unescape` to convert HTML entities to characters. * * @private * @param {string} chr The matched character to unescape. * @returns {string} Returns the unescaped character. */ var unescapeHtmlChar = basePropertyOf(htmlUnescapes); /** * Gets the size of a Unicode `string`. * * @private * @param {string} string The string inspect. * @returns {number} Returns the string size. */ function unicodeSize(string) { var result = (reUnicode.lastIndex = 0); while (reUnicode.test(string)) { ++result; } return result; } /** * Converts a Unicode `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function unicodeToArray(string) { return string.match(reUnicode) || []; } /** * Splits a Unicode `string` into an array of its words. * * @private * @param {string} The string to inspect. * @returns {Array} Returns the words of `string`. */ function unicodeWords(string) { return string.match(reUnicodeWord) || []; } /*--------------------------------------------------------------------------*/ /** * Create a new pristine `lodash` function using the `context` object. * * @static * @memberOf _ * @since 1.1.0 * @category Util * @param {Object} [context=root] The context object. * @returns {Function} Returns a new `lodash` function. * @example * * _.mixin({ 'foo': _.constant('foo') }); * * var lodash = _.runInContext(); * lodash.mixin({ 'bar': lodash.constant('bar') }); * * _.isFunction(_.foo); * // => true * _.isFunction(_.bar); * // => false * * lodash.isFunction(lodash.foo); * // => false * lodash.isFunction(lodash.bar); * // => true * * // Create a suped-up `defer` in Node.js. * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; */ var runInContext = function runInContext(context) { context = context == null ? root : _.defaults( root.Object(), context, _.pick(root, contextProps), ); /** Built-in constructor references. */ var Array = context.Array, Date = context.Date, Error = context.Error, Function = context.Function, Math = context.Math, Object = context.Object, RegExp = context.RegExp, String = context.String, TypeError = context.TypeError; /** Used for built-in method references. */ var arrayProto = Array.prototype, funcProto = Function.prototype, objectProto = Object.prototype; /** Used to detect overreaching core-js shims. */ var coreJsData = context['__core-js_shared__']; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Used to generate unique IDs. */ var idCounter = 0; /** Used to detect methods masquerading as native. */ var maskSrcKey = (function () { var uid = /[^.]+$/.exec( (coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO) || '', ); return uid ? 'Symbol(src)_1.' + uid : ''; })(); /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** Used to infer the `Object` constructor. */ var objectCtorString = funcToString.call(Object); /** Used to restore the original `_` reference in `_.noConflict`. */ var oldDash = root._; /** Used to detect if a method is native. */ var reIsNative = RegExp( '^' + funcToString .call(hasOwnProperty) .replace(reRegExpChar, '\\$&') .replace( /hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?', ) + '$', ); /** Built-in value references. */ var Buffer = moduleExports ? context.Buffer : undefined, Symbol = context.Symbol, Uint8Array = context.Uint8Array, allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, getPrototype = overArg(Object.getPrototypeOf, Object), objectCreate = Object.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, symIterator = Symbol ? Symbol.iterator : undefined, symToStringTag = Symbol ? Symbol.toStringTag : undefined; var defineProperty = (function () { try { var func = getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} })(); /** Mocked built-ins. */ var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, ctxNow = Date && Date.now !== root.Date.now && Date.now, ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeCeil = Math.ceil, nativeFloor = Math.floor, nativeGetSymbols = Object.getOwnPropertySymbols, nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object.keys, Object), nativeMax = Math.max, nativeMin = Math.min, nativeNow = Date.now, nativeParseInt = context.parseInt, nativeRandom = Math.random, nativeReverse = arrayProto.reverse; /* Built-in method references that are verified to be native. */ var DataView = getNative(context, 'DataView'), Map = getNative(context, 'Map'), Promise = getNative(context, 'Promise'), Set = getNative(context, 'Set'), WeakMap = getNative(context, 'WeakMap'), nativeCreate = getNative(Object, 'create'); /** Used to store function metadata. */ var metaMap = WeakMap && new WeakMap(); /** Used to lookup unminified function names. */ var realNames = {}; /** Used to detect maps, sets, and weakmaps. */ var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap); /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /*------------------------------------------------------------------------*/ /** * Creates a `lodash` object which wraps `value` to enable implicit method * chain sequences. Methods that operate on and return arrays, collections, * and functions can be chained together. Methods that retrieve a single value * or may return a primitive value will automatically end the chain sequence * and return the unwrapped value. Otherwise, the value must be unwrapped * with `_#value`. * * Explicit chain sequences, which must be unwrapped with `_#value`, may be * enabled using `_.chain`. * * The execution of chained methods is lazy, that is, it's deferred until * `_#value` is implicitly or explicitly called. * * Lazy evaluation allows several methods to support shortcut fusion. * Shortcut fusion is an optimization to merge iteratee calls; this avoids * the creation of intermediate arrays and can greatly reduce the number of * iteratee executions. Sections of a chain sequence qualify for shortcut * fusion if the section is applied to an array and iteratees accept only * one argument. The heuristic for whether a section qualifies for shortcut * fusion is subject to change. * * Chaining is supported in custom builds as long as the `_#value` method is * directly or indirectly included in the build. * * In addition to lodash methods, wrappers have `Array` and `String` methods. * * The wrapper `Array` methods are: * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` * * The wrapper `String` methods are: * `replace` and `split` * * The wrapper methods that support shortcut fusion are: * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` * * The chainable wrapper methods are: * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, * `zipObject`, `zipObjectDeep`, and `zipWith` * * The wrapper methods that are **not** chainable by default are: * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, * `upperFirst`, `value`, and `words` * * @name _ * @constructor * @category Seq * @param {*} value The value to wrap in a `lodash` instance. * @returns {Object} Returns the new `lodash` wrapper instance. * @example * * function square(n) { * return n * n; * } * * var wrapped = _([1, 2, 3]); * * // Returns an unwrapped value. * wrapped.reduce(_.add); * // => 6 * * // Returns a wrapped value. * var squares = wrapped.map(square); * * _.isArray(squares); * // => false * * _.isArray(squares.value()); * // => true */ function lodash(value) { if ( isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper) ) { if (value instanceof LodashWrapper) { return value; } if (hasOwnProperty.call(value, '__wrapped__')) { return wrapperClone(value); } } return new LodashWrapper(value); } /** * The base implementation of `_.create` without support for assigning * properties to the created object. * * @private * @param {Object} proto The object to inherit from. * @returns {Object} Returns the new object. */ var baseCreate = (function () { function object() {} return function (proto) { if (!isObject(proto)) { return {}; } if (objectCreate) { return objectCreate(proto); } object.prototype = proto; var result = new object(); object.prototype = undefined; return result; }; })(); /** * The function whose prototype chain sequence wrappers inherit from. * * @private */ function baseLodash() { // No operation performed. } /** * The base constructor for creating `lodash` wrapper objects. * * @private * @param {*} value The value to wrap. * @param {boolean} [chainAll] Enable explicit method chain sequences. */ function LodashWrapper(value, chainAll) { this.__wrapped__ = value; this.__actions__ = []; this.__chain__ = !!chainAll; this.__index__ = 0; this.__values__ = undefined; } /** * By default, the template delimiters used by lodash are like those in * embedded Ruby (ERB) as well as ES2015 template strings. Change the * following template settings to use alternative delimiters. * * @static * @memberOf _ * @type {Object} */ lodash.templateSettings = { /** * Used to detect `data` property values to be HTML-escaped. * * @memberOf _.templateSettings * @type {RegExp} */ escape: reEscape, /** * Used to detect code to be evaluated. * * @memberOf _.templateSettings * @type {RegExp} */ evaluate: reEvaluate, /** * Used to detect `data` property values to inject. * * @memberOf _.templateSettings * @type {RegExp} */ interpolate: reInterpolate, /** * Used to reference the data object in the template text. * * @memberOf _.templateSettings * @type {string} */ variable: '', /** * Used to import variables into the compiled template. * * @memberOf _.templateSettings * @type {Object} */ imports: { /** * A reference to the `lodash` function. * * @memberOf _.templateSettings.imports * @type {Function} */ _: lodash, }, }; // Ensure wrappers are instances of `baseLodash`. lodash.prototype = baseLodash.prototype; lodash.prototype.constructor = lodash; LodashWrapper.prototype = baseCreate(baseLodash.prototype); LodashWrapper.prototype.constructor = LodashWrapper; /*------------------------------------------------------------------------*/ /** * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. * * @private * @constructor * @param {*} value The value to wrap. */ function LazyWrapper(value) { this.__wrapped__ = value; this.__actions__ = []; this.__dir__ = 1; this.__filtered__ = false; this.__iteratees__ = []; this.__takeCount__ = MAX_ARRAY_LENGTH; this.__views__ = []; } /** * Creates a clone of the lazy wrapper object. * * @private * @name clone * @memberOf LazyWrapper * @returns {Object} Returns the cloned `LazyWrapper` object. */ function lazyClone() { var result = new LazyWrapper(this.__wrapped__); result.__actions__ = copyArray(this.__actions__); result.__dir__ = this.__dir__; result.__filtered__ = this.__filtered__; result.__iteratees__ = copyArray(this.__iteratees__); result.__takeCount__ = this.__takeCount__; result.__views__ = copyArray(this.__views__); return result; } /** * Reverses the direction of lazy iteration. * * @private * @name reverse * @memberOf LazyWrapper * @returns {Object} Returns the new reversed `LazyWrapper` object. */ function lazyReverse() { if (this.__filtered__) { var result = new LazyWrapper(this); result.__dir__ = -1; result.__filtered__ = true; } else { result = this.clone(); result.__dir__ *= -1; } return result; } /** * Extracts the unwrapped value from its lazy wrapper. * * @private * @name value * @memberOf LazyWrapper * @returns {*} Returns the unwrapped value. */ function lazyValue() { var array = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray(array), isRight = dir < 0, arrLength = isArr ? array.length : 0, view = getView(0, arrLength, this.__views__), start = view.start, end = view.end, length = end - start, index = isRight ? end : start - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin(length, this.__takeCount__); if ( !isArr || (!isRight && arrLength == length && takeCount == length) ) { return baseWrapperValue(array, this.__actions__); } var result = []; outer: while (length-- && resIndex < takeCount) { index += dir; var iterIndex = -1, value = array[index]; while (++iterIndex < iterLength) { var data = iteratees[iterIndex], iteratee = data.iteratee, type = data.type, computed = iteratee(value); if (type == LAZY_MAP_FLAG) { value = computed; } else if (!computed) { if (type == LAZY_FILTER_FLAG) { continue outer; } else { break outer; } } } result[resIndex++] = value; } return result; } // Ensure `LazyWrapper` is an instance of `baseLodash`. LazyWrapper.prototype = baseCreate(baseLodash.prototype); LazyWrapper.prototype.constructor = LazyWrapper; /*------------------------------------------------------------------------*/ /** * Creates a hash object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = nativeCreate ? nativeCreate(null) : {}; this.size = 0; } /** * Removes `key` and its value from the hash. * * @private * @name delete * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } /** * Gets the hash value for `key`. * * @private * @name get * @memberOf Hash * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function hashGet(key) { var data = this.__data__; if (nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED ? undefined : result; } return hasOwnProperty.call(data, key) ? data[key] : undefined; } /** * Checks if a hash value for `key` exists. * * @private * @name has * @memberOf Hash * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function hashHas(key) { var data = this.__data__; return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); } /** * Sets the hash `key` to `value`. * * @private * @name set * @memberOf Hash * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the hash instance. */ function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED : value; return this; } // Add methods to `Hash`. Hash.prototype.clear = hashClear; Hash.prototype['delete'] = hashDelete; Hash.prototype.get = hashGet; Hash.prototype.has = hashHas; Hash.prototype.set = hashSet; /*------------------------------------------------------------------------*/ /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } /** * Removes `key` and its value from the list cache. * * @private * @name delete * @memberOf ListCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function listCacheDelete(key) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { return false; } var lastIndex = data.length - 1; if (index == lastIndex) { data.pop(); } else { splice.call(data, index, 1); } --this.size; return true; } /** * Gets the list cache value for `key`. * * @private * @name get * @memberOf ListCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function listCacheGet(key) { var data = this.__data__, index = assocIndexOf(data, key); return index < 0 ? undefined : data[index][1]; } /** * Checks if a list cache value for `key` exists. * * @private * @name has * @memberOf ListCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function listCacheHas(key) { return assocIndexOf(this.__data__, key) > -1; } /** * Sets the list cache `key` to `value`. * * @private * @name set * @memberOf ListCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the list cache instance. */ function listCacheSet(key, value) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } // Add methods to `ListCache`. ListCache.prototype.clear = listCacheClear; ListCache.prototype['delete'] = listCacheDelete; ListCache.prototype.get = listCacheGet; ListCache.prototype.has = listCacheHas; ListCache.prototype.set = listCacheSet; /*------------------------------------------------------------------------*/ /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } /** * Removes all key-value entries from the map. * * @private * @name clear * @memberOf MapCache */ function mapCacheClear() { this.size = 0; this.__data__ = { hash: new Hash(), map: new (Map || ListCache)(), string: new Hash(), }; } /** * Removes `key` and its value from the map. * * @private * @name delete * @memberOf MapCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function mapCacheDelete(key) { var result = getMapData(this, key)['delete'](key); this.size -= result ? 1 : 0; return result; } /** * Gets the map value for `key`. * * @private * @name get * @memberOf MapCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function mapCacheGet(key) { return getMapData(this, key).get(key); } /** * Checks if a map value for `key` exists. * * @private * @name has * @memberOf MapCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function mapCacheHas(key) { return getMapData(this, key).has(key); } /** * Sets the map `key` to `value`. * * @private * @name set * @memberOf MapCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ function mapCacheSet(key, value) { var data = getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } // Add methods to `MapCache`. MapCache.prototype.clear = mapCacheClear; MapCache.prototype['delete'] = mapCacheDelete; MapCache.prototype.get = mapCacheGet; MapCache.prototype.has = mapCacheHas; MapCache.prototype.set = mapCacheSet; /*------------------------------------------------------------------------*/ /** * * Creates an array cache object to store unique values. * * @private * @constructor * @param {Array} [values] The values to cache. */ function SetCache(values) { var index = -1, length = values == null ? 0 : values.length; this.__data__ = new MapCache(); while (++index < length) { this.add(values[index]); } } /** * Adds `value` to the array cache. * * @private * @name add * @memberOf SetCache * @alias push * @param {*} value The value to cache. * @returns {Object} Returns the cache instance. */ function setCacheAdd(value) { this.__data__.set(value, HASH_UNDEFINED); return this; } /** * Checks if `value` is in the array cache. * * @private * @name has * @memberOf SetCache * @param {*} value The value to search for. * @returns {number} Returns `true` if `value` is found, else `false`. */ function setCacheHas(value) { return this.__data__.has(value); } // Add methods to `SetCache`. SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; SetCache.prototype.has = setCacheHas; /*------------------------------------------------------------------------*/ /** * Creates a stack cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Stack(entries) { var data = (this.__data__ = new ListCache(entries)); this.size = data.size; } /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new ListCache(); this.size = 0; } /** * Removes `key` and its value from the stack. * * @private * @name delete * @memberOf Stack * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { var data = this.__data__, result = data['delete'](key); this.size = data.size; return result; } /** * Gets the stack value for `key`. * * @private * @name get * @memberOf Stack * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function stackGet(key) { return this.__data__.get(key); } /** * Checks if a stack value for `key` exists. * * @private * @name has * @memberOf Stack * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { return this.__data__.has(key); } /** * Sets the stack `key` to `value`. * * @private * @name set * @memberOf Stack * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { var data = this.__data__; if (data instanceof ListCache) { var pairs = data.__data__; if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) { pairs.push([key, value]); this.size = ++data.size; return this; } data = this.__data__ = new MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } // Add methods to `Stack`. Stack.prototype.clear = stackClear; Stack.prototype['delete'] = stackDelete; Stack.prototype.get = stackGet; Stack.prototype.has = stackHas; Stack.prototype.set = stackSet; /*------------------------------------------------------------------------*/ /** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */ function arrayLikeKeys(value, inherited) { var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length; for (var key in value) { if ( (inherited || hasOwnProperty.call(value, key)) && !( skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode. (key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers. (isBuff && (key == 'offset' || key == 'parent')) || // PhantomJS 2 has enumerable non-index properties on typed arrays. (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || // Skip index properties. isIndex(key, length)) ) ) { result.push(key); } } return result; } /** * A specialized version of `_.sample` for arrays. * * @private * @param {Array} array The array to sample. * @returns {*} Returns the random element. */ function arraySample(array) { var length = array.length; return length ? array[baseRandom(0, length - 1)] : undefined; } /** * A specialized version of `_.sampleSize` for arrays. * * @private * @param {Array} array The array to sample. * @param {number} n The number of elements to sample. * @returns {Array} Returns the random elements. */ function arraySampleSize(array, n) { return shuffleSelf( copyArray(array), baseClamp(n, 0, array.length), ); } /** * A specialized version of `_.shuffle` for arrays. * * @private * @param {Array} array The array to shuffle. * @returns {Array} Returns the new shuffled array. */ function arrayShuffle(array) { return shuffleSelf(copyArray(array)); } /** * This function is like `assignValue` except that it doesn't assign * `undefined` values. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function assignMergeValue(object, key, value) { if ( (value !== undefined && !eq(object[key], value)) || (value === undefined && !(key in object)) ) { baseAssignValue(object, key, value); } } /** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function assignValue(object, key, value) { var objValue = object[key]; if ( !(hasOwnProperty.call(object, key) && eq(objValue, value)) || (value === undefined && !(key in object)) ) { baseAssignValue(object, key, value); } } /** * Gets the index at which the `key` is found in `array` of key-value pairs. * * @private * @param {Array} array The array to inspect. * @param {*} key The key to search for. * @returns {number} Returns the index of the matched value, else `-1`. */ function assocIndexOf(array, key) { var length = array.length; while (length--) { if (eq(array[length][0], key)) { return length; } } return -1; } /** * Aggregates elements of `collection` on `accumulator` with keys transformed * by `iteratee` and values set by `setter`. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} setter The function to set `accumulator` values. * @param {Function} iteratee The iteratee to transform keys. * @param {Object} accumulator The initial aggregated object. * @returns {Function} Returns `accumulator`. */ function baseAggregator(collection, setter, iteratee, accumulator) { baseEach(collection, function (value, key, collection) { setter(accumulator, value, iteratee(value), collection); }); return accumulator; } /** * The base implementation of `_.assign` without support for multiple sources * or `customizer` functions. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @returns {Object} Returns `object`. */ function baseAssign(object, source) { return object && copyObject(source, keys(source), object); } /** * The base implementation of `_.assignIn` without support for multiple sources * or `customizer` functions. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @returns {Object} Returns `object`. */ function baseAssignIn(object, source) { return object && copyObject(source, keysIn(source), object); } /** * The base implementation of `assignValue` and `assignMergeValue` without * value checks. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function baseAssignValue(object, key, value) { if (key == '__proto__' && defineProperty) { defineProperty(object, key, { configurable: true, enumerable: true, value: value, writable: true, }); } else { object[key] = value; } } /** * The base implementation of `_.at` without support for individual paths. * * @private * @param {Object} object The object to iterate over. * @param {string[]} paths The property paths to pick. * @returns {Array} Returns the picked elements. */ function baseAt(object, paths) { var index = -1, length = paths.length, result = Array(length), skip = object == null; while (++index < length) { result[index] = skip ? undefined : get(object, paths[index]); } return result; } /** * The base implementation of `_.clamp` which doesn't coerce arguments. * * @private * @param {number} number The number to clamp. * @param {number} [lower] The lower bound. * @param {number} upper The upper bound. * @returns {number} Returns the clamped number. */ function baseClamp(number, lower, upper) { if (number === number) { if (upper !== undefined) { number = number <= upper ? number : upper; } if (lower !== undefined) { number = number >= lower ? number : lower; } } return number; } /** * The base implementation of `_.clone` and `_.cloneDeep` which tracks * traversed objects. * * @private * @param {*} value The value to clone. * @param {boolean} bitmask The bitmask flags. * 1 - Deep clone * 2 - Flatten inherited properties * 4 - Clone symbols * @param {Function} [customizer] The function to customize cloning. * @param {string} [key] The key of `value`. * @param {Object} [object] The parent object of `value`. * @param {Object} [stack] Tracks traversed objects and their clone counterparts. * @returns {*} Returns the cloned value. */ function baseClone(value, bitmask, customizer, key, object, stack) { var result, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG; if (customizer) { result = object ? customizer(value, key, object, stack) : customizer(value); } if (result !== undefined) { return result; } if (!isObject(value)) { return value; } var isArr = isArray(value); if (isArr) { result = initCloneArray(value); if (!isDeep) { return copyArray(value, result); } } else { var tag = getTag(value), isFunc = tag == funcTag || tag == genTag; if (isBuffer(value)) { return cloneBuffer(value, isDeep); } if (tag == objectTag || tag == argsTag || (isFunc && !object)) { result = isFlat || isFunc ? {} : initCloneObject(value); if (!isDeep) { return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value)); } } else { if (!cloneableTags[tag]) { return object ? value : {}; } result = initCloneByTag(value, tag, isDeep); } } // Check for circular references and return its corresponding clone. stack || (stack = new Stack()); var stacked = stack.get(value); if (stacked) { return stacked; } stack.set(value, result); if (isSet(value)) { value.forEach(function (subValue) { result.add( baseClone( subValue, bitmask, customizer, subValue, value, stack, ), ); }); return result; } if (isMap(value)) { value.forEach(function (subValue, key) { result.set( key, baseClone(subValue, bitmask, customizer, key, value, stack), ); }); return result; } var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys; var props = isArr ? undefined : keysFunc(value); arrayEach(props || value, function (subValue, key) { if (props) { key = subValue; subValue = value[key]; } // Recursively populate clone (susceptible to call stack limits). assignValue( result, key, baseClone(subValue, bitmask, customizer, key, value, stack), ); }); return result; } /** * The base implementation of `_.conforms` which doesn't clone `source`. * * @private * @param {Object} source The object of property predicates to conform to. * @returns {Function} Returns the new spec function. */ function baseConforms(source) { var props = keys(source); return function (object) { return baseConformsTo(object, source, props); }; } /** * The base implementation of `_.conformsTo` which accepts `props` to check. * * @private * @param {Object} object The object to inspect. * @param {Object} source The object of property predicates to conform to. * @returns {boolean} Returns `true` if `object` conforms, else `false`. */ function baseConformsTo(object, source, props) { var length = props.length; if (object == null) { return !length; } object = Object(object); while (length--) { var key = props[length], predicate = source[key], value = object[key]; if ( (value === undefined && !(key in object)) || !predicate(value) ) { return false; } } return true; } /** * The base implementation of `_.delay` and `_.defer` which accepts `args` * to provide to `func`. * * @private * @param {Function} func The function to delay. * @param {number} wait The number of milliseconds to delay invocation. * @param {Array} args The arguments to provide to `func`. * @returns {number|Object} Returns the timer id or timeout object. */ function baseDelay(func, wait, args) { if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } return setTimeout(function () { func.apply(undefined, args); }, wait); } /** * The base implementation of methods like `_.difference` without support * for excluding multiple arrays or iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Array} values The values to exclude. * @param {Function} [iteratee] The iteratee invoked per element. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new array of filtered values. */ function baseDifference(array, values, iteratee, comparator) { var index = -1, includes = arrayIncludes, isCommon = true, length = array.length, result = [], valuesLength = values.length; if (!length) { return result; } if (iteratee) { values = arrayMap(values, baseUnary(iteratee)); } if (comparator) { includes = arrayIncludesWith; isCommon = false; } else if (values.length >= LARGE_ARRAY_SIZE) { includes = cacheHas; isCommon = false; values = new SetCache(values); } outer: while (++index < length) { var value = array[index], computed = iteratee == null ? value : iteratee(value); value = comparator || value !== 0 ? value : 0; if (isCommon && computed === computed) { var valuesIndex = valuesLength; while (valuesIndex--) { if (values[valuesIndex] === computed) { continue outer; } } result.push(value); } else if (!includes(values, computed, comparator)) { result.push(value); } } return result; } /** * The base implementation of `_.forEach` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array|Object} Returns `collection`. */ var baseEach = createBaseEach(baseForOwn); /** * The base implementation of `_.forEachRight` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array|Object} Returns `collection`. */ var baseEachRight = createBaseEach(baseForOwnRight, true); /** * The base implementation of `_.every` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if all elements pass the predicate check, * else `false` */ function baseEvery(collection, predicate) { var result = true; baseEach(collection, function (value, index, collection) { result = !!predicate(value, index, collection); return result; }); return result; } /** * The base implementation of methods like `_.max` and `_.min` which accepts a * `comparator` to determine the extremum value. * * @private * @param {Array} array The array to iterate over. * @param {Function} iteratee The iteratee invoked per iteration. * @param {Function} comparator The comparator used to compare values. * @returns {*} Returns the extremum value. */ function baseExtremum(array, iteratee, comparator) { var index = -1, length = array.length; while (++index < length) { var value = array[index], current = iteratee(value); if ( current != null && (computed === undefined ? current === current && !isSymbol(current) : comparator(current, computed)) ) { var computed = current, result = value; } } return result; } /** * The base implementation of `_.fill` without an iteratee call guard. * * @private * @param {Array} array The array to fill. * @param {*} value The value to fill `array` with. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns `array`. */ function baseFill(array, value, start, end) { var length = array.length; start = toInteger(start); if (start < 0) { start = -start > length ? 0 : length + start; } end = end === undefined || end > length ? length : toInteger(end); if (end < 0) { end += length; } end = start > end ? 0 : toLength(end); while (start < end) { array[start++] = value; } return array; } /** * The base implementation of `_.filter` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function baseFilter(collection, predicate) { var result = []; baseEach(collection, function (value, index, collection) { if (predicate(value, index, collection)) { result.push(value); } }); return result; } /** * The base implementation of `_.flatten` with support for restricting flattening. * * @private * @param {Array} array The array to flatten. * @param {number} depth The maximum recursion depth. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. * @param {Array} [result=[]] The initial result value. * @returns {Array} Returns the new flattened array. */ function baseFlatten(array, depth, predicate, isStrict, result) { var index = -1, length = array.length; predicate || (predicate = isFlattenable); result || (result = []); while (++index < length) { var value = array[index]; if (depth > 0 && predicate(value)) { if (depth > 1) { // Recursively flatten arrays (susceptible to call stack limits). baseFlatten(value, depth - 1, predicate, isStrict, result); } else { arrayPush(result, value); } } else if (!isStrict) { result[result.length] = value; } } return result; } /** * The base implementation of `baseForOwn` which iterates over `object` * properties returned by `keysFunc` and invokes `iteratee` for each property. * Iteratee functions may exit iteration early by explicitly returning `false`. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {Function} keysFunc The function to get the keys of `object`. * @returns {Object} Returns `object`. */ var baseFor = createBaseFor(); /** * This function is like `baseFor` except that it iterates over properties * in the opposite order. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {Function} keysFunc The function to get the keys of `object`. * @returns {Object} Returns `object`. */ var baseForRight = createBaseFor(true); /** * The base implementation of `_.forOwn` without support for iteratee shorthands. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Object} Returns `object`. */ function baseForOwn(object, iteratee) { return object && baseFor(object, iteratee, keys); } /** * The base implementation of `_.forOwnRight` without support for iteratee shorthands. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Object} Returns `object`. */ function baseForOwnRight(object, iteratee) { return object && baseForRight(object, iteratee, keys); } /** * The base implementation of `_.functions` which creates an array of * `object` function property names filtered from `props`. * * @private * @param {Object} object The object to inspect. * @param {Array} props The property names to filter. * @returns {Array} Returns the function names. */ function baseFunctions(object, props) { return arrayFilter(props, function (key) { return isFunction(object[key]); }); } /** * The base implementation of `_.get` without support for default values. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @returns {*} Returns the resolved value. */ function baseGet(object, path) { path = castPath(path, object); var index = 0, length = path.length; while (object != null && index < length) { object = object[toKey(path[index++])]; } return index && index == length ? object : undefined; } /** * The base implementation of `getAllKeys` and `getAllKeysIn` which uses * `keysFunc` and `symbolsFunc` to get the enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @param {Function} keysFunc The function to get the keys of `object`. * @param {Function} symbolsFunc The function to get the symbols of `object`. * @returns {Array} Returns the array of property names and symbols. */ function baseGetAllKeys(object, keysFunc, symbolsFunc) { var result = keysFunc(object); return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); } /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); } /** * The base implementation of `_.gt` which doesn't coerce arguments. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if `value` is greater than `other`, * else `false`. */ function baseGt(value, other) { return value > other; } /** * The base implementation of `_.has` without support for deep paths. * * @private * @param {Object} [object] The object to query. * @param {Array|string} key The key to check. * @returns {boolean} Returns `true` if `key` exists, else `false`. */ function baseHas(object, key) { return object != null && hasOwnProperty.call(object, key); } /** * The base implementation of `_.hasIn` without support for deep paths. * * @private * @param {Object} [object] The object to query. * @param {Array|string} key The key to check. * @returns {boolean} Returns `true` if `key` exists, else `false`. */ function baseHasIn(object, key) { return object != null && key in Object(object); } /** * The base implementation of `_.inRange` which doesn't coerce arguments. * * @private * @param {number} number The number to check. * @param {number} start The start of the range. * @param {number} end The end of the range. * @returns {boolean} Returns `true` if `number` is in the range, else `false`. */ function baseInRange(number, start, end) { return ( number >= nativeMin(start, end) && number < nativeMax(start, end) ); } /** * The base implementation of methods like `_.intersection`, without support * for iteratee shorthands, that accepts an array of arrays to inspect. * * @private * @param {Array} arrays The arrays to inspect. * @param {Function} [iteratee] The iteratee invoked per element. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new array of shared values. */ function baseIntersection(arrays, iteratee, comparator) { var includes = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array(othLength), maxLength = Infinity, result = []; while (othIndex--) { var array = arrays[othIndex]; if (othIndex && iteratee) { array = arrayMap(array, baseUnary(iteratee)); } maxLength = nativeMin(array.length, maxLength); caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) ? new SetCache(othIndex && array) : undefined; } array = arrays[0]; var index = -1, seen = caches[0]; outer: while (++index < length && result.length < maxLength) { var value = array[index], computed = iteratee ? iteratee(value) : value; value = comparator || value !== 0 ? value : 0; if ( !(seen ? cacheHas(seen, computed) : includes(result, computed, comparator)) ) { othIndex = othLength; while (--othIndex) { var cache = caches[othIndex]; if ( !(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator)) ) { continue outer; } } if (seen) { seen.push(computed); } result.push(value); } } return result; } /** * The base implementation of `_.invert` and `_.invertBy` which inverts * `object` with values transformed by `iteratee` and set by `setter`. * * @private * @param {Object} object The object to iterate over. * @param {Function} setter The function to set `accumulator` values. * @param {Function} iteratee The iteratee to transform values. * @param {Object} accumulator The initial inverted object. * @returns {Function} Returns `accumulator`. */ function baseInverter(object, setter, iteratee, accumulator) { baseForOwn(object, function (value, key, object) { setter(accumulator, iteratee(value), key, object); }); return accumulator; } /** * The base implementation of `_.invoke` without support for individual * method arguments. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path of the method to invoke. * @param {Array} args The arguments to invoke the method with. * @returns {*} Returns the result of the invoked method. */ function baseInvoke(object, path, args) { path = castPath(path, object); object = parent(object, path); var func = object == null ? object : object[toKey(last(path))]; return func == null ? undefined : apply(func, object, args); } /** * The base implementation of `_.isArguments`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, */ function baseIsArguments(value) { return isObjectLike(value) && baseGetTag(value) == argsTag; } /** * The base implementation of `_.isArrayBuffer` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. */ function baseIsArrayBuffer(value) { return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; } /** * The base implementation of `_.isDate` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a date object, else `false`. */ function baseIsDate(value) { return isObjectLike(value) && baseGetTag(value) == dateTag; } /** * The base implementation of `_.isEqual` which supports partial comparisons * and tracks traversed objects. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @param {boolean} bitmask The bitmask flags. * 1 - Unordered comparison * 2 - Partial comparison * @param {Function} [customizer] The function to customize comparisons. * @param {Object} [stack] Tracks traversed `value` and `other` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ function baseIsEqual(value, other, bitmask, customizer, stack) { if (value === other) { return true; } if ( value == null || other == null || (!isObjectLike(value) && !isObjectLike(other)) ) { return value !== value && other !== other; } return baseIsEqualDeep( value, other, bitmask, customizer, baseIsEqual, stack, ); } /** * A specialized version of `baseIsEqual` for arrays and objects which performs * deep comparisons and tracks traversed objects enabling objects with circular * references to be compared. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} [stack] Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function baseIsEqualDeep( object, other, bitmask, customizer, equalFunc, stack, ) { var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); objTag = objTag == argsTag ? objectTag : objTag; othTag = othTag == argsTag ? objectTag : othTag; var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; if (isSameTag && isBuffer(object)) { if (!isBuffer(other)) { return false; } objIsArr = true; objIsObj = false; } if (isSameTag && !objIsObj) { stack || (stack = new Stack()); return objIsArr || isTypedArray(object) ? equalArrays( object, other, bitmask, customizer, equalFunc, stack, ) : equalByTag( object, other, objTag, bitmask, customizer, equalFunc, stack, ); } if (!(bitmask & COMPARE_PARTIAL_FLAG)) { var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); if (objIsWrapped || othIsWrapped) { var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; stack || (stack = new Stack()); return equalFunc( objUnwrapped, othUnwrapped, bitmask, customizer, stack, ); } } if (!isSameTag) { return false; } stack || (stack = new Stack()); return equalObjects( object, other, bitmask, customizer, equalFunc, stack, ); } /** * The base implementation of `_.isMap` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a map, else `false`. */ function baseIsMap(value) { return isObjectLike(value) && getTag(value) == mapTag; } /** * The base implementation of `_.isMatch` without support for iteratee shorthands. * * @private * @param {Object} object The object to inspect. * @param {Object} source The object of property values to match. * @param {Array} matchData The property names, values, and compare flags to match. * @param {Function} [customizer] The function to customize comparisons. * @returns {boolean} Returns `true` if `object` is a match, else `false`. */ function baseIsMatch(object, source, matchData, customizer) { var index = matchData.length, length = index, noCustomizer = !customizer; if (object == null) { return !length; } object = Object(object); while (index--) { var data = matchData[index]; if ( noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object) ) { return false; } } while (++index < length) { data = matchData[index]; var key = data[0], objValue = object[key], srcValue = data[1]; if (noCustomizer && data[2]) { if (objValue === undefined && !(key in object)) { return false; } } else { var stack = new Stack(); if (customizer) { var result = customizer( objValue, srcValue, key, object, source, stack, ); } if ( !(result === undefined ? baseIsEqual( srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack, ) : result) ) { return false; } } } return true; } /** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. */ function baseIsNative(value) { if (!isObject(value) || isMasked(value)) { return false; } var pattern = isFunction(value) ? reIsNative : reIsHostCtor; return pattern.test(toSource(value)); } /** * The base implementation of `_.isRegExp` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. */ function baseIsRegExp(value) { return isObjectLike(value) && baseGetTag(value) == regexpTag; } /** * The base implementation of `_.isSet` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a set, else `false`. */ function baseIsSet(value) { return isObjectLike(value) && getTag(value) == setTag; } /** * The base implementation of `_.isTypedArray` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. */ function baseIsTypedArray(value) { return ( isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)] ); } /** * The base implementation of `_.iteratee`. * * @private * @param {*} [value=_.identity] The value to convert to an iteratee. * @returns {Function} Returns the iteratee. */ function baseIteratee(value) { // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. if (typeof value == 'function') { return value; } if (value == null) { return identity; } if (typeof value == 'object') { return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); } return property(value); } /** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeys(object) { if (!isPrototype(object)) { return nativeKeys(object); } var result = []; for (var key in Object(object)) { if (hasOwnProperty.call(object, key) && key != 'constructor') { result.push(key); } } return result; } /** * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeysIn(object) { if (!isObject(object)) { return nativeKeysIn(object); } var isProto = isPrototype(object), result = []; for (var key in object) { if ( !( key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)) ) ) { result.push(key); } } return result; } /** * The base implementation of `_.lt` which doesn't coerce arguments. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if `value` is less than `other`, * else `false`. */ function baseLt(value, other) { return value < other; } /** * The base implementation of `_.map` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function baseMap(collection, iteratee) { var index = -1, result = isArrayLike(collection) ? Array(collection.length) : []; baseEach(collection, function (value, key, collection) { result[++index] = iteratee(value, key, collection); }); return result; } /** * The base implementation of `_.matches` which doesn't clone `source`. * * @private * @param {Object} source The object of property values to match. * @returns {Function} Returns the new spec function. */ function baseMatches(source) { var matchData = getMatchData(source); if (matchData.length == 1 && matchData[0][2]) { return matchesStrictComparable( matchData[0][0], matchData[0][1], ); } return function (object) { return ( object === source || baseIsMatch(object, source, matchData) ); }; } /** * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. * * @private * @param {string} path The path of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function baseMatchesProperty(path, srcValue) { if (isKey(path) && isStrictComparable(srcValue)) { return matchesStrictComparable(toKey(path), srcValue); } return function (object) { var objValue = get(object, path); return objValue === undefined && objValue === srcValue ? hasIn(object, path) : baseIsEqual( srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, ); }; } /** * The base implementation of `_.merge` without support for multiple sources. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @param {number} srcIndex The index of `source`. * @param {Function} [customizer] The function to customize merged values. * @param {Object} [stack] Tracks traversed source values and their merged * counterparts. */ function baseMerge(object, source, srcIndex, customizer, stack) { if (object === source) { return; } baseFor( source, function (srcValue, key) { if (isObject(srcValue)) { stack || (stack = new Stack()); baseMergeDeep( object, source, key, srcIndex, baseMerge, customizer, stack, ); } else { var newValue = customizer ? customizer( safeGet(object, key), srcValue, key + '', object, source, stack, ) : undefined; if (newValue === undefined) { newValue = srcValue; } assignMergeValue(object, key, newValue); } }, keysIn, ); } /** * A specialized version of `baseMerge` for arrays and objects which performs * deep merges and tracks traversed objects enabling objects with circular * references to be merged. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @param {string} key The key of the value to merge. * @param {number} srcIndex The index of `source`. * @param {Function} mergeFunc The function to merge values. * @param {Function} [customizer] The function to customize assigned values. * @param {Object} [stack] Tracks traversed source values and their merged * counterparts. */ function baseMergeDeep( object, source, key, srcIndex, mergeFunc, customizer, stack, ) { var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue); if (stacked) { assignMergeValue(object, key, stacked); return; } var newValue = customizer ? customizer( objValue, srcValue, key + '', object, source, stack, ) : undefined; var isCommon = newValue === undefined; if (isCommon) { var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); newValue = srcValue; if (isArr || isBuff || isTyped) { if (isArray(objValue)) { newValue = objValue; } else if (isArrayLikeObject(objValue)) { newValue = copyArray(objValue); } else if (isBuff) { isCommon = false; newValue = cloneBuffer(srcValue, true); } else if (isTyped) { isCommon = false; newValue = cloneTypedArray(srcValue, true); } else { newValue = []; } } else if (isPlainObject(srcValue) || isArguments(srcValue)) { newValue = objValue; if (isArguments(objValue)) { newValue = toPlainObject(objValue); } else if ( !isObject(objValue) || (srcIndex && isFunction(objValue)) ) { newValue = initCloneObject(srcValue); } } else { isCommon = false; } } if (isCommon) { // Recursively merge objects and arrays (susceptible to call stack limits). stack.set(srcValue, newValue); mergeFunc(newValue, srcValue, srcIndex, customizer, stack); stack['delete'](srcValue); } assignMergeValue(object, key, newValue); } /** * The base implementation of `_.nth` which doesn't coerce arguments. * * @private * @param {Array} array The array to query. * @param {number} n The index of the element to return. * @returns {*} Returns the nth element of `array`. */ function baseNth(array, n) { var length = array.length; if (!length) { return; } n += n < 0 ? length : 0; return isIndex(n, length) ? array[n] : undefined; } /** * The base implementation of `_.orderBy` without param guards. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. * @param {string[]} orders The sort orders of `iteratees`. * @returns {Array} Returns the new sorted array. */ function baseOrderBy(collection, iteratees, orders) { var index = -1; iteratees = arrayMap( iteratees.length ? iteratees : [identity], baseUnary(getIteratee()), ); var result = baseMap( collection, function (value, key, collection) { var criteria = arrayMap(iteratees, function (iteratee) { return iteratee(value); }); return { criteria: criteria, index: ++index, value: value }; }, ); return baseSortBy(result, function (object, other) { return compareMultiple(object, other, orders); }); } /** * The base implementation of `_.pick` without support for individual * property identifiers. * * @private * @param {Object} object The source object. * @param {string[]} paths The property paths to pick. * @returns {Object} Returns the new object. */ function basePick(object, paths) { return basePickBy(object, paths, function (value, path) { return hasIn(object, path); }); } /** * The base implementation of `_.pickBy` without support for iteratee shorthands. * * @private * @param {Object} object The source object. * @param {string[]} paths The property paths to pick. * @param {Function} predicate The function invoked per property. * @returns {Object} Returns the new object. */ function basePickBy(object, paths, predicate) { var index = -1, length = paths.length, result = {}; while (++index < length) { var path = paths[index], value = baseGet(object, path); if (predicate(value, path)) { baseSet(result, castPath(path, object), value); } } return result; } /** * A specialized version of `baseProperty` which supports deep paths. * * @private * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. */ function basePropertyDeep(path) { return function (object) { return baseGet(object, path); }; } /** * The base implementation of `_.pullAllBy` without support for iteratee * shorthands. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to remove. * @param {Function} [iteratee] The iteratee invoked per element. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns `array`. */ function basePullAll(array, values, iteratee, comparator) { var indexOf = comparator ? baseIndexOfWith : baseIndexOf, index = -1, length = values.length, seen = array; if (array === values) { values = copyArray(values); } if (iteratee) { seen = arrayMap(array, baseUnary(iteratee)); } while (++index < length) { var fromIndex = 0, value = values[index], computed = iteratee ? iteratee(value) : value; while ( (fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1 ) { if (seen !== array) { splice.call(seen, fromIndex, 1); } splice.call(array, fromIndex, 1); } } return array; } /** * The base implementation of `_.pullAt` without support for individual * indexes or capturing the removed elements. * * @private * @param {Array} array The array to modify. * @param {number[]} indexes The indexes of elements to remove. * @returns {Array} Returns `array`. */ function basePullAt(array, indexes) { var length = array ? indexes.length : 0, lastIndex = length - 1; while (length--) { var index = indexes[length]; if (length == lastIndex || index !== previous) { var previous = index; if (isIndex(index)) { splice.call(array, index, 1); } else { baseUnset(array, index); } } } return array; } /** * The base implementation of `_.random` without support for returning * floating-point numbers. * * @private * @param {number} lower The lower bound. * @param {number} upper The upper bound. * @returns {number} Returns the random number. */ function baseRandom(lower, upper) { return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); } /** * The base implementation of `_.range` and `_.rangeRight` which doesn't * coerce arguments. * * @private * @param {number} start The start of the range. * @param {number} end The end of the range. * @param {number} step The value to increment or decrement by. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Array} Returns the range of numbers. */ function baseRange(start, end, step, fromRight) { var index = -1, length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result = Array(length); while (length--) { result[fromRight ? length : ++index] = start; start += step; } return result; } /** * The base implementation of `_.repeat` which doesn't coerce arguments. * * @private * @param {string} string The string to repeat. * @param {number} n The number of times to repeat the string. * @returns {string} Returns the repeated string. */ function baseRepeat(string, n) { var result = ''; if (!string || n < 1 || n > MAX_SAFE_INTEGER) { return result; } // Leverage the exponentiation by squaring algorithm for a faster repeat. // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. do { if (n % 2) { result += string; } n = nativeFloor(n / 2); if (n) { string += string; } } while (n); return result; } /** * The base implementation of `_.rest` which doesn't validate or coerce arguments. * * @private * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @returns {Function} Returns the new function. */ function baseRest(func, start) { return setToString(overRest(func, start, identity), func + ''); } /** * The base implementation of `_.sample`. * * @private * @param {Array|Object} collection The collection to sample. * @returns {*} Returns the random element. */ function baseSample(collection) { return arraySample(values(collection)); } /** * The base implementation of `_.sampleSize` without param guards. * * @private * @param {Array|Object} collection The collection to sample. * @param {number} n The number of elements to sample. * @returns {Array} Returns the random elements. */ function baseSampleSize(collection, n) { var array = values(collection); return shuffleSelf(array, baseClamp(n, 0, array.length)); } /** * The base implementation of `_.set`. * * @private * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {*} value The value to set. * @param {Function} [customizer] The function to customize path creation. * @returns {Object} Returns `object`. */ function baseSet(object, path, value, customizer) { if (!isObject(object)) { return object; } path = castPath(path, object); var index = -1, length = path.length, lastIndex = length - 1, nested = object; while (nested != null && ++index < length) { var key = toKey(path[index]), newValue = value; if (index != lastIndex) { var objValue = nested[key]; newValue = customizer ? customizer(objValue, key, nested) : undefined; if (newValue === undefined) { newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {}; } } assignValue(nested, key, newValue); nested = nested[key]; } return object; } /** * The base implementation of `setData` without support for hot loop shorting. * * @private * @param {Function} func The function to associate metadata with. * @param {*} data The metadata. * @returns {Function} Returns `func`. */ var baseSetData = !metaMap ? identity : function (func, data) { metaMap.set(func, data); return func; }; /** * The base implementation of `setToString` without support for hot loop shorting. * * @private * @param {Function} func The function to modify. * @param {Function} string The `toString` result. * @returns {Function} Returns `func`. */ var baseSetToString = !defineProperty ? identity : function (func, string) { return defineProperty(func, 'toString', { configurable: true, enumerable: false, value: constant(string), writable: true, }); }; /** * The base implementation of `_.shuffle`. * * @private * @param {Array|Object} collection The collection to shuffle. * @returns {Array} Returns the new shuffled array. */ function baseShuffle(collection) { return shuffleSelf(values(collection)); } /** * The base implementation of `_.slice` without an iteratee call guard. * * @private * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */ function baseSlice(array, start, end) { var index = -1, length = array.length; if (start < 0) { start = -start > length ? 0 : length + start; } end = end > length ? length : end; if (end < 0) { end += length; } length = start > end ? 0 : (end - start) >>> 0; start >>>= 0; var result = Array(length); while (++index < length) { result[index] = array[index + start]; } return result; } /** * The base implementation of `_.some` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if any element passes the predicate check, * else `false`. */ function baseSome(collection, predicate) { var result; baseEach(collection, function (value, index, collection) { result = predicate(value, index, collection); return !result; }); return !!result; } /** * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which * performs a binary search of `array` to determine the index at which `value` * should be inserted into `array` in order to maintain its sort order. * * @private * @param {Array} array The sorted array to inspect. * @param {*} value The value to evaluate. * @param {boolean} [retHighest] Specify returning the highest qualified index. * @returns {number} Returns the index at which `value` should be inserted * into `array`. */ function baseSortedIndex(array, value, retHighest) { var low = 0, high = array == null ? low : array.length; if ( typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH ) { while (low < high) { var mid = (low + high) >>> 1, computed = array[mid]; if ( computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value) ) { low = mid + 1; } else { high = mid; } } return high; } return baseSortedIndexBy(array, value, identity, retHighest); } /** * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` * which invokes `iteratee` for `value` and each element of `array` to compute * their sort ranking. The iteratee is invoked with one argument; (value). * * @private * @param {Array} array The sorted array to inspect. * @param {*} value The value to evaluate. * @param {Function} iteratee The iteratee invoked per element. * @param {boolean} [retHighest] Specify returning the highest qualified index. * @returns {number} Returns the index at which `value` should be inserted * into `array`. */ function baseSortedIndexBy(array, value, iteratee, retHighest) { value = iteratee(value); var low = 0, high = array == null ? 0 : array.length, valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol(value), valIsUndefined = value === undefined; while (low < high) { var mid = nativeFloor((low + high) / 2), computed = iteratee(array[mid]), othIsDefined = computed !== undefined, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol(computed); if (valIsNaN) { var setLow = retHighest || othIsReflexive; } else if (valIsUndefined) { setLow = othIsReflexive && (retHighest || othIsDefined); } else if (valIsNull) { setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); } else if (valIsSymbol) { setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); } else if (othIsNull || othIsSymbol) { setLow = false; } else { setLow = retHighest ? computed <= value : computed < value; } if (setLow) { low = mid + 1; } else { high = mid; } } return nativeMin(high, MAX_ARRAY_INDEX); } /** * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without * support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} [iteratee] The iteratee invoked per element. * @returns {Array} Returns the new duplicate free array. */ function baseSortedUniq(array, iteratee) { var index = -1, length = array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index], computed = iteratee ? iteratee(value) : value; if (!index || !eq(computed, seen)) { var seen = computed; result[resIndex++] = value === 0 ? 0 : value; } } return result; } /** * The base implementation of `_.toNumber` which doesn't ensure correct * conversions of binary, hexadecimal, or octal string values. * * @private * @param {*} value The value to process. * @returns {number} Returns the number. */ function baseToNumber(value) { if (typeof value == 'number') { return value; } if (isSymbol(value)) { return NAN; } return +value; } /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value == 'string') { return value; } if (isArray(value)) { // Recursively convert values (susceptible to call stack limits). return arrayMap(value, baseToString) + ''; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = value + ''; return result == '0' && 1 / value == -INFINITY ? '-0' : result; } /** * The base implementation of `_.uniqBy` without support for iteratee shorthands. * * @private * @param {Array} array The array to inspect. * @param {Function} [iteratee] The iteratee invoked per element. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new duplicate free array. */ function baseUniq(array, iteratee, comparator) { var index = -1, includes = arrayIncludes, length = array.length, isCommon = true, result = [], seen = result; if (comparator) { isCommon = false; includes = arrayIncludesWith; } else if (length >= LARGE_ARRAY_SIZE) { var set = iteratee ? null : createSet(array); if (set) { return setToArray(set); } isCommon = false; includes = cacheHas; seen = new SetCache(); } else { seen = iteratee ? [] : result; } outer: while (++index < length) { var value = array[index], computed = iteratee ? iteratee(value) : value; value = comparator || value !== 0 ? value : 0; if (isCommon && computed === computed) { var seenIndex = seen.length; while (seenIndex--) { if (seen[seenIndex] === computed) { continue outer; } } if (iteratee) { seen.push(computed); } result.push(value); } else if (!includes(seen, computed, comparator)) { if (seen !== result) { seen.push(computed); } result.push(value); } } return result; } /** * The base implementation of `_.unset`. * * @private * @param {Object} object The object to modify. * @param {Array|string} path The property path to unset. * @returns {boolean} Returns `true` if the property is deleted, else `false`. */ function baseUnset(object, path) { path = castPath(path, object); object = parent(object, path); return object == null || delete object[toKey(last(path))]; } /** * The base implementation of `_.update`. * * @private * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to update. * @param {Function} updater The function to produce the updated value. * @param {Function} [customizer] The function to customize path creation. * @returns {Object} Returns `object`. */ function baseUpdate(object, path, updater, customizer) { return baseSet( object, path, updater(baseGet(object, path)), customizer, ); } /** * The base implementation of methods like `_.dropWhile` and `_.takeWhile` * without support for iteratee shorthands. * * @private * @param {Array} array The array to query. * @param {Function} predicate The function invoked per iteration. * @param {boolean} [isDrop] Specify dropping elements instead of taking them. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Array} Returns the slice of `array`. */ function baseWhile(array, predicate, isDrop, fromRight) { var length = array.length, index = fromRight ? length : -1; while ( (fromRight ? index-- : ++index < length) && predicate(array[index], index, array) ) {} return isDrop ? baseSlice( array, fromRight ? 0 : index, fromRight ? index + 1 : length, ) : baseSlice( array, fromRight ? index + 1 : 0, fromRight ? length : index, ); } /** * The base implementation of `wrapperValue` which returns the result of * performing a sequence of actions on the unwrapped `value`, where each * successive action is supplied the return value of the previous. * * @private * @param {*} value The unwrapped value. * @param {Array} actions Actions to perform to resolve the unwrapped value. * @returns {*} Returns the resolved value. */ function baseWrapperValue(value, actions) { var result = value; if (result instanceof LazyWrapper) { result = result.value(); } return arrayReduce( actions, function (result, action) { return action.func.apply( action.thisArg, arrayPush([result], action.args), ); }, result, ); } /** * The base implementation of methods like `_.xor`, without support for * iteratee shorthands, that accepts an array of arrays to inspect. * * @private * @param {Array} arrays The arrays to inspect. * @param {Function} [iteratee] The iteratee invoked per element. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new array of values. */ function baseXor(arrays, iteratee, comparator) { var length = arrays.length; if (length < 2) { return length ? baseUniq(arrays[0]) : []; } var index = -1, result = Array(length); while (++index < length) { var array = arrays[index], othIndex = -1; while (++othIndex < length) { if (othIndex != index) { result[index] = baseDifference( result[index] || array, arrays[othIndex], iteratee, comparator, ); } } } return baseUniq(baseFlatten(result, 1), iteratee, comparator); } /** * This base implementation of `_.zipObject` which assigns values using `assignFunc`. * * @private * @param {Array} props The property identifiers. * @param {Array} values The property values. * @param {Function} assignFunc The function to assign values. * @returns {Object} Returns the new object. */ function baseZipObject(props, values, assignFunc) { var index = -1, length = props.length, valsLength = values.length, result = {}; while (++index < length) { var value = index < valsLength ? values[index] : undefined; assignFunc(result, props[index], value); } return result; } /** * Casts `value` to an empty array if it's not an array like object. * * @private * @param {*} value The value to inspect. * @returns {Array|Object} Returns the cast array-like object. */ function castArrayLikeObject(value) { return isArrayLikeObject(value) ? value : []; } /** * Casts `value` to `identity` if it's not a function. * * @private * @param {*} value The value to inspect. * @returns {Function} Returns cast function. */ function castFunction(value) { return typeof value == 'function' ? value : identity; } /** * Casts `value` to a path array if it's not one. * * @private * @param {*} value The value to inspect. * @param {Object} [object] The object to query keys on. * @returns {Array} Returns the cast property path array. */ function castPath(value, object) { if (isArray(value)) { return value; } return isKey(value, object) ? [value] : stringToPath(toString(value)); } /** * A `baseRest` alias which can be replaced with `identity` by module * replacement plugins. * * @private * @type {Function} * @param {Function} func The function to apply a rest parameter to. * @returns {Function} Returns the new function. */ var castRest = baseRest; /** * Casts `array` to a slice if it's needed. * * @private * @param {Array} array The array to inspect. * @param {number} start The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the cast slice. */ function castSlice(array, start, end) { var length = array.length; end = end === undefined ? length : end; return !start && end >= length ? array : baseSlice(array, start, end); } /** * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). * * @private * @param {number|Object} id The timer id or timeout object of the timer to clear. */ var clearTimeout = ctxClearTimeout || function (id) { return root.clearTimeout(id); }; /** * Creates a clone of `buffer`. * * @private * @param {Buffer} buffer The buffer to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Buffer} Returns the cloned buffer. */ function cloneBuffer(buffer, isDeep) { if (isDeep) { return buffer.slice(); } var length = buffer.length, result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); buffer.copy(result); return result; } /** * Creates a clone of `arrayBuffer`. * * @private * @param {ArrayBuffer} arrayBuffer The array buffer to clone. * @returns {ArrayBuffer} Returns the cloned array buffer. */ function cloneArrayBuffer(arrayBuffer) { var result = new arrayBuffer.constructor(arrayBuffer.byteLength); new Uint8Array(result).set(new Uint8Array(arrayBuffer)); return result; } /** * Creates a clone of `dataView`. * * @private * @param {Object} dataView The data view to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the cloned data view. */ function cloneDataView(dataView, isDeep) { var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; return new dataView.constructor( buffer, dataView.byteOffset, dataView.byteLength, ); } /** * Creates a clone of `regexp`. * * @private * @param {Object} regexp The regexp to clone. * @returns {Object} Returns the cloned regexp. */ function cloneRegExp(regexp) { var result = new regexp.constructor( regexp.source, reFlags.exec(regexp), ); result.lastIndex = regexp.lastIndex; return result; } /** * Creates a clone of the `symbol` object. * * @private * @param {Object} symbol The symbol object to clone. * @returns {Object} Returns the cloned symbol object. */ function cloneSymbol(symbol) { return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; } /** * Creates a clone of `typedArray`. * * @private * @param {Object} typedArray The typed array to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the cloned typed array. */ function cloneTypedArray(typedArray, isDeep) { var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; return new typedArray.constructor( buffer, typedArray.byteOffset, typedArray.length, ); } /** * Compares values to sort them in ascending order. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {number} Returns the sort order indicator for `value`. */ function compareAscending(value, other) { if (value !== other) { var valIsDefined = value !== undefined, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value); var othIsDefined = other !== undefined, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other); if ( (!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || (valIsNull && othIsDefined && othIsReflexive) || (!valIsDefined && othIsReflexive) || !valIsReflexive ) { return 1; } if ( (!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || (othIsNull && valIsDefined && valIsReflexive) || (!othIsDefined && valIsReflexive) || !othIsReflexive ) { return -1; } } return 0; } /** * Used by `_.orderBy` to compare multiple properties of a value to another * and stable sort them. * * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, * specify an order of "desc" for descending or "asc" for ascending sort order * of corresponding values. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {boolean[]|string[]} orders The order to sort by for each property. * @returns {number} Returns the sort order indicator for `object`. */ function compareMultiple(object, other, orders) { var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length; while (++index < length) { var result = compareAscending( objCriteria[index], othCriteria[index], ); if (result) { if (index >= ordersLength) { return result; } var order = orders[index]; return result * (order == 'desc' ? -1 : 1); } } // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications // that causes it, under certain circumstances, to provide the same value for // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 // for more details. // // This also ensures a stable sort in V8 and other engines. // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. return object.index - other.index; } /** * Creates an array that is the composition of partially applied arguments, * placeholders, and provided arguments into a single array of arguments. * * @private * @param {Array} args The provided arguments. * @param {Array} partials The arguments to prepend to those provided. * @param {Array} holders The `partials` placeholder indexes. * @params {boolean} [isCurried] Specify composing for a curried function. * @returns {Array} Returns the new array of composed arguments. */ function composeArgs(args, partials, holders, isCurried) { var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result = Array(leftLength + rangeLength), isUncurried = !isCurried; while (++leftIndex < leftLength) { result[leftIndex] = partials[leftIndex]; } while (++argsIndex < holdersLength) { if (isUncurried || argsIndex < argsLength) { result[holders[argsIndex]] = args[argsIndex]; } } while (rangeLength--) { result[leftIndex++] = args[argsIndex++]; } return result; } /** * This function is like `composeArgs` except that the arguments composition * is tailored for `_.partialRight`. * * @private * @param {Array} args The provided arguments. * @param {Array} partials The arguments to append to those provided. * @param {Array} holders The `partials` placeholder indexes. * @params {boolean} [isCurried] Specify composing for a curried function. * @returns {Array} Returns the new array of composed arguments. */ function composeArgsRight(args, partials, holders, isCurried) { var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result = Array(rangeLength + rightLength), isUncurried = !isCurried; while (++argsIndex < rangeLength) { result[argsIndex] = args[argsIndex]; } var offset = argsIndex; while (++rightIndex < rightLength) { result[offset + rightIndex] = partials[rightIndex]; } while (++holdersIndex < holdersLength) { if (isUncurried || argsIndex < argsLength) { result[offset + holders[holdersIndex]] = args[argsIndex++]; } } return result; } /** * Copies the values of `source` to `array`. * * @private * @param {Array} source The array to copy values from. * @param {Array} [array=[]] The array to copy values to. * @returns {Array} Returns `array`. */ function copyArray(source, array) { var index = -1, length = source.length; array || (array = Array(length)); while (++index < length) { array[index] = source[index]; } return array; } /** * Copies properties of `source` to `object`. * * @private * @param {Object} source The object to copy properties from. * @param {Array} props The property identifiers to copy. * @param {Object} [object={}] The object to copy properties to. * @param {Function} [customizer] The function to customize copied values. * @returns {Object} Returns `object`. */ function copyObject(source, props, object, customizer) { var isNew = !object; object || (object = {}); var index = -1, length = props.length; while (++index < length) { var key = props[index]; var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined; if (newValue === undefined) { newValue = source[key]; } if (isNew) { baseAssignValue(object, key, newValue); } else { assignValue(object, key, newValue); } } return object; } /** * Copies own symbols of `source` to `object`. * * @private * @param {Object} source The object to copy symbols from. * @param {Object} [object={}] The object to copy symbols to. * @returns {Object} Returns `object`. */ function copySymbols(source, object) { return copyObject(source, getSymbols(source), object); } /** * Copies own and inherited symbols of `source` to `object`. * * @private * @param {Object} source The object to copy symbols from. * @param {Object} [object={}] The object to copy symbols to. * @returns {Object} Returns `object`. */ function copySymbolsIn(source, object) { return copyObject(source, getSymbolsIn(source), object); } /** * Creates a function like `_.groupBy`. * * @private * @param {Function} setter The function to set accumulator values. * @param {Function} [initializer] The accumulator object initializer. * @returns {Function} Returns the new aggregator function. */ function createAggregator(setter, initializer) { return function (collection, iteratee) { var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {}; return func( collection, setter, getIteratee(iteratee, 2), accumulator, ); }; } /** * Creates a function like `_.assign`. * * @private * @param {Function} assigner The function to assign values. * @returns {Function} Returns the new assigner function. */ function createAssigner(assigner) { return baseRest(function (object, sources) { var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined, guard = length > 2 ? sources[2] : undefined; customizer = assigner.length > 3 && typeof customizer == 'function' ? (length--, customizer) : undefined; if (guard && isIterateeCall(sources[0], sources[1], guard)) { customizer = length < 3 ? undefined : customizer; length = 1; } object = Object(object); while (++index < length) { var source = sources[index]; if (source) { assigner(object, source, index, customizer); } } return object; }); } /** * Creates a `baseEach` or `baseEachRight` function. * * @private * @param {Function} eachFunc The function to iterate over a collection. * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseEach(eachFunc, fromRight) { return function (collection, iteratee) { if (collection == null) { return collection; } if (!isArrayLike(collection)) { return eachFunc(collection, iteratee); } var length = collection.length, index = fromRight ? length : -1, iterable = Object(collection); while (fromRight ? index-- : ++index < length) { if (iteratee(iterable[index], index, iterable) === false) { break; } } return collection; }; } /** * Creates a base function for methods like `_.forIn` and `_.forOwn`. * * @private * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseFor(fromRight) { return function (object, iteratee, keysFunc) { var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; while (length--) { var key = props[fromRight ? length : ++index]; if (iteratee(iterable[key], key, iterable) === false) { break; } } return object; }; } /** * Creates a function that wraps `func` to invoke it with the optional `this` * binding of `thisArg`. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask flags. See `createWrap` for more details. * @param {*} [thisArg] The `this` binding of `func`. * @returns {Function} Returns the new wrapped function. */ function createBind(func, bitmask, thisArg) { var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); function wrapper() { var fn = this && this !== root && this instanceof wrapper ? Ctor : func; return fn.apply(isBind ? thisArg : this, arguments); } return wrapper; } /** * Creates a function like `_.lowerFirst`. * * @private * @param {string} methodName The name of the `String` case method to use. * @returns {Function} Returns the new case function. */ function createCaseFirst(methodName) { return function (string) { string = toString(string); var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined; var chr = strSymbols ? strSymbols[0] : string.charAt(0); var trailing = strSymbols ? castSlice(strSymbols, 1).join('') : string.slice(1); return chr[methodName]() + trailing; }; } /** * Creates a function like `_.camelCase`. * * @private * @param {Function} callback The function to combine each word. * @returns {Function} Returns the new compounder function. */ function createCompounder(callback) { return function (string) { return arrayReduce( words(deburr(string).replace(reApos, '')), callback, '', ); }; } /** * Creates a function that produces an instance of `Ctor` regardless of * whether it was invoked as part of a `new` expression or by `call` or `apply`. * * @private * @param {Function} Ctor The constructor to wrap. * @returns {Function} Returns the new wrapped function. */ function createCtor(Ctor) { return function () { // Use a `switch` statement to work with class constructors. See // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist // for more details. var args = arguments; switch (args.length) { case 0: return new Ctor(); case 1: return new Ctor(args[0]); case 2: return new Ctor(args[0], args[1]); case 3: return new Ctor(args[0], args[1], args[2]); case 4: return new Ctor(args[0], args[1], args[2], args[3]); case 5: return new Ctor( args[0], args[1], args[2], args[3], args[4], ); case 6: return new Ctor( args[0], args[1], args[2], args[3], args[4], args[5], ); case 7: return new Ctor( args[0], args[1], args[2], args[3], args[4], args[5], args[6], ); } var thisBinding = baseCreate(Ctor.prototype), result = Ctor.apply(thisBinding, args); // Mimic the constructor's `return` behavior. // See https://es5.github.io/#x13.2.2 for more details. return isObject(result) ? result : thisBinding; }; } /** * Creates a function that wraps `func` to enable currying. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask flags. See `createWrap` for more details. * @param {number} arity The arity of `func`. * @returns {Function} Returns the new wrapped function. */ function createCurry(func, bitmask, arity) { var Ctor = createCtor(func); function wrapper() { var length = arguments.length, args = Array(length), index = length, placeholder = getHolder(wrapper); while (index--) { args[index] = arguments[index]; } var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder); length -= holders.length; if (length < arity) { return createRecurry( func, bitmask, createHybrid, wrapper.placeholder, undefined, args, holders, undefined, undefined, arity - length, ); } var fn = this && this !== root && this instanceof wrapper ? Ctor : func; return apply(fn, this, args); } return wrapper; } /** * Creates a `_.find` or `_.findLast` function. * * @private * @param {Function} findIndexFunc The function to find the collection index. * @returns {Function} Returns the new find function. */ function createFind(findIndexFunc) { return function (collection, predicate, fromIndex) { var iterable = Object(collection); if (!isArrayLike(collection)) { var iteratee = getIteratee(predicate, 3); collection = keys(collection); predicate = function (key) { return iteratee(iterable[key], key, iterable); }; } var index = findIndexFunc(collection, predicate, fromIndex); return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; }; } /** * Creates a `_.flow` or `_.flowRight` function. * * @private * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new flow function. */ function createFlow(fromRight) { return flatRest(function (funcs) { var length = funcs.length, index = length, prereq = LodashWrapper.prototype.thru; if (fromRight) { funcs.reverse(); } while (index--) { var func = funcs[index]; if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } if (prereq && !wrapper && getFuncName(func) == 'wrapper') { var wrapper = new LodashWrapper([], true); } } index = wrapper ? index : length; while (++index < length) { func = funcs[index]; var funcName = getFuncName(func), data = funcName == 'wrapper' ? getData(func) : undefined; if ( data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1 ) { wrapper = wrapper[getFuncName(data[0])].apply( wrapper, data[3], ); } else { wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func); } } return function () { var args = arguments, value = args[0]; if (wrapper && args.length == 1 && isArray(value)) { return wrapper.plant(value).value(); } var index = 0, result = length ? funcs[index].apply(this, args) : value; while (++index < length) { result = funcs[index].call(this, result); } return result; }; }); } /** * Creates a function that wraps `func` to invoke it with optional `this` * binding of `thisArg`, partial application, and currying. * * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask flags. See `createWrap` for more details. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to * the new function. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [partialsRight] The arguments to append to those provided * to the new function. * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */ function createHybrid( func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity, ) { var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined : createCtor(func); function wrapper() { var length = arguments.length, args = Array(length), index = length; while (index--) { args[index] = arguments[index]; } if (isCurried) { var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder); } if (partials) { args = composeArgs(args, partials, holders, isCurried); } if (partialsRight) { args = composeArgsRight( args, partialsRight, holdersRight, isCurried, ); } length -= holdersCount; if (isCurried && length < arity) { var newHolders = replaceHolders(args, placeholder); return createRecurry( func, bitmask, createHybrid, wrapper.placeholder, thisArg, args, newHolders, argPos, ary, arity - length, ); } var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func; length = args.length; if (argPos) { args = reorder(args, argPos); } else if (isFlip && length > 1) { args.reverse(); } if (isAry && ary < length) { args.length = ary; } if (this && this !== root && this instanceof wrapper) { fn = Ctor || createCtor(fn); } return fn.apply(thisBinding, args); } return wrapper; } /** * Creates a function like `_.invertBy`. * * @private * @param {Function} setter The function to set accumulator values. * @param {Function} toIteratee The function to resolve iteratees. * @returns {Function} Returns the new inverter function. */ function createInverter(setter, toIteratee) { return function (object, iteratee) { return baseInverter(object, setter, toIteratee(iteratee), {}); }; } /** * Creates a function that performs a mathematical operation on two values. * * @private * @param {Function} operator The function to perform the operation. * @param {number} [defaultValue] The value used for `undefined` arguments. * @returns {Function} Returns the new mathematical operation function. */ function createMathOperation(operator, defaultValue) { return function (value, other) { var result; if (value === undefined && other === undefined) { return defaultValue; } if (value !== undefined) { result = value; } if (other !== undefined) { if (result === undefined) { return other; } if (typeof value == 'string' || typeof other == 'string') { value = baseToString(value); other = baseToString(other); } else { value = baseToNumber(value); other = baseToNumber(other); } result = operator(value, other); } return result; }; } /** * Creates a function like `_.over`. * * @private * @param {Function} arrayFunc The function to iterate over iteratees. * @returns {Function} Returns the new over function. */ function createOver(arrayFunc) { return flatRest(function (iteratees) { iteratees = arrayMap(iteratees, baseUnary(getIteratee())); return baseRest(function (args) { var thisArg = this; return arrayFunc(iteratees, function (iteratee) { return apply(iteratee, thisArg, args); }); }); }); } /** * Creates the padding for `string` based on `length`. The `chars` string * is truncated if the number of characters exceeds `length`. * * @private * @param {number} length The padding length. * @param {string} [chars=' '] The string used as padding. * @returns {string} Returns the padding for `string`. */ function createPadding(length, chars) { chars = chars === undefined ? ' ' : baseToString(chars); var charsLength = chars.length; if (charsLength < 2) { return charsLength ? baseRepeat(chars, length) : chars; } var result = baseRepeat( chars, nativeCeil(length / stringSize(chars)), ); return hasUnicode(chars) ? castSlice(stringToArray(result), 0, length).join('') : result.slice(0, length); } /** * Creates a function that wraps `func` to invoke it with the `this` binding * of `thisArg` and `partials` prepended to the arguments it receives. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask flags. See `createWrap` for more details. * @param {*} thisArg The `this` binding of `func`. * @param {Array} partials The arguments to prepend to those provided to * the new function. * @returns {Function} Returns the new wrapped function. */ function createPartial(func, bitmask, thisArg, partials) { var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); function wrapper() { var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array(leftLength + argsLength), fn = this && this !== root && this instanceof wrapper ? Ctor : func; while (++leftIndex < leftLength) { args[leftIndex] = partials[leftIndex]; } while (argsLength--) { args[leftIndex++] = arguments[++argsIndex]; } return apply(fn, isBind ? thisArg : this, args); } return wrapper; } /** * Creates a `_.range` or `_.rangeRight` function. * * @private * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new range function. */ function createRange(fromRight) { return function (start, end, step) { if ( step && typeof step != 'number' && isIterateeCall(start, end, step) ) { end = step = undefined; } // Ensure the sign of `-0` is preserved. start = toFinite(start); if (end === undefined) { end = start; start = 0; } else { end = toFinite(end); } step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); return baseRange(start, end, step, fromRight); }; } /** * Creates a function that performs a relational operation on two values. * * @private * @param {Function} operator The function to perform the operation. * @returns {Function} Returns the new relational operation function. */ function createRelationalOperation(operator) { return function (value, other) { if (!(typeof value == 'string' && typeof other == 'string')) { value = toNumber(value); other = toNumber(other); } return operator(value, other); }; } /** * Creates a function that wraps `func` to continue currying. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask flags. See `createWrap` for more details. * @param {Function} wrapFunc The function to create the `func` wrapper. * @param {*} placeholder The placeholder value. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to * the new function. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */ function createRecurry( func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity, ) { var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined, newHoldersRight = isCurry ? undefined : holders, newPartials = isCurry ? partials : undefined, newPartialsRight = isCurry ? undefined : partials; bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG; bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); } var newData = [ func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, argPos, ary, arity, ]; var result = wrapFunc.apply(undefined, newData); if (isLaziable(func)) { setData(result, newData); } result.placeholder = placeholder; return setWrapToString(result, func, bitmask); } /** * Creates a function like `_.round`. * * @private * @param {string} methodName The name of the `Math` method to use when rounding. * @returns {Function} Returns the new round function. */ function createRound(methodName) { var func = Math[methodName]; return function (number, precision) { number = toNumber(number); precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); if (precision) { // Shift with exponential notation to avoid floating-point issues. // See [MDN](https://mdn.io/round#Examples) for more details. var pair = (toString(number) + 'e').split('e'), value = func(pair[0] + 'e' + (+pair[1] + precision)); pair = (toString(value) + 'e').split('e'); return +(pair[0] + 'e' + (+pair[1] - precision)); } return func(number); }; } /** * Creates a set object of `values`. * * @private * @param {Array} values The values to add to the set. * @returns {Object} Returns the new set. */ var createSet = !( Set && 1 / setToArray(new Set([, -0]))[1] == INFINITY ) ? noop : function (values) { return new Set(values); }; /** * Creates a `_.toPairs` or `_.toPairsIn` function. * * @private * @param {Function} keysFunc The function to get the keys of a given object. * @returns {Function} Returns the new pairs function. */ function createToPairs(keysFunc) { return function (object) { var tag = getTag(object); if (tag == mapTag) { return mapToArray(object); } if (tag == setTag) { return setToPairs(object); } return baseToPairs(object, keysFunc(object)); }; } /** * Creates a function that either curries or invokes `func` with optional * `this` binding and partially applied arguments. * * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask flags. * 1 - `_.bind` * 2 - `_.bindKey` * 4 - `_.curry` or `_.curryRight` of a bound function * 8 - `_.curry` * 16 - `_.curryRight` * 32 - `_.partial` * 64 - `_.partialRight` * 128 - `_.rearg` * 256 - `_.ary` * 512 - `_.flip` * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to be partially applied. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */ function createWrap( func, bitmask, thisArg, partials, holders, argPos, ary, arity, ) { var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; if (!isBindKey && typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } var length = partials ? partials.length : 0; if (!length) { bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); partials = holders = undefined; } ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); arity = arity === undefined ? arity : toInteger(arity); length -= holders ? holders.length : 0; if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { var partialsRight = partials, holdersRight = holders; partials = holders = undefined; } var data = isBindKey ? undefined : getData(func); var newData = [ func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity, ]; if (data) { mergeData(newData, data); } func = newData[0]; bitmask = newData[1]; thisArg = newData[2]; partials = newData[3]; holders = newData[4]; arity = newData[9] = newData[9] === undefined ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0); if ( !arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG) ) { bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); } if (!bitmask || bitmask == WRAP_BIND_FLAG) { var result = createBind(func, bitmask, thisArg); } else if ( bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG ) { result = createCurry(func, bitmask, arity); } else if ( (bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length ) { result = createPartial(func, bitmask, thisArg, partials); } else { result = createHybrid.apply(undefined, newData); } var setter = data ? baseSetData : setData; return setWrapToString(setter(result, newData), func, bitmask); } /** * Used by `_.defaults` to customize its `_.assignIn` use to assign properties * of source objects to the destination object for all destination properties * that resolve to `undefined`. * * @private * @param {*} objValue The destination value. * @param {*} srcValue The source value. * @param {string} key The key of the property to assign. * @param {Object} object The parent object of `objValue`. * @returns {*} Returns the value to assign. */ function customDefaultsAssignIn(objValue, srcValue, key, object) { if ( objValue === undefined || (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key)) ) { return srcValue; } return objValue; } /** * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source * objects into destination objects that are passed thru. * * @private * @param {*} objValue The destination value. * @param {*} srcValue The source value. * @param {string} key The key of the property to merge. * @param {Object} object The parent object of `objValue`. * @param {Object} source The parent object of `srcValue`. * @param {Object} [stack] Tracks traversed source values and their merged * counterparts. * @returns {*} Returns the value to assign. */ function customDefaultsMerge( objValue, srcValue, key, object, source, stack, ) { if (isObject(objValue) && isObject(srcValue)) { // Recursively merge objects and arrays (susceptible to call stack limits). stack.set(srcValue, objValue); baseMerge( objValue, srcValue, undefined, customDefaultsMerge, stack, ); stack['delete'](srcValue); } return objValue; } /** * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain * objects. * * @private * @param {*} value The value to inspect. * @param {string} key The key of the property to inspect. * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. */ function customOmitClone(value) { return isPlainObject(value) ? undefined : value; } /** * A specialized version of `baseIsEqualDeep` for arrays with support for * partial deep comparisons. * * @private * @param {Array} array The array to compare. * @param {Array} other The other array to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `array` and `other` objects. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ function equalArrays( array, other, bitmask, customizer, equalFunc, stack, ) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; if ( arrLength != othLength && !(isPartial && othLength > arrLength) ) { return false; } // Assume cyclic values are equal. var stacked = stack.get(array); if (stacked && stack.get(other)) { return stacked == other; } var index = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined; stack.set(array, other); stack.set(other, array); // Ignore non-index properties. while (++index < arrLength) { var arrValue = array[index], othValue = other[index]; if (customizer) { var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer( arrValue, othValue, index, array, other, stack, ); } if (compared !== undefined) { if (compared) { continue; } result = false; break; } // Recursively compare arrays (susceptible to call stack limits). if (seen) { if ( !arraySome(other, function (othValue, othIndex) { if ( !cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc( arrValue, othValue, bitmask, customizer, stack, )) ) { return seen.push(othIndex); } }) ) { result = false; break; } } else if ( !( arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack) ) ) { result = false; break; } } stack['delete'](array); stack['delete'](other); return result; } /** * A specialized version of `baseIsEqualDeep` for comparing objects of * the same `toStringTag`. * * **Note:** This function only supports comparing values with tags of * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalByTag( object, other, tag, bitmask, customizer, equalFunc, stack, ) { switch (tag) { case dataViewTag: if ( object.byteLength != other.byteLength || object.byteOffset != other.byteOffset ) { return false; } object = object.buffer; other = other.buffer; case arrayBufferTag: if ( object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other)) ) { return false; } return true; case boolTag: case dateTag: case numberTag: // Coerce booleans to `1` or `0` and dates to milliseconds. // Invalid dates are coerced to `NaN`. return eq(+object, +other); case errorTag: return ( object.name == other.name && object.message == other.message ); case regexpTag: case stringTag: // Coerce regexes to strings and treat strings, primitives and objects, // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring // for more details. return object == other + ''; case mapTag: var convert = mapToArray; case setTag: var isPartial = bitmask & COMPARE_PARTIAL_FLAG; convert || (convert = setToArray); if (object.size != other.size && !isPartial) { return false; } // Assume cyclic values are equal. var stacked = stack.get(object); if (stacked) { return stacked == other; } bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits). stack.set(object, other); var result = equalArrays( convert(object), convert(other), bitmask, customizer, equalFunc, stack, ); stack['delete'](object); return result; case symbolTag: if (symbolValueOf) { return ( symbolValueOf.call(object) == symbolValueOf.call(other) ); } } return false; } /** * A specialized version of `baseIsEqualDeep` for objects with support for * partial deep comparisons. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalObjects( object, other, bitmask, customizer, equalFunc, stack, ) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; if (objLength != othLength && !isPartial) { return false; } var index = objLength; while (index--) { var key = objProps[index]; if ( !(isPartial ? key in other : hasOwnProperty.call(other, key)) ) { return false; } } // Assume cyclic values are equal. var stacked = stack.get(object); if (stacked && stack.get(other)) { return stacked == other; } var result = true; stack.set(object, other); stack.set(other, object); var skipCtor = isPartial; while (++index < objLength) { key = objProps[index]; var objValue = object[key], othValue = other[key]; if (customizer) { var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); } // Recursively compare objects (susceptible to call stack limits). if ( !(compared === undefined ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared) ) { result = false; break; } skipCtor || (skipCtor = key == 'constructor'); } if (result && !skipCtor) { var objCtor = object.constructor, othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal. if ( objCtor != othCtor && 'constructor' in object && 'constructor' in other && !( typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor ) ) { result = false; } } stack['delete'](object); stack['delete'](other); return result; } /** * A specialized version of `baseRest` which flattens the rest array. * * @private * @param {Function} func The function to apply a rest parameter to. * @returns {Function} Returns the new function. */ function flatRest(func) { return setToString(overRest(func, undefined, flatten), func + ''); } /** * Creates an array of own enumerable property names and symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeys(object) { return baseGetAllKeys(object, keys, getSymbols); } /** * Creates an array of own and inherited enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeysIn(object) { return baseGetAllKeys(object, keysIn, getSymbolsIn); } /** * Gets metadata for `func`. * * @private * @param {Function} func The function to query. * @returns {*} Returns the metadata for `func`. */ var getData = !metaMap ? noop : function (func) { return metaMap.get(func); }; /** * Gets the name of `func`. * * @private * @param {Function} func The function to query. * @returns {string} Returns the function name. */ function getFuncName(func) { var result = func.name + '', array = realNames[result], length = hasOwnProperty.call(realNames, result) ? array.length : 0; while (length--) { var data = array[length], otherFunc = data.func; if (otherFunc == null || otherFunc == func) { return data.name; } } return result; } /** * Gets the argument placeholder value for `func`. * * @private * @param {Function} func The function to inspect. * @returns {*} Returns the placeholder value. */ function getHolder(func) { var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; return object.placeholder; } /** * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, * this function returns the custom method, otherwise it returns `baseIteratee`. * If arguments are provided, the chosen function is invoked with them and * its result is returned. * * @private * @param {*} [value] The value to convert to an iteratee. * @param {number} [arity] The arity of the created iteratee. * @returns {Function} Returns the chosen function or its result. */ function getIteratee() { var result = lodash.iteratee || iteratee; result = result === iteratee ? baseIteratee : result; return arguments.length ? result(arguments[0], arguments[1]) : result; } /** * Gets the data for `map`. * * @private * @param {Object} map The map to query. * @param {string} key The reference key. * @returns {*} Returns the map data. */ function getMapData(map, key) { var data = map.__data__; return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; } /** * Gets the property names, values, and compare flags of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the match data of `object`. */ function getMatchData(object) { var result = keys(object), length = result.length; while (length--) { var key = result[length], value = object[key]; result[length] = [key, value, isStrictComparable(value)]; } return result; } /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : undefined; } /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } /** * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbols = !nativeGetSymbols ? stubArray : function (object) { if (object == null) { return []; } object = Object(object); return arrayFilter( nativeGetSymbols(object), function (symbol) { return propertyIsEnumerable.call(object, symbol); }, ); }; /** * Creates an array of the own and inherited enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbolsIn = !nativeGetSymbols ? stubArray : function (object) { var result = []; while (object) { arrayPush(result, getSymbols(object)); object = getPrototype(object); } return result; }; /** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. if ( (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || (Map && getTag(new Map()) != mapTag) || (Promise && getTag(Promise.resolve()) != promiseTag) || (Set && getTag(new Set()) != setTag) || (WeakMap && getTag(new WeakMap()) != weakMapTag) ) { getTag = function (value) { var result = baseGetTag(value), Ctor = result == objectTag ? value.constructor : undefined, ctorString = Ctor ? toSource(Ctor) : ''; if (ctorString) { switch (ctorString) { case dataViewCtorString: return dataViewTag; case mapCtorString: return mapTag; case promiseCtorString: return promiseTag; case setCtorString: return setTag; case weakMapCtorString: return weakMapTag; } } return result; }; } /** * Gets the view, applying any `transforms` to the `start` and `end` positions. * * @private * @param {number} start The start of the view. * @param {number} end The end of the view. * @param {Array} transforms The transformations to apply to the view. * @returns {Object} Returns an object containing the `start` and `end` * positions of the view. */ function getView(start, end, transforms) { var index = -1, length = transforms.length; while (++index < length) { var data = transforms[index], size = data.size; switch (data.type) { case 'drop': start += size; break; case 'dropRight': end -= size; break; case 'take': end = nativeMin(end, start + size); break; case 'takeRight': start = nativeMax(start, end - size); break; } } return { start: start, end: end }; } /** * Extracts wrapper details from the `source` body comment. * * @private * @param {string} source The source to inspect. * @returns {Array} Returns the wrapper details. */ function getWrapDetails(source) { var match = source.match(reWrapDetails); return match ? match[1].split(reSplitDetails) : []; } /** * Checks if `path` exists on `object`. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @param {Function} hasFunc The function to check properties. * @returns {boolean} Returns `true` if `path` exists, else `false`. */ function hasPath(object, path, hasFunc) { path = castPath(path, object); var index = -1, length = path.length, result = false; while (++index < length) { var key = toKey(path[index]); if (!(result = object != null && hasFunc(object, key))) { break; } object = object[key]; } if (result || ++index != length) { return result; } length = object == null ? 0 : object.length; return ( !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)) ); } /** * Initializes an array clone. * * @private * @param {Array} array The array to clone. * @returns {Array} Returns the initialized clone. */ function initCloneArray(array) { var length = array.length, result = new array.constructor(length); // Add properties assigned by `RegExp#exec`. if ( length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index') ) { result.index = array.index; result.input = array.input; } return result; } /** * Initializes an object clone. * * @private * @param {Object} object The object to clone. * @returns {Object} Returns the initialized clone. */ function initCloneObject(object) { return typeof object.constructor == 'function' && !isPrototype(object) ? baseCreate(getPrototype(object)) : {}; } /** * Initializes an object clone based on its `toStringTag`. * * **Note:** This function only supports cloning values with tags of * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. * * @private * @param {Object} object The object to clone. * @param {string} tag The `toStringTag` of the object to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the initialized clone. */ function initCloneByTag(object, tag, isDeep) { var Ctor = object.constructor; switch (tag) { case arrayBufferTag: return cloneArrayBuffer(object); case boolTag: case dateTag: return new Ctor(+object); case dataViewTag: return cloneDataView(object, isDeep); case float32Tag: case float64Tag: case int8Tag: case int16Tag: case int32Tag: case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: return cloneTypedArray(object, isDeep); case mapTag: return new Ctor(); case numberTag: case stringTag: return new Ctor(object); case regexpTag: return cloneRegExp(object); case setTag: return new Ctor(); case symbolTag: return cloneSymbol(object); } } /** * Inserts wrapper `details` in a comment at the top of the `source` body. * * @private * @param {string} source The source to modify. * @returns {Array} details The details to insert. * @returns {string} Returns the modified source. */ function insertWrapDetails(source, details) { var length = details.length; if (!length) { return source; } var lastIndex = length - 1; details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; details = details.join(length > 2 ? ', ' : ' '); return source.replace( reWrapComment, '{\n/* [wrapped with ' + details + '] */\n', ); } /** * Checks if `value` is a flattenable `arguments` object or array. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. */ function isFlattenable(value) { return ( isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]) ); } /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { var type = typeof value; length = length == null ? MAX_SAFE_INTEGER : length; return ( !!length && (type == 'number' || (type != 'symbol' && reIsUint.test(value))) && value > -1 && value % 1 == 0 && value < length ); } /** * Checks if the given arguments are from an iteratee call. * * @private * @param {*} value The potential iteratee value argument. * @param {*} index The potential iteratee index or key argument. * @param {*} object The potential iteratee object argument. * @returns {boolean} Returns `true` if the arguments are from an iteratee call, * else `false`. */ function isIterateeCall(value, index, object) { if (!isObject(object)) { return false; } var type = typeof index; if ( type == 'number' ? isArrayLike(object) && isIndex(index, object.length) : type == 'string' && index in object ) { return eq(object[index], value); } return false; } /** * Checks if `value` is a property name and not a property path. * * @private * @param {*} value The value to check. * @param {Object} [object] The object to query keys on. * @returns {boolean} Returns `true` if `value` is a property name, else `false`. */ function isKey(value, object) { if (isArray(value)) { return false; } var type = typeof value; if ( type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value) ) { return true; } return ( reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (object != null && value in Object(object)) ); } /** * Checks if `value` is suitable for use as unique object key. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ function isKeyable(value) { var type = typeof value; return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null; } /** * Checks if `func` has a lazy counterpart. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` has a lazy counterpart, * else `false`. */ function isLaziable(func) { var funcName = getFuncName(func), other = lodash[funcName]; if ( typeof other != 'function' || !(funcName in LazyWrapper.prototype) ) { return false; } if (func === other) { return true; } var data = getData(other); return !!data && func === data[0]; } /** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ function isMasked(func) { return !!maskSrcKey && maskSrcKey in func; } /** * Checks if `func` is capable of being masked. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `func` is maskable, else `false`. */ var isMaskable = coreJsData ? isFunction : stubFalse; /** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */ function isPrototype(value) { var Ctor = value && value.constructor, proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; return value === proto; } /** * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` if suitable for strict * equality comparisons, else `false`. */ function isStrictComparable(value) { return value === value && !isObject(value); } /** * A specialized version of `matchesProperty` for source values suitable * for strict equality comparisons, i.e. `===`. * * @private * @param {string} key The key of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function matchesStrictComparable(key, srcValue) { return function (object) { if (object == null) { return false; } return ( object[key] === srcValue && (srcValue !== undefined || key in Object(object)) ); }; } /** * A specialized version of `_.memoize` which clears the memoized function's * cache when it exceeds `MAX_MEMOIZE_SIZE`. * * @private * @param {Function} func The function to have its output memoized. * @returns {Function} Returns the new memoized function. */ function memoizeCapped(func) { var result = memoize(func, function (key) { if (cache.size === MAX_MEMOIZE_SIZE) { cache.clear(); } return key; }); var cache = result.cache; return result; } /** * Merges the function metadata of `source` into `data`. * * Merging metadata reduces the number of wrappers used to invoke a function. * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` * may be applied regardless of execution order. Methods like `_.ary` and * `_.rearg` modify function arguments, making the order in which they are * executed important, preventing the merging of metadata. However, we make * an exception for a safe combined case where curried functions have `_.ary` * and or `_.rearg` applied. * * @private * @param {Array} data The destination metadata. * @param {Array} source The source metadata. * @returns {Array} Returns `data`. */ function mergeData(data, source) { var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); var isCombo = (srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG) || (srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8]) || (srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG); // Exit early if metadata can't be merged. if (!(isCommon || isCombo)) { return data; } // Use source `thisArg` if available. if (srcBitmask & WRAP_BIND_FLAG) { data[2] = source[2]; // Set when currying a bound function. newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; } // Compose partial arguments. var value = source[3]; if (value) { var partials = data[3]; data[3] = partials ? composeArgs(partials, value, source[4]) : value; data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; } // Compose partial right arguments. value = source[5]; if (value) { partials = data[5]; data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; } // Use source `argPos` if available. value = source[7]; if (value) { data[7] = value; } // Use source `ary` if it's smaller. if (srcBitmask & WRAP_ARY_FLAG) { data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); } // Use source `arity` if one is not provided. if (data[9] == null) { data[9] = source[9]; } // Use source `func` and merge bitmasks. data[0] = source[0]; data[1] = newBitmask; return data; } /** * This function is like * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * except that it includes inherited enumerable properties. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function nativeKeysIn(object) { var result = []; if (object != null) { for (var key in Object(object)) { result.push(key); } } return result; } /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString.call(value); } /** * A specialized version of `baseRest` which transforms the rest array. * * @private * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @param {Function} transform The rest array transform. * @returns {Function} Returns the new function. */ function overRest(func, start, transform) { start = nativeMax( start === undefined ? func.length - 1 : start, 0, ); return function () { var args = arguments, index = -1, length = nativeMax(args.length - start, 0), array = Array(length); while (++index < length) { array[index] = args[start + index]; } index = -1; var otherArgs = Array(start + 1); while (++index < start) { otherArgs[index] = args[index]; } otherArgs[start] = transform(array); return apply(func, this, otherArgs); }; } /** * Gets the parent value at `path` of `object`. * * @private * @param {Object} object The object to query. * @param {Array} path The path to get the parent value of. * @returns {*} Returns the parent value. */ function parent(object, path) { return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); } /** * Reorder `array` according to the specified indexes where the element at * the first index is assigned as the first element, the element at * the second index is assigned as the second element, and so on. * * @private * @param {Array} array The array to reorder. * @param {Array} indexes The arranged array indexes. * @returns {Array} Returns `array`. */ function reorder(array, indexes) { var arrLength = array.length, length = nativeMin(indexes.length, arrLength), oldArray = copyArray(array); while (length--) { var index = indexes[length]; array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; } return array; } /** * Sets metadata for `func`. * * **Note:** If this function becomes hot, i.e. is invoked a lot in a short * period of time, it will trip its breaker and transition to an identity * function to avoid garbage collection pauses in V8. See * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) * for more details. * * @private * @param {Function} func The function to associate metadata with. * @param {*} data The metadata. * @returns {Function} Returns `func`. */ var setData = shortOut(baseSetData); /** * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). * * @private * @param {Function} func The function to delay. * @param {number} wait The number of milliseconds to delay invocation. * @returns {number|Object} Returns the timer id or timeout object. */ var setTimeout = ctxSetTimeout || function (func, wait) { return root.setTimeout(func, wait); }; /** * Sets the `toString` method of `func` to return `string`. * * @private * @param {Function} func The function to modify. * @param {Function} string The `toString` result. * @returns {Function} Returns `func`. */ var setToString = shortOut(baseSetToString); /** * Sets the `toString` method of `wrapper` to mimic the source of `reference` * with wrapper details in a comment at the top of the source body. * * @private * @param {Function} wrapper The function to modify. * @param {Function} reference The reference function. * @param {number} bitmask The bitmask flags. See `createWrap` for more details. * @returns {Function} Returns `wrapper`. */ function setWrapToString(wrapper, reference, bitmask) { var source = reference + ''; return setToString( wrapper, insertWrapDetails( source, updateWrapDetails(getWrapDetails(source), bitmask), ), ); } /** * Creates a function that'll short out and invoke `identity` instead * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` * milliseconds. * * @private * @param {Function} func The function to restrict. * @returns {Function} Returns the new shortable function. */ function shortOut(func) { var count = 0, lastCalled = 0; return function () { var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled); lastCalled = stamp; if (remaining > 0) { if (++count >= HOT_COUNT) { return arguments[0]; } } else { count = 0; } return func.apply(undefined, arguments); }; } /** * A specialized version of `_.shuffle` which mutates and sets the size of `array`. * * @private * @param {Array} array The array to shuffle. * @param {number} [size=array.length] The size of `array`. * @returns {Array} Returns `array`. */ function shuffleSelf(array, size) { var index = -1, length = array.length, lastIndex = length - 1; size = size === undefined ? length : size; while (++index < size) { var rand = baseRandom(index, lastIndex), value = array[rand]; array[rand] = array[index]; array[index] = value; } array.length = size; return array; } /** * Converts `string` to a property path array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the property path array. */ var stringToPath = memoizeCapped(function (string) { var result = []; if (string.charCodeAt(0) === 46 /* . */) { result.push(''); } string.replace( rePropName, function (match, number, quote, subString) { result.push( quote ? subString.replace(reEscapeChar, '$1') : number || match, ); }, ); return result; }); /** * Converts `value` to a string key if it's not a string or symbol. * * @private * @param {*} value The value to inspect. * @returns {string|symbol} Returns the key. */ function toKey(value) { if (typeof value == 'string' || isSymbol(value)) { return value; } var result = value + ''; return result == '0' && 1 / value == -INFINITY ? '-0' : result; } /** * Converts `func` to its source code. * * @private * @param {Function} func The function to convert. * @returns {string} Returns the source code. */ function toSource(func) { if (func != null) { try { return funcToString.call(func); } catch (e) {} try { return func + ''; } catch (e) {} } return ''; } /** * Updates wrapper `details` based on `bitmask` flags. * * @private * @returns {Array} details The details to modify. * @param {number} bitmask The bitmask flags. See `createWrap` for more details. * @returns {Array} Returns `details`. */ function updateWrapDetails(details, bitmask) { arrayEach(wrapFlags, function (pair) { var value = '_.' + pair[0]; if (bitmask & pair[1] && !arrayIncludes(details, value)) { details.push(value); } }); return details.sort(); } /** * Creates a clone of `wrapper`. * * @private * @param {Object} wrapper The wrapper to clone. * @returns {Object} Returns the cloned wrapper. */ function wrapperClone(wrapper) { if (wrapper instanceof LazyWrapper) { return wrapper.clone(); } var result = new LodashWrapper( wrapper.__wrapped__, wrapper.__chain__, ); result.__actions__ = copyArray(wrapper.__actions__); result.__index__ = wrapper.__index__; result.__values__ = wrapper.__values__; return result; } /*------------------------------------------------------------------------*/ /** * Creates an array of elements split into groups the length of `size`. * If `array` can't be split evenly, the final chunk will be the remaining * elements. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to process. * @param {number} [size=1] The length of each chunk * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the new array of chunks. * @example * * _.chunk(['a', 'b', 'c', 'd'], 2); * // => [['a', 'b'], ['c', 'd']] * * _.chunk(['a', 'b', 'c', 'd'], 3); * // => [['a', 'b', 'c'], ['d']] */ function chunk(array, size, guard) { if ( guard ? isIterateeCall(array, size, guard) : size === undefined ) { size = 1; } else { size = nativeMax(toInteger(size), 0); } var length = array == null ? 0 : array.length; if (!length || size < 1) { return []; } var index = 0, resIndex = 0, result = Array(nativeCeil(length / size)); while (index < length) { result[resIndex++] = baseSlice(array, index, (index += size)); } return result; } /** * Creates an array with all falsey values removed. The values `false`, `null`, * `0`, `""`, `undefined`, and `NaN` are falsey. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to compact. * @returns {Array} Returns the new array of filtered values. * @example * * _.compact([0, 1, false, 2, '', 3]); * // => [1, 2, 3] */ function compact(array) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (value) { result[resIndex++] = value; } } return result; } /** * Creates a new array concatenating `array` with any additional arrays * and/or values. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to concatenate. * @param {...*} [values] The values to concatenate. * @returns {Array} Returns the new concatenated array. * @example * * var array = [1]; * var other = _.concat(array, 2, [3], [[4]]); * * console.log(other); * // => [1, 2, 3, [4]] * * console.log(array); * // => [1] */ function concat() { var length = arguments.length; if (!length) { return []; } var args = Array(length - 1), array = arguments[0], index = length; while (index--) { args[index - 1] = arguments[index]; } return arrayPush( isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1), ); } /** * Creates an array of `array` values not included in the other given arrays * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. The order and references of result values are * determined by the first array. * * **Note:** Unlike `_.pullAll`, this method returns a new array. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to inspect. * @param {...Array} [values] The values to exclude. * @returns {Array} Returns the new array of filtered values. * @see _.without, _.xor * @example * * _.difference([2, 1], [2, 3]); * // => [1] */ var difference = baseRest(function (array, values) { return isArrayLikeObject(array) ? baseDifference( array, baseFlatten(values, 1, isArrayLikeObject, true), ) : []; }); /** * This method is like `_.difference` except that it accepts `iteratee` which * is invoked for each element of `array` and `values` to generate the criterion * by which they're compared. The order and references of result values are * determined by the first array. The iteratee is invoked with one argument: * (value). * * **Note:** Unlike `_.pullAllBy`, this method returns a new array. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to inspect. * @param {...Array} [values] The values to exclude. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {Array} Returns the new array of filtered values. * @example * * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); * // => [1.2] * * // The `_.property` iteratee shorthand. * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); * // => [{ 'x': 2 }] */ var differenceBy = baseRest(function (array, values) { var iteratee = last(values); if (isArrayLikeObject(iteratee)) { iteratee = undefined; } return isArrayLikeObject(array) ? baseDifference( array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2), ) : []; }); /** * This method is like `_.difference` except that it accepts `comparator` * which is invoked to compare elements of `array` to `values`. The order and * references of result values are determined by the first array. The comparator * is invoked with two arguments: (arrVal, othVal). * * **Note:** Unlike `_.pullAllWith`, this method returns a new array. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to inspect. * @param {...Array} [values] The values to exclude. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new array of filtered values. * @example * * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; * * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); * // => [{ 'x': 2, 'y': 1 }] */ var differenceWith = baseRest(function (array, values) { var comparator = last(values); if (isArrayLikeObject(comparator)) { comparator = undefined; } return isArrayLikeObject(array) ? baseDifference( array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator, ) : []; }); /** * Creates a slice of `array` with `n` elements dropped from the beginning. * * @static * @memberOf _ * @since 0.5.0 * @category Array * @param {Array} array The array to query. * @param {number} [n=1] The number of elements to drop. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the slice of `array`. * @example * * _.drop([1, 2, 3]); * // => [2, 3] * * _.drop([1, 2, 3], 2); * // => [3] * * _.drop([1, 2, 3], 5); * // => [] * * _.drop([1, 2, 3], 0); * // => [1, 2, 3] */ function drop(array, n, guard) { var length = array == null ? 0 : array.length; if (!length) { return []; } n = guard || n === undefined ? 1 : toInteger(n); return baseSlice(array, n < 0 ? 0 : n, length); } /** * Creates a slice of `array` with `n` elements dropped from the end. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to query. * @param {number} [n=1] The number of elements to drop. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the slice of `array`. * @example * * _.dropRight([1, 2, 3]); * // => [1, 2] * * _.dropRight([1, 2, 3], 2); * // => [1] * * _.dropRight([1, 2, 3], 5); * // => [] * * _.dropRight([1, 2, 3], 0); * // => [1, 2, 3] */ function dropRight(array, n, guard) { var length = array == null ? 0 : array.length; if (!length) { return []; } n = guard || n === undefined ? 1 : toInteger(n); n = length - n; return baseSlice(array, 0, n < 0 ? 0 : n); } /** * Creates a slice of `array` excluding elements dropped from the end. * Elements are dropped until `predicate` returns falsey. The predicate is * invoked with three arguments: (value, index, array). * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to query. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {Array} Returns the slice of `array`. * @example * * var users = [ * { 'user': 'barney', 'active': true }, * { 'user': 'fred', 'active': false }, * { 'user': 'pebbles', 'active': false } * ]; * * _.dropRightWhile(users, function(o) { return !o.active; }); * // => objects for ['barney'] * * // The `_.matches` iteratee shorthand. * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); * // => objects for ['barney', 'fred'] * * // The `_.matchesProperty` iteratee shorthand. * _.dropRightWhile(users, ['active', false]); * // => objects for ['barney'] * * // The `_.property` iteratee shorthand. * _.dropRightWhile(users, 'active'); * // => objects for ['barney', 'fred', 'pebbles'] */ function dropRightWhile(array, predicate) { return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : []; } /** * Creates a slice of `array` excluding elements dropped from the beginning. * Elements are dropped until `predicate` returns falsey. The predicate is * invoked with three arguments: (value, index, array). * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to query. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {Array} Returns the slice of `array`. * @example * * var users = [ * { 'user': 'barney', 'active': false }, * { 'user': 'fred', 'active': false }, * { 'user': 'pebbles', 'active': true } * ]; * * _.dropWhile(users, function(o) { return !o.active; }); * // => objects for ['pebbles'] * * // The `_.matches` iteratee shorthand. * _.dropWhile(users, { 'user': 'barney', 'active': false }); * // => objects for ['fred', 'pebbles'] * * // The `_.matchesProperty` iteratee shorthand. * _.dropWhile(users, ['active', false]); * // => objects for ['pebbles'] * * // The `_.property` iteratee shorthand. * _.dropWhile(users, 'active'); * // => objects for ['barney', 'fred', 'pebbles'] */ function dropWhile(array, predicate) { return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : []; } /** * Fills elements of `array` with `value` from `start` up to, but not * including, `end`. * * **Note:** This method mutates `array`. * * @static * @memberOf _ * @since 3.2.0 * @category Array * @param {Array} array The array to fill. * @param {*} value The value to fill `array` with. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns `array`. * @example * * var array = [1, 2, 3]; * * _.fill(array, 'a'); * console.log(array); * // => ['a', 'a', 'a'] * * _.fill(Array(3), 2); * // => [2, 2, 2] * * _.fill([4, 6, 8, 10], '*', 1, 3); * // => [4, '*', '*', 10] */ function fill(array, value, start, end) { var length = array == null ? 0 : array.length; if (!length) { return []; } if ( start && typeof start != 'number' && isIterateeCall(array, value, start) ) { start = 0; end = length; } return baseFill(array, value, start, end); } /** * This method is like `_.find` except that it returns the index of the first * element `predicate` returns truthy for instead of the element itself. * * @static * @memberOf _ * @since 1.1.0 * @category Array * @param {Array} array The array to inspect. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @param {number} [fromIndex=0] The index to search from. * @returns {number} Returns the index of the found element, else `-1`. * @example * * var users = [ * { 'user': 'barney', 'active': false }, * { 'user': 'fred', 'active': false }, * { 'user': 'pebbles', 'active': true } * ]; * * _.findIndex(users, function(o) { return o.user == 'barney'; }); * // => 0 * * // The `_.matches` iteratee shorthand. * _.findIndex(users, { 'user': 'fred', 'active': false }); * // => 1 * * // The `_.matchesProperty` iteratee shorthand. * _.findIndex(users, ['active', false]); * // => 0 * * // The `_.property` iteratee shorthand. * _.findIndex(users, 'active'); * // => 2 */ function findIndex(array, predicate, fromIndex) { var length = array == null ? 0 : array.length; if (!length) { return -1; } var index = fromIndex == null ? 0 : toInteger(fromIndex); if (index < 0) { index = nativeMax(length + index, 0); } return baseFindIndex(array, getIteratee(predicate, 3), index); } /** * This method is like `_.findIndex` except that it iterates over elements * of `collection` from right to left. * * @static * @memberOf _ * @since 2.0.0 * @category Array * @param {Array} array The array to inspect. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @param {number} [fromIndex=array.length-1] The index to search from. * @returns {number} Returns the index of the found element, else `-1`. * @example * * var users = [ * { 'user': 'barney', 'active': true }, * { 'user': 'fred', 'active': false }, * { 'user': 'pebbles', 'active': false } * ]; * * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); * // => 2 * * // The `_.matches` iteratee shorthand. * _.findLastIndex(users, { 'user': 'barney', 'active': true }); * // => 0 * * // The `_.matchesProperty` iteratee shorthand. * _.findLastIndex(users, ['active', false]); * // => 2 * * // The `_.property` iteratee shorthand. * _.findLastIndex(users, 'active'); * // => 0 */ function findLastIndex(array, predicate, fromIndex) { var length = array == null ? 0 : array.length; if (!length) { return -1; } var index = length - 1; if (fromIndex !== undefined) { index = toInteger(fromIndex); index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); } return baseFindIndex( array, getIteratee(predicate, 3), index, true, ); } /** * Flattens `array` a single level deep. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.flatten([1, [2, [3, [4]], 5]]); * // => [1, 2, [3, [4]], 5] */ function flatten(array) { var length = array == null ? 0 : array.length; return length ? baseFlatten(array, 1) : []; } /** * Recursively flattens `array`. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.flattenDeep([1, [2, [3, [4]], 5]]); * // => [1, 2, 3, 4, 5] */ function flattenDeep(array) { var length = array == null ? 0 : array.length; return length ? baseFlatten(array, INFINITY) : []; } /** * Recursively flatten `array` up to `depth` times. * * @static * @memberOf _ * @since 4.4.0 * @category Array * @param {Array} array The array to flatten. * @param {number} [depth=1] The maximum recursion depth. * @returns {Array} Returns the new flattened array. * @example * * var array = [1, [2, [3, [4]], 5]]; * * _.flattenDepth(array, 1); * // => [1, 2, [3, [4]], 5] * * _.flattenDepth(array, 2); * // => [1, 2, 3, [4], 5] */ function flattenDepth(array, depth) { var length = array == null ? 0 : array.length; if (!length) { return []; } depth = depth === undefined ? 1 : toInteger(depth); return baseFlatten(array, depth); } /** * The inverse of `_.toPairs`; this method returns an object composed * from key-value `pairs`. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} pairs The key-value pairs. * @returns {Object} Returns the new object. * @example * * _.fromPairs([['a', 1], ['b', 2]]); * // => { 'a': 1, 'b': 2 } */ function fromPairs(pairs) { var index = -1, length = pairs == null ? 0 : pairs.length, result = {}; while (++index < length) { var pair = pairs[index]; result[pair[0]] = pair[1]; } return result; } /** * Gets the first element of `array`. * * @static * @memberOf _ * @since 0.1.0 * @alias first * @category Array * @param {Array} array The array to query. * @returns {*} Returns the first element of `array`. * @example * * _.head([1, 2, 3]); * // => 1 * * _.head([]); * // => undefined */ function head(array) { return array && array.length ? array[0] : undefined; } /** * Gets the index at which the first occurrence of `value` is found in `array` * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. If `fromIndex` is negative, it's used as the * offset from the end of `array`. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} [fromIndex=0] The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. * @example * * _.indexOf([1, 2, 1, 2], 2); * // => 1 * * // Search from the `fromIndex`. * _.indexOf([1, 2, 1, 2], 2, 2); * // => 3 */ function indexOf(array, value, fromIndex) { var length = array == null ? 0 : array.length; if (!length) { return -1; } var index = fromIndex == null ? 0 : toInteger(fromIndex); if (index < 0) { index = nativeMax(length + index, 0); } return baseIndexOf(array, value, index); } /** * Gets all but the last element of `array`. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to query. * @returns {Array} Returns the slice of `array`. * @example * * _.initial([1, 2, 3]); * // => [1, 2] */ function initial(array) { var length = array == null ? 0 : array.length; return length ? baseSlice(array, 0, -1) : []; } /** * Creates an array of unique values that are included in all given arrays * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. The order and references of result values are * determined by the first array. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @returns {Array} Returns the new array of intersecting values. * @example * * _.intersection([2, 1], [2, 3]); * // => [2] */ var intersection = baseRest(function (arrays) { var mapped = arrayMap(arrays, castArrayLikeObject); return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : []; }); /** * This method is like `_.intersection` except that it accepts `iteratee` * which is invoked for each element of each `arrays` to generate the criterion * by which they're compared. The order and references of result values are * determined by the first array. The iteratee is invoked with one argument: * (value). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {Array} Returns the new array of intersecting values. * @example * * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); * // => [2.1] * * // The `_.property` iteratee shorthand. * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); * // => [{ 'x': 1 }] */ var intersectionBy = baseRest(function (arrays) { var iteratee = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); if (iteratee === last(mapped)) { iteratee = undefined; } else { mapped.pop(); } return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee, 2)) : []; }); /** * This method is like `_.intersection` except that it accepts `comparator` * which is invoked to compare elements of `arrays`. The order and references * of result values are determined by the first array. The comparator is * invoked with two arguments: (arrVal, othVal). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new array of intersecting values. * @example * * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; * * _.intersectionWith(objects, others, _.isEqual); * // => [{ 'x': 1, 'y': 2 }] */ var intersectionWith = baseRest(function (arrays) { var comparator = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); comparator = typeof comparator == 'function' ? comparator : undefined; if (comparator) { mapped.pop(); } return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined, comparator) : []; }); /** * Converts all elements in `array` into a string separated by `separator`. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to convert. * @param {string} [separator=','] The element separator. * @returns {string} Returns the joined string. * @example * * _.join(['a', 'b', 'c'], '~'); * // => 'a~b~c' */ function join(array, separator) { return array == null ? '' : nativeJoin.call(array, separator); } /** * Gets the last element of `array`. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to query. * @returns {*} Returns the last element of `array`. * @example * * _.last([1, 2, 3]); * // => 3 */ function last(array) { var length = array == null ? 0 : array.length; return length ? array[length - 1] : undefined; } /** * This method is like `_.indexOf` except that it iterates over elements of * `array` from right to left. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @param {number} [fromIndex=array.length-1] The index to search from. * @returns {number} Returns the index of the matched value, else `-1`. * @example * * _.lastIndexOf([1, 2, 1, 2], 2); * // => 3 * * // Search from the `fromIndex`. * _.lastIndexOf([1, 2, 1, 2], 2, 2); * // => 1 */ function lastIndexOf(array, value, fromIndex) { var length = array == null ? 0 : array.length; if (!length) { return -1; } var index = length; if (fromIndex !== undefined) { index = toInteger(fromIndex); index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); } return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true); } /** * Gets the element at index `n` of `array`. If `n` is negative, the nth * element from the end is returned. * * @static * @memberOf _ * @since 4.11.0 * @category Array * @param {Array} array The array to query. * @param {number} [n=0] The index of the element to return. * @returns {*} Returns the nth element of `array`. * @example * * var array = ['a', 'b', 'c', 'd']; * * _.nth(array, 1); * // => 'b' * * _.nth(array, -2); * // => 'c'; */ function nth(array, n) { return array && array.length ? baseNth(array, toInteger(n)) : undefined; } /** * Removes all given values from `array` using * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` * to remove elements from an array by predicate. * * @static * @memberOf _ * @since 2.0.0 * @category Array * @param {Array} array The array to modify. * @param {...*} [values] The values to remove. * @returns {Array} Returns `array`. * @example * * var array = ['a', 'b', 'c', 'a', 'b', 'c']; * * _.pull(array, 'a', 'c'); * console.log(array); * // => ['b', 'b'] */ var pull = baseRest(pullAll); /** * This method is like `_.pull` except that it accepts an array of values to remove. * * **Note:** Unlike `_.difference`, this method mutates `array`. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to modify. * @param {Array} values The values to remove. * @returns {Array} Returns `array`. * @example * * var array = ['a', 'b', 'c', 'a', 'b', 'c']; * * _.pullAll(array, ['a', 'c']); * console.log(array); * // => ['b', 'b'] */ function pullAll(array, values) { return array && array.length && values && values.length ? basePullAll(array, values) : array; } /** * This method is like `_.pullAll` except that it accepts `iteratee` which is * invoked for each element of `array` and `values` to generate the criterion * by which they're compared. The iteratee is invoked with one argument: (value). * * **Note:** Unlike `_.differenceBy`, this method mutates `array`. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to modify. * @param {Array} values The values to remove. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {Array} Returns `array`. * @example * * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; * * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); * console.log(array); * // => [{ 'x': 2 }] */ function pullAllBy(array, values, iteratee) { return array && array.length && values && values.length ? basePullAll(array, values, getIteratee(iteratee, 2)) : array; } /** * This method is like `_.pullAll` except that it accepts `comparator` which * is invoked to compare elements of `array` to `values`. The comparator is * invoked with two arguments: (arrVal, othVal). * * **Note:** Unlike `_.differenceWith`, this method mutates `array`. * * @static * @memberOf _ * @since 4.6.0 * @category Array * @param {Array} array The array to modify. * @param {Array} values The values to remove. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns `array`. * @example * * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; * * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); * console.log(array); * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] */ function pullAllWith(array, values, comparator) { return array && array.length && values && values.length ? basePullAll(array, values, undefined, comparator) : array; } /** * Removes elements from `array` corresponding to `indexes` and returns an * array of removed elements. * * **Note:** Unlike `_.at`, this method mutates `array`. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to modify. * @param {...(number|number[])} [indexes] The indexes of elements to remove. * @returns {Array} Returns the new array of removed elements. * @example * * var array = ['a', 'b', 'c', 'd']; * var pulled = _.pullAt(array, [1, 3]); * * console.log(array); * // => ['a', 'c'] * * console.log(pulled); * // => ['b', 'd'] */ var pullAt = flatRest(function (array, indexes) { var length = array == null ? 0 : array.length, result = baseAt(array, indexes); basePullAt( array, arrayMap(indexes, function (index) { return isIndex(index, length) ? +index : index; }).sort(compareAscending), ); return result; }); /** * Removes all elements from `array` that `predicate` returns truthy for * and returns an array of the removed elements. The predicate is invoked * with three arguments: (value, index, array). * * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` * to pull elements from an array by value. * * @static * @memberOf _ * @since 2.0.0 * @category Array * @param {Array} array The array to modify. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {Array} Returns the new array of removed elements. * @example * * var array = [1, 2, 3, 4]; * var evens = _.remove(array, function(n) { * return n % 2 == 0; * }); * * console.log(array); * // => [1, 3] * * console.log(evens); * // => [2, 4] */ function remove(array, predicate) { var result = []; if (!(array && array.length)) { return result; } var index = -1, indexes = [], length = array.length; predicate = getIteratee(predicate, 3); while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result.push(value); indexes.push(index); } } basePullAt(array, indexes); return result; } /** * Reverses `array` so that the first element becomes the last, the second * element becomes the second to last, and so on. * * **Note:** This method mutates `array` and is based on * [`Array#reverse`](https://mdn.io/Array/reverse). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to modify. * @returns {Array} Returns `array`. * @example * * var array = [1, 2, 3]; * * _.reverse(array); * // => [3, 2, 1] * * console.log(array); * // => [3, 2, 1] */ function reverse(array) { return array == null ? array : nativeReverse.call(array); } /** * Creates a slice of `array` from `start` up to, but not including, `end`. * * **Note:** This method is used instead of * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are * returned. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */ function slice(array, start, end) { var length = array == null ? 0 : array.length; if (!length) { return []; } if ( end && typeof end != 'number' && isIterateeCall(array, start, end) ) { start = 0; end = length; } else { start = start == null ? 0 : toInteger(start); end = end === undefined ? length : toInteger(end); } return baseSlice(array, start, end); } /** * Uses a binary search to determine the lowest index at which `value` * should be inserted into `array` in order to maintain its sort order. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The sorted array to inspect. * @param {*} value The value to evaluate. * @returns {number} Returns the index at which `value` should be inserted * into `array`. * @example * * _.sortedIndex([30, 50], 40); * // => 1 */ function sortedIndex(array, value) { return baseSortedIndex(array, value); } /** * This method is like `_.sortedIndex` except that it accepts `iteratee` * which is invoked for `value` and each element of `array` to compute their * sort ranking. The iteratee is invoked with one argument: (value). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The sorted array to inspect. * @param {*} value The value to evaluate. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {number} Returns the index at which `value` should be inserted * into `array`. * @example * * var objects = [{ 'x': 4 }, { 'x': 5 }]; * * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); * // => 0 * * // The `_.property` iteratee shorthand. * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); * // => 0 */ function sortedIndexBy(array, value, iteratee) { return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); } /** * This method is like `_.indexOf` except that it performs a binary * search on a sorted `array`. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @returns {number} Returns the index of the matched value, else `-1`. * @example * * _.sortedIndexOf([4, 5, 5, 5, 6], 5); * // => 1 */ function sortedIndexOf(array, value) { var length = array == null ? 0 : array.length; if (length) { var index = baseSortedIndex(array, value); if (index < length && eq(array[index], value)) { return index; } } return -1; } /** * This method is like `_.sortedIndex` except that it returns the highest * index at which `value` should be inserted into `array` in order to * maintain its sort order. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The sorted array to inspect. * @param {*} value The value to evaluate. * @returns {number} Returns the index at which `value` should be inserted * into `array`. * @example * * _.sortedLastIndex([4, 5, 5, 5, 6], 5); * // => 4 */ function sortedLastIndex(array, value) { return baseSortedIndex(array, value, true); } /** * This method is like `_.sortedLastIndex` except that it accepts `iteratee` * which is invoked for `value` and each element of `array` to compute their * sort ranking. The iteratee is invoked with one argument: (value). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The sorted array to inspect. * @param {*} value The value to evaluate. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {number} Returns the index at which `value` should be inserted * into `array`. * @example * * var objects = [{ 'x': 4 }, { 'x': 5 }]; * * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); * // => 1 * * // The `_.property` iteratee shorthand. * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); * // => 1 */ function sortedLastIndexBy(array, value, iteratee) { return baseSortedIndexBy( array, value, getIteratee(iteratee, 2), true, ); } /** * This method is like `_.lastIndexOf` except that it performs a binary * search on a sorted `array`. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to inspect. * @param {*} value The value to search for. * @returns {number} Returns the index of the matched value, else `-1`. * @example * * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); * // => 3 */ function sortedLastIndexOf(array, value) { var length = array == null ? 0 : array.length; if (length) { var index = baseSortedIndex(array, value, true) - 1; if (eq(array[index], value)) { return index; } } return -1; } /** * This method is like `_.uniq` except that it's designed and optimized * for sorted arrays. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to inspect. * @returns {Array} Returns the new duplicate free array. * @example * * _.sortedUniq([1, 1, 2]); * // => [1, 2] */ function sortedUniq(array) { return array && array.length ? baseSortedUniq(array) : []; } /** * This method is like `_.uniqBy` except that it's designed and optimized * for sorted arrays. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to inspect. * @param {Function} [iteratee] The iteratee invoked per element. * @returns {Array} Returns the new duplicate free array. * @example * * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); * // => [1.1, 2.3] */ function sortedUniqBy(array, iteratee) { return array && array.length ? baseSortedUniq(array, getIteratee(iteratee, 2)) : []; } /** * Gets all but the first element of `array`. * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to query. * @returns {Array} Returns the slice of `array`. * @example * * _.tail([1, 2, 3]); * // => [2, 3] */ function tail(array) { var length = array == null ? 0 : array.length; return length ? baseSlice(array, 1, length) : []; } /** * Creates a slice of `array` with `n` elements taken from the beginning. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to query. * @param {number} [n=1] The number of elements to take. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the slice of `array`. * @example * * _.take([1, 2, 3]); * // => [1] * * _.take([1, 2, 3], 2); * // => [1, 2] * * _.take([1, 2, 3], 5); * // => [1, 2, 3] * * _.take([1, 2, 3], 0); * // => [] */ function take(array, n, guard) { if (!(array && array.length)) { return []; } n = guard || n === undefined ? 1 : toInteger(n); return baseSlice(array, 0, n < 0 ? 0 : n); } /** * Creates a slice of `array` with `n` elements taken from the end. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to query. * @param {number} [n=1] The number of elements to take. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the slice of `array`. * @example * * _.takeRight([1, 2, 3]); * // => [3] * * _.takeRight([1, 2, 3], 2); * // => [2, 3] * * _.takeRight([1, 2, 3], 5); * // => [1, 2, 3] * * _.takeRight([1, 2, 3], 0); * // => [] */ function takeRight(array, n, guard) { var length = array == null ? 0 : array.length; if (!length) { return []; } n = guard || n === undefined ? 1 : toInteger(n); n = length - n; return baseSlice(array, n < 0 ? 0 : n, length); } /** * Creates a slice of `array` with elements taken from the end. Elements are * taken until `predicate` returns falsey. The predicate is invoked with * three arguments: (value, index, array). * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to query. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {Array} Returns the slice of `array`. * @example * * var users = [ * { 'user': 'barney', 'active': true }, * { 'user': 'fred', 'active': false }, * { 'user': 'pebbles', 'active': false } * ]; * * _.takeRightWhile(users, function(o) { return !o.active; }); * // => objects for ['fred', 'pebbles'] * * // The `_.matches` iteratee shorthand. * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); * // => objects for ['pebbles'] * * // The `_.matchesProperty` iteratee shorthand. * _.takeRightWhile(users, ['active', false]); * // => objects for ['fred', 'pebbles'] * * // The `_.property` iteratee shorthand. * _.takeRightWhile(users, 'active'); * // => [] */ function takeRightWhile(array, predicate) { return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : []; } /** * Creates a slice of `array` with elements taken from the beginning. Elements * are taken until `predicate` returns falsey. The predicate is invoked with * three arguments: (value, index, array). * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to query. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {Array} Returns the slice of `array`. * @example * * var users = [ * { 'user': 'barney', 'active': false }, * { 'user': 'fred', 'active': false }, * { 'user': 'pebbles', 'active': true } * ]; * * _.takeWhile(users, function(o) { return !o.active; }); * // => objects for ['barney', 'fred'] * * // The `_.matches` iteratee shorthand. * _.takeWhile(users, { 'user': 'barney', 'active': false }); * // => objects for ['barney'] * * // The `_.matchesProperty` iteratee shorthand. * _.takeWhile(users, ['active', false]); * // => objects for ['barney', 'fred'] * * // The `_.property` iteratee shorthand. * _.takeWhile(users, 'active'); * // => [] */ function takeWhile(array, predicate) { return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : []; } /** * Creates an array of unique values, in order, from all given arrays using * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @returns {Array} Returns the new array of combined values. * @example * * _.union([2], [1, 2]); * // => [2, 1] */ var union = baseRest(function (arrays) { return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); }); /** * This method is like `_.union` except that it accepts `iteratee` which is * invoked for each element of each `arrays` to generate the criterion by * which uniqueness is computed. Result values are chosen from the first * array in which the value occurs. The iteratee is invoked with one argument: * (value). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {Array} Returns the new array of combined values. * @example * * _.unionBy([2.1], [1.2, 2.3], Math.floor); * // => [2.1, 1.2] * * // The `_.property` iteratee shorthand. * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); * // => [{ 'x': 1 }, { 'x': 2 }] */ var unionBy = baseRest(function (arrays) { var iteratee = last(arrays); if (isArrayLikeObject(iteratee)) { iteratee = undefined; } return baseUniq( baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2), ); }); /** * This method is like `_.union` except that it accepts `comparator` which * is invoked to compare elements of `arrays`. Result values are chosen from * the first array in which the value occurs. The comparator is invoked * with two arguments: (arrVal, othVal). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new array of combined values. * @example * * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; * * _.unionWith(objects, others, _.isEqual); * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] */ var unionWith = baseRest(function (arrays) { var comparator = last(arrays); comparator = typeof comparator == 'function' ? comparator : undefined; return baseUniq( baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator, ); }); /** * Creates a duplicate-free version of an array, using * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons, in which only the first occurrence of each element * is kept. The order of result values is determined by the order they occur * in the array. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to inspect. * @returns {Array} Returns the new duplicate free array. * @example * * _.uniq([2, 1, 2]); * // => [2, 1] */ function uniq(array) { return array && array.length ? baseUniq(array) : []; } /** * This method is like `_.uniq` except that it accepts `iteratee` which is * invoked for each element in `array` to generate the criterion by which * uniqueness is computed. The order of result values is determined by the * order they occur in the array. The iteratee is invoked with one argument: * (value). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to inspect. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {Array} Returns the new duplicate free array. * @example * * _.uniqBy([2.1, 1.2, 2.3], Math.floor); * // => [2.1, 1.2] * * // The `_.property` iteratee shorthand. * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); * // => [{ 'x': 1 }, { 'x': 2 }] */ function uniqBy(array, iteratee) { return array && array.length ? baseUniq(array, getIteratee(iteratee, 2)) : []; } /** * This method is like `_.uniq` except that it accepts `comparator` which * is invoked to compare elements of `array`. The order of result values is * determined by the order they occur in the array.The comparator is invoked * with two arguments: (arrVal, othVal). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {Array} array The array to inspect. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new duplicate free array. * @example * * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; * * _.uniqWith(objects, _.isEqual); * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] */ function uniqWith(array, comparator) { comparator = typeof comparator == 'function' ? comparator : undefined; return array && array.length ? baseUniq(array, undefined, comparator) : []; } /** * This method is like `_.zip` except that it accepts an array of grouped * elements and creates an array regrouping the elements to their pre-zip * configuration. * * @static * @memberOf _ * @since 1.2.0 * @category Array * @param {Array} array The array of grouped elements to process. * @returns {Array} Returns the new array of regrouped elements. * @example * * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); * // => [['a', 1, true], ['b', 2, false]] * * _.unzip(zipped); * // => [['a', 'b'], [1, 2], [true, false]] */ function unzip(array) { if (!(array && array.length)) { return []; } var length = 0; array = arrayFilter(array, function (group) { if (isArrayLikeObject(group)) { length = nativeMax(group.length, length); return true; } }); return baseTimes(length, function (index) { return arrayMap(array, baseProperty(index)); }); } /** * This method is like `_.unzip` except that it accepts `iteratee` to specify * how regrouped values should be combined. The iteratee is invoked with the * elements of each group: (...group). * * @static * @memberOf _ * @since 3.8.0 * @category Array * @param {Array} array The array of grouped elements to process. * @param {Function} [iteratee=_.identity] The function to combine * regrouped values. * @returns {Array} Returns the new array of regrouped elements. * @example * * var zipped = _.zip([1, 2], [10, 20], [100, 200]); * // => [[1, 10, 100], [2, 20, 200]] * * _.unzipWith(zipped, _.add); * // => [3, 30, 300] */ function unzipWith(array, iteratee) { if (!(array && array.length)) { return []; } var result = unzip(array); if (iteratee == null) { return result; } return arrayMap(result, function (group) { return apply(iteratee, undefined, group); }); } /** * Creates an array excluding all given values using * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * **Note:** Unlike `_.pull`, this method returns a new array. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to inspect. * @param {...*} [values] The values to exclude. * @returns {Array} Returns the new array of filtered values. * @see _.difference, _.xor * @example * * _.without([2, 1, 2, 3], 1, 2); * // => [3] */ var without = baseRest(function (array, values) { return isArrayLikeObject(array) ? baseDifference(array, values) : []; }); /** * Creates an array of unique values that is the * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) * of the given arrays. The order of result values is determined by the order * they occur in the arrays. * * @static * @memberOf _ * @since 2.4.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @returns {Array} Returns the new array of filtered values. * @see _.difference, _.without * @example * * _.xor([2, 1], [2, 3]); * // => [1, 3] */ var xor = baseRest(function (arrays) { return baseXor(arrayFilter(arrays, isArrayLikeObject)); }); /** * This method is like `_.xor` except that it accepts `iteratee` which is * invoked for each element of each `arrays` to generate the criterion by * which by which they're compared. The order of result values is determined * by the order they occur in the arrays. The iteratee is invoked with one * argument: (value). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {Array} Returns the new array of filtered values. * @example * * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); * // => [1.2, 3.4] * * // The `_.property` iteratee shorthand. * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); * // => [{ 'x': 2 }] */ var xorBy = baseRest(function (arrays) { var iteratee = last(arrays); if (isArrayLikeObject(iteratee)) { iteratee = undefined; } return baseXor( arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2), ); }); /** * This method is like `_.xor` except that it accepts `comparator` which is * invoked to compare elements of `arrays`. The order of result values is * determined by the order they occur in the arrays. The comparator is invoked * with two arguments: (arrVal, othVal). * * @static * @memberOf _ * @since 4.0.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. * @param {Function} [comparator] The comparator invoked per element. * @returns {Array} Returns the new array of filtered values. * @example * * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; * * _.xorWith(objects, others, _.isEqual); * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] */ var xorWith = baseRest(function (arrays) { var comparator = last(arrays); comparator = typeof comparator == 'function' ? comparator : undefined; return baseXor( arrayFilter(arrays, isArrayLikeObject), undefined, comparator, ); }); /** * Creates an array of grouped elements, the first of which contains the * first elements of the given arrays, the second of which contains the * second elements of the given arrays, and so on. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {...Array} [arrays] The arrays to process. * @returns {Array} Returns the new array of grouped elements. * @example * * _.zip(['a', 'b'], [1, 2], [true, false]); * // => [['a', 1, true], ['b', 2, false]] */ var zip = baseRest(unzip); /** * This method is like `_.fromPairs` except that it accepts two arrays, * one of property identifiers and one of corresponding values. * * @static * @memberOf _ * @since 0.4.0 * @category Array * @param {Array} [props=[]] The property identifiers. * @param {Array} [values=[]] The property values. * @returns {Object} Returns the new object. * @example * * _.zipObject(['a', 'b'], [1, 2]); * // => { 'a': 1, 'b': 2 } */ function zipObject(props, values) { return baseZipObject(props || [], values || [], assignValue); } /** * This method is like `_.zipObject` except that it supports property paths. * * @static * @memberOf _ * @since 4.1.0 * @category Array * @param {Array} [props=[]] The property identifiers. * @param {Array} [values=[]] The property values. * @returns {Object} Returns the new object. * @example * * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } */ function zipObjectDeep(props, values) { return baseZipObject(props || [], values || [], baseSet); } /** * This method is like `_.zip` except that it accepts `iteratee` to specify * how grouped values should be combined. The iteratee is invoked with the * elements of each group: (...group). * * @static * @memberOf _ * @since 3.8.0 * @category Array * @param {...Array} [arrays] The arrays to process. * @param {Function} [iteratee=_.identity] The function to combine * grouped values. * @returns {Array} Returns the new array of grouped elements. * @example * * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { * return a + b + c; * }); * // => [111, 222] */ var zipWith = baseRest(function (arrays) { var length = arrays.length, iteratee = length > 1 ? arrays[length - 1] : undefined; iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; return unzipWith(arrays, iteratee); }); /*------------------------------------------------------------------------*/ /** * Creates a `lodash` wrapper instance that wraps `value` with explicit method * chain sequences enabled. The result of such sequences must be unwrapped * with `_#value`. * * @static * @memberOf _ * @since 1.3.0 * @category Seq * @param {*} value The value to wrap. * @returns {Object} Returns the new `lodash` wrapper instance. * @example * * var users = [ * { 'user': 'barney', 'age': 36 }, * { 'user': 'fred', 'age': 40 }, * { 'user': 'pebbles', 'age': 1 } * ]; * * var youngest = _ * .chain(users) * .sortBy('age') * .map(function(o) { * return o.user + ' is ' + o.age; * }) * .head() * .value(); * // => 'pebbles is 1' */ function chain(value) { var result = lodash(value); result.__chain__ = true; return result; } /** * This method invokes `interceptor` and returns `value`. The interceptor * is invoked with one argument; (value). The purpose of this method is to * "tap into" a method chain sequence in order to modify intermediate results. * * @static * @memberOf _ * @since 0.1.0 * @category Seq * @param {*} value The value to provide to `interceptor`. * @param {Function} interceptor The function to invoke. * @returns {*} Returns `value`. * @example * * _([1, 2, 3]) * .tap(function(array) { * // Mutate input array. * array.pop(); * }) * .reverse() * .value(); * // => [2, 1] */ function tap(value, interceptor) { interceptor(value); return value; } /** * This method is like `_.tap` except that it returns the result of `interceptor`. * The purpose of this method is to "pass thru" values replacing intermediate * results in a method chain sequence. * * @static * @memberOf _ * @since 3.0.0 * @category Seq * @param {*} value The value to provide to `interceptor`. * @param {Function} interceptor The function to invoke. * @returns {*} Returns the result of `interceptor`. * @example * * _(' abc ') * .chain() * .trim() * .thru(function(value) { * return [value]; * }) * .value(); * // => ['abc'] */ function thru(value, interceptor) { return interceptor(value); } /** * This method is the wrapper version of `_.at`. * * @name at * @memberOf _ * @since 1.0.0 * @category Seq * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Object} Returns the new `lodash` wrapper instance. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; * * _(object).at(['a[0].b.c', 'a[1]']).value(); * // => [3, 4] */ var wrapperAt = flatRest(function (paths) { var length = paths.length, start = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function (object) { return baseAt(object, paths); }; if ( length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start) ) { return this.thru(interceptor); } value = value.slice(start, +start + (length ? 1 : 0)); value.__actions__.push({ func: thru, args: [interceptor], thisArg: undefined, }); return new LodashWrapper(value, this.__chain__).thru(function ( array, ) { if (length && !array.length) { array.push(undefined); } return array; }); }); /** * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. * * @name chain * @memberOf _ * @since 0.1.0 * @category Seq * @returns {Object} Returns the new `lodash` wrapper instance. * @example * * var users = [ * { 'user': 'barney', 'age': 36 }, * { 'user': 'fred', 'age': 40 } * ]; * * // A sequence without explicit chaining. * _(users).head(); * // => { 'user': 'barney', 'age': 36 } * * // A sequence with explicit chaining. * _(users) * .chain() * .head() * .pick('user') * .value(); * // => { 'user': 'barney' } */ function wrapperChain() { return chain(this); } /** * Executes the chain sequence and returns the wrapped result. * * @name commit * @memberOf _ * @since 3.2.0 * @category Seq * @returns {Object} Returns the new `lodash` wrapper instance. * @example * * var array = [1, 2]; * var wrapped = _(array).push(3); * * console.log(array); * // => [1, 2] * * wrapped = wrapped.commit(); * console.log(array); * // => [1, 2, 3] * * wrapped.last(); * // => 3 * * console.log(array); * // => [1, 2, 3] */ function wrapperCommit() { return new LodashWrapper(this.value(), this.__chain__); } /** * Gets the next value on a wrapped object following the * [iterator protocol](https://mdn.io/iteration_protocols#iterator). * * @name next * @memberOf _ * @since 4.0.0 * @category Seq * @returns {Object} Returns the next iterator value. * @example * * var wrapped = _([1, 2]); * * wrapped.next(); * // => { 'done': false, 'value': 1 } * * wrapped.next(); * // => { 'done': false, 'value': 2 } * * wrapped.next(); * // => { 'done': true, 'value': undefined } */ function wrapperNext() { if (this.__values__ === undefined) { this.__values__ = toArray(this.value()); } var done = this.__index__ >= this.__values__.length, value = done ? undefined : this.__values__[this.__index__++]; return { done: done, value: value }; } /** * Enables the wrapper to be iterable. * * @name Symbol.iterator * @memberOf _ * @since 4.0.0 * @category Seq * @returns {Object} Returns the wrapper object. * @example * * var wrapped = _([1, 2]); * * wrapped[Symbol.iterator]() === wrapped; * // => true * * Array.from(wrapped); * // => [1, 2] */ function wrapperToIterator() { return this; } /** * Creates a clone of the chain sequence planting `value` as the wrapped value. * * @name plant * @memberOf _ * @since 3.2.0 * @category Seq * @param {*} value The value to plant. * @returns {Object} Returns the new `lodash` wrapper instance. * @example * * function square(n) { * return n * n; * } * * var wrapped = _([1, 2]).map(square); * var other = wrapped.plant([3, 4]); * * other.value(); * // => [9, 16] * * wrapped.value(); * // => [1, 4] */ function wrapperPlant(value) { var result, parent = this; while (parent instanceof baseLodash) { var clone = wrapperClone(parent); clone.__index__ = 0; clone.__values__ = undefined; if (result) { previous.__wrapped__ = clone; } else { result = clone; } var previous = clone; parent = parent.__wrapped__; } previous.__wrapped__ = value; return result; } /** * This method is the wrapper version of `_.reverse`. * * **Note:** This method mutates the wrapped array. * * @name reverse * @memberOf _ * @since 0.1.0 * @category Seq * @returns {Object} Returns the new `lodash` wrapper instance. * @example * * var array = [1, 2, 3]; * * _(array).reverse().value() * // => [3, 2, 1] * * console.log(array); * // => [3, 2, 1] */ function wrapperReverse() { var value = this.__wrapped__; if (value instanceof LazyWrapper) { var wrapped = value; if (this.__actions__.length) { wrapped = new LazyWrapper(this); } wrapped = wrapped.reverse(); wrapped.__actions__.push({ func: thru, args: [reverse], thisArg: undefined, }); return new LodashWrapper(wrapped, this.__chain__); } return this.thru(reverse); } /** * Executes the chain sequence to resolve the unwrapped value. * * @name value * @memberOf _ * @since 0.1.0 * @alias toJSON, valueOf * @category Seq * @returns {*} Returns the resolved unwrapped value. * @example * * _([1, 2, 3]).value(); * // => [1, 2, 3] */ function wrapperValue() { return baseWrapperValue(this.__wrapped__, this.__actions__); } /*------------------------------------------------------------------------*/ /** * Creates an object composed of keys generated from the results of running * each element of `collection` thru `iteratee`. The corresponding value of * each key is the number of times the key was returned by `iteratee`. The * iteratee is invoked with one argument: (value). * * @static * @memberOf _ * @since 0.5.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The iteratee to transform keys. * @returns {Object} Returns the composed aggregate object. * @example * * _.countBy([6.1, 4.2, 6.3], Math.floor); * // => { '4': 1, '6': 2 } * * // The `_.property` iteratee shorthand. * _.countBy(['one', 'two', 'three'], 'length'); * // => { '3': 2, '5': 1 } */ var countBy = createAggregator(function (result, value, key) { if (hasOwnProperty.call(result, key)) { ++result[key]; } else { baseAssignValue(result, key, 1); } }); /** * Checks if `predicate` returns truthy for **all** elements of `collection`. * Iteration is stopped once `predicate` returns falsey. The predicate is * invoked with three arguments: (value, index|key, collection). * * **Note:** This method returns `true` for * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of * elements of empty collections. * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {boolean} Returns `true` if all elements pass the predicate check, * else `false`. * @example * * _.every([true, 1, null, 'yes'], Boolean); * // => false * * var users = [ * { 'user': 'barney', 'age': 36, 'active': false }, * { 'user': 'fred', 'age': 40, 'active': false } * ]; * * // The `_.matches` iteratee shorthand. * _.every(users, { 'user': 'barney', 'active': false }); * // => false * * // The `_.matchesProperty` iteratee shorthand. * _.every(users, ['active', false]); * // => true * * // The `_.property` iteratee shorthand. * _.every(users, 'active'); * // => false */ function every(collection, predicate, guard) { var func = isArray(collection) ? arrayEvery : baseEvery; if (guard && isIterateeCall(collection, predicate, guard)) { predicate = undefined; } return func(collection, getIteratee(predicate, 3)); } /** * Iterates over elements of `collection`, returning an array of all elements * `predicate` returns truthy for. The predicate is invoked with three * arguments: (value, index|key, collection). * * **Note:** Unlike `_.remove`, this method returns a new array. * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {Array} Returns the new filtered array. * @see _.reject * @example * * var users = [ * { 'user': 'barney', 'age': 36, 'active': true }, * { 'user': 'fred', 'age': 40, 'active': false } * ]; * * _.filter(users, function(o) { return !o.active; }); * // => objects for ['fred'] * * // The `_.matches` iteratee shorthand. * _.filter(users, { 'age': 36, 'active': true }); * // => objects for ['barney'] * * // The `_.matchesProperty` iteratee shorthand. * _.filter(users, ['active', false]); * // => objects for ['fred'] * * // The `_.property` iteratee shorthand. * _.filter(users, 'active'); * // => objects for ['barney'] */ function filter(collection, predicate) { var func = isArray(collection) ? arrayFilter : baseFilter; return func(collection, getIteratee(predicate, 3)); } /** * Iterates over elements of `collection`, returning the first element * `predicate` returns truthy for. The predicate is invoked with three * arguments: (value, index|key, collection). * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to inspect. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @param {number} [fromIndex=0] The index to search from. * @returns {*} Returns the matched element, else `undefined`. * @example * * var users = [ * { 'user': 'barney', 'age': 36, 'active': true }, * { 'user': 'fred', 'age': 40, 'active': false }, * { 'user': 'pebbles', 'age': 1, 'active': true } * ]; * * _.find(users, function(o) { return o.age < 40; }); * // => object for 'barney' * * // The `_.matches` iteratee shorthand. * _.find(users, { 'age': 1, 'active': true }); * // => object for 'pebbles' * * // The `_.matchesProperty` iteratee shorthand. * _.find(users, ['active', false]); * // => object for 'fred' * * // The `_.property` iteratee shorthand. * _.find(users, 'active'); * // => object for 'barney' */ var find = createFind(findIndex); /** * This method is like `_.find` except that it iterates over elements of * `collection` from right to left. * * @static * @memberOf _ * @since 2.0.0 * @category Collection * @param {Array|Object} collection The collection to inspect. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @param {number} [fromIndex=collection.length-1] The index to search from. * @returns {*} Returns the matched element, else `undefined`. * @example * * _.findLast([1, 2, 3, 4], function(n) { * return n % 2 == 1; * }); * // => 3 */ var findLast = createFind(findLastIndex); /** * Creates a flattened array of values by running each element in `collection` * thru `iteratee` and flattening the mapped results. The iteratee is invoked * with three arguments: (value, index|key, collection). * * @static * @memberOf _ * @since 4.0.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Array} Returns the new flattened array. * @example * * function duplicate(n) { * return [n, n]; * } * * _.flatMap([1, 2], duplicate); * // => [1, 1, 2, 2] */ function flatMap(collection, iteratee) { return baseFlatten(map(collection, iteratee), 1); } /** * This method is like `_.flatMap` except that it recursively flattens the * mapped results. * * @static * @memberOf _ * @since 4.7.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Array} Returns the new flattened array. * @example * * function duplicate(n) { * return [[[n, n]]]; * } * * _.flatMapDeep([1, 2], duplicate); * // => [1, 1, 2, 2] */ function flatMapDeep(collection, iteratee) { return baseFlatten(map(collection, iteratee), INFINITY); } /** * This method is like `_.flatMap` except that it recursively flattens the * mapped results up to `depth` times. * * @static * @memberOf _ * @since 4.7.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @param {number} [depth=1] The maximum recursion depth. * @returns {Array} Returns the new flattened array. * @example * * function duplicate(n) { * return [[[n, n]]]; * } * * _.flatMapDepth([1, 2], duplicate, 2); * // => [[1, 1], [2, 2]] */ function flatMapDepth(collection, iteratee, depth) { depth = depth === undefined ? 1 : toInteger(depth); return baseFlatten(map(collection, iteratee), depth); } /** * Iterates over elements of `collection` and invokes `iteratee` for each element. * The iteratee is invoked with three arguments: (value, index|key, collection). * Iteratee functions may exit iteration early by explicitly returning `false`. * * **Note:** As with other "Collections" methods, objects with a "length" * property are iterated like arrays. To avoid this behavior use `_.forIn` * or `_.forOwn` for object iteration. * * @static * @memberOf _ * @since 0.1.0 * @alias each * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Array|Object} Returns `collection`. * @see _.forEachRight * @example * * _.forEach([1, 2], function(value) { * console.log(value); * }); * // => Logs `1` then `2`. * * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { * console.log(key); * }); * // => Logs 'a' then 'b' (iteration order is not guaranteed). */ function forEach(collection, iteratee) { var func = isArray(collection) ? arrayEach : baseEach; return func(collection, getIteratee(iteratee, 3)); } /** * This method is like `_.forEach` except that it iterates over elements of * `collection` from right to left. * * @static * @memberOf _ * @since 2.0.0 * @alias eachRight * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Array|Object} Returns `collection`. * @see _.forEach * @example * * _.forEachRight([1, 2], function(value) { * console.log(value); * }); * // => Logs `2` then `1`. */ function forEachRight(collection, iteratee) { var func = isArray(collection) ? arrayEachRight : baseEachRight; return func(collection, getIteratee(iteratee, 3)); } /** * Creates an object composed of keys generated from the results of running * each element of `collection` thru `iteratee`. The order of grouped values * is determined by the order they occur in `collection`. The corresponding * value of each key is an array of elements responsible for generating the * key. The iteratee is invoked with one argument: (value). * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The iteratee to transform keys. * @returns {Object} Returns the composed aggregate object. * @example * * _.groupBy([6.1, 4.2, 6.3], Math.floor); * // => { '4': [4.2], '6': [6.1, 6.3] } * * // The `_.property` iteratee shorthand. * _.groupBy(['one', 'two', 'three'], 'length'); * // => { '3': ['one', 'two'], '5': ['three'] } */ var groupBy = createAggregator(function (result, value, key) { if (hasOwnProperty.call(result, key)) { result[key].push(value); } else { baseAssignValue(result, key, [value]); } }); /** * Checks if `value` is in `collection`. If `collection` is a string, it's * checked for a substring of `value`, otherwise * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * is used for equality comparisons. If `fromIndex` is negative, it's used as * the offset from the end of `collection`. * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object|string} collection The collection to inspect. * @param {*} value The value to search for. * @param {number} [fromIndex=0] The index to search from. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. * @returns {boolean} Returns `true` if `value` is found, else `false`. * @example * * _.includes([1, 2, 3], 1); * // => true * * _.includes([1, 2, 3], 1, 2); * // => false * * _.includes({ 'a': 1, 'b': 2 }, 1); * // => true * * _.includes('abcd', 'bc'); * // => true */ function includes(collection, value, fromIndex, guard) { collection = isArrayLike(collection) ? collection : values(collection); fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0; var length = collection.length; if (fromIndex < 0) { fromIndex = nativeMax(length + fromIndex, 0); } return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1; } /** * Invokes the method at `path` of each element in `collection`, returning * an array of the results of each invoked method. Any additional arguments * are provided to each invoked method. If `path` is a function, it's invoked * for, and `this` bound to, each element in `collection`. * * @static * @memberOf _ * @since 4.0.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Array|Function|string} path The path of the method to invoke or * the function invoked per iteration. * @param {...*} [args] The arguments to invoke each method with. * @returns {Array} Returns the array of results. * @example * * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); * // => [[1, 5, 7], [1, 2, 3]] * * _.invokeMap([123, 456], String.prototype.split, ''); * // => [['1', '2', '3'], ['4', '5', '6']] */ var invokeMap = baseRest(function (collection, path, args) { var index = -1, isFunc = typeof path == 'function', result = isArrayLike(collection) ? Array(collection.length) : []; baseEach(collection, function (value) { result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); }); return result; }); /** * Creates an object composed of keys generated from the results of running * each element of `collection` thru `iteratee`. The corresponding value of * each key is the last element responsible for generating the key. The * iteratee is invoked with one argument: (value). * * @static * @memberOf _ * @since 4.0.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The iteratee to transform keys. * @returns {Object} Returns the composed aggregate object. * @example * * var array = [ * { 'dir': 'left', 'code': 97 }, * { 'dir': 'right', 'code': 100 } * ]; * * _.keyBy(array, function(o) { * return String.fromCharCode(o.code); * }); * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } * * _.keyBy(array, 'dir'); * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } */ var keyBy = createAggregator(function (result, value, key) { baseAssignValue(result, key, value); }); /** * Creates an array of values by running each element in `collection` thru * `iteratee`. The iteratee is invoked with three arguments: * (value, index|key, collection). * * Many lodash methods are guarded to work as iteratees for methods like * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. * * The guarded methods are: * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, * `template`, `trim`, `trimEnd`, `trimStart`, and `words` * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Array} Returns the new mapped array. * @example * * function square(n) { * return n * n; * } * * _.map([4, 8], square); * // => [16, 64] * * _.map({ 'a': 4, 'b': 8 }, square); * // => [16, 64] (iteration order is not guaranteed) * * var users = [ * { 'user': 'barney' }, * { 'user': 'fred' } * ]; * * // The `_.property` iteratee shorthand. * _.map(users, 'user'); * // => ['barney', 'fred'] */ function map(collection, iteratee) { var func = isArray(collection) ? arrayMap : baseMap; return func(collection, getIteratee(iteratee, 3)); } /** * This method is like `_.sortBy` except that it allows specifying the sort * orders of the iteratees to sort by. If `orders` is unspecified, all values * are sorted in ascending order. Otherwise, specify an order of "desc" for * descending or "asc" for ascending sort order of corresponding values. * * @static * @memberOf _ * @since 4.0.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] * The iteratees to sort by. * @param {string[]} [orders] The sort orders of `iteratees`. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. * @returns {Array} Returns the new sorted array. * @example * * var users = [ * { 'user': 'fred', 'age': 48 }, * { 'user': 'barney', 'age': 34 }, * { 'user': 'fred', 'age': 40 }, * { 'user': 'barney', 'age': 36 } * ]; * * // Sort by `user` in ascending order and by `age` in descending order. * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] */ function orderBy(collection, iteratees, orders, guard) { if (collection == null) { return []; } if (!isArray(iteratees)) { iteratees = iteratees == null ? [] : [iteratees]; } orders = guard ? undefined : orders; if (!isArray(orders)) { orders = orders == null ? [] : [orders]; } return baseOrderBy(collection, iteratees, orders); } /** * Creates an array of elements split into two groups, the first of which * contains elements `predicate` returns truthy for, the second of which * contains elements `predicate` returns falsey for. The predicate is * invoked with one argument: (value). * * @static * @memberOf _ * @since 3.0.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {Array} Returns the array of grouped elements. * @example * * var users = [ * { 'user': 'barney', 'age': 36, 'active': false }, * { 'user': 'fred', 'age': 40, 'active': true }, * { 'user': 'pebbles', 'age': 1, 'active': false } * ]; * * _.partition(users, function(o) { return o.active; }); * // => objects for [['fred'], ['barney', 'pebbles']] * * // The `_.matches` iteratee shorthand. * _.partition(users, { 'age': 1, 'active': false }); * // => objects for [['pebbles'], ['barney', 'fred']] * * // The `_.matchesProperty` iteratee shorthand. * _.partition(users, ['active', false]); * // => objects for [['barney', 'pebbles'], ['fred']] * * // The `_.property` iteratee shorthand. * _.partition(users, 'active'); * // => objects for [['fred'], ['barney', 'pebbles']] */ var partition = createAggregator( function (result, value, key) { result[key ? 0 : 1].push(value); }, function () { return [[], []]; }, ); /** * Reduces `collection` to a value which is the accumulated result of running * each element in `collection` thru `iteratee`, where each successive * invocation is supplied the return value of the previous. If `accumulator` * is not given, the first element of `collection` is used as the initial * value. The iteratee is invoked with four arguments: * (accumulator, value, index|key, collection). * * Many lodash methods are guarded to work as iteratees for methods like * `_.reduce`, `_.reduceRight`, and `_.transform`. * * The guarded methods are: * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, * and `sortBy` * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @param {*} [accumulator] The initial value. * @returns {*} Returns the accumulated value. * @see _.reduceRight * @example * * _.reduce([1, 2], function(sum, n) { * return sum + n; * }, 0); * // => 3 * * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { * (result[value] || (result[value] = [])).push(key); * return result; * }, {}); * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) */ function reduce(collection, iteratee, accumulator) { var func = isArray(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3; return func( collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach, ); } /** * This method is like `_.reduce` except that it iterates over elements of * `collection` from right to left. * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @param {*} [accumulator] The initial value. * @returns {*} Returns the accumulated value. * @see _.reduce * @example * * var array = [[0, 1], [2, 3], [4, 5]]; * * _.reduceRight(array, function(flattened, other) { * return flattened.concat(other); * }, []); * // => [4, 5, 2, 3, 0, 1] */ function reduceRight(collection, iteratee, accumulator) { var func = isArray(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3; return func( collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight, ); } /** * The opposite of `_.filter`; this method returns the elements of `collection` * that `predicate` does **not** return truthy for. * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {Array} Returns the new filtered array. * @see _.filter * @example * * var users = [ * { 'user': 'barney', 'age': 36, 'active': false }, * { 'user': 'fred', 'age': 40, 'active': true } * ]; * * _.reject(users, function(o) { return !o.active; }); * // => objects for ['fred'] * * // The `_.matches` iteratee shorthand. * _.reject(users, { 'age': 40, 'active': true }); * // => objects for ['barney'] * * // The `_.matchesProperty` iteratee shorthand. * _.reject(users, ['active', false]); * // => objects for ['fred'] * * // The `_.property` iteratee shorthand. * _.reject(users, 'active'); * // => objects for ['barney'] */ function reject(collection, predicate) { var func = isArray(collection) ? arrayFilter : baseFilter; return func(collection, negate(getIteratee(predicate, 3))); } /** * Gets a random element from `collection`. * * @static * @memberOf _ * @since 2.0.0 * @category Collection * @param {Array|Object} collection The collection to sample. * @returns {*} Returns the random element. * @example * * _.sample([1, 2, 3, 4]); * // => 2 */ function sample(collection) { var func = isArray(collection) ? arraySample : baseSample; return func(collection); } /** * Gets `n` random elements at unique keys from `collection` up to the * size of `collection`. * * @static * @memberOf _ * @since 4.0.0 * @category Collection * @param {Array|Object} collection The collection to sample. * @param {number} [n=1] The number of elements to sample. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the random elements. * @example * * _.sampleSize([1, 2, 3], 2); * // => [3, 1] * * _.sampleSize([1, 2, 3], 4); * // => [2, 3, 1] */ function sampleSize(collection, n, guard) { if ( guard ? isIterateeCall(collection, n, guard) : n === undefined ) { n = 1; } else { n = toInteger(n); } var func = isArray(collection) ? arraySampleSize : baseSampleSize; return func(collection, n); } /** * Creates an array of shuffled values, using a version of the * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to shuffle. * @returns {Array} Returns the new shuffled array. * @example * * _.shuffle([1, 2, 3, 4]); * // => [4, 1, 3, 2] */ function shuffle(collection) { var func = isArray(collection) ? arrayShuffle : baseShuffle; return func(collection); } /** * Gets the size of `collection` by returning its length for array-like * values or the number of own enumerable string keyed properties for objects. * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object|string} collection The collection to inspect. * @returns {number} Returns the collection size. * @example * * _.size([1, 2, 3]); * // => 3 * * _.size({ 'a': 1, 'b': 2 }); * // => 2 * * _.size('pebbles'); * // => 7 */ function size(collection) { if (collection == null) { return 0; } if (isArrayLike(collection)) { return isString(collection) ? stringSize(collection) : collection.length; } var tag = getTag(collection); if (tag == mapTag || tag == setTag) { return collection.size; } return baseKeys(collection).length; } /** * Checks if `predicate` returns truthy for **any** element of `collection`. * Iteration is stopped once `predicate` returns truthy. The predicate is * invoked with three arguments: (value, index|key, collection). * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {boolean} Returns `true` if any element passes the predicate check, * else `false`. * @example * * _.some([null, 0, 'yes', false], Boolean); * // => true * * var users = [ * { 'user': 'barney', 'active': true }, * { 'user': 'fred', 'active': false } * ]; * * // The `_.matches` iteratee shorthand. * _.some(users, { 'user': 'barney', 'active': false }); * // => false * * // The `_.matchesProperty` iteratee shorthand. * _.some(users, ['active', false]); * // => true * * // The `_.property` iteratee shorthand. * _.some(users, 'active'); * // => true */ function some(collection, predicate, guard) { var func = isArray(collection) ? arraySome : baseSome; if (guard && isIterateeCall(collection, predicate, guard)) { predicate = undefined; } return func(collection, getIteratee(predicate, 3)); } /** * Creates an array of elements, sorted in ascending order by the results of * running each element in a collection thru each iteratee. This method * performs a stable sort, that is, it preserves the original sort order of * equal elements. The iteratees are invoked with one argument: (value). * * @static * @memberOf _ * @since 0.1.0 * @category Collection * @param {Array|Object} collection The collection to iterate over. * @param {...(Function|Function[])} [iteratees=[_.identity]] * The iteratees to sort by. * @returns {Array} Returns the new sorted array. * @example * * var users = [ * { 'user': 'fred', 'age': 48 }, * { 'user': 'barney', 'age': 36 }, * { 'user': 'fred', 'age': 40 }, * { 'user': 'barney', 'age': 34 } * ]; * * _.sortBy(users, [function(o) { return o.user; }]); * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] * * _.sortBy(users, ['user', 'age']); * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] */ var sortBy = baseRest(function (collection, iteratees) { if (collection == null) { return []; } var length = iteratees.length; if ( length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1]) ) { iteratees = []; } else if ( length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2]) ) { iteratees = [iteratees[0]]; } return baseOrderBy(collection, baseFlatten(iteratees, 1), []); }); /*------------------------------------------------------------------------*/ /** * Gets the timestamp of the number of milliseconds that have elapsed since * the Unix epoch (1 January 1970 00:00:00 UTC). * * @static * @memberOf _ * @since 2.4.0 * @category Date * @returns {number} Returns the timestamp. * @example * * _.defer(function(stamp) { * console.log(_.now() - stamp); * }, _.now()); * // => Logs the number of milliseconds it took for the deferred invocation. */ var now = ctxNow || function () { return root.Date.now(); }; /*------------------------------------------------------------------------*/ /** * The opposite of `_.before`; this method creates a function that invokes * `func` once it's called `n` or more times. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {number} n The number of calls before `func` is invoked. * @param {Function} func The function to restrict. * @returns {Function} Returns the new restricted function. * @example * * var saves = ['profile', 'settings']; * * var done = _.after(saves.length, function() { * console.log('done saving!'); * }); * * _.forEach(saves, function(type) { * asyncSave({ 'type': type, 'complete': done }); * }); * // => Logs 'done saving!' after the two async saves have completed. */ function after(n, func) { if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } n = toInteger(n); return function () { if (--n < 1) { return func.apply(this, arguments); } }; } /** * Creates a function that invokes `func`, with up to `n` arguments, * ignoring any additional arguments. * * @static * @memberOf _ * @since 3.0.0 * @category Function * @param {Function} func The function to cap arguments for. * @param {number} [n=func.length] The arity cap. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Function} Returns the new capped function. * @example * * _.map(['6', '8', '10'], _.ary(parseInt, 1)); * // => [6, 8, 10] */ function ary(func, n, guard) { n = guard ? undefined : n; n = func && n == null ? func.length : n; return createWrap( func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n, ); } /** * Creates a function that invokes `func`, with the `this` binding and arguments * of the created function, while it's called less than `n` times. Subsequent * calls to the created function return the result of the last `func` invocation. * * @static * @memberOf _ * @since 3.0.0 * @category Function * @param {number} n The number of calls at which `func` is no longer invoked. * @param {Function} func The function to restrict. * @returns {Function} Returns the new restricted function. * @example * * jQuery(element).on('click', _.before(5, addContactToList)); * // => Allows adding up to 4 contacts to the list. */ function before(n, func) { var result; if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } n = toInteger(n); return function () { if (--n > 0) { result = func.apply(this, arguments); } if (n <= 1) { func = undefined; } return result; }; } /** * Creates a function that invokes `func` with the `this` binding of `thisArg` * and `partials` prepended to the arguments it receives. * * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, * may be used as a placeholder for partially applied arguments. * * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" * property of bound functions. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to bind. * @param {*} thisArg The `this` binding of `func`. * @param {...*} [partials] The arguments to be partially applied. * @returns {Function} Returns the new bound function. * @example * * function greet(greeting, punctuation) { * return greeting + ' ' + this.user + punctuation; * } * * var object = { 'user': 'fred' }; * * var bound = _.bind(greet, object, 'hi'); * bound('!'); * // => 'hi fred!' * * // Bound with placeholders. * var bound = _.bind(greet, object, _, '!'); * bound('hi'); * // => 'hi fred!' */ var bind = baseRest(function (func, thisArg, partials) { var bitmask = WRAP_BIND_FLAG; if (partials.length) { var holders = replaceHolders(partials, getHolder(bind)); bitmask |= WRAP_PARTIAL_FLAG; } return createWrap(func, bitmask, thisArg, partials, holders); }); /** * Creates a function that invokes the method at `object[key]` with `partials` * prepended to the arguments it receives. * * This method differs from `_.bind` by allowing bound functions to reference * methods that may be redefined or don't yet exist. See * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) * for more details. * * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic * builds, may be used as a placeholder for partially applied arguments. * * @static * @memberOf _ * @since 0.10.0 * @category Function * @param {Object} object The object to invoke the method on. * @param {string} key The key of the method. * @param {...*} [partials] The arguments to be partially applied. * @returns {Function} Returns the new bound function. * @example * * var object = { * 'user': 'fred', * 'greet': function(greeting, punctuation) { * return greeting + ' ' + this.user + punctuation; * } * }; * * var bound = _.bindKey(object, 'greet', 'hi'); * bound('!'); * // => 'hi fred!' * * object.greet = function(greeting, punctuation) { * return greeting + 'ya ' + this.user + punctuation; * }; * * bound('!'); * // => 'hiya fred!' * * // Bound with placeholders. * var bound = _.bindKey(object, 'greet', _, '!'); * bound('hi'); * // => 'hiya fred!' */ var bindKey = baseRest(function (object, key, partials) { var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; if (partials.length) { var holders = replaceHolders(partials, getHolder(bindKey)); bitmask |= WRAP_PARTIAL_FLAG; } return createWrap(key, bitmask, object, partials, holders); }); /** * Creates a function that accepts arguments of `func` and either invokes * `func` returning its result, if at least `arity` number of arguments have * been provided, or returns a function that accepts the remaining `func` * arguments, and so on. The arity of `func` may be specified if `func.length` * is not sufficient. * * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, * may be used as a placeholder for provided arguments. * * **Note:** This method doesn't set the "length" property of curried functions. * * @static * @memberOf _ * @since 2.0.0 * @category Function * @param {Function} func The function to curry. * @param {number} [arity=func.length] The arity of `func`. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Function} Returns the new curried function. * @example * * var abc = function(a, b, c) { * return [a, b, c]; * }; * * var curried = _.curry(abc); * * curried(1)(2)(3); * // => [1, 2, 3] * * curried(1, 2)(3); * // => [1, 2, 3] * * curried(1, 2, 3); * // => [1, 2, 3] * * // Curried with placeholders. * curried(1)(_, 3)(2); * // => [1, 2, 3] */ function curry(func, arity, guard) { arity = guard ? undefined : arity; var result = createWrap( func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity, ); result.placeholder = curry.placeholder; return result; } /** * This method is like `_.curry` except that arguments are applied to `func` * in the manner of `_.partialRight` instead of `_.partial`. * * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic * builds, may be used as a placeholder for provided arguments. * * **Note:** This method doesn't set the "length" property of curried functions. * * @static * @memberOf _ * @since 3.0.0 * @category Function * @param {Function} func The function to curry. * @param {number} [arity=func.length] The arity of `func`. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Function} Returns the new curried function. * @example * * var abc = function(a, b, c) { * return [a, b, c]; * }; * * var curried = _.curryRight(abc); * * curried(3)(2)(1); * // => [1, 2, 3] * * curried(2, 3)(1); * // => [1, 2, 3] * * curried(1, 2, 3); * // => [1, 2, 3] * * // Curried with placeholders. * curried(3)(1, _)(2); * // => [1, 2, 3] */ function curryRight(func, arity, guard) { arity = guard ? undefined : arity; var result = createWrap( func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity, ); result.placeholder = curryRight.placeholder; return result; } /** * Creates a debounced function that delays invoking `func` until after `wait` * milliseconds have elapsed since the last time the debounced function was * invoked. The debounced function comes with a `cancel` method to cancel * delayed `func` invocations and a `flush` method to immediately invoke them. * Provide `options` to indicate whether `func` should be invoked on the * leading and/or trailing edge of the `wait` timeout. The `func` is invoked * with the last arguments provided to the debounced function. Subsequent * calls to the debounced function return the result of the last `func` * invocation. * * **Note:** If `leading` and `trailing` options are `true`, `func` is * invoked on the trailing edge of the timeout only if the debounced function * is invoked more than once during the `wait` timeout. * * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred * until to the next tick, similar to `setTimeout` with a timeout of `0`. * * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) * for details over the differences between `_.debounce` and `_.throttle`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to debounce. * @param {number} [wait=0] The number of milliseconds to delay. * @param {Object} [options={}] The options object. * @param {boolean} [options.leading=false] * Specify invoking on the leading edge of the timeout. * @param {number} [options.maxWait] * The maximum time `func` is allowed to be delayed before it's invoked. * @param {boolean} [options.trailing=true] * Specify invoking on the trailing edge of the timeout. * @returns {Function} Returns the new debounced function. * @example * * // Avoid costly calculations while the window size is in flux. * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); * * // Invoke `sendMail` when clicked, debouncing subsequent calls. * jQuery(element).on('click', _.debounce(sendMail, 300, { * 'leading': true, * 'trailing': false * })); * * // Ensure `batchLog` is invoked once after 1 second of debounced calls. * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); * var source = new EventSource('/stream'); * jQuery(source).on('message', debounced); * * // Cancel the trailing debounced invocation. * jQuery(window).on('popstate', debounced.cancel); */ function debounce(func, wait, options) { var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } wait = toNumber(wait) || 0; if (isObject(options)) { leading = !!options.leading; maxing = 'maxWait' in options; maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; trailing = 'trailing' in options ? !!options.trailing : trailing; } function invokeFunc(time) { var args = lastArgs, thisArg = lastThis; lastArgs = lastThis = undefined; lastInvokeTime = time; result = func.apply(thisArg, args); return result; } function leadingEdge(time) { // Reset any `maxWait` timer. lastInvokeTime = time; // Start the timer for the trailing edge. timerId = setTimeout(timerExpired, wait); // Invoke the leading edge. return leading ? invokeFunc(time) : result; } function remainingWait(time) { var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall; return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; } function shouldInvoke(time) { var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the // trailing edge, the system time has gone backwards and we're treating // it as the trailing edge, or we've hit the `maxWait` limit. return ( lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || (maxing && timeSinceLastInvoke >= maxWait) ); } function timerExpired() { var time = now(); if (shouldInvoke(time)) { return trailingEdge(time); } // Restart the timer. timerId = setTimeout(timerExpired, remainingWait(time)); } function trailingEdge(time) { timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been // debounced at least once. if (trailing && lastArgs) { return invokeFunc(time); } lastArgs = lastThis = undefined; return result; } function cancel() { if (timerId !== undefined) { clearTimeout(timerId); } lastInvokeTime = 0; lastArgs = lastCallTime = lastThis = timerId = undefined; } function flush() { return timerId === undefined ? result : trailingEdge(now()); } function debounced() { var time = now(), isInvoking = shouldInvoke(time); lastArgs = arguments; lastThis = this; lastCallTime = time; if (isInvoking) { if (timerId === undefined) { return leadingEdge(lastCallTime); } if (maxing) { // Handle invocations in a tight loop. timerId = setTimeout(timerExpired, wait); return invokeFunc(lastCallTime); } } if (timerId === undefined) { timerId = setTimeout(timerExpired, wait); } return result; } debounced.cancel = cancel; debounced.flush = flush; return debounced; } /** * Defers invoking the `func` until the current call stack has cleared. Any * additional arguments are provided to `func` when it's invoked. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to defer. * @param {...*} [args] The arguments to invoke `func` with. * @returns {number} Returns the timer id. * @example * * _.defer(function(text) { * console.log(text); * }, 'deferred'); * // => Logs 'deferred' after one millisecond. */ var defer = baseRest(function (func, args) { return baseDelay(func, 1, args); }); /** * Invokes `func` after `wait` milliseconds. Any additional arguments are * provided to `func` when it's invoked. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to delay. * @param {number} wait The number of milliseconds to delay invocation. * @param {...*} [args] The arguments to invoke `func` with. * @returns {number} Returns the timer id. * @example * * _.delay(function(text) { * console.log(text); * }, 1000, 'later'); * // => Logs 'later' after one second. */ var delay = baseRest(function (func, wait, args) { return baseDelay(func, toNumber(wait) || 0, args); }); /** * Creates a function that invokes `func` with arguments reversed. * * @static * @memberOf _ * @since 4.0.0 * @category Function * @param {Function} func The function to flip arguments for. * @returns {Function} Returns the new flipped function. * @example * * var flipped = _.flip(function() { * return _.toArray(arguments); * }); * * flipped('a', 'b', 'c', 'd'); * // => ['d', 'c', 'b', 'a'] */ function flip(func) { return createWrap(func, WRAP_FLIP_FLAG); } /** * Creates a function that memoizes the result of `func`. If `resolver` is * provided, it determines the cache key for storing the result based on the * arguments provided to the memoized function. By default, the first argument * provided to the memoized function is used as the map cache key. The `func` * is invoked with the `this` binding of the memoized function. * * **Note:** The cache is exposed as the `cache` property on the memoized * function. Its creation may be customized by replacing the `_.memoize.Cache` * constructor with one whose instances implement the * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) * method interface of `clear`, `delete`, `get`, `has`, and `set`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to have its output memoized. * @param {Function} [resolver] The function to resolve the cache key. * @returns {Function} Returns the new memoized function. * @example * * var object = { 'a': 1, 'b': 2 }; * var other = { 'c': 3, 'd': 4 }; * * var values = _.memoize(_.values); * values(object); * // => [1, 2] * * values(other); * // => [3, 4] * * object.a = 2; * values(object); * // => [1, 2] * * // Modify the result cache. * values.cache.set(object, ['a', 'b']); * values(object); * // => ['a', 'b'] * * // Replace `_.memoize.Cache`. * _.memoize.Cache = WeakMap; */ function memoize(func, resolver) { if ( typeof func != 'function' || (resolver != null && typeof resolver != 'function') ) { throw new TypeError(FUNC_ERROR_TEXT); } var memoized = function () { var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; if (cache.has(key)) { return cache.get(key); } var result = func.apply(this, args); memoized.cache = cache.set(key, result) || cache; return result; }; memoized.cache = new (memoize.Cache || MapCache)(); return memoized; } // Expose `MapCache`. memoize.Cache = MapCache; /** * Creates a function that negates the result of the predicate `func`. The * `func` predicate is invoked with the `this` binding and arguments of the * created function. * * @static * @memberOf _ * @since 3.0.0 * @category Function * @param {Function} predicate The predicate to negate. * @returns {Function} Returns the new negated function. * @example * * function isEven(n) { * return n % 2 == 0; * } * * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); * // => [1, 3, 5] */ function negate(predicate) { if (typeof predicate != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } return function () { var args = arguments; switch (args.length) { case 0: return !predicate.call(this); case 1: return !predicate.call(this, args[0]); case 2: return !predicate.call(this, args[0], args[1]); case 3: return !predicate.call(this, args[0], args[1], args[2]); } return !predicate.apply(this, args); }; } /** * Creates a function that is restricted to invoking `func` once. Repeat calls * to the function return the value of the first invocation. The `func` is * invoked with the `this` binding and arguments of the created function. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to restrict. * @returns {Function} Returns the new restricted function. * @example * * var initialize = _.once(createApplication); * initialize(); * initialize(); * // => `createApplication` is invoked once */ function once(func) { return before(2, func); } /** * Creates a function that invokes `func` with its arguments transformed. * * @static * @since 4.0.0 * @memberOf _ * @category Function * @param {Function} func The function to wrap. * @param {...(Function|Function[])} [transforms=[_.identity]] * The argument transforms. * @returns {Function} Returns the new function. * @example * * function doubled(n) { * return n * 2; * } * * function square(n) { * return n * n; * } * * var func = _.overArgs(function(x, y) { * return [x, y]; * }, [square, doubled]); * * func(9, 3); * // => [81, 6] * * func(10, 5); * // => [100, 10] */ var overArgs = castRest(function (func, transforms) { transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap( baseFlatten(transforms, 1), baseUnary(getIteratee()), ); var funcsLength = transforms.length; return baseRest(function (args) { var index = -1, length = nativeMin(args.length, funcsLength); while (++index < length) { args[index] = transforms[index].call(this, args[index]); } return apply(func, this, args); }); }); /** * Creates a function that invokes `func` with `partials` prepended to the * arguments it receives. This method is like `_.bind` except it does **not** * alter the `this` binding. * * The `_.partial.placeholder` value, which defaults to `_` in monolithic * builds, may be used as a placeholder for partially applied arguments. * * **Note:** This method doesn't set the "length" property of partially * applied functions. * * @static * @memberOf _ * @since 0.2.0 * @category Function * @param {Function} func The function to partially apply arguments to. * @param {...*} [partials] The arguments to be partially applied. * @returns {Function} Returns the new partially applied function. * @example * * function greet(greeting, name) { * return greeting + ' ' + name; * } * * var sayHelloTo = _.partial(greet, 'hello'); * sayHelloTo('fred'); * // => 'hello fred' * * // Partially applied with placeholders. * var greetFred = _.partial(greet, _, 'fred'); * greetFred('hi'); * // => 'hi fred' */ var partial = baseRest(function (func, partials) { var holders = replaceHolders(partials, getHolder(partial)); return createWrap( func, WRAP_PARTIAL_FLAG, undefined, partials, holders, ); }); /** * This method is like `_.partial` except that partially applied arguments * are appended to the arguments it receives. * * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic * builds, may be used as a placeholder for partially applied arguments. * * **Note:** This method doesn't set the "length" property of partially * applied functions. * * @static * @memberOf _ * @since 1.0.0 * @category Function * @param {Function} func The function to partially apply arguments to. * @param {...*} [partials] The arguments to be partially applied. * @returns {Function} Returns the new partially applied function. * @example * * function greet(greeting, name) { * return greeting + ' ' + name; * } * * var greetFred = _.partialRight(greet, 'fred'); * greetFred('hi'); * // => 'hi fred' * * // Partially applied with placeholders. * var sayHelloTo = _.partialRight(greet, 'hello', _); * sayHelloTo('fred'); * // => 'hello fred' */ var partialRight = baseRest(function (func, partials) { var holders = replaceHolders(partials, getHolder(partialRight)); return createWrap( func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders, ); }); /** * Creates a function that invokes `func` with arguments arranged according * to the specified `indexes` where the argument value at the first index is * provided as the first argument, the argument value at the second index is * provided as the second argument, and so on. * * @static * @memberOf _ * @since 3.0.0 * @category Function * @param {Function} func The function to rearrange arguments for. * @param {...(number|number[])} indexes The arranged argument indexes. * @returns {Function} Returns the new function. * @example * * var rearged = _.rearg(function(a, b, c) { * return [a, b, c]; * }, [2, 0, 1]); * * rearged('b', 'c', 'a') * // => ['a', 'b', 'c'] */ var rearg = flatRest(function (func, indexes) { return createWrap( func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes, ); }); /** * Creates a function that invokes `func` with the `this` binding of the * created function and arguments from `start` and beyond provided as * an array. * * **Note:** This method is based on the * [rest parameter](https://mdn.io/rest_parameters). * * @static * @memberOf _ * @since 4.0.0 * @category Function * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @returns {Function} Returns the new function. * @example * * var say = _.rest(function(what, names) { * return what + ' ' + _.initial(names).join(', ') + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); * }); * * say('hello', 'fred', 'barney', 'pebbles'); * // => 'hello fred, barney, & pebbles' */ function rest(func, start) { if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } start = start === undefined ? start : toInteger(start); return baseRest(func, start); } /** * Creates a function that invokes `func` with the `this` binding of the * create function and an array of arguments much like * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). * * **Note:** This method is based on the * [spread operator](https://mdn.io/spread_operator). * * @static * @memberOf _ * @since 3.2.0 * @category Function * @param {Function} func The function to spread arguments over. * @param {number} [start=0] The start position of the spread. * @returns {Function} Returns the new function. * @example * * var say = _.spread(function(who, what) { * return who + ' says ' + what; * }); * * say(['fred', 'hello']); * // => 'fred says hello' * * var numbers = Promise.all([ * Promise.resolve(40), * Promise.resolve(36) * ]); * * numbers.then(_.spread(function(x, y) { * return x + y; * })); * // => a Promise of 76 */ function spread(func, start) { if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } start = start == null ? 0 : nativeMax(toInteger(start), 0); return baseRest(function (args) { var array = args[start], otherArgs = castSlice(args, 0, start); if (array) { arrayPush(otherArgs, array); } return apply(func, this, otherArgs); }); } /** * Creates a throttled function that only invokes `func` at most once per * every `wait` milliseconds. The throttled function comes with a `cancel` * method to cancel delayed `func` invocations and a `flush` method to * immediately invoke them. Provide `options` to indicate whether `func` * should be invoked on the leading and/or trailing edge of the `wait` * timeout. The `func` is invoked with the last arguments provided to the * throttled function. Subsequent calls to the throttled function return the * result of the last `func` invocation. * * **Note:** If `leading` and `trailing` options are `true`, `func` is * invoked on the trailing edge of the timeout only if the throttled function * is invoked more than once during the `wait` timeout. * * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred * until to the next tick, similar to `setTimeout` with a timeout of `0`. * * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) * for details over the differences between `_.throttle` and `_.debounce`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to throttle. * @param {number} [wait=0] The number of milliseconds to throttle invocations to. * @param {Object} [options={}] The options object. * @param {boolean} [options.leading=true] * Specify invoking on the leading edge of the timeout. * @param {boolean} [options.trailing=true] * Specify invoking on the trailing edge of the timeout. * @returns {Function} Returns the new throttled function. * @example * * // Avoid excessively updating the position while scrolling. * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); * * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); * jQuery(element).on('click', throttled); * * // Cancel the trailing throttled invocation. * jQuery(window).on('popstate', throttled.cancel); */ function throttle(func, wait, options) { var leading = true, trailing = true; if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } if (isObject(options)) { leading = 'leading' in options ? !!options.leading : leading; trailing = 'trailing' in options ? !!options.trailing : trailing; } return debounce(func, wait, { leading: leading, maxWait: wait, trailing: trailing, }); } /** * Creates a function that accepts up to one argument, ignoring any * additional arguments. * * @static * @memberOf _ * @since 4.0.0 * @category Function * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. * @example * * _.map(['6', '8', '10'], _.unary(parseInt)); * // => [6, 8, 10] */ function unary(func) { return ary(func, 1); } /** * Creates a function that provides `value` to `wrapper` as its first * argument. Any additional arguments provided to the function are appended * to those provided to the `wrapper`. The wrapper is invoked with the `this` * binding of the created function. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {*} value The value to wrap. * @param {Function} [wrapper=identity] The wrapper function. * @returns {Function} Returns the new function. * @example * * var p = _.wrap(_.escape, function(func, text) { * return '

' + func(text) + '

'; * }); * * p('fred, barney, & pebbles'); * // => '

fred, barney, & pebbles

' */ function wrap(value, wrapper) { return partial(castFunction(wrapper), value); } /*------------------------------------------------------------------------*/ /** * Casts `value` as an array if it's not one. * * @static * @memberOf _ * @since 4.4.0 * @category Lang * @param {*} value The value to inspect. * @returns {Array} Returns the cast array. * @example * * _.castArray(1); * // => [1] * * _.castArray({ 'a': 1 }); * // => [{ 'a': 1 }] * * _.castArray('abc'); * // => ['abc'] * * _.castArray(null); * // => [null] * * _.castArray(undefined); * // => [undefined] * * _.castArray(); * // => [] * * var array = [1, 2, 3]; * console.log(_.castArray(array) === array); * // => true */ function castArray() { if (!arguments.length) { return []; } var value = arguments[0]; return isArray(value) ? value : [value]; } /** * Creates a shallow clone of `value`. * * **Note:** This method is loosely based on the * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) * and supports cloning arrays, array buffers, booleans, date objects, maps, * numbers, `Object` objects, regexes, sets, strings, symbols, and typed * arrays. The own enumerable properties of `arguments` objects are cloned * as plain objects. An empty object is returned for uncloneable values such * as error objects, functions, DOM nodes, and WeakMaps. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to clone. * @returns {*} Returns the cloned value. * @see _.cloneDeep * @example * * var objects = [{ 'a': 1 }, { 'b': 2 }]; * * var shallow = _.clone(objects); * console.log(shallow[0] === objects[0]); * // => true */ function clone(value) { return baseClone(value, CLONE_SYMBOLS_FLAG); } /** * This method is like `_.clone` except that it accepts `customizer` which * is invoked to produce the cloned value. If `customizer` returns `undefined`, * cloning is handled by the method instead. The `customizer` is invoked with * up to four arguments; (value [, index|key, object, stack]). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to clone. * @param {Function} [customizer] The function to customize cloning. * @returns {*} Returns the cloned value. * @see _.cloneDeepWith * @example * * function customizer(value) { * if (_.isElement(value)) { * return value.cloneNode(false); * } * } * * var el = _.cloneWith(document.body, customizer); * * console.log(el === document.body); * // => false * console.log(el.nodeName); * // => 'BODY' * console.log(el.childNodes.length); * // => 0 */ function cloneWith(value, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); } /** * This method is like `_.clone` except that it recursively clones `value`. * * @static * @memberOf _ * @since 1.0.0 * @category Lang * @param {*} value The value to recursively clone. * @returns {*} Returns the deep cloned value. * @see _.clone * @example * * var objects = [{ 'a': 1 }, { 'b': 2 }]; * * var deep = _.cloneDeep(objects); * console.log(deep[0] === objects[0]); * // => false */ function cloneDeep(value) { return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); } /** * This method is like `_.cloneWith` except that it recursively clones `value`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to recursively clone. * @param {Function} [customizer] The function to customize cloning. * @returns {*} Returns the deep cloned value. * @see _.cloneWith * @example * * function customizer(value) { * if (_.isElement(value)) { * return value.cloneNode(true); * } * } * * var el = _.cloneDeepWith(document.body, customizer); * * console.log(el === document.body); * // => false * console.log(el.nodeName); * // => 'BODY' * console.log(el.childNodes.length); * // => 20 */ function cloneDeepWith(value, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; return baseClone( value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer, ); } /** * Checks if `object` conforms to `source` by invoking the predicate * properties of `source` with the corresponding property values of `object`. * * **Note:** This method is equivalent to `_.conforms` when `source` is * partially applied. * * @static * @memberOf _ * @since 4.14.0 * @category Lang * @param {Object} object The object to inspect. * @param {Object} source The object of property predicates to conform to. * @returns {boolean} Returns `true` if `object` conforms, else `false`. * @example * * var object = { 'a': 1, 'b': 2 }; * * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); * // => true * * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); * // => false */ function conformsTo(object, source) { return ( source == null || baseConformsTo(object, source, keys(source)) ); } /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */ function eq(value, other) { return value === other || (value !== value && other !== other); } /** * Checks if `value` is greater than `other`. * * @static * @memberOf _ * @since 3.9.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if `value` is greater than `other`, * else `false`. * @see _.lt * @example * * _.gt(3, 1); * // => true * * _.gt(3, 3); * // => false * * _.gt(1, 3); * // => false */ var gt = createRelationalOperation(baseGt); /** * Checks if `value` is greater than or equal to `other`. * * @static * @memberOf _ * @since 3.9.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if `value` is greater than or equal to * `other`, else `false`. * @see _.lte * @example * * _.gte(3, 1); * // => true * * _.gte(3, 3); * // => true * * _.gte(1, 3); * // => false */ var gte = createRelationalOperation(function (value, other) { return value >= other; }); /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ var isArguments = baseIsArguments( (function () { return arguments; })(), ) ? baseIsArguments : function (value) { return ( isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee') ); }; /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; /** * Checks if `value` is classified as an `ArrayBuffer` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. * @example * * _.isArrayBuffer(new ArrayBuffer(2)); * // => true * * _.isArrayBuffer(new Array(2)); * // => false */ var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return ( value != null && isLength(value.length) && !isFunction(value) ); } /** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, * else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */ function isArrayLikeObject(value) { return isObjectLike(value) && isArrayLike(value); } /** * Checks if `value` is classified as a boolean primitive or object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. * @example * * _.isBoolean(false); * // => true * * _.isBoolean(null); * // => false */ function isBoolean(value) { return ( value === true || value === false || (isObjectLike(value) && baseGetTag(value) == boolTag) ); } /** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */ var isBuffer = nativeIsBuffer || stubFalse; /** * Checks if `value` is classified as a `Date` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a date object, else `false`. * @example * * _.isDate(new Date); * // => true * * _.isDate('Mon April 23 2012'); * // => false */ var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; /** * Checks if `value` is likely a DOM element. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. * @example * * _.isElement(document.body); * // => true * * _.isElement(''); * // => false */ function isElement(value) { return ( isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value) ); } /** * Checks if `value` is an empty object, collection, map, or set. * * Objects are considered empty if they have no own enumerable string keyed * properties. * * Array-like values such as `arguments` objects, arrays, buffers, strings, or * jQuery-like collections are considered empty if they have a `length` of `0`. * Similarly, maps and sets are considered empty if they have a `size` of `0`. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is empty, else `false`. * @example * * _.isEmpty(null); * // => true * * _.isEmpty(true); * // => true * * _.isEmpty(1); * // => true * * _.isEmpty([1, 2, 3]); * // => false * * _.isEmpty({ 'a': 1 }); * // => false */ function isEmpty(value) { if (value == null) { return true; } if ( isArrayLike(value) && (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || isBuffer(value) || isTypedArray(value) || isArguments(value)) ) { return !value.length; } var tag = getTag(value); if (tag == mapTag || tag == setTag) { return !value.size; } if (isPrototype(value)) { return !baseKeys(value).length; } for (var key in value) { if (hasOwnProperty.call(value, key)) { return false; } } return true; } /** * Performs a deep comparison between two values to determine if they are * equivalent. * * **Note:** This method supports comparing arrays, array buffers, booleans, * date objects, error objects, maps, numbers, `Object` objects, regexes, * sets, strings, symbols, and typed arrays. `Object` objects are compared * by their own, not inherited, enumerable properties. Functions and DOM * nodes are compared by strict equality, i.e. `===`. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.isEqual(object, other); * // => true * * object === other; * // => false */ function isEqual(value, other) { return baseIsEqual(value, other); } /** * This method is like `_.isEqual` except that it accepts `customizer` which * is invoked to compare values. If `customizer` returns `undefined`, comparisons * are handled by the method instead. The `customizer` is invoked with up to * six arguments: (objValue, othValue [, index|key, object, other, stack]). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @param {Function} [customizer] The function to customize comparisons. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * function isGreeting(value) { * return /^h(?:i|ello)$/.test(value); * } * * function customizer(objValue, othValue) { * if (isGreeting(objValue) && isGreeting(othValue)) { * return true; * } * } * * var array = ['hello', 'goodbye']; * var other = ['hi', 'goodbye']; * * _.isEqualWith(array, other, customizer); * // => true */ function isEqualWith(value, other, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; var result = customizer ? customizer(value, other) : undefined; return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; } /** * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, * `SyntaxError`, `TypeError`, or `URIError` object. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an error object, else `false`. * @example * * _.isError(new Error); * // => true * * _.isError(Error); * // => false */ function isError(value) { if (!isObjectLike(value)) { return false; } var tag = baseGetTag(value); return ( tag == errorTag || tag == domExcTag || (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)) ); } /** * Checks if `value` is a finite primitive number. * * **Note:** This method is based on * [`Number.isFinite`](https://mdn.io/Number/isFinite). * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. * @example * * _.isFinite(3); * // => true * * _.isFinite(Number.MIN_VALUE); * // => true * * _.isFinite(Infinity); * // => false * * _.isFinite('3'); * // => false */ function isFinite(value) { return typeof value == 'number' && nativeIsFinite(value); } /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { if (!isObject(value)) { return false; } // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 9 which returns 'object' for typed arrays and other constructors. var tag = baseGetTag(value); return ( tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag ); } /** * Checks if `value` is an integer. * * **Note:** This method is based on * [`Number.isInteger`](https://mdn.io/Number/isInteger). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an integer, else `false`. * @example * * _.isInteger(3); * // => true * * _.isInteger(Number.MIN_VALUE); * // => false * * _.isInteger(Infinity); * // => false * * _.isInteger('3'); * // => false */ function isInteger(value) { return typeof value == 'number' && value == toInteger(value); } /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return ( typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER ); } /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return value != null && typeof value == 'object'; } /** * Checks if `value` is classified as a `Map` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a map, else `false`. * @example * * _.isMap(new Map); * // => true * * _.isMap(new WeakMap); * // => false */ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; /** * Performs a partial deep comparison between `object` and `source` to * determine if `object` contains equivalent property values. * * **Note:** This method is equivalent to `_.matches` when `source` is * partially applied. * * Partial comparisons will match empty array and empty object `source` * values against any array or object value, respectively. See `_.isEqual` * for a list of supported value comparisons. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {Object} object The object to inspect. * @param {Object} source The object of property values to match. * @returns {boolean} Returns `true` if `object` is a match, else `false`. * @example * * var object = { 'a': 1, 'b': 2 }; * * _.isMatch(object, { 'b': 2 }); * // => true * * _.isMatch(object, { 'b': 1 }); * // => false */ function isMatch(object, source) { return ( object === source || baseIsMatch(object, source, getMatchData(source)) ); } /** * This method is like `_.isMatch` except that it accepts `customizer` which * is invoked to compare values. If `customizer` returns `undefined`, comparisons * are handled by the method instead. The `customizer` is invoked with five * arguments: (objValue, srcValue, index|key, object, source). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {Object} object The object to inspect. * @param {Object} source The object of property values to match. * @param {Function} [customizer] The function to customize comparisons. * @returns {boolean} Returns `true` if `object` is a match, else `false`. * @example * * function isGreeting(value) { * return /^h(?:i|ello)$/.test(value); * } * * function customizer(objValue, srcValue) { * if (isGreeting(objValue) && isGreeting(srcValue)) { * return true; * } * } * * var object = { 'greeting': 'hello' }; * var source = { 'greeting': 'hi' }; * * _.isMatchWith(object, source, customizer); * // => true */ function isMatchWith(object, source, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; return baseIsMatch( object, source, getMatchData(source), customizer, ); } /** * Checks if `value` is `NaN`. * * **Note:** This method is based on * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for * `undefined` and other non-number values. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. * @example * * _.isNaN(NaN); * // => true * * _.isNaN(new Number(NaN)); * // => true * * isNaN(undefined); * // => true * * _.isNaN(undefined); * // => false */ function isNaN(value) { // An `NaN` primitive is the only value that is not equal to itself. // Perform the `toStringTag` check first to avoid errors with some // ActiveX objects in IE. return isNumber(value) && value != +value; } /** * Checks if `value` is a pristine native function. * * **Note:** This method can't reliably detect native functions in the presence * of the core-js package because core-js circumvents this kind of detection. * Despite multiple requests, the core-js maintainer has made it clear: any * attempt to fix the detection will be obstructed. As a result, we're left * with little choice but to throw an error. Unfortunately, this also affects * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), * which rely on core-js. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. * @example * * _.isNative(Array.prototype.push); * // => true * * _.isNative(_); * // => false */ function isNative(value) { if (isMaskable(value)) { throw new Error(CORE_ERROR_TEXT); } return baseIsNative(value); } /** * Checks if `value` is `null`. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `null`, else `false`. * @example * * _.isNull(null); * // => true * * _.isNull(void 0); * // => false */ function isNull(value) { return value === null; } /** * Checks if `value` is `null` or `undefined`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is nullish, else `false`. * @example * * _.isNil(null); * // => true * * _.isNil(void 0); * // => true * * _.isNil(NaN); * // => false */ function isNil(value) { return value == null; } /** * Checks if `value` is classified as a `Number` primitive or object. * * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are * classified as numbers, use the `_.isFinite` method. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a number, else `false`. * @example * * _.isNumber(3); * // => true * * _.isNumber(Number.MIN_VALUE); * // => true * * _.isNumber(Infinity); * // => true * * _.isNumber('3'); * // => false */ function isNumber(value) { return ( typeof value == 'number' || (isObjectLike(value) && baseGetTag(value) == numberTag) ); } /** * Checks if `value` is a plain object, that is, an object created by the * `Object` constructor or one with a `[[Prototype]]` of `null`. * * @static * @memberOf _ * @since 0.8.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. * @example * * function Foo() { * this.a = 1; * } * * _.isPlainObject(new Foo); * // => false * * _.isPlainObject([1, 2, 3]); * // => false * * _.isPlainObject({ 'x': 0, 'y': 0 }); * // => true * * _.isPlainObject(Object.create(null)); * // => true */ function isPlainObject(value) { if (!isObjectLike(value) || baseGetTag(value) != objectTag) { return false; } var proto = getPrototype(value); if (proto === null) { return true; } var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; return ( typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString ); } /** * Checks if `value` is classified as a `RegExp` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. * @example * * _.isRegExp(/abc/); * // => true * * _.isRegExp('/abc/'); * // => false */ var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; /** * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 * double precision number which isn't the result of a rounded unsafe integer. * * **Note:** This method is based on * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. * @example * * _.isSafeInteger(3); * // => true * * _.isSafeInteger(Number.MIN_VALUE); * // => false * * _.isSafeInteger(Infinity); * // => false * * _.isSafeInteger('3'); * // => false */ function isSafeInteger(value) { return ( isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER ); } /** * Checks if `value` is classified as a `Set` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a set, else `false`. * @example * * _.isSet(new Set); * // => true * * _.isSet(new WeakSet); * // => false */ var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; /** * Checks if `value` is classified as a `String` primitive or object. * * @static * @since 0.1.0 * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a string, else `false`. * @example * * _.isString('abc'); * // => true * * _.isString(1); * // => false */ function isString(value) { return ( typeof value == 'string' || (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag) ); } /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return ( typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag) ); } /** * Checks if `value` is classified as a typed array. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * * _.isTypedArray(new Uint8Array); * // => true * * _.isTypedArray([]); * // => false */ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; /** * Checks if `value` is `undefined`. * * @static * @since 0.1.0 * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. * @example * * _.isUndefined(void 0); * // => true * * _.isUndefined(null); * // => false */ function isUndefined(value) { return value === undefined; } /** * Checks if `value` is classified as a `WeakMap` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. * @example * * _.isWeakMap(new WeakMap); * // => true * * _.isWeakMap(new Map); * // => false */ function isWeakMap(value) { return isObjectLike(value) && getTag(value) == weakMapTag; } /** * Checks if `value` is classified as a `WeakSet` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. * @example * * _.isWeakSet(new WeakSet); * // => true * * _.isWeakSet(new Set); * // => false */ function isWeakSet(value) { return isObjectLike(value) && baseGetTag(value) == weakSetTag; } /** * Checks if `value` is less than `other`. * * @static * @memberOf _ * @since 3.9.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if `value` is less than `other`, * else `false`. * @see _.gt * @example * * _.lt(1, 3); * // => true * * _.lt(3, 3); * // => false * * _.lt(3, 1); * // => false */ var lt = createRelationalOperation(baseLt); /** * Checks if `value` is less than or equal to `other`. * * @static * @memberOf _ * @since 3.9.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if `value` is less than or equal to * `other`, else `false`. * @see _.gte * @example * * _.lte(1, 3); * // => true * * _.lte(3, 3); * // => true * * _.lte(3, 1); * // => false */ var lte = createRelationalOperation(function (value, other) { return value <= other; }); /** * Converts `value` to an array. * * @static * @since 0.1.0 * @memberOf _ * @category Lang * @param {*} value The value to convert. * @returns {Array} Returns the converted array. * @example * * _.toArray({ 'a': 1, 'b': 2 }); * // => [1, 2] * * _.toArray('abc'); * // => ['a', 'b', 'c'] * * _.toArray(1); * // => [] * * _.toArray(null); * // => [] */ function toArray(value) { if (!value) { return []; } if (isArrayLike(value)) { return isString(value) ? stringToArray(value) : copyArray(value); } if (symIterator && value[symIterator]) { return iteratorToArray(value[symIterator]()); } var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values; return func(value); } /** * Converts `value` to a finite number. * * @static * @memberOf _ * @since 4.12.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted number. * @example * * _.toFinite(3.2); * // => 3.2 * * _.toFinite(Number.MIN_VALUE); * // => 5e-324 * * _.toFinite(Infinity); * // => 1.7976931348623157e+308 * * _.toFinite('3.2'); * // => 3.2 */ function toFinite(value) { if (!value) { return value === 0 ? value : 0; } value = toNumber(value); if (value === INFINITY || value === -INFINITY) { var sign = value < 0 ? -1 : 1; return sign * MAX_INTEGER; } return value === value ? value : 0; } /** * Converts `value` to an integer. * * **Note:** This method is loosely based on * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toInteger(3.2); * // => 3 * * _.toInteger(Number.MIN_VALUE); * // => 0 * * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * * _.toInteger('3.2'); * // => 3 */ function toInteger(value) { var result = toFinite(value), remainder = result % 1; return result === result ? remainder ? result - remainder : result : 0; } /** * Converts `value` to an integer suitable for use as the length of an * array-like object. * * **Note:** This method is based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toLength(3.2); * // => 3 * * _.toLength(Number.MIN_VALUE); * // => 0 * * _.toLength(Infinity); * // => 4294967295 * * _.toLength('3.2'); * // => 3 */ function toLength(value) { return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; } /** * Converts `value` to a number. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to process. * @returns {number} Returns the number. * @example * * _.toNumber(3.2); * // => 3.2 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 * * _.toNumber(Infinity); * // => Infinity * * _.toNumber('3.2'); * // => 3.2 */ function toNumber(value) { if (typeof value == 'number') { return value; } if (isSymbol(value)) { return NAN; } if (isObject(value)) { var other = typeof value.valueOf == 'function' ? value.valueOf() : value; value = isObject(other) ? other + '' : other; } if (typeof value != 'string') { return value === 0 ? value : +value; } value = value.replace(reTrim, ''); var isBinary = reIsBinary.test(value); return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; } /** * Converts `value` to a plain object flattening inherited enumerable string * keyed properties of `value` to own properties of the plain object. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to convert. * @returns {Object} Returns the converted plain object. * @example * * function Foo() { * this.b = 2; * } * * Foo.prototype.c = 3; * * _.assign({ 'a': 1 }, new Foo); * // => { 'a': 1, 'b': 2 } * * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); * // => { 'a': 1, 'b': 2, 'c': 3 } */ function toPlainObject(value) { return copyObject(value, keysIn(value)); } /** * Converts `value` to a safe integer. A safe integer can be compared and * represented correctly. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toSafeInteger(3.2); * // => 3 * * _.toSafeInteger(Number.MIN_VALUE); * // => 0 * * _.toSafeInteger(Infinity); * // => 9007199254740991 * * _.toSafeInteger('3.2'); * // => 3 */ function toSafeInteger(value) { return value ? baseClamp( toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, ) : value === 0 ? value : 0; } /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } /*------------------------------------------------------------------------*/ /** * Assigns own enumerable string keyed properties of source objects to the * destination object. Source objects are applied from left to right. * Subsequent sources overwrite property assignments of previous sources. * * **Note:** This method mutates `object` and is loosely based on * [`Object.assign`](https://mdn.io/Object/assign). * * @static * @memberOf _ * @since 0.10.0 * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @see _.assignIn * @example * * function Foo() { * this.a = 1; * } * * function Bar() { * this.c = 3; * } * * Foo.prototype.b = 2; * Bar.prototype.d = 4; * * _.assign({ 'a': 0 }, new Foo, new Bar); * // => { 'a': 1, 'c': 3 } */ var assign = createAssigner(function (object, source) { if (isPrototype(source) || isArrayLike(source)) { copyObject(source, keys(source), object); return; } for (var key in source) { if (hasOwnProperty.call(source, key)) { assignValue(object, key, source[key]); } } }); /** * This method is like `_.assign` except that it iterates over own and * inherited source properties. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 4.0.0 * @alias extend * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @see _.assign * @example * * function Foo() { * this.a = 1; * } * * function Bar() { * this.c = 3; * } * * Foo.prototype.b = 2; * Bar.prototype.d = 4; * * _.assignIn({ 'a': 0 }, new Foo, new Bar); * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } */ var assignIn = createAssigner(function (object, source) { copyObject(source, keysIn(source), object); }); /** * This method is like `_.assignIn` except that it accepts `customizer` * which is invoked to produce the assigned values. If `customizer` returns * `undefined`, assignment is handled by the method instead. The `customizer` * is invoked with five arguments: (objValue, srcValue, key, object, source). * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 4.0.0 * @alias extendWith * @category Object * @param {Object} object The destination object. * @param {...Object} sources The source objects. * @param {Function} [customizer] The function to customize assigned values. * @returns {Object} Returns `object`. * @see _.assignWith * @example * * function customizer(objValue, srcValue) { * return _.isUndefined(objValue) ? srcValue : objValue; * } * * var defaults = _.partialRight(_.assignInWith, customizer); * * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); * // => { 'a': 1, 'b': 2 } */ var assignInWith = createAssigner(function ( object, source, srcIndex, customizer, ) { copyObject(source, keysIn(source), object, customizer); }); /** * This method is like `_.assign` except that it accepts `customizer` * which is invoked to produce the assigned values. If `customizer` returns * `undefined`, assignment is handled by the method instead. The `customizer` * is invoked with five arguments: (objValue, srcValue, key, object, source). * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The destination object. * @param {...Object} sources The source objects. * @param {Function} [customizer] The function to customize assigned values. * @returns {Object} Returns `object`. * @see _.assignInWith * @example * * function customizer(objValue, srcValue) { * return _.isUndefined(objValue) ? srcValue : objValue; * } * * var defaults = _.partialRight(_.assignWith, customizer); * * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); * // => { 'a': 1, 'b': 2 } */ var assignWith = createAssigner(function ( object, source, srcIndex, customizer, ) { copyObject(source, keys(source), object, customizer); }); /** * Creates an array of values corresponding to `paths` of `object`. * * @static * @memberOf _ * @since 1.0.0 * @category Object * @param {Object} object The object to iterate over. * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Array} Returns the picked values. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; * * _.at(object, ['a[0].b.c', 'a[1]']); * // => [3, 4] */ var at = flatRest(baseAt); /** * Creates an object that inherits from the `prototype` object. If a * `properties` object is given, its own enumerable string keyed properties * are assigned to the created object. * * @static * @memberOf _ * @since 2.3.0 * @category Object * @param {Object} prototype The object to inherit from. * @param {Object} [properties] The properties to assign to the object. * @returns {Object} Returns the new object. * @example * * function Shape() { * this.x = 0; * this.y = 0; * } * * function Circle() { * Shape.call(this); * } * * Circle.prototype = _.create(Shape.prototype, { * 'constructor': Circle * }); * * var circle = new Circle; * circle instanceof Circle; * // => true * * circle instanceof Shape; * // => true */ function create(prototype, properties) { var result = baseCreate(prototype); return properties == null ? result : baseAssign(result, properties); } /** * Assigns own and inherited enumerable string keyed properties of source * objects to the destination object for all destination properties that * resolve to `undefined`. Source objects are applied from left to right. * Once a property is set, additional values of the same property are ignored. * * **Note:** This method mutates `object`. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @see _.defaultsDeep * @example * * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); * // => { 'a': 1, 'b': 2 } */ var defaults = baseRest(function (object, sources) { object = Object(object); var index = -1; var length = sources.length; var guard = length > 2 ? sources[2] : undefined; if (guard && isIterateeCall(sources[0], sources[1], guard)) { length = 1; } while (++index < length) { var source = sources[index]; var props = keysIn(source); var propsIndex = -1; var propsLength = props.length; while (++propsIndex < propsLength) { var key = props[propsIndex]; var value = object[key]; if ( value === undefined || (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) ) { object[key] = source[key]; } } } return object; }); /** * This method is like `_.defaults` except that it recursively assigns * default properties. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 3.10.0 * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @see _.defaults * @example * * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); * // => { 'a': { 'b': 2, 'c': 3 } } */ var defaultsDeep = baseRest(function (args) { args.push(undefined, customDefaultsMerge); return apply(mergeWith, undefined, args); }); /** * This method is like `_.find` except that it returns the key of the first * element `predicate` returns truthy for instead of the element itself. * * @static * @memberOf _ * @since 1.1.0 * @category Object * @param {Object} object The object to inspect. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {string|undefined} Returns the key of the matched element, * else `undefined`. * @example * * var users = { * 'barney': { 'age': 36, 'active': true }, * 'fred': { 'age': 40, 'active': false }, * 'pebbles': { 'age': 1, 'active': true } * }; * * _.findKey(users, function(o) { return o.age < 40; }); * // => 'barney' (iteration order is not guaranteed) * * // The `_.matches` iteratee shorthand. * _.findKey(users, { 'age': 1, 'active': true }); * // => 'pebbles' * * // The `_.matchesProperty` iteratee shorthand. * _.findKey(users, ['active', false]); * // => 'fred' * * // The `_.property` iteratee shorthand. * _.findKey(users, 'active'); * // => 'barney' */ function findKey(object, predicate) { return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); } /** * This method is like `_.findKey` except that it iterates over elements of * a collection in the opposite order. * * @static * @memberOf _ * @since 2.0.0 * @category Object * @param {Object} object The object to inspect. * @param {Function} [predicate=_.identity] The function invoked per iteration. * @returns {string|undefined} Returns the key of the matched element, * else `undefined`. * @example * * var users = { * 'barney': { 'age': 36, 'active': true }, * 'fred': { 'age': 40, 'active': false }, * 'pebbles': { 'age': 1, 'active': true } * }; * * _.findLastKey(users, function(o) { return o.age < 40; }); * // => returns 'pebbles' assuming `_.findKey` returns 'barney' * * // The `_.matches` iteratee shorthand. * _.findLastKey(users, { 'age': 36, 'active': true }); * // => 'barney' * * // The `_.matchesProperty` iteratee shorthand. * _.findLastKey(users, ['active', false]); * // => 'fred' * * // The `_.property` iteratee shorthand. * _.findLastKey(users, 'active'); * // => 'pebbles' */ function findLastKey(object, predicate) { return baseFindKey( object, getIteratee(predicate, 3), baseForOwnRight, ); } /** * Iterates over own and inherited enumerable string keyed properties of an * object and invokes `iteratee` for each property. The iteratee is invoked * with three arguments: (value, key, object). Iteratee functions may exit * iteration early by explicitly returning `false`. * * @static * @memberOf _ * @since 0.3.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns `object`. * @see _.forInRight * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.forIn(new Foo, function(value, key) { * console.log(key); * }); * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). */ function forIn(object, iteratee) { return object == null ? object : baseFor(object, getIteratee(iteratee, 3), keysIn); } /** * This method is like `_.forIn` except that it iterates over properties of * `object` in the opposite order. * * @static * @memberOf _ * @since 2.0.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns `object`. * @see _.forIn * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.forInRight(new Foo, function(value, key) { * console.log(key); * }); * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. */ function forInRight(object, iteratee) { return object == null ? object : baseForRight(object, getIteratee(iteratee, 3), keysIn); } /** * Iterates over own enumerable string keyed properties of an object and * invokes `iteratee` for each property. The iteratee is invoked with three * arguments: (value, key, object). Iteratee functions may exit iteration * early by explicitly returning `false`. * * @static * @memberOf _ * @since 0.3.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns `object`. * @see _.forOwnRight * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.forOwn(new Foo, function(value, key) { * console.log(key); * }); * // => Logs 'a' then 'b' (iteration order is not guaranteed). */ function forOwn(object, iteratee) { return object && baseForOwn(object, getIteratee(iteratee, 3)); } /** * This method is like `_.forOwn` except that it iterates over properties of * `object` in the opposite order. * * @static * @memberOf _ * @since 2.0.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns `object`. * @see _.forOwn * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.forOwnRight(new Foo, function(value, key) { * console.log(key); * }); * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. */ function forOwnRight(object, iteratee) { return ( object && baseForOwnRight(object, getIteratee(iteratee, 3)) ); } /** * Creates an array of function property names from own enumerable properties * of `object`. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to inspect. * @returns {Array} Returns the function names. * @see _.functionsIn * @example * * function Foo() { * this.a = _.constant('a'); * this.b = _.constant('b'); * } * * Foo.prototype.c = _.constant('c'); * * _.functions(new Foo); * // => ['a', 'b'] */ function functions(object) { return object == null ? [] : baseFunctions(object, keys(object)); } /** * Creates an array of function property names from own and inherited * enumerable properties of `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to inspect. * @returns {Array} Returns the function names. * @see _.functions * @example * * function Foo() { * this.a = _.constant('a'); * this.b = _.constant('b'); * } * * Foo.prototype.c = _.constant('c'); * * _.functionsIn(new Foo); * // => ['a', 'b', 'c'] */ function functionsIn(object) { return object == null ? [] : baseFunctions(object, keysIn(object)); } /** * Gets the value at `path` of `object`. If the resolved value is * `undefined`, the `defaultValue` is returned in its place. * * @static * @memberOf _ * @since 3.7.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @param {*} [defaultValue] The value returned for `undefined` resolved values. * @returns {*} Returns the resolved value. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.get(object, 'a[0].b.c'); * // => 3 * * _.get(object, ['a', '0', 'b', 'c']); * // => 3 * * _.get(object, 'a.b.c', 'default'); * // => 'default' */ function get(object, path, defaultValue) { var result = object == null ? undefined : baseGet(object, path); return result === undefined ? defaultValue : result; } /** * Checks if `path` is a direct property of `object`. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * * var object = { 'a': { 'b': 2 } }; * var other = _.create({ 'a': _.create({ 'b': 2 }) }); * * _.has(object, 'a'); * // => true * * _.has(object, 'a.b'); * // => true * * _.has(object, ['a', 'b']); * // => true * * _.has(other, 'a'); * // => false */ function has(object, path) { return object != null && hasPath(object, path, baseHas); } /** * Checks if `path` is a direct or inherited property of `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * * var object = _.create({ 'a': _.create({ 'b': 2 }) }); * * _.hasIn(object, 'a'); * // => true * * _.hasIn(object, 'a.b'); * // => true * * _.hasIn(object, ['a', 'b']); * // => true * * _.hasIn(object, 'b'); * // => false */ function hasIn(object, path) { return object != null && hasPath(object, path, baseHasIn); } /** * Creates an object composed of the inverted keys and values of `object`. * If `object` contains duplicate values, subsequent values overwrite * property assignments of previous values. * * @static * @memberOf _ * @since 0.7.0 * @category Object * @param {Object} object The object to invert. * @returns {Object} Returns the new inverted object. * @example * * var object = { 'a': 1, 'b': 2, 'c': 1 }; * * _.invert(object); * // => { '1': 'c', '2': 'b' } */ var invert = createInverter(function (result, value, key) { if (value != null && typeof value.toString != 'function') { value = nativeObjectToString.call(value); } result[value] = key; }, constant(identity)); /** * This method is like `_.invert` except that the inverted object is generated * from the results of running each element of `object` thru `iteratee`. The * corresponding inverted value of each inverted key is an array of keys * responsible for generating the inverted value. The iteratee is invoked * with one argument: (value). * * @static * @memberOf _ * @since 4.1.0 * @category Object * @param {Object} object The object to invert. * @param {Function} [iteratee=_.identity] The iteratee invoked per element. * @returns {Object} Returns the new inverted object. * @example * * var object = { 'a': 1, 'b': 2, 'c': 1 }; * * _.invertBy(object); * // => { '1': ['a', 'c'], '2': ['b'] } * * _.invertBy(object, function(value) { * return 'group' + value; * }); * // => { 'group1': ['a', 'c'], 'group2': ['b'] } */ var invertBy = createInverter(function (result, value, key) { if (value != null && typeof value.toString != 'function') { value = nativeObjectToString.call(value); } if (hasOwnProperty.call(result, value)) { result[value].push(key); } else { result[value] = [key]; } }, getIteratee); /** * Invokes the method at `path` of `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path of the method to invoke. * @param {...*} [args] The arguments to invoke the method with. * @returns {*} Returns the result of the invoked method. * @example * * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; * * _.invoke(object, 'a[0].b.c.slice', 1, 3); * // => [2, 3] */ var invoke = baseRest(baseInvoke); /** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */ function keys(object) { return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); } /** * Creates an array of the own and inherited enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. * * @static * @memberOf _ * @since 3.0.0 * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keysIn(new Foo); * // => ['a', 'b', 'c'] (iteration order is not guaranteed) */ function keysIn(object) { return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); } /** * The opposite of `_.mapValues`; this method creates an object with the * same values as `object` and keys generated by running each own enumerable * string keyed property of `object` thru `iteratee`. The iteratee is invoked * with three arguments: (value, key, object). * * @static * @memberOf _ * @since 3.8.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns the new mapped object. * @see _.mapValues * @example * * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { * return key + value; * }); * // => { 'a1': 1, 'b2': 2 } */ function mapKeys(object, iteratee) { var result = {}; iteratee = getIteratee(iteratee, 3); baseForOwn(object, function (value, key, object) { baseAssignValue(result, iteratee(value, key, object), value); }); return result; } /** * Creates an object with the same keys as `object` and values generated * by running each own enumerable string keyed property of `object` thru * `iteratee`. The iteratee is invoked with three arguments: * (value, key, object). * * @static * @memberOf _ * @since 2.4.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns the new mapped object. * @see _.mapKeys * @example * * var users = { * 'fred': { 'user': 'fred', 'age': 40 }, * 'pebbles': { 'user': 'pebbles', 'age': 1 } * }; * * _.mapValues(users, function(o) { return o.age; }); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) * * // The `_.property` iteratee shorthand. * _.mapValues(users, 'age'); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) */ function mapValues(object, iteratee) { var result = {}; iteratee = getIteratee(iteratee, 3); baseForOwn(object, function (value, key, object) { baseAssignValue(result, key, iteratee(value, key, object)); }); return result; } /** * This method is like `_.assign` except that it recursively merges own and * inherited enumerable string keyed properties of source objects into the * destination object. Source properties that resolve to `undefined` are * skipped if a destination value exists. Array and plain object properties * are merged recursively. Other objects and value types are overridden by * assignment. Source objects are applied from left to right. Subsequent * sources overwrite property assignments of previous sources. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 0.5.0 * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @example * * var object = { * 'a': [{ 'b': 2 }, { 'd': 4 }] * }; * * var other = { * 'a': [{ 'c': 3 }, { 'e': 5 }] * }; * * _.merge(object, other); * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } */ var merge = createAssigner(function (object, source, srcIndex) { baseMerge(object, source, srcIndex); }); /** * This method is like `_.merge` except that it accepts `customizer` which * is invoked to produce the merged values of the destination and source * properties. If `customizer` returns `undefined`, merging is handled by the * method instead. The `customizer` is invoked with six arguments: * (objValue, srcValue, key, object, source, stack). * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The destination object. * @param {...Object} sources The source objects. * @param {Function} customizer The function to customize assigned values. * @returns {Object} Returns `object`. * @example * * function customizer(objValue, srcValue) { * if (_.isArray(objValue)) { * return objValue.concat(srcValue); * } * } * * var object = { 'a': [1], 'b': [2] }; * var other = { 'a': [3], 'b': [4] }; * * _.mergeWith(object, other, customizer); * // => { 'a': [1, 3], 'b': [2, 4] } */ var mergeWith = createAssigner(function ( object, source, srcIndex, customizer, ) { baseMerge(object, source, srcIndex, customizer); }); /** * The opposite of `_.pick`; this method creates an object composed of the * own and inherited enumerable property paths of `object` that are not omitted. * * **Note:** This method is considerably slower than `_.pick`. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The source object. * @param {...(string|string[])} [paths] The property paths to omit. * @returns {Object} Returns the new object. * @example * * var object = { 'a': 1, 'b': '2', 'c': 3 }; * * _.omit(object, ['a', 'c']); * // => { 'b': '2' } */ var omit = flatRest(function (object, paths) { var result = {}; if (object == null) { return result; } var isDeep = false; paths = arrayMap(paths, function (path) { path = castPath(path, object); isDeep || (isDeep = path.length > 1); return path; }); copyObject(object, getAllKeysIn(object), result); if (isDeep) { result = baseClone( result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone, ); } var length = paths.length; while (length--) { baseUnset(result, paths[length]); } return result; }); /** * The opposite of `_.pickBy`; this method creates an object composed of * the own and inherited enumerable string keyed properties of `object` that * `predicate` doesn't return truthy for. The predicate is invoked with two * arguments: (value, key). * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The source object. * @param {Function} [predicate=_.identity] The function invoked per property. * @returns {Object} Returns the new object. * @example * * var object = { 'a': 1, 'b': '2', 'c': 3 }; * * _.omitBy(object, _.isNumber); * // => { 'b': '2' } */ function omitBy(object, predicate) { return pickBy(object, negate(getIteratee(predicate))); } /** * Creates an object composed of the picked `object` properties. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The source object. * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Object} Returns the new object. * @example * * var object = { 'a': 1, 'b': '2', 'c': 3 }; * * _.pick(object, ['a', 'c']); * // => { 'a': 1, 'c': 3 } */ var pick = flatRest(function (object, paths) { return object == null ? {} : basePick(object, paths); }); /** * Creates an object composed of the `object` properties `predicate` returns * truthy for. The predicate is invoked with two arguments: (value, key). * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The source object. * @param {Function} [predicate=_.identity] The function invoked per property. * @returns {Object} Returns the new object. * @example * * var object = { 'a': 1, 'b': '2', 'c': 3 }; * * _.pickBy(object, _.isNumber); * // => { 'a': 1, 'c': 3 } */ function pickBy(object, predicate) { if (object == null) { return {}; } var props = arrayMap(getAllKeysIn(object), function (prop) { return [prop]; }); predicate = getIteratee(predicate); return basePickBy(object, props, function (value, path) { return predicate(value, path[0]); }); } /** * This method is like `_.get` except that if the resolved value is a * function it's invoked with the `this` binding of its parent object and * its result is returned. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path of the property to resolve. * @param {*} [defaultValue] The value returned for `undefined` resolved values. * @returns {*} Returns the resolved value. * @example * * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; * * _.result(object, 'a[0].b.c1'); * // => 3 * * _.result(object, 'a[0].b.c2'); * // => 4 * * _.result(object, 'a[0].b.c3', 'default'); * // => 'default' * * _.result(object, 'a[0].b.c3', _.constant('default')); * // => 'default' */ function result(object, path, defaultValue) { path = castPath(path, object); var index = -1, length = path.length; // Ensure the loop is entered when path is empty. if (!length) { length = 1; object = undefined; } while (++index < length) { var value = object == null ? undefined : object[toKey(path[index])]; if (value === undefined) { index = length; value = defaultValue; } object = isFunction(value) ? value.call(object) : value; } return object; } /** * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, * it's created. Arrays are created for missing index properties while objects * are created for all other missing properties. Use `_.setWith` to customize * `path` creation. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 3.7.0 * @category Object * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {*} value The value to set. * @returns {Object} Returns `object`. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.set(object, 'a[0].b.c', 4); * console.log(object.a[0].b.c); * // => 4 * * _.set(object, ['x', '0', 'y', 'z'], 5); * console.log(object.x[0].y.z); * // => 5 */ function set(object, path, value) { return object == null ? object : baseSet(object, path, value); } /** * This method is like `_.set` except that it accepts `customizer` which is * invoked to produce the objects of `path`. If `customizer` returns `undefined` * path creation is handled by the method instead. The `customizer` is invoked * with three arguments: (nsValue, key, nsObject). * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {*} value The value to set. * @param {Function} [customizer] The function to customize assigned values. * @returns {Object} Returns `object`. * @example * * var object = {}; * * _.setWith(object, '[0][1]', 'a', Object); * // => { '0': { '1': 'a' } } */ function setWith(object, path, value, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; return object == null ? object : baseSet(object, path, value, customizer); } /** * Creates an array of own enumerable string keyed-value pairs for `object` * which can be consumed by `_.fromPairs`. If `object` is a map or set, its * entries are returned. * * @static * @memberOf _ * @since 4.0.0 * @alias entries * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the key-value pairs. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.toPairs(new Foo); * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) */ var toPairs = createToPairs(keys); /** * Creates an array of own and inherited enumerable string keyed-value pairs * for `object` which can be consumed by `_.fromPairs`. If `object` is a map * or set, its entries are returned. * * @static * @memberOf _ * @since 4.0.0 * @alias entriesIn * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the key-value pairs. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.toPairsIn(new Foo); * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) */ var toPairsIn = createToPairs(keysIn); /** * An alternative to `_.reduce`; this method transforms `object` to a new * `accumulator` object which is the result of running each of its own * enumerable string keyed properties thru `iteratee`, with each invocation * potentially mutating the `accumulator` object. If `accumulator` is not * provided, a new object with the same `[[Prototype]]` will be used. The * iteratee is invoked with four arguments: (accumulator, value, key, object). * Iteratee functions may exit iteration early by explicitly returning `false`. * * @static * @memberOf _ * @since 1.3.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @param {*} [accumulator] The custom accumulator value. * @returns {*} Returns the accumulated value. * @example * * _.transform([2, 3, 4], function(result, n) { * result.push(n *= n); * return n % 2 == 0; * }, []); * // => [4, 9] * * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { * (result[value] || (result[value] = [])).push(key); * }, {}); * // => { '1': ['a', 'c'], '2': ['b'] } */ function transform(object, iteratee, accumulator) { var isArr = isArray(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object); iteratee = getIteratee(iteratee, 4); if (accumulator == null) { var Ctor = object && object.constructor; if (isArrLike) { accumulator = isArr ? new Ctor() : []; } else if (isObject(object)) { accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; } else { accumulator = {}; } } (isArrLike ? arrayEach : baseForOwn)( object, function (value, index, object) { return iteratee(accumulator, value, index, object); }, ); return accumulator; } /** * Removes the property at `path` of `object`. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to unset. * @returns {boolean} Returns `true` if the property is deleted, else `false`. * @example * * var object = { 'a': [{ 'b': { 'c': 7 } }] }; * _.unset(object, 'a[0].b.c'); * // => true * * console.log(object); * // => { 'a': [{ 'b': {} }] }; * * _.unset(object, ['a', '0', 'b', 'c']); * // => true * * console.log(object); * // => { 'a': [{ 'b': {} }] }; */ function unset(object, path) { return object == null ? true : baseUnset(object, path); } /** * This method is like `_.set` except that accepts `updater` to produce the * value to set. Use `_.updateWith` to customize `path` creation. The `updater` * is invoked with one argument: (value). * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 4.6.0 * @category Object * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {Function} updater The function to produce the updated value. * @returns {Object} Returns `object`. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.update(object, 'a[0].b.c', function(n) { return n * n; }); * console.log(object.a[0].b.c); * // => 9 * * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); * console.log(object.x[0].y.z); * // => 0 */ function update(object, path, updater) { return object == null ? object : baseUpdate(object, path, castFunction(updater)); } /** * This method is like `_.update` except that it accepts `customizer` which is * invoked to produce the objects of `path`. If `customizer` returns `undefined` * path creation is handled by the method instead. The `customizer` is invoked * with three arguments: (nsValue, key, nsObject). * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 4.6.0 * @category Object * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {Function} updater The function to produce the updated value. * @param {Function} [customizer] The function to customize assigned values. * @returns {Object} Returns `object`. * @example * * var object = {}; * * _.updateWith(object, '[0][1]', _.constant('a'), Object); * // => { '0': { '1': 'a' } } */ function updateWith(object, path, updater, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); } /** * Creates an array of the own enumerable string keyed property values of `object`. * * **Note:** Non-object values are coerced to objects. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property values. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.values(new Foo); * // => [1, 2] (iteration order is not guaranteed) * * _.values('hi'); * // => ['h', 'i'] */ function values(object) { return object == null ? [] : baseValues(object, keys(object)); } /** * Creates an array of the own and inherited enumerable string keyed property * values of `object`. * * **Note:** Non-object values are coerced to objects. * * @static * @memberOf _ * @since 3.0.0 * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property values. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.valuesIn(new Foo); * // => [1, 2, 3] (iteration order is not guaranteed) */ function valuesIn(object) { return object == null ? [] : baseValues(object, keysIn(object)); } /*------------------------------------------------------------------------*/ /** * Clamps `number` within the inclusive `lower` and `upper` bounds. * * @static * @memberOf _ * @since 4.0.0 * @category Number * @param {number} number The number to clamp. * @param {number} [lower] The lower bound. * @param {number} upper The upper bound. * @returns {number} Returns the clamped number. * @example * * _.clamp(-10, -5, 5); * // => -5 * * _.clamp(10, -5, 5); * // => 5 */ function clamp(number, lower, upper) { if (upper === undefined) { upper = lower; lower = undefined; } if (upper !== undefined) { upper = toNumber(upper); upper = upper === upper ? upper : 0; } if (lower !== undefined) { lower = toNumber(lower); lower = lower === lower ? lower : 0; } return baseClamp(toNumber(number), lower, upper); } /** * Checks if `n` is between `start` and up to, but not including, `end`. If * `end` is not specified, it's set to `start` with `start` then set to `0`. * If `start` is greater than `end` the params are swapped to support * negative ranges. * * @static * @memberOf _ * @since 3.3.0 * @category Number * @param {number} number The number to check. * @param {number} [start=0] The start of the range. * @param {number} end The end of the range. * @returns {boolean} Returns `true` if `number` is in the range, else `false`. * @see _.range, _.rangeRight * @example * * _.inRange(3, 2, 4); * // => true * * _.inRange(4, 8); * // => true * * _.inRange(4, 2); * // => false * * _.inRange(2, 2); * // => false * * _.inRange(1.2, 2); * // => true * * _.inRange(5.2, 4); * // => false * * _.inRange(-3, -2, -6); * // => true */ function inRange(number, start, end) { start = toFinite(start); if (end === undefined) { end = start; start = 0; } else { end = toFinite(end); } number = toNumber(number); return baseInRange(number, start, end); } /** * Produces a random number between the inclusive `lower` and `upper` bounds. * If only one argument is provided a number between `0` and the given number * is returned. If `floating` is `true`, or either `lower` or `upper` are * floats, a floating-point number is returned instead of an integer. * * **Note:** JavaScript follows the IEEE-754 standard for resolving * floating-point values which can produce unexpected results. * * @static * @memberOf _ * @since 0.7.0 * @category Number * @param {number} [lower=0] The lower bound. * @param {number} [upper=1] The upper bound. * @param {boolean} [floating] Specify returning a floating-point number. * @returns {number} Returns the random number. * @example * * _.random(0, 5); * // => an integer between 0 and 5 * * _.random(5); * // => also an integer between 0 and 5 * * _.random(5, true); * // => a floating-point number between 0 and 5 * * _.random(1.2, 5.2); * // => a floating-point number between 1.2 and 5.2 */ function random(lower, upper, floating) { if ( floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating) ) { upper = floating = undefined; } if (floating === undefined) { if (typeof upper == 'boolean') { floating = upper; upper = undefined; } else if (typeof lower == 'boolean') { floating = lower; lower = undefined; } } if (lower === undefined && upper === undefined) { lower = 0; upper = 1; } else { lower = toFinite(lower); if (upper === undefined) { upper = lower; lower = 0; } else { upper = toFinite(upper); } } if (lower > upper) { var temp = lower; lower = upper; upper = temp; } if (floating || lower % 1 || upper % 1) { var rand = nativeRandom(); return nativeMin( lower + rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1))), upper, ); } return baseRandom(lower, upper); } /*------------------------------------------------------------------------*/ /** * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the camel cased string. * @example * * _.camelCase('Foo Bar'); * // => 'fooBar' * * _.camelCase('--foo-bar--'); * // => 'fooBar' * * _.camelCase('__FOO_BAR__'); * // => 'fooBar' */ var camelCase = createCompounder(function (result, word, index) { word = word.toLowerCase(); return result + (index ? capitalize(word) : word); }); /** * Converts the first character of `string` to upper case and the remaining * to lower case. * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to capitalize. * @returns {string} Returns the capitalized string. * @example * * _.capitalize('FRED'); * // => 'Fred' */ function capitalize(string) { return upperFirst(toString(string).toLowerCase()); } /** * Deburrs `string` by converting * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) * letters to basic Latin letters and removing * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to deburr. * @returns {string} Returns the deburred string. * @example * * _.deburr('déjà vu'); * // => 'deja vu' */ function deburr(string) { string = toString(string); return ( string && string.replace(reLatin, deburrLetter).replace(reComboMark, '') ); } /** * Checks if `string` ends with the given target string. * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to inspect. * @param {string} [target] The string to search for. * @param {number} [position=string.length] The position to search up to. * @returns {boolean} Returns `true` if `string` ends with `target`, * else `false`. * @example * * _.endsWith('abc', 'c'); * // => true * * _.endsWith('abc', 'b'); * // => false * * _.endsWith('abc', 'b', 2); * // => true */ function endsWith(string, target, position) { string = toString(string); target = baseToString(target); var length = string.length; position = position === undefined ? length : baseClamp(toInteger(position), 0, length); var end = position; position -= target.length; return position >= 0 && string.slice(position, end) == target; } /** * Converts the characters "&", "<", ">", '"', and "'" in `string` to their * corresponding HTML entities. * * **Note:** No other characters are escaped. To escape additional * characters use a third-party library like [_he_](https://mths.be/he). * * Though the ">" character is escaped for symmetry, characters like * ">" and "/" don't need escaping in HTML and have no special meaning * unless they're part of a tag or unquoted attribute value. See * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) * (under "semi-related fun fact") for more details. * * When working with HTML you should always * [quote attribute values](http://wonko.com/post/html-escaping) to reduce * XSS vectors. * * @static * @since 0.1.0 * @memberOf _ * @category String * @param {string} [string=''] The string to escape. * @returns {string} Returns the escaped string. * @example * * _.escape('fred, barney, & pebbles'); * // => 'fred, barney, & pebbles' */ function escape(string) { string = toString(string); return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string; } /** * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to escape. * @returns {string} Returns the escaped string. * @example * * _.escapeRegExp('[lodash](https://lodash.com/)'); * // => '\[lodash\]\(https://lodash\.com/\)' */ function escapeRegExp(string) { string = toString(string); return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, '\\$&') : string; } /** * Converts `string` to * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the kebab cased string. * @example * * _.kebabCase('Foo Bar'); * // => 'foo-bar' * * _.kebabCase('fooBar'); * // => 'foo-bar' * * _.kebabCase('__FOO_BAR__'); * // => 'foo-bar' */ var kebabCase = createCompounder(function (result, word, index) { return result + (index ? '-' : '') + word.toLowerCase(); }); /** * Converts `string`, as space separated words, to lower case. * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the lower cased string. * @example * * _.lowerCase('--Foo-Bar--'); * // => 'foo bar' * * _.lowerCase('fooBar'); * // => 'foo bar' * * _.lowerCase('__FOO_BAR__'); * // => 'foo bar' */ var lowerCase = createCompounder(function (result, word, index) { return result + (index ? ' ' : '') + word.toLowerCase(); }); /** * Converts the first character of `string` to lower case. * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the converted string. * @example * * _.lowerFirst('Fred'); * // => 'fred' * * _.lowerFirst('FRED'); * // => 'fRED' */ var lowerFirst = createCaseFirst('toLowerCase'); /** * Pads `string` on the left and right sides if it's shorter than `length`. * Padding characters are truncated if they can't be evenly divided by `length`. * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to pad. * @param {number} [length=0] The padding length. * @param {string} [chars=' '] The string used as padding. * @returns {string} Returns the padded string. * @example * * _.pad('abc', 8); * // => ' abc ' * * _.pad('abc', 8, '_-'); * // => '_-abc_-_' * * _.pad('abc', 3); * // => 'abc' */ function pad(string, length, chars) { string = toString(string); length = toInteger(length); var strLength = length ? stringSize(string) : 0; if (!length || strLength >= length) { return string; } var mid = (length - strLength) / 2; return ( createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars) ); } /** * Pads `string` on the right side if it's shorter than `length`. Padding * characters are truncated if they exceed `length`. * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to pad. * @param {number} [length=0] The padding length. * @param {string} [chars=' '] The string used as padding. * @returns {string} Returns the padded string. * @example * * _.padEnd('abc', 6); * // => 'abc ' * * _.padEnd('abc', 6, '_-'); * // => 'abc_-_' * * _.padEnd('abc', 3); * // => 'abc' */ function padEnd(string, length, chars) { string = toString(string); length = toInteger(length); var strLength = length ? stringSize(string) : 0; return length && strLength < length ? string + createPadding(length - strLength, chars) : string; } /** * Pads `string` on the left side if it's shorter than `length`. Padding * characters are truncated if they exceed `length`. * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to pad. * @param {number} [length=0] The padding length. * @param {string} [chars=' '] The string used as padding. * @returns {string} Returns the padded string. * @example * * _.padStart('abc', 6); * // => ' abc' * * _.padStart('abc', 6, '_-'); * // => '_-_abc' * * _.padStart('abc', 3); * // => 'abc' */ function padStart(string, length, chars) { string = toString(string); length = toInteger(length); var strLength = length ? stringSize(string) : 0; return length && strLength < length ? createPadding(length - strLength, chars) + string : string; } /** * Converts `string` to an integer of the specified radix. If `radix` is * `undefined` or `0`, a `radix` of `10` is used unless `value` is a * hexadecimal, in which case a `radix` of `16` is used. * * **Note:** This method aligns with the * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. * * @static * @memberOf _ * @since 1.1.0 * @category String * @param {string} string The string to convert. * @param {number} [radix=10] The radix to interpret `value` by. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {number} Returns the converted integer. * @example * * _.parseInt('08'); * // => 8 * * _.map(['6', '08', '10'], _.parseInt); * // => [6, 8, 10] */ function parseInt(string, radix, guard) { if (guard || radix == null) { radix = 0; } else if (radix) { radix = +radix; } return nativeParseInt( toString(string).replace(reTrimStart, ''), radix || 0, ); } /** * Repeats the given string `n` times. * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to repeat. * @param {number} [n=1] The number of times to repeat the string. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {string} Returns the repeated string. * @example * * _.repeat('*', 3); * // => '***' * * _.repeat('abc', 2); * // => 'abcabc' * * _.repeat('abc', 0); * // => '' */ function repeat(string, n, guard) { if (guard ? isIterateeCall(string, n, guard) : n === undefined) { n = 1; } else { n = toInteger(n); } return baseRepeat(toString(string), n); } /** * Replaces matches for `pattern` in `string` with `replacement`. * * **Note:** This method is based on * [`String#replace`](https://mdn.io/String/replace). * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to modify. * @param {RegExp|string} pattern The pattern to replace. * @param {Function|string} replacement The match replacement. * @returns {string} Returns the modified string. * @example * * _.replace('Hi Fred', 'Fred', 'Barney'); * // => 'Hi Barney' */ function replace() { var args = arguments, string = toString(args[0]); return args.length < 3 ? string : string.replace(args[1], args[2]); } /** * Converts `string` to * [snake case](https://en.wikipedia.org/wiki/Snake_case). * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the snake cased string. * @example * * _.snakeCase('Foo Bar'); * // => 'foo_bar' * * _.snakeCase('fooBar'); * // => 'foo_bar' * * _.snakeCase('--FOO-BAR--'); * // => 'foo_bar' */ var snakeCase = createCompounder(function (result, word, index) { return result + (index ? '_' : '') + word.toLowerCase(); }); /** * Splits `string` by `separator`. * * **Note:** This method is based on * [`String#split`](https://mdn.io/String/split). * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to split. * @param {RegExp|string} separator The separator pattern to split by. * @param {number} [limit] The length to truncate results to. * @returns {Array} Returns the string segments. * @example * * _.split('a-b-c', '-', 2); * // => ['a', 'b'] */ function split(string, separator, limit) { if ( limit && typeof limit != 'number' && isIterateeCall(string, separator, limit) ) { separator = limit = undefined; } limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; if (!limit) { return []; } string = toString(string); if ( string && (typeof separator == 'string' || (separator != null && !isRegExp(separator))) ) { separator = baseToString(separator); if (!separator && hasUnicode(string)) { return castSlice(stringToArray(string), 0, limit); } } return string.split(separator, limit); } /** * Converts `string` to * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). * * @static * @memberOf _ * @since 3.1.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the start cased string. * @example * * _.startCase('--foo-bar--'); * // => 'Foo Bar' * * _.startCase('fooBar'); * // => 'Foo Bar' * * _.startCase('__FOO_BAR__'); * // => 'FOO BAR' */ var startCase = createCompounder(function (result, word, index) { return result + (index ? ' ' : '') + upperFirst(word); }); /** * Checks if `string` starts with the given target string. * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to inspect. * @param {string} [target] The string to search for. * @param {number} [position=0] The position to search from. * @returns {boolean} Returns `true` if `string` starts with `target`, * else `false`. * @example * * _.startsWith('abc', 'a'); * // => true * * _.startsWith('abc', 'b'); * // => false * * _.startsWith('abc', 'b', 1); * // => true */ function startsWith(string, target, position) { string = toString(string); position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length); target = baseToString(target); return string.slice(position, position + target.length) == target; } /** * Creates a compiled template function that can interpolate data properties * in "interpolate" delimiters, HTML-escape interpolated data properties in * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data * properties may be accessed as free variables in the template. If a setting * object is given, it takes precedence over `_.templateSettings` values. * * **Note:** In the development build `_.template` utilizes * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) * for easier debugging. * * For more information on precompiling templates see * [lodash's custom builds documentation](https://lodash.com/custom-builds). * * For more information on Chrome extension sandboxes see * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). * * @static * @since 0.1.0 * @memberOf _ * @category String * @param {string} [string=''] The template string. * @param {Object} [options={}] The options object. * @param {RegExp} [options.escape=_.templateSettings.escape] * The HTML "escape" delimiter. * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] * The "evaluate" delimiter. * @param {Object} [options.imports=_.templateSettings.imports] * An object to import into the template as free variables. * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] * The "interpolate" delimiter. * @param {string} [options.sourceURL='lodash.templateSources[n]'] * The sourceURL of the compiled template. * @param {string} [options.variable='obj'] * The data object variable name. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Function} Returns the compiled template function. * @example * * // Use the "interpolate" delimiter to create a compiled template. * var compiled = _.template('hello <%= user %>!'); * compiled({ 'user': 'fred' }); * // => 'hello fred!' * * // Use the HTML "escape" delimiter to escape data property values. * var compiled = _.template('<%- value %>'); * compiled({ 'value': ' )}
); } ================================================ FILE: packages/app/pages/_error.tsx ================================================ /** * NOTE: This requires `@sentry/nextjs` version 7.3.0 or higher. * * NOTE: If using this with `next` version 12.2.0 or lower, uncomment the * penultimate line in `CustomErrorComponent`. * * This page is loaded by Nextjs: * - on the server, when data-fetching methods throw or reject * - on the client, when `getInitialProps` throws or rejects * - on the client, when a React lifecycle method throws or rejects, and it's * caught by the built-in Nextjs error boundary * * See: * - https://nextjs.org/docs/basic-features/data-fetching/overview * - https://nextjs.org/docs/api-reference/data-fetching/get-initial-props * - https://reactjs.org/docs/error-boundaries.html */ import NextErrorComponent from 'next/error'; const CustomErrorComponent = (props: any) => { // If you're using a Nextjs version prior to 12.2.1, uncomment this to // compensate for https://github.com/vercel/next.js/issues/8592 // Sentry.captureUnderscoreErrorException(props); return ; }; CustomErrorComponent.getInitialProps = async (contextData: any) => { // This will contain the status code of the response return NextErrorComponent.getInitialProps(contextData); }; export default CustomErrorComponent; ================================================ FILE: packages/app/pages/alerts.tsx ================================================ import AlertsPage from '@/AlertsPage'; export default AlertsPage; ================================================ FILE: packages/app/pages/api/[...all].ts ================================================ import { NextApiRequest, NextApiResponse } from 'next'; import { createProxyMiddleware, fixRequestBody } from 'http-proxy-middleware'; const DEFAULT_SERVER_URL = `http://127.0.0.1:${process.env.HYPERDX_API_PORT}`; export const config = { api: { externalResolver: true, bodyParser: false, }, }; export default (req: NextApiRequest, res: NextApiResponse) => { const proxy = createProxyMiddleware({ changeOrigin: true, // logger: console, // DEBUG pathRewrite: { '^/api': '' }, target: process.env.SERVER_URL || DEFAULT_SERVER_URL, autoRewrite: true, // ...(IS_DEV && { // logger: console, // }), }); return proxy(req, res, error => { if (error) { console.error(error); res.status(500).send('API proxy error'); return; } res.status(404).send('Not found'); }); }; ================================================ FILE: packages/app/pages/api/config.ts ================================================ import type { NextApiRequest, NextApiResponse } from 'next'; import { HDX_API_KEY, HDX_COLLECTOR_URL, HDX_EXPORTER_ENABLED, HDX_SERVICE_NAME, } from '@/config'; import type { NextApiConfigResponseData } from '@/types'; export default function handler( req: NextApiRequest, res: NextApiResponse, ) { res.status(200).json({ apiKey: HDX_EXPORTER_ENABLED ? HDX_API_KEY : undefined, collectorUrl: HDX_COLLECTOR_URL, serviceName: HDX_SERVICE_NAME, appVersion: process.env.NEXT_PUBLIC_APP_VERSION, }); } ================================================ FILE: packages/app/pages/benchmark.tsx ================================================ import BenchmarkPage from '@/BenchmarkPage'; export default BenchmarkPage; ================================================ FILE: packages/app/pages/careers.tsx ================================================ import CareersPage from '@/CareersPage'; export default CareersPage; ================================================ FILE: packages/app/pages/chart.tsx ================================================ import ChartPage from '@/DBChartPage'; export default ChartPage; ================================================ FILE: packages/app/pages/clickhouse.tsx ================================================ import ClickhousePage from '@/ClickhousePage'; export default ClickhousePage; ================================================ FILE: packages/app/pages/dashboards/[dashboardId].tsx ================================================ import DashboardPage from '@/DBDashboardPage'; export default DashboardPage; ================================================ FILE: packages/app/pages/dashboards/import.tsx ================================================ import DBDashboardImportPage from '@/DBDashboardImportPage'; export default DBDashboardImportPage; ================================================ FILE: packages/app/pages/dashboards/index.tsx ================================================ import DBDashboardPage from '@/DBDashboardPage'; export default DBDashboardPage; ================================================ FILE: packages/app/pages/index.tsx ================================================ import LandingPage from '@/LandingPage'; export default LandingPage; ================================================ FILE: packages/app/pages/join-team.tsx ================================================ import JoinTeamPage from '@/JoinTeamPage'; export default JoinTeamPage; ================================================ FILE: packages/app/pages/kubernetes.tsx ================================================ import KubernetesDashboardPage from '@/KubernetesDashboardPage'; export default KubernetesDashboardPage; ================================================ FILE: packages/app/pages/login/index.tsx ================================================ import AuthPage from '@/AuthPage'; export default function Login() { return (
); } ================================================ FILE: packages/app/pages/register.tsx ================================================ import AuthPage from '@/AuthPage'; export default function Register() { return (
); } ================================================ FILE: packages/app/pages/search/[savedSearchId].tsx ================================================ import SearchPage from '@/DBSearchPage'; export default SearchPage; ================================================ FILE: packages/app/pages/search/index.tsx ================================================ import SearchPage from '@/DBSearchPage'; export default SearchPage; ================================================ FILE: packages/app/pages/service-map.tsx ================================================ import DBServiceMapPage from '@/DBServiceMapPage'; export default DBServiceMapPage; ================================================ FILE: packages/app/pages/services.tsx ================================================ import ServicesDashboardPage from '@/ServicesDashboardPage'; export default ServicesDashboardPage; ================================================ FILE: packages/app/pages/sessions.tsx ================================================ import SessionsPage from '@/SessionsPage'; export default SessionsPage; ================================================ FILE: packages/app/pages/team/index.tsx ================================================ import TeamPage from '@/TeamPage'; export default TeamPage; ================================================ FILE: packages/app/playwright.config.ts ================================================ import { defineConfig, devices } from '@playwright/test'; import path from 'path'; // Check if we should use full-stack mode (with backend) const USE_FULLSTACK = process.env.E2E_FULLSTACK === 'true'; // Check if we should use next dev (hot reload) instead of build + start const USE_DEV = process.env.E2E_USE_DEV === 'true'; const AUTH_FILE = path.join(__dirname, 'tests/e2e/.auth/user.json'); // Timeout configuration constants (in milliseconds) const TEST_TIMEOUT_MS = 60 * 1000; // 60 seconds per test const API_SERVER_STARTUP_TIMEOUT_MS = 120 * 1000; // 2 minutes for API to start const APP_SERVER_STARTUP_TIMEOUT_MS = 180 * 1000; // 3 minutes for Next.js build + start /** * @see https://playwright.dev/docs/test-configuration */ export default defineConfig({ testDir: './tests/e2e', /* Global setup to ensure server is ready */ globalSetup: USE_FULLSTACK ? require.resolve('./tests/e2e/global-setup-fullstack.ts') : require.resolve('./tests/e2e/global-setup-local.ts'), /* Run tests in files in parallel */ fullyParallel: true, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ retries: process.env.CI ? 2 : 1, /* Use multiple workers on CI for faster execution */ workers: process.env.CI ? 2 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: [ ['html'], ['json', { outputFile: 'test-results/results.json' }], ...(process.env.CI ? [['github'] as const, ['list'] as const] : [['list'] as const]), ], /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Base URL to use in actions like `await page.goto('/')`. */ baseURL: USE_FULLSTACK ? 'http://localhost:28081' : process.env.PLAYWRIGHT_BASE_URL || 'http://localhost:8081', /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', /* Take screenshot on failure */ screenshot: 'only-on-failure', /* Record video on failure */ video: 'retain-on-failure', }, /* Global test timeout - CI needs more time than local */ timeout: TEST_TIMEOUT_MS, /* Configure projects for different test environments */ projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'], // Use saved authentication state for full-stack mode ...(USE_FULLSTACK && { storageState: AUTH_FILE, }), }, }, ], /* Run your local dev server before starting the tests */ // Note: webServer array syntax requires Playwright v1.32.0+ (current: v1.57.0) webServer: USE_FULLSTACK ? [ // Full-stack mode: Start API and App servers (infrastructure started separately) { // Connections/sources come from env (injected by run-e2e.js from e2e-fixtures.json) command: `cd ../api && ${process.env.MONGO_URI ? `MONGO_URI="${process.env.MONGO_URI}"` : ''} DOTENV_CONFIG_PATH=.env.e2e npx ts-node --transpile-only -r tsconfig-paths/register -r dotenv-expand/config -r @hyperdx/node-opentelemetry/build/src/tracing src/index.ts`, port: 29000, reuseExistingServer: !process.env.CI, timeout: API_SERVER_STARTUP_TIMEOUT_MS, stdout: 'pipe', stderr: 'pipe', }, { // Full UI: Alerts + Dashboards. Not local mode; Alerts enabled; command: USE_DEV ? 'SERVER_URL=http://localhost:29000 PORT=28081 next dev --webpack' : 'SERVER_URL=http://localhost:29000 PORT=28081 yarn build && SERVER_URL=http://localhost:29000 PORT=28081 yarn start', port: 28081, reuseExistingServer: !process.env.CI, timeout: APP_SERVER_STARTUP_TIMEOUT_MS, stdout: 'pipe', stderr: 'pipe', }, ] : { // Local mode: Frontend only command: USE_DEV ? 'NEXT_PUBLIC_IS_LOCAL_MODE=true PORT=8081 next dev --webpack' : 'NEXT_PUBLIC_IS_LOCAL_MODE=true yarn build && NEXT_PUBLIC_IS_LOCAL_MODE=true PORT=8081 yarn start', port: 8081, reuseExistingServer: !process.env.CI, timeout: APP_SERVER_STARTUP_TIMEOUT_MS, stdout: 'pipe', stderr: 'pipe', }, }); ================================================ FILE: packages/app/postcss.config.cjs ================================================ module.exports = { plugins: { 'postcss-preset-mantine': {}, 'postcss-simple-vars': { variables: { 'mantine-breakpoint-xs': '36em', 'mantine-breakpoint-sm': '48em', 'mantine-breakpoint-md': '62em', 'mantine-breakpoint-lg': '75em', 'mantine-breakpoint-xl': '88em', }, }, }, }; ================================================ FILE: packages/app/public/pyodide/pyodide-lock.json ================================================ { "info": { "abi_version": "2024_0", "arch": "wasm32", "platform": "emscripten_3_1_58", "python": "3.12.7", "version": "0.27.2" }, "packages": { "affine": { "depends": [], "file_name": "affine-2.4.0-py3-none-any.whl", "imports": ["affine"], "install_dir": "site", "name": "affine", "package_type": "package", "sha256": "465f43c53d566d8631c62020147e94c76c6e89bd3cf7255b91e3c6e1376589d8", "unvendored_tests": true, "version": "2.4.0" }, "affine-tests": { "depends": ["affine"], "file_name": "affine-tests.tar", "imports": [], "install_dir": "site", "name": "affine-tests", "package_type": "package", "sha256": "496ef58c6daf0684e50060026bd9b3b807f03eacf3490dfcd4e610463a660fcd", "unvendored_tests": false, "version": "2.4.0" }, "aiohttp": { "depends": [ "aiosignal", "async-timeout", "attrs", "charset-normalizer", "frozenlist", "multidict", "yarl" ], "file_name": "aiohttp-3.9.5-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["aiohttp"], "install_dir": "site", "name": "aiohttp", "package_type": "package", "sha256": "9187d627eaf387a56f0518fbd804f7c6caa7fc8bf672fa9efdf60ad4370a170b", "unvendored_tests": true, "version": "3.9.5" }, "aiohttp-tests": { "depends": ["aiohttp"], "file_name": "aiohttp-tests.tar", "imports": [], "install_dir": "site", "name": "aiohttp-tests", "package_type": "package", "sha256": "3f0691239fc606ab18dfa44282257d9dbbc2babd094cde2debdd2767ab7ac0e8", "unvendored_tests": false, "version": "3.9.5" }, "aiosignal": { "depends": ["frozenlist"], "file_name": "aiosignal-1.3.1-py3-none-any.whl", "imports": ["aiosignal"], "install_dir": "site", "name": "aiosignal", "package_type": "package", "sha256": "591e2f6aa2430ad9f511b36332d0c4d481c8b60ff4812673044409f70fc9acfb", "unvendored_tests": false, "version": "1.3.1" }, "altair": { "depends": [ "typing-extensions", "jinja2", "jsonschema", "packaging", "narwhals" ], "file_name": "altair-5.4.1-py3-none-any.whl", "imports": ["altair"], "install_dir": "site", "name": "altair", "package_type": "package", "sha256": "22b80935bacbbfc514a7ecce044510bc776dd18debdd82f65604c94fae09691d", "unvendored_tests": false, "version": "5.4.1" }, "annotated-types": { "depends": [], "file_name": "annotated_types-0.6.0-py3-none-any.whl", "imports": ["annotated_types"], "install_dir": "site", "name": "annotated-types", "package_type": "package", "sha256": "7415a962cd82322eacb271516c7c1c0a0d7bcd43b318ca058322b5d27b24517e", "unvendored_tests": true, "version": "0.6.0" }, "annotated-types-tests": { "depends": ["annotated-types"], "file_name": "annotated-types-tests.tar", "imports": [], "install_dir": "site", "name": "annotated-types-tests", "package_type": "package", "sha256": "ec8dc09ec048f30ff6c915159315188439435136769a3a7202321c09ca971719", "unvendored_tests": false, "version": "0.6.0" }, "apsw": { "depends": [], "file_name": "apsw-3.47.2.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["apsw"], "install_dir": "site", "name": "apsw", "package_type": "package", "sha256": "ea5d67230168a5f055c52b3b77be071cdf73007bcbd3a3a2b6fd0d99cc627a7d", "unvendored_tests": false, "version": "3.47.2.0" }, "argon2-cffi": { "depends": ["argon2-cffi-bindings"], "file_name": "argon2_cffi-23.1.0-py3-none-any.whl", "imports": ["argon2"], "install_dir": "site", "name": "argon2-cffi", "package_type": "package", "sha256": "934f49e85bceb8beb0c0beff0c80be029887297988d4801dc55fe6691ef89e58", "unvendored_tests": false, "version": "23.1.0" }, "argon2-cffi-bindings": { "depends": ["cffi"], "file_name": "argon2_cffi_bindings-21.2.0-cp312-abi3-pyodide_2024_0_wasm32.whl", "imports": ["_argon2_cffi_bindings"], "install_dir": "site", "name": "argon2-cffi-bindings", "package_type": "package", "sha256": "dd94aa3c2b9a630fe86ba52349380ddb9da63622c26bc623ea8431a30e278259", "unvendored_tests": false, "version": "21.2.0" }, "arro3-compute": { "depends": ["arro3-core"], "file_name": "arro3_compute-0.4.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["arro3.compute"], "install_dir": "site", "name": "arro3-compute", "package_type": "package", "sha256": "3d20915b504c7f2cf54a80e03938560bec35fa392a00215b233227a3d7b312ea", "unvendored_tests": false, "version": "0.4.1" }, "arro3-core": { "depends": [], "file_name": "arro3_core-0.4.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["arro3.core"], "install_dir": "site", "name": "arro3-core", "package_type": "package", "sha256": "3c9770df7027ba8f110d2afbad63f019b7d2d7c0cfafc46e1819b2441ca9d386", "unvendored_tests": false, "version": "0.4.1" }, "arro3-io": { "depends": ["arro3-core"], "file_name": "arro3_io-0.4.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["arro3.io"], "install_dir": "site", "name": "arro3-io", "package_type": "package", "sha256": "da072bcc0b8f8e2d8671e8b3ed19097244331d0db616b073dd5ae11eb565849a", "unvendored_tests": false, "version": "0.4.1" }, "asciitree": { "depends": [], "file_name": "asciitree-0.3.3-py3-none-any.whl", "imports": ["asciitree"], "install_dir": "site", "name": "asciitree", "package_type": "package", "sha256": "3f509fb58e8b0ed0cb084c36a086b1d7e5b798ed68b27276231ed8f65b428fb1", "unvendored_tests": false, "version": "0.3.3" }, "astropy": { "depends": [ "packaging", "numpy", "pyerfa", "pyyaml", "astropy_iers_data" ], "file_name": "astropy-7.0.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["astropy"], "install_dir": "site", "name": "astropy", "package_type": "package", "sha256": "5ed3238853f36c71c8b8d73c32cc6c08d0c339f799fa0d72bc74f58d86fe8fd3", "unvendored_tests": false, "version": "7.0.0" }, "astropy-iers-data": { "depends": [], "file_name": "astropy_iers_data-0.2024.4.22.0.29.50-py3-none-any.whl", "imports": ["astropy_iers_data"], "install_dir": "site", "name": "astropy_iers_data", "package_type": "package", "sha256": "34d885b3f2a2b7d7c98c990712707c1135add7f7a9697632cf89868f251cd013", "unvendored_tests": true, "version": "0.2024.4.22.0.29.50" }, "astropy-iers-data-tests": { "depends": ["astropy_iers_data"], "file_name": "astropy_iers_data-tests.tar", "imports": [], "install_dir": "site", "name": "astropy_iers_data-tests", "package_type": "package", "sha256": "e227d67965fdba74771df0081354df9519d7c79b9e9a0a81662f94d5b57f775e", "unvendored_tests": false, "version": "0.2024.4.22.0.29.50" }, "asttokens": { "depends": ["six"], "file_name": "asttokens-2.4.1-py2.py3-none-any.whl", "imports": ["asttokens"], "install_dir": "site", "name": "asttokens", "package_type": "package", "sha256": "de1a0afc149b38969fe53a55965367e10fb45b570fc539759f1365e295e8139d", "unvendored_tests": false, "version": "2.4.1" }, "async-timeout": { "depends": [], "file_name": "async_timeout-4.0.3-py3-none-any.whl", "imports": ["async_timeout"], "install_dir": "site", "name": "async-timeout", "package_type": "package", "sha256": "4702dadd2d1b431a44d1c5090dc045ce63f3d5aeb23bcf1474e57c4c7b32ef7f", "unvendored_tests": false, "version": "4.0.3" }, "atomicwrites": { "depends": [], "file_name": "atomicwrites-1.4.1-py2.py3-none-any.whl", "imports": ["atomicwrites"], "install_dir": "site", "name": "atomicwrites", "package_type": "package", "sha256": "b042cb4c980f7c1e6eed67f4bfd32d8f15d573a6852285c4bb85f878d8c0a19c", "unvendored_tests": false, "version": "1.4.1" }, "attrs": { "depends": ["six"], "file_name": "attrs-23.2.0-py3-none-any.whl", "imports": ["attr", "attrs"], "install_dir": "site", "name": "attrs", "package_type": "package", "sha256": "a23f168e4d416843171974929b5a9d546bd4a6dd9f7632cc8b1a46fa43236fc9", "unvendored_tests": false, "version": "23.2.0" }, "autograd": { "depends": ["numpy", "future"], "file_name": "autograd-1.7.0-py3-none-any.whl", "imports": ["autograd"], "install_dir": "site", "name": "autograd", "package_type": "package", "sha256": "c125e6a90889971ffca4b97dff361fa280f9a7225b6da0b6eeb6d5a9d5e6df66", "unvendored_tests": true, "version": "1.7.0" }, "autograd-tests": { "depends": ["autograd"], "file_name": "autograd-tests.tar", "imports": [], "install_dir": "site", "name": "autograd-tests", "package_type": "package", "sha256": "a19acf64fdcd2fb08bc8b8177efb2b7f78c788a46ccc5693d08843436eaa8822", "unvendored_tests": false, "version": "1.7.0" }, "awkward-cpp": { "depends": ["numpy"], "file_name": "awkward_cpp-43-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["awkward_cpp"], "install_dir": "site", "name": "awkward-cpp", "package_type": "package", "sha256": "46fe3991a82b71e3c8a84e0ddf8509e00e7425d9e4acd84e44d8535d155ef451", "unvendored_tests": false, "version": "43" }, "b2d": { "depends": ["numpy", "pydantic", "setuptools", "annotated-types"], "file_name": "b2d-0.7.4-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["b2d"], "install_dir": "site", "name": "b2d", "package_type": "package", "sha256": "c03c088ab3582dc38a3d66253e596cdffbaf7c220aabe45a878307ca409ff1a0", "unvendored_tests": false, "version": "0.7.4" }, "bcrypt": { "depends": [], "file_name": "bcrypt-4.1.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["bcrypt"], "install_dir": "site", "name": "bcrypt", "package_type": "package", "sha256": "021155b46b2c7416e9716ff6281a9ed9fd59340f50850831120a7d8cf0dc13fd", "unvendored_tests": false, "version": "4.1.2" }, "beautifulsoup4": { "depends": ["soupsieve"], "file_name": "beautifulsoup4-4.12.3-py3-none-any.whl", "imports": ["bs4"], "install_dir": "site", "name": "beautifulsoup4", "package_type": "package", "sha256": "756d1f28c28b37e5db4c611c8f3231e16cb511b083de8816ba2343cf27b81d1c", "unvendored_tests": true, "version": "4.12.3" }, "beautifulsoup4-tests": { "depends": ["beautifulsoup4"], "file_name": "beautifulsoup4-tests.tar", "imports": [], "install_dir": "site", "name": "beautifulsoup4-tests", "package_type": "package", "sha256": "042cba82c4156b55cbcfcdb281ca2557e4532dad31fecbca037945eaf68a928a", "unvendored_tests": false, "version": "4.12.3" }, "biopython": { "depends": ["numpy"], "file_name": "biopython-1.84-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["Bio", "BioSQL"], "install_dir": "site", "name": "biopython", "package_type": "package", "sha256": "ebe69644476b90deccc189f00810b96d651a2733ddd64931913040d263b33b7b", "unvendored_tests": false, "version": "1.84" }, "bitarray": { "depends": [], "file_name": "bitarray-2.9.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["bitarray"], "install_dir": "site", "name": "bitarray", "package_type": "package", "sha256": "890590bb911972a11685846ee4d60b083f0b803f7e2d36609a41cec2906b2904", "unvendored_tests": true, "version": "2.9.2" }, "bitarray-tests": { "depends": ["bitarray"], "file_name": "bitarray-tests.tar", "imports": [], "install_dir": "site", "name": "bitarray-tests", "package_type": "package", "sha256": "121659fad7b88bfd884dcb5e585e9e5ce5889229718a567ae60583766f99e1d9", "unvendored_tests": false, "version": "2.9.2" }, "bitstring": { "depends": ["bitarray"], "file_name": "bitstring-4.1.4-py3-none-any.whl", "imports": ["bitstring"], "install_dir": "site", "name": "bitstring", "package_type": "package", "sha256": "8d43c4cfe97e024476d18a440f4aeefb5c2317fe05671666426e0f702fd5f823", "unvendored_tests": false, "version": "4.1.4" }, "bleach": { "depends": ["webencodings", "packaging", "six"], "file_name": "bleach-6.1.0-py3-none-any.whl", "imports": ["bleach"], "install_dir": "site", "name": "bleach", "package_type": "package", "sha256": "152bcd3e8b3c66f55d359ed8d75285be1a90885038f534db3a90bbcb4bbda3d6", "unvendored_tests": false, "version": "6.1.0" }, "bokeh": { "depends": [ "contourpy", "numpy", "jinja2", "pandas", "pillow", "python-dateutil", "six", "typing-extensions", "pyyaml", "xyzservices" ], "file_name": "bokeh-3.6.0-py3-none-any.whl", "imports": ["bokeh"], "install_dir": "site", "name": "bokeh", "package_type": "package", "sha256": "dc0a1552460d811eb2c693bf8b7fcb8f3ff688cd43ebd7e891058f2babefcea5", "unvendored_tests": false, "version": "3.6.0" }, "boost-histogram": { "depends": ["numpy"], "file_name": "boost_histogram-1.5.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["boost_histogram"], "install_dir": "site", "name": "boost-histogram", "package_type": "package", "sha256": "21292559f03dc4dd5d1d3aa1b858ef513acb9177006db9c9e85d91bb11cc930a", "unvendored_tests": false, "version": "1.5.0" }, "brotli": { "depends": [], "file_name": "Brotli-1.1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["brotli"], "install_dir": "site", "name": "brotli", "package_type": "package", "sha256": "be94d49e8deb69e77881cc31c9c34d4200a5948e701e3b9c667daf1922f92d3c", "unvendored_tests": false, "version": "1.1.0" }, "buffer-test": { "depends": [], "file_name": "buffer_test-0.1.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["buffer_test"], "install_dir": "site", "name": "buffer-test", "package_type": "package", "sha256": "05bf589edda8e407e0e35cd76cffd322573906a7b13b40e50f93468a4ad4675f", "unvendored_tests": false, "version": "0.1.1" }, "cachetools": { "depends": [], "file_name": "cachetools-5.3.3-py3-none-any.whl", "imports": ["cachetools"], "install_dir": "site", "name": "cachetools", "package_type": "package", "sha256": "7ddeccd149789a3ca355079e547c4d4e99a5cd2c1b74653914758507b6add9fc", "unvendored_tests": false, "version": "5.3.3" }, "cartopy": { "depends": ["shapely", "pyshp", "pyproj", "geos", "matplotlib", "scipy"], "file_name": "Cartopy-0.24.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cartopy"], "install_dir": "site", "name": "Cartopy", "package_type": "package", "sha256": "6a4d2dd87d95fb42412b30a444bc31e1c0817cf676ad2243e9bb80f2475b8a29", "unvendored_tests": true, "version": "0.24.1" }, "cartopy-tests": { "depends": ["cartopy"], "file_name": "Cartopy-tests.tar", "imports": [], "install_dir": "site", "name": "Cartopy-tests", "package_type": "package", "sha256": "5512016766a582f520d0b8606f973101fb9364b0557311775a5cb4016b962918", "unvendored_tests": false, "version": "0.24.1" }, "casadi": { "depends": ["numpy"], "file_name": "casadi-3.6.7-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["casadi"], "install_dir": "site", "name": "casadi", "package_type": "package", "sha256": "da8b8c643769893a56de55c3735b0bfa123089532755df26645d80287716ae21", "unvendored_tests": false, "version": "3.6.7" }, "cbor-diag": { "depends": [], "file_name": "cbor_diag-1.0.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cbor_diag"], "install_dir": "site", "name": "cbor-diag", "package_type": "package", "sha256": "a441a5e0236027af2e69ec4753c63a4aaf13e42c845d823d181e40917ac50b0a", "unvendored_tests": false, "version": "1.0.1" }, "certifi": { "depends": [], "file_name": "certifi-2024.12.14-py3-none-any.whl", "imports": ["certifi"], "install_dir": "site", "name": "certifi", "package_type": "package", "sha256": "b0fe59943d1d650161259833b9a7ecafba38ce7f99ab41b2473249304f4b215b", "unvendored_tests": false, "version": "2024.12.14" }, "cffi": { "depends": ["pycparser"], "file_name": "cffi-1.17.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cffi"], "install_dir": "site", "name": "cffi", "package_type": "package", "sha256": "216060a8ba3afa1deb8be9175d75ea1c03f1a60145d1e91095a8b911fd1f10ab", "unvendored_tests": false, "version": "1.17.1" }, "cffi-example": { "depends": ["cffi"], "file_name": "cffi_example-0.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cffi_example"], "install_dir": "site", "name": "cffi_example", "package_type": "package", "sha256": "94fd0b48768aa1b180c2eece308de2401ba4aa7c77182394a2e269bb15a26d8b", "unvendored_tests": false, "version": "0.1" }, "cftime": { "depends": ["numpy"], "file_name": "cftime-1.6.4.post1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cftime"], "install_dir": "site", "name": "cftime", "package_type": "package", "sha256": "2a53284c738cc5ad8caaad8ed9f18ca3cc0ae1e6547fed7bf42ab403cf5f36df", "unvendored_tests": false, "version": "1.6.4.post1" }, "charset-normalizer": { "depends": [], "file_name": "charset_normalizer-3.3.2-py3-none-any.whl", "imports": ["charset_normalizer"], "install_dir": "site", "name": "charset-normalizer", "package_type": "package", "sha256": "8acf154714f67b1deb8dae69e825d9fd65e1d55e090cb54cad2df6671eb73b23", "unvendored_tests": false, "version": "3.3.2" }, "clarabel": { "depends": ["numpy", "scipy"], "file_name": "clarabel-0.9.0-cp37-abi3-pyodide_2024_0_wasm32.whl", "imports": ["clarabel"], "install_dir": "site", "name": "clarabel", "package_type": "package", "sha256": "2321a26bb99e54c229ff74ba611c8b4a502507eae83d2bf389e5ef96d0816c4c", "unvendored_tests": false, "version": "0.9.0" }, "click": { "depends": [], "file_name": "click-8.1.7-py3-none-any.whl", "imports": ["click"], "install_dir": "site", "name": "click", "package_type": "package", "sha256": "c2b9604d1a4f4aa2d4bc1f3a23b9e86b125256705a8d067981df75f118112626", "unvendored_tests": false, "version": "8.1.7" }, "cligj": { "depends": ["click"], "file_name": "cligj-0.7.2-py3-none-any.whl", "imports": ["cligj"], "install_dir": "site", "name": "cligj", "package_type": "package", "sha256": "23cabb7a6017e89151b02fc81601989abad08af91581dff99efeabae4c46fdd8", "unvendored_tests": false, "version": "0.7.2" }, "clingo": { "depends": ["cffi"], "file_name": "clingo-5.7.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["clingo"], "install_dir": "site", "name": "clingo", "package_type": "package", "sha256": "dd3a149f5d816246ca99ed94ad3ee7b00886d93924bf1e817e34b0383012cbec", "unvendored_tests": false, "version": "5.7.1" }, "cloudpickle": { "depends": [], "file_name": "cloudpickle-3.0.0-py3-none-any.whl", "imports": ["cloudpickle"], "install_dir": "site", "name": "cloudpickle", "package_type": "package", "sha256": "9b7839b924570fcc02f918f94bc95b4197169b89756c73dd82b5b8eb61667178", "unvendored_tests": false, "version": "3.0.0" }, "cmyt": { "depends": ["colorspacious", "matplotlib", "more-itertools", "numpy"], "file_name": "cmyt-2.0.0-py3-none-any.whl", "imports": ["cmyt"], "install_dir": "site", "name": "cmyt", "package_type": "package", "sha256": "f6563bb0942f138e4a218b9f2fbba367a537b7cd0115f9e93a282525dafbf5fa", "unvendored_tests": true, "version": "2.0.0" }, "cmyt-tests": { "depends": ["cmyt"], "file_name": "cmyt-tests.tar", "imports": [], "install_dir": "site", "name": "cmyt-tests", "package_type": "package", "sha256": "184c76099c03adff9e4c2c8486481274594fba658f073176640f96d42be8a131", "unvendored_tests": false, "version": "2.0.0" }, "colorspacious": { "depends": ["numpy"], "file_name": "colorspacious-1.1.2-py2.py3-none-any.whl", "imports": ["colorspacious"], "install_dir": "site", "name": "colorspacious", "package_type": "package", "sha256": "4f6ea6bc9aaf8cfa31370d56da25af0e37a972b563a05ac8a72ed530d6579d3f", "unvendored_tests": false, "version": "1.1.2" }, "contourpy": { "depends": ["numpy"], "file_name": "contourpy-1.3.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["contourpy"], "install_dir": "site", "name": "contourpy", "package_type": "package", "sha256": "76262950782afcb1888a8379ebf657d44f2d761051a610dc11d435903508bc44", "unvendored_tests": false, "version": "1.3.0" }, "coolprop": { "depends": ["numpy", "matplotlib"], "file_name": "CoolProp-6.6.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["CoolProp"], "install_dir": "site", "name": "coolprop", "package_type": "package", "sha256": "8c1a069ca09d5320e4db3d754988a9694da601403ccba0b62dbc36a7cfb7dc2d", "unvendored_tests": true, "version": "6.6.0" }, "coolprop-tests": { "depends": ["coolprop"], "file_name": "coolprop-tests.tar", "imports": [], "install_dir": "site", "name": "coolprop-tests", "package_type": "package", "sha256": "9424d6af3a61671ee799fc0aede136b0f0049c2102797953196e61f7c30649ce", "unvendored_tests": false, "version": "6.6.0" }, "coverage": { "depends": ["sqlite3"], "file_name": "coverage-7.4.4-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["coverage"], "install_dir": "site", "name": "coverage", "package_type": "package", "sha256": "7a85aa0a9ec905ed5e80b7fcd32e60c0e9ea46cb21954a68f286fa649e6a8a44", "unvendored_tests": false, "version": "7.4.4" }, "cpp-exceptions-test": { "depends": [], "file_name": "cpp-exceptions-test-0.1.zip", "imports": [], "install_dir": "dynlib", "name": "cpp-exceptions-test", "package_type": "shared_library", "sha256": "f8a3a2ae760488a58d1b7c39472ea2cc055e5263fe696e15f108804355b2a054", "unvendored_tests": false, "version": "0.1" }, "cpp-exceptions-test2": { "depends": [], "file_name": "cpp_exceptions_test2-1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cpp-exceptions-test2"], "install_dir": "site", "name": "cpp-exceptions-test2", "package_type": "package", "sha256": "8cc8c48e7131a8e6c81aea87e7de628898310241a4fc555f70cb44768838697d", "unvendored_tests": false, "version": "1.0" }, "cramjam": { "depends": [], "file_name": "cramjam-2.8.3-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cramjam"], "install_dir": "site", "name": "cramjam", "package_type": "package", "sha256": "73216c235a829b0e7146544cfdfc0d105739268d9d5facab464ecba2da302a5f", "unvendored_tests": false, "version": "2.8.3" }, "crc32c": { "depends": [], "file_name": "crc32c-2.7.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["crc32c"], "install_dir": "site", "name": "crc32c", "package_type": "package", "sha256": "6d01abf50e692a3f7c0318862d2a23fce272c79e8e1b0c15aa232ffe8df51f1e", "unvendored_tests": false, "version": "2.7.1" }, "cryptography": { "depends": ["openssl", "six", "cffi"], "file_name": "cryptography-42.0.5-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cryptography"], "install_dir": "site", "name": "cryptography", "package_type": "package", "sha256": "33089d150f53f9a1b8a962f33381a5f6aa0b6169743409cd0e895a5ee594f1f5", "unvendored_tests": false, "version": "42.0.5" }, "css-inline": { "depends": [], "file_name": "css_inline-0.14.6-cp37-abi3-pyodide_2024_0_wasm32.whl", "imports": ["css_inline"], "install_dir": "site", "name": "css-inline", "package_type": "package", "sha256": "8165669ad2e752d684753aaefc38983ebf1b7a21b711ad9e4e0e44c8c6617327", "unvendored_tests": false, "version": "0.14.6" }, "cssselect": { "depends": [], "file_name": "cssselect-1.2.0-py2.py3-none-any.whl", "imports": ["cssselect"], "install_dir": "site", "name": "cssselect", "package_type": "package", "sha256": "dd8e3574b1918238f98e1cc484efecbb8638736bab56c690a51f84fef77d3f34", "unvendored_tests": false, "version": "1.2.0" }, "cvxpy-base": { "depends": ["numpy", "scipy", "clarabel"], "file_name": "cvxpy_base-1.5.1-py3-none-any.whl", "imports": ["cvxpy"], "install_dir": "site", "name": "cvxpy-base", "package_type": "package", "sha256": "5fccbfc6e628c163da2da88e6cfa666090da6174706edc59be54db3b7dba7b99", "unvendored_tests": true, "version": "1.5.1" }, "cvxpy-base-tests": { "depends": ["cvxpy-base"], "file_name": "cvxpy-base-tests.tar", "imports": [], "install_dir": "site", "name": "cvxpy-base-tests", "package_type": "package", "sha256": "f8612395cf47114bfc2ff77de26e62911aa3f773720b63a8c740d4478028beaf", "unvendored_tests": false, "version": "1.5.1" }, "cycler": { "depends": ["six"], "file_name": "cycler-0.12.1-py3-none-any.whl", "imports": ["cycler"], "install_dir": "site", "name": "cycler", "package_type": "package", "sha256": "58e815bd25f79b23d8eacd824207b3f23da1a624f190ab3796ea13c41880ab73", "unvendored_tests": false, "version": "0.12.1" }, "cysignals": { "depends": [], "file_name": "cysignals-1.12.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cysignals"], "install_dir": "site", "name": "cysignals", "package_type": "package", "sha256": "61dc1faffc1937637efd8c7e938ae054f3a94c77d972ec166b1f0431a9171796", "unvendored_tests": false, "version": "1.12.2" }, "cytoolz": { "depends": ["toolz"], "file_name": "cytoolz-0.12.3-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cytoolz"], "install_dir": "site", "name": "cytoolz", "package_type": "package", "sha256": "6af79d9cd6f6880c1f73f256d528e2704e00c5ab94b885b38ea6312929ab0848", "unvendored_tests": true, "version": "0.12.3" }, "cytoolz-tests": { "depends": ["cytoolz"], "file_name": "cytoolz-tests.tar", "imports": [], "install_dir": "site", "name": "cytoolz-tests", "package_type": "package", "sha256": "17046869dfbd3becf2c8114c31b84087deabba5b53b0518e06daebf224b235b1", "unvendored_tests": false, "version": "0.12.3" }, "decorator": { "depends": [], "file_name": "decorator-5.1.1-py3-none-any.whl", "imports": ["decorator"], "install_dir": "site", "name": "decorator", "package_type": "package", "sha256": "c68b74ca68cc0c533fa1c254a02f4857fcbde1ceb0e332bcf42bb63db6dc0fc5", "unvendored_tests": false, "version": "5.1.1" }, "demes": { "depends": ["attrs", "ruamel.yaml"], "file_name": "demes-0.2.3-py3-none-any.whl", "imports": ["demes"], "install_dir": "site", "name": "demes", "package_type": "package", "sha256": "2f542c978ddbadaf6a0466a880b02c0ae4530b152062a1bce35dcb046b1efe42", "unvendored_tests": false, "version": "0.2.3" }, "deprecation": { "depends": ["packaging"], "file_name": "deprecation-2.1.0-py2.py3-none-any.whl", "imports": ["deprecation"], "install_dir": "site", "name": "deprecation", "package_type": "package", "sha256": "3cd88ec0010dbeb29b52258d6d8dcfe1bb5fd7945be7f4a33ad4085e4537000f", "unvendored_tests": false, "version": "2.1.0" }, "distlib": { "depends": [], "file_name": "distlib-0.3.8-py2.py3-none-any.whl", "imports": ["distlib"], "install_dir": "site", "name": "distlib", "package_type": "package", "sha256": "07c8b4ce9d3a7200e71a2850ef069b6a0a7bd3a492e2468cb731b848dab628bb", "unvendored_tests": false, "version": "0.3.8" }, "docutils": { "depends": [], "file_name": "docutils-0.21.1-py3-none-any.whl", "imports": ["docutils"], "install_dir": "site", "name": "docutils", "package_type": "package", "sha256": "88ff5931f499256e99533d6eaf746de987c108bd2e25a65d7620bd51027aef33", "unvendored_tests": false, "version": "0.21.1" }, "duckdb": { "depends": [], "file_name": "duckdb-1.1.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["duckdb"], "install_dir": "site", "name": "duckdb", "package_type": "package", "sha256": "ed6d0c122bcd3fce6778f3786895e4e22f823276da31ecc7cf8274039585af05", "unvendored_tests": false, "version": "1.1.2" }, "ewah-bool-utils": { "depends": [], "file_name": "ewah_bool_utils-1.2.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["ewah_bool_utils"], "install_dir": "site", "name": "ewah_bool_utils", "package_type": "package", "sha256": "b8f35bbf6594c197351a7a7dbc3a06d3cfb175d76bbf09ae37b17d86375d8eaa", "unvendored_tests": true, "version": "1.2.2" }, "ewah-bool-utils-tests": { "depends": ["ewah_bool_utils"], "file_name": "ewah_bool_utils-tests.tar", "imports": [], "install_dir": "site", "name": "ewah_bool_utils-tests", "package_type": "package", "sha256": "9e03f7d6b4527266fa6cec3122665a4dca13c884d37ae9a62426fc8bf8d7a609", "unvendored_tests": false, "version": "1.2.2" }, "exceptiongroup": { "depends": [], "file_name": "exceptiongroup-1.2.1-py3-none-any.whl", "imports": ["exceptiongroup"], "install_dir": "site", "name": "exceptiongroup", "package_type": "package", "sha256": "bb57553202b5fee77296b3578edb9a9587ae17460f03cce50e6145deeb38ee3e", "unvendored_tests": false, "version": "1.2.1" }, "executing": { "depends": [], "file_name": "executing-2.0.1-py2.py3-none-any.whl", "imports": ["executing"], "install_dir": "site", "name": "executing", "package_type": "package", "sha256": "1acd3cb0a8559c26c7ca333d25f50930feed74367b15771807e018e4b6c98507", "unvendored_tests": false, "version": "2.0.1" }, "fastparquet": { "depends": ["cramjam", "numpy", "pandas", "fsspec", "packaging"], "file_name": "fastparquet-2024.5.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["fastparquet"], "install_dir": "site", "name": "fastparquet", "package_type": "package", "sha256": "bb7bf805331c83e3e5453e0b4e409544e97d88acd687a4c146112bbaf31d0081", "unvendored_tests": false, "version": "2024.5.0" }, "fiona": { "depends": ["attrs", "certifi", "setuptools", "six", "click", "cligj"], "file_name": "fiona-1.9.5-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["fiona"], "install_dir": "site", "name": "fiona", "package_type": "package", "sha256": "483d6aaab1b5e25fa08b84015fc171f0245a5ca058f646e9c89e621c0cf9d375", "unvendored_tests": true, "version": "1.9.5" }, "fiona-tests": { "depends": ["fiona"], "file_name": "fiona-tests.tar", "imports": [], "install_dir": "site", "name": "fiona-tests", "package_type": "package", "sha256": "66bbc1421329395e4c4053764d3721f93106d2f1953582f45d17df0cd511a78d", "unvendored_tests": false, "version": "1.9.5" }, "fonttools": { "depends": [], "file_name": "fonttools-4.51.0-py3-none-any.whl", "imports": ["fontTools"], "install_dir": "site", "name": "fonttools", "package_type": "package", "sha256": "1ca523c75a5926a5527612c7a2303cee671af8f27e04a82eafce0dfc8cdb8e03", "unvendored_tests": false, "version": "4.51.0" }, "fpcast-test": { "depends": [], "file_name": "fpcast_test-0.1.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["fpcast_test"], "install_dir": "site", "name": "fpcast-test", "package_type": "package", "sha256": "f85fbbf6f2f69946fda6dd59e7433f01d128a35da33d0435e6f220cb5516e5c3", "unvendored_tests": false, "version": "0.1.1" }, "freesasa": { "depends": [], "file_name": "freesasa-2.2.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["freesasa"], "install_dir": "site", "name": "freesasa", "package_type": "package", "sha256": "ad0d21286e6b8a5d318b614f1d48d8796d38d035f3d0175b9e05cfc1d1979791", "unvendored_tests": false, "version": "2.2.1" }, "frozenlist": { "depends": [], "file_name": "frozenlist-1.4.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["frozenlist"], "install_dir": "site", "name": "frozenlist", "package_type": "package", "sha256": "b4be6f3f2280322295663cfaa7c4bbdb9c9eb48e00efe3677386bcaaad066af1", "unvendored_tests": false, "version": "1.4.1" }, "fsspec": { "depends": [], "file_name": "fsspec-2024.3.1-py3-none-any.whl", "imports": ["fsspec"], "install_dir": "site", "name": "fsspec", "package_type": "package", "sha256": "ba9d42bdecf772af2e01f416c471a8dc60dfb28e726cc414ffcd944291819e02", "unvendored_tests": true, "version": "2024.3.1" }, "fsspec-tests": { "depends": ["fsspec"], "file_name": "fsspec-tests.tar", "imports": [], "install_dir": "site", "name": "fsspec-tests", "package_type": "package", "sha256": "4171ee772a8235aa21e79cf6a6f657b96c94a1cf0a5ff967f924cfcd6261a845", "unvendored_tests": false, "version": "2024.3.1" }, "future": { "depends": [], "file_name": "future-1.0.0-py3-none-any.whl", "imports": ["future"], "install_dir": "site", "name": "future", "package_type": "package", "sha256": "6c8b0a269573529600423c9c31773d39750bec142fde487522e17541efbef054", "unvendored_tests": true, "version": "1.0.0" }, "future-tests": { "depends": ["future"], "file_name": "future-tests.tar", "imports": [], "install_dir": "site", "name": "future-tests", "package_type": "package", "sha256": "d5e3fdf179d19a15a34ca58f9009bcf4c1affabb3513c832218d06929e522b0a", "unvendored_tests": false, "version": "1.0.0" }, "galpy": { "depends": [ "numpy", "scipy", "matplotlib", "astropy", "future", "setuptools" ], "file_name": "galpy-1.10.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["galpy"], "install_dir": "site", "name": "galpy", "package_type": "package", "sha256": "87e4846e0541de0496f75306dfbf09793d1fa78e5c66dcfd3583a95d64955360", "unvendored_tests": false, "version": "1.10.1" }, "gdal": { "depends": ["geos"], "file_name": "gdal-3.8.3.zip", "imports": [], "install_dir": "dynlib", "name": "gdal", "package_type": "shared_library", "sha256": "0f60e3622732fe52face32551dcb07f78fa5f5545845c070348e3b7a30894ce3", "unvendored_tests": false, "version": "3.8.3" }, "gensim": { "depends": ["numpy", "scipy", "six", "smart-open", "wrapt"], "file_name": "gensim-4.3.3-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["gensim"], "install_dir": "site", "name": "gensim", "package_type": "package", "sha256": "6527a685053691942ac2f756e342b46c6c1f3a314c7e9835c59e4e684e0ba033", "unvendored_tests": true, "version": "4.3.3" }, "gensim-tests": { "depends": ["gensim"], "file_name": "gensim-tests.tar", "imports": [], "install_dir": "site", "name": "gensim-tests", "package_type": "package", "sha256": "ad81fec029788dde8181ea2629022887d88639e9e477c536fe410ce30919bf47", "unvendored_tests": false, "version": "4.3.3" }, "geopandas": { "depends": ["shapely", "fiona", "pyproj", "packaging", "pandas"], "file_name": "geopandas-1.0.1-py3-none-any.whl", "imports": ["geopandas"], "install_dir": "site", "name": "geopandas", "package_type": "package", "sha256": "5070b10daf8bc871a3115240545d2ccdf6542f060c5c1e3cc06777306c60caf8", "unvendored_tests": true, "version": "1.0.1" }, "geopandas-tests": { "depends": ["geopandas"], "file_name": "geopandas-tests.tar", "imports": [], "install_dir": "site", "name": "geopandas-tests", "package_type": "package", "sha256": "9cfe2d522725bc68fdb3c0ff35336c7af7b56f504d7cf6ff4ae130842df878c0", "unvendored_tests": false, "version": "1.0.1" }, "geos": { "depends": [], "file_name": "geos-3.12.1.zip", "imports": [], "install_dir": "dynlib", "name": "geos", "package_type": "shared_library", "sha256": "8d5603389e9a988e77739cf15b7a932713587426ebfab14e414422dc5d577f28", "unvendored_tests": false, "version": "3.12.1" }, "gmpy2": { "depends": [], "file_name": "gmpy2-2.1.5-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["gmpy2"], "install_dir": "site", "name": "gmpy2", "package_type": "package", "sha256": "065f6d2c701e5d37f19ab35323d8e5989f8d89beee026d9f9fb2e3c684bbf297", "unvendored_tests": false, "version": "2.1.5" }, "gsw": { "depends": ["numpy"], "file_name": "gsw-3.6.19-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["gsw"], "install_dir": "site", "name": "gsw", "package_type": "package", "sha256": "08c96c9ca360da19498da2003389c2a4d059dfd501ff104f54a72f5b77a7c271", "unvendored_tests": true, "version": "3.6.19" }, "gsw-tests": { "depends": ["gsw"], "file_name": "gsw-tests.tar", "imports": [], "install_dir": "site", "name": "gsw-tests", "package_type": "package", "sha256": "83f1adae6b11219fd10621c4daee27679f9cffaa11ee7c8fec47a463a02c832d", "unvendored_tests": false, "version": "3.6.19" }, "h5py": { "depends": ["numpy", "pkgconfig"], "file_name": "h5py-3.12.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["h5py"], "install_dir": "site", "name": "h5py", "package_type": "package", "sha256": "6564701c3a86d489c9cca00431f8afd12adbc6c1b3d605f9d325e962f1034e97", "unvendored_tests": true, "version": "3.12.1" }, "h5py-tests": { "depends": ["h5py"], "file_name": "h5py-tests.tar", "imports": [], "install_dir": "site", "name": "h5py-tests", "package_type": "package", "sha256": "737f040abb67dbe91f4873420858a73db91a91086d67090e74a93d1f0c82ae18", "unvendored_tests": false, "version": "3.12.1" }, "hashlib": { "depends": ["openssl"], "file_name": "hashlib-1.0.0-py2.py3-none-any.whl", "imports": ["_hashlib"], "install_dir": "site", "name": "hashlib", "package_type": "cpython_module", "sha256": "56bd2b2a0cd81066a70446d4244fb8070d71523b8b686493b7d12be0ba6225ff", "unvendored_tests": false, "version": "1.0.0" }, "html5lib": { "depends": ["webencodings", "six"], "file_name": "html5lib-1.1-py2.py3-none-any.whl", "imports": ["html5lib"], "install_dir": "site", "name": "html5lib", "package_type": "package", "sha256": "d64aa803514282af904f2f0e402d8f836859bde7329502ded9afff938c238a49", "unvendored_tests": false, "version": "1.1" }, "httpx": { "depends": [], "file_name": "httpx-0.28.1-py3-none-any.whl", "imports": ["httpx"], "install_dir": "site", "name": "httpx", "package_type": "package", "sha256": "0b3a5f31b3fd1638dc6c35cc9bb79e29e8a7bfdeedfdf4520a72b9a0247ca56d", "unvendored_tests": false, "version": "0.28.1" }, "idna": { "depends": [], "file_name": "idna-3.7-py3-none-any.whl", "imports": ["idna"], "install_dir": "site", "name": "idna", "package_type": "package", "sha256": "a4e8a581607ddf344012a9ab04c7e110a220e3cbf9453eed8b0d1d946f5fd3a1", "unvendored_tests": false, "version": "3.7" }, "igraph": { "depends": ["texttable"], "file_name": "igraph-0.11.4-cp39-abi3-pyodide_2024_0_wasm32.whl", "imports": ["igraph"], "install_dir": "site", "name": "igraph", "package_type": "package", "sha256": "5c8520d43a3379734f93525e8ac0a8093754489d0a5f222638feb1f676a71415", "unvendored_tests": false, "version": "0.11.4" }, "imageio": { "depends": ["numpy", "pillow"], "file_name": "imageio-2.36.0-py3-none-any.whl", "imports": ["imageio"], "install_dir": "site", "name": "imageio", "package_type": "package", "sha256": "ebe09cbf06b1fa33f101e736cb739f104d2dab2922a60bc8926eb12007188fa3", "unvendored_tests": false, "version": "2.36.0" }, "iminuit": { "depends": ["numpy"], "file_name": "iminuit-2.30.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["iminuit"], "install_dir": "site", "name": "iminuit", "package_type": "package", "sha256": "3e5593eafa4e8a4ae2271d1194a9b7e1a38e021a901f21881757b9e55b2ceeb9", "unvendored_tests": false, "version": "2.30.1" }, "iniconfig": { "depends": [], "file_name": "iniconfig-2.0.0-py3-none-any.whl", "imports": ["iniconfig"], "install_dir": "site", "name": "iniconfig", "package_type": "package", "sha256": "40a30f804117cca70c5af3a2c9b92cc273a8b8d092224f1f99f170cca406e4d0", "unvendored_tests": false, "version": "2.0.0" }, "ipython": { "depends": [ "asttokens", "decorator", "executing", "matplotlib-inline", "prompt_toolkit", "pure-eval", "pygments", "six", "stack-data", "traitlets", "sqlite3", "wcwidth" ], "file_name": "ipython-8.23.0-py3-none-any.whl", "imports": ["IPython"], "install_dir": "site", "name": "ipython", "package_type": "package", "sha256": "bdae049aa0d0e6eebbe4c8e90f882e8499809e457c0c3485c0cae4d9528875c5", "unvendored_tests": true, "version": "8.23.0" }, "ipython-tests": { "depends": ["ipython"], "file_name": "ipython-tests.tar", "imports": [], "install_dir": "site", "name": "ipython-tests", "package_type": "package", "sha256": "2154ff0c7a3100929e5df5f505a9d2e3a806ea2acbb6128f3c02dbd7416c35b6", "unvendored_tests": false, "version": "8.23.0" }, "jedi": { "depends": ["parso"], "file_name": "jedi-0.19.1-py2.py3-none-any.whl", "imports": ["jedi"], "install_dir": "site", "name": "jedi", "package_type": "package", "sha256": "ce49bd5a4b070f684e297a5141478864928aa00819a96d83a5ccb2642fbcccb4", "unvendored_tests": true, "version": "0.19.1" }, "jedi-tests": { "depends": ["jedi"], "file_name": "jedi-tests.tar", "imports": [], "install_dir": "site", "name": "jedi-tests", "package_type": "package", "sha256": "4bd995260dec4d6d1ad3c478cfc61fb93e6c2d7553d930ac67f92ff67b9e9c8d", "unvendored_tests": false, "version": "0.19.1" }, "jinja2": { "depends": ["markupsafe"], "file_name": "Jinja2-3.1.3-py3-none-any.whl", "imports": ["jinja2"], "install_dir": "site", "name": "Jinja2", "package_type": "package", "sha256": "ae75cf520f1fee73c9315c6c1472fdaf0f312b328efc06d37e2eadb71d2ce363", "unvendored_tests": false, "version": "3.1.3" }, "joblib": { "depends": [], "file_name": "joblib-1.4.0-py3-none-any.whl", "imports": ["joblib"], "install_dir": "site", "name": "joblib", "package_type": "package", "sha256": "782163eb9956ba264df3c5305037c7a247b8609606c50cb69c620b6a434448fc", "unvendored_tests": true, "version": "1.4.0" }, "joblib-tests": { "depends": ["joblib"], "file_name": "joblib-tests.tar", "imports": [], "install_dir": "site", "name": "joblib-tests", "package_type": "package", "sha256": "49d77db01a38831d20f7739cbe2c1210efa1d2b53436ecc9a2cf717dbcaf8678", "unvendored_tests": false, "version": "1.4.0" }, "jsonschema": { "depends": [ "attrs", "pyrsistent", "referencing", "jsonschema_specifications" ], "file_name": "jsonschema-4.21.1-py3-none-any.whl", "imports": ["jsonschema"], "install_dir": "site", "name": "jsonschema", "package_type": "package", "sha256": "119305091e05dd548496debb4b13474049790bbff15450b41eea4c44d09a7141", "unvendored_tests": true, "version": "4.21.1" }, "jsonschema-specifications": { "depends": [], "file_name": "jsonschema_specifications-2023.12.1-py3-none-any.whl", "imports": ["jsonschema_specifications"], "install_dir": "site", "name": "jsonschema_specifications", "package_type": "package", "sha256": "b4a840c945a4af3580c086935b1f0ada771752a72044d86a86175f6bfb88d32d", "unvendored_tests": true, "version": "2023.12.1" }, "jsonschema-specifications-tests": { "depends": ["jsonschema_specifications"], "file_name": "jsonschema_specifications-tests.tar", "imports": [], "install_dir": "site", "name": "jsonschema_specifications-tests", "package_type": "package", "sha256": "e3e6ab5f2e28845c3db7a03359c9a0bf4563a6db346680097ae5405018007b40", "unvendored_tests": false, "version": "2023.12.1" }, "jsonschema-tests": { "depends": ["jsonschema"], "file_name": "jsonschema-tests.tar", "imports": [], "install_dir": "site", "name": "jsonschema-tests", "package_type": "package", "sha256": "4c8a944949c8da3a1fb421a7c2a3d953c3c0663d692ecd47b61d99aa98d1215b", "unvendored_tests": false, "version": "4.21.1" }, "kiwisolver": { "depends": [], "file_name": "kiwisolver-1.4.5-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["kiwisolver"], "install_dir": "site", "name": "kiwisolver", "package_type": "package", "sha256": "10b13eb725b7ac38cf9a5f51caa266a92e24f5d7c79b74eed7dafd901fae16c6", "unvendored_tests": false, "version": "1.4.5" }, "lakers-python": { "depends": [], "file_name": "lakers_python-0.4.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["lakers"], "install_dir": "site", "name": "lakers-python", "package_type": "package", "sha256": "250d34c774f6f39efd6319282b301d99d9bdbb65058cf3145b8927f10b29c9ca", "unvendored_tests": false, "version": "0.4.1" }, "lazy-loader": { "depends": [], "file_name": "lazy_loader-0.4-py3-none-any.whl", "imports": ["lazy_loader"], "install_dir": "site", "name": "lazy_loader", "package_type": "package", "sha256": "a4a5ff4a8bf5d35047b8bc4b4c3ca0e1a8e90af39249978c8fbe28668b0dfa05", "unvendored_tests": true, "version": "0.4" }, "lazy-loader-tests": { "depends": ["lazy_loader"], "file_name": "lazy_loader-tests.tar", "imports": [], "install_dir": "site", "name": "lazy_loader-tests", "package_type": "package", "sha256": "b2668f916aa3c31668cdeb6d27fbaf30543dc4c636732baac60f883b78a74584", "unvendored_tests": false, "version": "0.4" }, "lazy-object-proxy": { "depends": [], "file_name": "lazy_object_proxy-1.10.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["lazy_object_proxy"], "install_dir": "site", "name": "lazy-object-proxy", "package_type": "package", "sha256": "78dcb0ce6602ee8de86a62b73766c66a399e9fa3c9db1b5904b1e1f8083753ee", "unvendored_tests": false, "version": "1.10.0" }, "libcst": { "depends": ["pyyaml"], "file_name": "libcst-1.4.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["libcst"], "install_dir": "site", "name": "libcst", "package_type": "package", "sha256": "54e026f0a3f61c8ad2dacfe3aef52d8425a024000ed7182f36c1280628c11727", "unvendored_tests": true, "version": "1.4.0" }, "libcst-tests": { "depends": ["libcst"], "file_name": "libcst-tests.tar", "imports": [], "install_dir": "site", "name": "libcst-tests", "package_type": "package", "sha256": "22e7f5decac3ca3470dd06554072b040e0d3ec8e492f8ff5c0e68dc505f9318d", "unvendored_tests": false, "version": "1.4.0" }, "libhdf5": { "depends": [], "file_name": "libhdf5-1.12.1.zip", "imports": [], "install_dir": "dynlib", "name": "libhdf5", "package_type": "shared_library", "sha256": "24cbf8033aedcf9efe7e1b6b03db25f9cec96fd7821409cf217dd4b79bf3ef28", "unvendored_tests": false, "version": "1.12.1" }, "libheif": { "depends": [], "file_name": "libheif-1.12.0.zip", "imports": [], "install_dir": "dynlib", "name": "libheif", "package_type": "shared_library", "sha256": "f2c3df4c176645bb221153e303593036483b8d931b1e77ac4cbe4eccd8752ff9", "unvendored_tests": false, "version": "1.12.0" }, "libmagic": { "depends": [], "file_name": "libmagic-5.42.zip", "imports": [], "install_dir": "dynlib", "name": "libmagic", "package_type": "shared_library", "sha256": "2fbf616d73667dc09cc9b2066ff8f0a61c6dc7a9390a7b6d90dee93d09cb8a6c", "unvendored_tests": false, "version": "5.42" }, "lightgbm": { "depends": ["numpy", "scipy", "scikit-learn"], "file_name": "lightgbm-4.5.0-py3-none-pyodide_2024_0_wasm32.whl", "imports": ["lightgbm"], "install_dir": "site", "name": "lightgbm", "package_type": "package", "sha256": "eea6e9d783c4d49cbb2b35b09e27c429d5fd35ae914781637164092c225203de", "unvendored_tests": false, "version": "4.5.0" }, "logbook": { "depends": ["ssl"], "file_name": "Logbook-1.7.0.post0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["logbook"], "install_dir": "site", "name": "logbook", "package_type": "package", "sha256": "da8dbfcba0d54bf8d381c94b39c2447bc8c60dd91025b952a62aa664df22a7b2", "unvendored_tests": false, "version": "1.7.0.post0" }, "lxml": { "depends": [], "file_name": "lxml-5.2.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["lxml"], "install_dir": "site", "name": "lxml", "package_type": "package", "sha256": "2fd139897daa910923b79a42e7e7496dd36a1ca5806b2d12e42ca41baf6a27d7", "unvendored_tests": false, "version": "5.2.1" }, "lzma": { "depends": [], "file_name": "lzma-1.0.0-py2.py3-none-any.whl", "imports": ["lzma", "_lzma"], "install_dir": "site", "name": "lzma", "package_type": "cpython_module", "sha256": "5eeaa17db4a33d90e71d2a76c0aad47dbb302c128c99b454a9badc26c0cf253d", "unvendored_tests": false, "version": "1.0.0" }, "markupsafe": { "depends": [], "file_name": "MarkupSafe-2.1.5-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["markupsafe"], "install_dir": "site", "name": "MarkupSafe", "package_type": "package", "sha256": "d7e66ed044fd7ec0e33cf9f2ec6ecc0590ee09863fa61cca27ba2824858bb795", "unvendored_tests": false, "version": "2.1.5" }, "matplotlib": { "depends": [ "contourpy", "cycler", "fonttools", "kiwisolver", "numpy", "packaging", "pillow", "pyparsing", "python-dateutil", "pytz", "matplotlib-pyodide" ], "file_name": "matplotlib-3.8.4-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pylab", "mpl_toolkits", "matplotlib"], "install_dir": "site", "name": "matplotlib", "package_type": "package", "sha256": "dad6745f930a0f438e3b7b668a7e4a587cbd36cbd2d248aa7428923350c39747", "unvendored_tests": true, "version": "3.8.4" }, "matplotlib-inline": { "depends": ["traitlets"], "file_name": "matplotlib_inline-0.1.7-py3-none-any.whl", "imports": ["matplotlib-inline"], "install_dir": "site", "name": "matplotlib-inline", "package_type": "package", "sha256": "c483913cbccb75cf40f6f5b1b156769a20955e03f1dad7066ade88a151a02bb2", "unvendored_tests": false, "version": "0.1.7" }, "matplotlib-pyodide": { "depends": [], "file_name": "matplotlib_pyodide-0.2.3-py3-none-any.whl", "imports": ["matplotlib_pyodide"], "install_dir": "site", "name": "matplotlib-pyodide", "package_type": "package", "sha256": "717b48079d00b397208d98d0d62fdc7688ccc517294a735b949bc5f62fe1f620", "unvendored_tests": false, "version": "0.2.3" }, "matplotlib-tests": { "depends": ["matplotlib"], "file_name": "matplotlib-tests.tar", "imports": [], "install_dir": "site", "name": "matplotlib-tests", "package_type": "package", "sha256": "8c7edf3395a896619116811ddd240f590a4335f8c9aa6e8cb84f3899e12d058a", "unvendored_tests": false, "version": "3.8.4" }, "memory-allocator": { "depends": [], "file_name": "memory_allocator-0.1.4-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["memory_allocator"], "install_dir": "site", "name": "memory-allocator", "package_type": "package", "sha256": "513bd31cb04adc4b6e5c0b85f0c08bbc5b17a13fb63d1039849afc56a565e67d", "unvendored_tests": false, "version": "0.1.4" }, "micropip": { "depends": ["packaging"], "file_name": "micropip-0.8.0-py3-none-any.whl", "imports": ["micropip"], "install_dir": "site", "name": "micropip", "package_type": "package", "sha256": "f06926694dba95e19768a2be65770c953ab350b8b622314b308c3b39f7ebebfa", "unvendored_tests": false, "version": "0.8.0" }, "mmh3": { "depends": [], "file_name": "mmh3-4.1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["mmh3"], "install_dir": "site", "name": "mmh3", "package_type": "package", "sha256": "48ad7d2a1d626b3313dd944e05284096f5878f6cd7465c490c02940515d8953a", "unvendored_tests": false, "version": "4.1.0" }, "mne": { "depends": [ "numpy", "scipy", "setuptools", "decorator", "lazy_loader", "packaging" ], "file_name": "mne-1.8.0-py3-none-any.whl", "imports": ["mne"], "install_dir": "site", "name": "mne", "package_type": "package", "sha256": "5a19b172b364c9bc7928916a2941883f4947928cf07b0aff203d3ec0db4ff5f8", "unvendored_tests": true, "version": "1.8.0" }, "mne-tests": { "depends": ["mne"], "file_name": "mne-tests.tar", "imports": [], "install_dir": "site", "name": "mne-tests", "package_type": "package", "sha256": "1f679c5107105f54f99f62c03f03a9ab94ff800632a7cda6ebc405b48735b00a", "unvendored_tests": false, "version": "1.8.0" }, "more-itertools": { "depends": [], "file_name": "more_itertools-10.2.0-py3-none-any.whl", "imports": ["more_itertools"], "install_dir": "site", "name": "more-itertools", "package_type": "package", "sha256": "1552e0fb82ee29a6fe1f0d466f3322ebec1b6bcab95343ace684b04875fa3d56", "unvendored_tests": false, "version": "10.2.0" }, "mpmath": { "depends": [], "file_name": "mpmath-1.3.0-py3-none-any.whl", "imports": ["mpmath"], "install_dir": "site", "name": "mpmath", "package_type": "package", "sha256": "19b572d1dbc8c93b7778b09e9a67d3df064cb34ddb06b73afa122d57a50e0d97", "unvendored_tests": true, "version": "1.3.0" }, "mpmath-tests": { "depends": ["mpmath"], "file_name": "mpmath-tests.tar", "imports": [], "install_dir": "site", "name": "mpmath-tests", "package_type": "package", "sha256": "ad81663fdc1c42197da6ea731c49b240e2969b8fd19d472b31f63c964747ac56", "unvendored_tests": false, "version": "1.3.0" }, "msgpack": { "depends": [], "file_name": "msgpack-1.1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["msgpack"], "install_dir": "site", "name": "msgpack", "package_type": "package", "sha256": "e368256596bb7f34c26a78efd9ca789405d81b505a89c75d47d5d56e7f6d7b51", "unvendored_tests": false, "version": "1.1.0" }, "msgspec": { "depends": [], "file_name": "msgspec-0.18.6-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["msgspec"], "install_dir": "site", "name": "msgspec", "package_type": "package", "sha256": "2cb9e65f695731ef68c0fcb731562c0fd485e6f796544bac12e002e9e2f1877f", "unvendored_tests": false, "version": "0.18.6" }, "msprime": { "depends": ["numpy", "newick", "tskit", "demes", "rpds-py"], "file_name": "msprime-1.3.3-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["msprime"], "install_dir": "site", "name": "msprime", "package_type": "package", "sha256": "97c3a77a0812fd1ae4a3045d28b2fffaefbcb5103ab1cb6efeaaf62908c1909b", "unvendored_tests": false, "version": "1.3.3" }, "multidict": { "depends": [], "file_name": "multidict-6.0.5-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["multidict"], "install_dir": "site", "name": "multidict", "package_type": "package", "sha256": "653ab1479ceb6e77b2058a1bff23d7878a2e5c15a71fa2fff4ff75d863a838fa", "unvendored_tests": false, "version": "6.0.5" }, "munch": { "depends": ["setuptools", "six"], "file_name": "munch-4.0.0-py2.py3-none-any.whl", "imports": ["munch"], "install_dir": "site", "name": "munch", "package_type": "package", "sha256": "93c00e5314cceff02923cdb363fbeaae6bb5c803c9cf3c0186b5af0f39be45a0", "unvendored_tests": false, "version": "4.0.0" }, "mypy": { "depends": [], "file_name": "mypy-1.9.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["mypyc", "mypy"], "install_dir": "site", "name": "mypy", "package_type": "package", "sha256": "1aa26ec6a677ebfdf4fa14369ff006fd70c3a5721fae973f0a676e3babfd574d", "unvendored_tests": true, "version": "1.9.0" }, "mypy-tests": { "depends": ["mypy"], "file_name": "mypy-tests.tar", "imports": [], "install_dir": "site", "name": "mypy-tests", "package_type": "package", "sha256": "3c181c521922e58f1efb5c4561ff6eb44d0be191f508f367bab6e9f7af4f7f8e", "unvendored_tests": false, "version": "1.9.0" }, "narwhals": { "depends": [], "file_name": "narwhals-1.10.0-py3-none-any.whl", "imports": ["narwhals"], "install_dir": "site", "name": "narwhals", "package_type": "package", "sha256": "4de02d24c43a16fd0ef5bf572cfed11ec204ea6e6dabcb01eb0edd53ba37745f", "unvendored_tests": false, "version": "1.10.0" }, "netcdf4": { "depends": ["numpy", "packaging", "h5py", "cftime", "certifi"], "file_name": "netCDF4-1.7.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["netCDF4"], "install_dir": "site", "name": "netcdf4", "package_type": "package", "sha256": "8206ca4dcfb3de3fc02c92d9df706d479c2cc92620ad445b1b758f3274e26c0f", "unvendored_tests": false, "version": "1.7.2" }, "networkx": { "depends": ["decorator", "setuptools", "matplotlib", "numpy"], "file_name": "networkx-3.4.2-py3-none-any.whl", "imports": ["networkx"], "install_dir": "site", "name": "networkx", "package_type": "package", "sha256": "0c5ea1642e2333657881311f8ff64c48f320f0b8571365ad9f0749dc432736dd", "unvendored_tests": true, "version": "3.4.2" }, "networkx-tests": { "depends": ["networkx"], "file_name": "networkx-tests.tar", "imports": [], "install_dir": "site", "name": "networkx-tests", "package_type": "package", "sha256": "c7b80324251d65faaaeb01d2eae8591a8330a5fd11a3367dd76a81b649be5d3b", "unvendored_tests": false, "version": "3.4.2" }, "newick": { "depends": [], "file_name": "newick-1.9.0-py2.py3-none-any.whl", "imports": ["newick"], "install_dir": "site", "name": "newick", "package_type": "package", "sha256": "58e1c4acbf8171097f45c78be7f7ba2a204aab160c32bb568dab210e5f98cc43", "unvendored_tests": false, "version": "1.9.0" }, "nh3": { "depends": [], "file_name": "nh3-0.2.17-cp37-abi3-pyodide_2024_0_wasm32.whl", "imports": ["nh3"], "install_dir": "site", "name": "nh3", "package_type": "package", "sha256": "40dadbc3292d7ba27de6f84ccfe43f030518c73e6a11718202845dd018f0687c", "unvendored_tests": false, "version": "0.2.17" }, "nlopt": { "depends": ["numpy"], "file_name": "nlopt-2.9.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["nlopt"], "install_dir": "site", "name": "nlopt", "package_type": "package", "sha256": "16013aabe655c9aca757ec78292cb5e56b65c480eee34f40a4c49147ae51de58", "unvendored_tests": false, "version": "2.9.1" }, "nltk": { "depends": ["regex", "sqlite3"], "file_name": "nltk-3.8.1-py3-none-any.whl", "imports": ["nltk"], "install_dir": "site", "name": "nltk", "package_type": "package", "sha256": "2515bdf9c2df686939ec25de7b2825dc6d04cfa278e88c298976f99f09e0529d", "unvendored_tests": true, "version": "3.8.1" }, "nltk-tests": { "depends": ["nltk"], "file_name": "nltk-tests.tar", "imports": [], "install_dir": "site", "name": "nltk-tests", "package_type": "package", "sha256": "79ace12d4d92880437f4e01b66d0dc80490047050d512a6721a416ff3d5c0adf", "unvendored_tests": false, "version": "3.8.1" }, "numcodecs": { "depends": ["numpy", "msgpack"], "file_name": "numcodecs-0.13.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["numcodecs"], "install_dir": "site", "name": "numcodecs", "package_type": "package", "sha256": "8d46ca2c9ddad750b05e602cd98e3688de461bb4615f298689e42d762eb80042", "unvendored_tests": true, "version": "0.13.1" }, "numcodecs-tests": { "depends": ["numcodecs"], "file_name": "numcodecs-tests.tar", "imports": [], "install_dir": "site", "name": "numcodecs-tests", "package_type": "package", "sha256": "62acd6f7bbb86d101556bbf12a10c8440d134d4107d61853cddc5d8d8e3e82fe", "unvendored_tests": false, "version": "0.13.1" }, "numpy": { "depends": [], "file_name": "numpy-2.0.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["numpy"], "install_dir": "site", "name": "numpy", "package_type": "package", "sha256": "ebfa5de0256e98fcd4ece4546e054dea50b73ecf735ec836237fd45bcc5eab1f", "unvendored_tests": true, "version": "2.0.2" }, "numpy-tests": { "depends": ["numpy"], "file_name": "numpy-tests.tar", "imports": [], "install_dir": "site", "name": "numpy-tests", "package_type": "package", "sha256": "c4566361660da308746235508c81b0268645c06b14076fc601067457d71d00d7", "unvendored_tests": false, "version": "2.0.2" }, "openblas": { "depends": [], "file_name": "openblas-0.3.26.zip", "imports": [], "install_dir": "dynlib", "name": "openblas", "package_type": "shared_library", "sha256": "c2e05180ecb30ca3863babe466030ab0a7a3af3a87aa77baebc5e4a6a2ed1e07", "unvendored_tests": false, "version": "0.3.26" }, "opencv-python": { "depends": ["numpy"], "file_name": "opencv_python-4.10.0.84-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["cv2"], "install_dir": "site", "name": "opencv-python", "package_type": "package", "sha256": "36a4f88783141380ef2799ab67f963063825a4357bcb0097bb02a82e7981ba90", "unvendored_tests": false, "version": "4.10.0.84" }, "openssl": { "depends": [], "file_name": "openssl-1.1.1w.zip", "imports": [], "install_dir": "dynlib", "name": "openssl", "package_type": "shared_library", "sha256": "7e796ef6d3ca7ed6f1af820fc7061033a034e986cddca38fc487e6ef9a4ac915", "unvendored_tests": false, "version": "1.1.1w" }, "optlang": { "depends": ["sympy", "six", "swiglpk"], "file_name": "optlang-1.8.1-py2.py3-none-any.whl", "imports": ["optlang"], "install_dir": "site", "name": "optlang", "package_type": "package", "sha256": "fb2465d1bd566702d1df8e4e3d5d7acf7d379b86166dcbda948ecc7c52d2900a", "unvendored_tests": true, "version": "1.8.1" }, "optlang-tests": { "depends": ["optlang"], "file_name": "optlang-tests.tar", "imports": [], "install_dir": "site", "name": "optlang-tests", "package_type": "package", "sha256": "a7aaf360662a3dacaebb9b78e7bfbb30dfc3d6443b34d1dd0166e19c3e852a27", "unvendored_tests": false, "version": "1.8.1" }, "orjson": { "depends": [], "file_name": "orjson-3.10.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["orjson"], "install_dir": "site", "name": "orjson", "package_type": "package", "sha256": "bc805b2a443af7e9c22312aa1f640af022b4a5c8176372aad20ca9a34acf02d2", "unvendored_tests": false, "version": "3.10.1" }, "packaging": { "depends": [], "file_name": "packaging-24.2-py3-none-any.whl", "imports": ["packaging"], "install_dir": "site", "name": "packaging", "package_type": "package", "sha256": "55c1c81063e172dd2d9d24321dd56b3d539bbc4d4583c24870bd4b7b350ec84c", "unvendored_tests": false, "version": "24.2" }, "pandas": { "depends": ["numpy", "python-dateutil", "pytz"], "file_name": "pandas-2.2.3-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pandas"], "install_dir": "site", "name": "pandas", "package_type": "package", "sha256": "a81cb10f8621fe36f7d1717b7903015f910ba5efdd431c4ff22c14f365fd9eed", "unvendored_tests": true, "version": "2.2.3" }, "pandas-tests": { "depends": ["pandas"], "file_name": "pandas-tests.tar", "imports": [], "install_dir": "site", "name": "pandas-tests", "package_type": "package", "sha256": "1607a809b3f2add8309062c8ce17a887031d0a471b6d5001f9df49931482d398", "unvendored_tests": false, "version": "2.2.3" }, "parso": { "depends": [], "file_name": "parso-0.8.4-py2.py3-none-any.whl", "imports": ["parso"], "install_dir": "site", "name": "parso", "package_type": "package", "sha256": "ebd86987f4eafe53ba5aceb599ecfb565c782a480bd60526edbdde956147b72f", "unvendored_tests": false, "version": "0.8.4" }, "patsy": { "depends": ["numpy", "six"], "file_name": "patsy-0.5.6-py2.py3-none-any.whl", "imports": ["patsy"], "install_dir": "site", "name": "patsy", "package_type": "package", "sha256": "da388687c54681e4bf59200e23d142c7c767a4d050ce23e076f2c07516b818c2", "unvendored_tests": true, "version": "0.5.6" }, "patsy-tests": { "depends": ["patsy"], "file_name": "patsy-tests.tar", "imports": [], "install_dir": "site", "name": "patsy-tests", "package_type": "package", "sha256": "6a00d81372f26cbc4573afc51a1c8e7ec4a53b2e14e6038a2a94820aee825304", "unvendored_tests": false, "version": "0.5.6" }, "peewee": { "depends": ["sqlite3", "cffi"], "file_name": "peewee-3.17.3-py3-none-any.whl", "imports": ["peewee"], "install_dir": "site", "name": "peewee", "package_type": "package", "sha256": "d4899e35da6a0099ae7f45749f964f475b112858182e094652c0168b06f0e029", "unvendored_tests": true, "version": "3.17.3" }, "peewee-tests": { "depends": ["peewee"], "file_name": "peewee-tests.tar", "imports": [], "install_dir": "site", "name": "peewee-tests", "package_type": "package", "sha256": "9fa7e4ae3dff114e991cf87ad7b680fd15d0800354d07b3030ed4a1c7c8314d1", "unvendored_tests": false, "version": "3.17.3" }, "pi-heif": { "depends": ["cffi", "pillow", "libheif"], "file_name": "pi_heif-0.21.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pi_heif"], "install_dir": "site", "name": "pi-heif", "package_type": "package", "sha256": "f630516711a729b94773a74d5acf23672a399c46614c78e196f2b1c8c05b9887", "unvendored_tests": false, "version": "0.21.0" }, "pillow": { "depends": [], "file_name": "pillow-10.2.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["PIL"], "install_dir": "site", "name": "Pillow", "package_type": "package", "sha256": "5dea298a10d557ef903d13e6522dd7e8696c187706bb477e1afdedc2a1d84d0a", "unvendored_tests": false, "version": "10.2.0" }, "pillow-heif": { "depends": ["cffi", "pillow", "libheif"], "file_name": "pillow_heif-0.20.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pillow_heif"], "install_dir": "site", "name": "pillow-heif", "package_type": "package", "sha256": "ab406bc2a4853d169a8ee956261a0c5d7bf2dfce5ad6fe9bcc78f57f3eb6b804", "unvendored_tests": false, "version": "0.20.0" }, "pkgconfig": { "depends": [], "file_name": "pkgconfig-1.5.5-py3-none-any.whl", "imports": ["pkgconfig"], "install_dir": "site", "name": "pkgconfig", "package_type": "package", "sha256": "e513ed6409b8dff53acd9888dee7f161d2dd9ebaaca412eb80910f1a8476c3c9", "unvendored_tests": false, "version": "1.5.5" }, "pluggy": { "depends": [], "file_name": "pluggy-1.5.0-py3-none-any.whl", "imports": ["pluggy"], "install_dir": "site", "name": "pluggy", "package_type": "package", "sha256": "3e856326ad6af071e91798766a25c9ce7ed6b5be61f927a28e05e6045b031031", "unvendored_tests": false, "version": "1.5.0" }, "polars": { "depends": [], "file_name": "polars-1.18.0-cp39-abi3-pyodide_2024_0_wasm32.whl", "imports": ["polars"], "install_dir": "site", "name": "polars", "package_type": "package", "sha256": "c05b49698b48975ed40fc73f6387fb692a778481745ed1a2f70060d1ca04959e", "unvendored_tests": false, "version": "1.18.0" }, "pplpy": { "depends": ["gmpy2", "cysignals"], "file_name": "pplpy-0.8.10-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["ppl"], "install_dir": "site", "name": "pplpy", "package_type": "package", "sha256": "50d1545682670ad663ffb8d40811f0cf43293d059b855942d98af736aecc711f", "unvendored_tests": false, "version": "0.8.10" }, "primecountpy": { "depends": ["cysignals"], "file_name": "primecountpy-0.1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["primecountpy"], "install_dir": "site", "name": "primecountpy", "package_type": "package", "sha256": "841a9d574e4fe407ab5c655c1ef98eb5b01fc7aae823d36d4d1f80f059f749b5", "unvendored_tests": false, "version": "0.1.0" }, "prompt-toolkit": { "depends": [], "file_name": "prompt_toolkit-3.0.43-py3-none-any.whl", "imports": ["prompt_toolkit"], "install_dir": "site", "name": "prompt_toolkit", "package_type": "package", "sha256": "f9861a288bcf2693d4700900b0cc0196498511d40a84471dad72e27f0fd7079e", "unvendored_tests": false, "version": "3.0.43" }, "protobuf": { "depends": [], "file_name": "protobuf-5.29.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["google"], "install_dir": "site", "name": "protobuf", "package_type": "package", "sha256": "f064b15292d577b80ea07efb9b48f4ed21cfa85b34c1b9f829b3512e2e945bf2", "unvendored_tests": false, "version": "5.29.2" }, "pure-eval": { "depends": [], "file_name": "pure_eval-0.2.3-py3-none-any.whl", "imports": ["pure_eval"], "install_dir": "site", "name": "pure-eval", "package_type": "package", "sha256": "9a16b6b8a2927f31b8ac784b1a8eb7889fa9f0c6c7eaf53f38f5d866dde4d728", "unvendored_tests": false, "version": "0.2.3" }, "py": { "depends": [], "file_name": "py-1.11.0-py2.py3-none-any.whl", "imports": ["py"], "install_dir": "site", "name": "py", "package_type": "package", "sha256": "c9c1c3373e9a3de4ec3ee71715f1e269e990e95a1a07b80f0c1f530562e4f095", "unvendored_tests": false, "version": "1.11.0" }, "pyarrow": { "depends": ["numpy", "pandas", "pyodide-unix-timezones"], "file_name": "pyarrow-18.1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pyarrow"], "install_dir": "site", "name": "pyarrow", "package_type": "package", "sha256": "8d25593325ca98ee5fc48dee9c719cd3e64a781eacc41efe7942fce12cd9587b", "unvendored_tests": false, "version": "18.1.0" }, "pyclipper": { "depends": [], "file_name": "pyclipper-1.3.0.post5-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pyclipper"], "install_dir": "site", "name": "pyclipper", "package_type": "package", "sha256": "f6c1b37275552c754fc13dfc830739a2a9f96e0fdcbd2f9869d093c0bd47f3c5", "unvendored_tests": false, "version": "1.3.0.post5" }, "pycparser": { "depends": [], "file_name": "pycparser-2.22-py3-none-any.whl", "imports": ["pycparser"], "install_dir": "site", "name": "pycparser", "package_type": "package", "sha256": "602252754447d8e4e54f824681bb813d534c32d9e297a2fff6a4e22db1f65663", "unvendored_tests": false, "version": "2.22" }, "pycryptodome": { "depends": [], "file_name": "pycryptodome-3.20.0-cp35-abi3-pyodide_2024_0_wasm32.whl", "imports": ["Crypto"], "install_dir": "site", "name": "pycryptodome", "package_type": "package", "sha256": "b8029b48e667b16e9ebdfc769bc33213f79842f91b45806bef5a005388cb3981", "unvendored_tests": true, "version": "3.20.0" }, "pycryptodome-tests": { "depends": ["pycryptodome"], "file_name": "pycryptodome-tests.tar", "imports": [], "install_dir": "site", "name": "pycryptodome-tests", "package_type": "package", "sha256": "535d5ef5deefec0e2620abc6df45492d2152cb76b49f768fa199e16dafafc70a", "unvendored_tests": false, "version": "3.20.0" }, "pydantic": { "depends": ["typing-extensions", "pydantic_core", "annotated-types"], "file_name": "pydantic-2.10.5-py3-none-any.whl", "imports": ["pydantic"], "install_dir": "site", "name": "pydantic", "package_type": "package", "sha256": "6f927c0165c8b384a0edabf0ed61338aa7fa9e3851ad118f8005be232a558b96", "unvendored_tests": false, "version": "2.10.5" }, "pydantic-core": { "depends": [], "file_name": "pydantic_core-2.27.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pydantic_core"], "install_dir": "site", "name": "pydantic_core", "package_type": "package", "sha256": "63d5d054fb86f8bf5dd8724aa453c1c96dadae633904b867d50dbc83d00f1931", "unvendored_tests": false, "version": "2.27.2" }, "pydecimal": { "depends": [], "file_name": "pydecimal-1.0.0-py2.py3-none-any.whl", "imports": ["_pydecimal"], "install_dir": "site", "name": "pydecimal", "package_type": "cpython_module", "sha256": "4a2793b3336fbe7768b538256a850830541638936859d526b7112b4f06332209", "unvendored_tests": false, "version": "1.0.0" }, "pydoc-data": { "depends": [], "file_name": "pydoc_data-1.0.0-py2.py3-none-any.whl", "imports": ["pydoc_data"], "install_dir": "site", "name": "pydoc_data", "package_type": "cpython_module", "sha256": "7a92fadf411389acbebfc2e88fd00581c67372aaf375409e82459b7c1f83a54a", "unvendored_tests": false, "version": "1.0.0" }, "pyerfa": { "depends": ["numpy"], "file_name": "pyerfa-2.0.1.4-cp39-abi3-pyodide_2024_0_wasm32.whl", "imports": ["erfa"], "install_dir": "site", "name": "pyerfa", "package_type": "package", "sha256": "2d7cd0ea3b2c3433b0aac74dd952e9d41d225c861a0151997f9eac789b3037e2", "unvendored_tests": true, "version": "2.0.1.4" }, "pyerfa-tests": { "depends": ["pyerfa"], "file_name": "pyerfa-tests.tar", "imports": [], "install_dir": "site", "name": "pyerfa-tests", "package_type": "package", "sha256": "b9353c9577fd040eb25b0d686a75dc76a5fbf3df94132afde014c24e605a1e9c", "unvendored_tests": false, "version": "2.0.1.4" }, "pygame-ce": { "depends": [], "file_name": "pygame_ce-2.4.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pygame"], "install_dir": "site", "name": "pygame-ce", "package_type": "package", "sha256": "038b90f060a6ee68b205378ed9f9ac1dc54f207aeb54f21f73bd4dcf50b541ac", "unvendored_tests": true, "version": "2.4.1" }, "pygame-ce-tests": { "depends": ["pygame-ce"], "file_name": "pygame-ce-tests.tar", "imports": [], "install_dir": "site", "name": "pygame-ce-tests", "package_type": "package", "sha256": "35c1a69571adc2bf312fd3362fce5497906ae251220f8bd9ecf37cc9888d39dc", "unvendored_tests": false, "version": "2.4.1" }, "pygments": { "depends": [], "file_name": "pygments-2.17.2-py3-none-any.whl", "imports": ["pygments"], "install_dir": "site", "name": "Pygments", "package_type": "package", "sha256": "ac04150325512ecf59de0ea182abf8879a47e641e523bbe2016ea71202048cd5", "unvendored_tests": false, "version": "2.17.2" }, "pyheif": { "depends": ["cffi"], "file_name": "pyheif-0.8.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pyheif"], "install_dir": "site", "name": "pyheif", "package_type": "package", "sha256": "7e27401baa3f01601454d0608c34c6c6ae4cebcbcc1bc9a7b169e37770087e64", "unvendored_tests": false, "version": "0.8.0" }, "pyiceberg": { "depends": [ "click", "fsspec", "mmh3", "pydantic", "pyparsing", "requests", "rich", "sortedcontainers", "sqlalchemy", "strictyaml" ], "file_name": "pyiceberg-0.6.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pyiceberg"], "install_dir": "site", "name": "pyiceberg", "package_type": "package", "sha256": "03e99f375fcd932b9e7a851fe8d312b6ad9014582e46cd131f07877170c1ccc2", "unvendored_tests": false, "version": "0.6.0" }, "pyinstrument": { "depends": [], "file_name": "pyinstrument-4.4.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pyinstrument"], "install_dir": "site", "name": "pyinstrument", "package_type": "package", "sha256": "e0397ed84f95dbabc8ac8053d3c686b66f5d4bad917a7739da01bbd04f58a46c", "unvendored_tests": false, "version": "4.4.0" }, "pynacl": { "depends": ["cffi"], "file_name": "PyNaCl-1.5.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["nacl"], "install_dir": "site", "name": "pynacl", "package_type": "package", "sha256": "e65889a351da44eab63d231db671f8da7a919e833dec93d1bbb290e20562ac52", "unvendored_tests": false, "version": "1.5.0" }, "pyodide-http": { "depends": [], "file_name": "pyodide_http-0.2.1-py3-none-any.whl", "imports": ["pyodide_http"], "install_dir": "site", "name": "pyodide-http", "package_type": "package", "sha256": "b4ed81d127887054de050cdfb635f123bbe20a118704a499202146c861dcc4f3", "unvendored_tests": false, "version": "0.2.1" }, "pyodide-unix-timezones": { "depends": [], "file_name": "pyodide_unix_timezones-1.0.0-py3-none-any.whl", "imports": ["unix_timezones"], "install_dir": "site", "name": "pyodide-unix-timezones", "package_type": "package", "sha256": "b469425f1cc451c8b80198a571a4a4743395a354e94bff66d82e913b22e72b3f", "unvendored_tests": false, "version": "1.0.0" }, "pyparsing": { "depends": [], "file_name": "pyparsing-3.1.2-py3-none-any.whl", "imports": ["pyparsing"], "install_dir": "site", "name": "pyparsing", "package_type": "package", "sha256": "1bfcec2f29dc86b12d23b4c7284af1004c1f3b5886fcfe38f2dd8ae8bc1983d5", "unvendored_tests": false, "version": "3.1.2" }, "pyproj": { "depends": ["certifi", "sqlite3"], "file_name": "pyproj-3.6.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pyproj"], "install_dir": "site", "name": "pyproj", "package_type": "package", "sha256": "11cae0abcb121ae8a51adf762028ea5552faa3c7dc8b33aff6ba0dfd11ac46c6", "unvendored_tests": false, "version": "3.6.1" }, "pyrsistent": { "depends": [], "file_name": "pyrsistent-0.20.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["_pyrsistent_version", "pyrsistent"], "install_dir": "site", "name": "pyrsistent", "package_type": "package", "sha256": "a8c1ffcbbc2d2cb0e874ab125228436d1feab02a25b19fa55ca9c906fa684062", "unvendored_tests": false, "version": "0.20.0" }, "pysam": { "depends": [], "file_name": "pysam-0.22.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pysam"], "install_dir": "site", "name": "pysam", "package_type": "package", "sha256": "d15f06f3cdab7bee55d99d08177a573cce401b8b336c8eaaa9fc185e80d6d395", "unvendored_tests": false, "version": "0.22.0" }, "pyshp": { "depends": [], "file_name": "pyshp-2.3.1-py2.py3-none-any.whl", "imports": ["shapefile"], "install_dir": "site", "name": "pyshp", "package_type": "package", "sha256": "9301f57f1eafbf379dda5cf521c9442c320e3743f86d8b5958cbca2d5b1b493c", "unvendored_tests": false, "version": "2.3.1" }, "pytest": { "depends": [ "atomicwrites", "attrs", "more-itertools", "pluggy", "py", "setuptools", "six", "iniconfig", "exceptiongroup" ], "file_name": "pytest-8.1.1-py3-none-any.whl", "imports": ["_pytest", "pytest"], "install_dir": "site", "name": "pytest", "package_type": "package", "sha256": "85b317e413a6ccdb7beb312971411d6cc22f7a92ca8447b5bba971b4137f17e2", "unvendored_tests": false, "version": "8.1.1" }, "pytest-asyncio": { "depends": ["pytest"], "file_name": "pytest_asyncio-0.23.7-py3-none-any.whl", "imports": ["pytest_asyncio"], "install_dir": "site", "name": "pytest-asyncio", "package_type": "package", "sha256": "8ee6a71569aa37a0910db072174c9acd13d5997c1098f280e94ed4574a0cc190", "unvendored_tests": false, "version": "0.23.7" }, "pytest-benchmark": { "depends": [], "file_name": "pytest_benchmark-4.0.0-py3-none-any.whl", "imports": ["pytest_benchmark"], "install_dir": "site", "name": "pytest-benchmark", "package_type": "package", "sha256": "74d99849a15a9c74047981dfa15433600a45a1059ee00ee2b80542b10dbda10c", "unvendored_tests": false, "version": "4.0.0" }, "python-dateutil": { "depends": ["six"], "file_name": "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", "imports": ["dateutil"], "install_dir": "site", "name": "python-dateutil", "package_type": "package", "sha256": "797b31f9ae8a3290efe40c9569dd9c6ddf55ab4121b2e6637442eb4dda5b7061", "unvendored_tests": false, "version": "2.9.0.post0" }, "python-flint": { "depends": [], "file_name": "python_flint-0.6.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["flint"], "install_dir": "site", "name": "python-flint", "package_type": "package", "sha256": "f9bf7f05a974343833d957471e62ecb309c9096166a8d6db76ddbc14be334f68", "unvendored_tests": false, "version": "0.6.0" }, "python-magic": { "depends": ["libmagic"], "file_name": "python_magic-0.4.27-py2.py3-none-any.whl", "imports": ["magic"], "install_dir": "site", "name": "python-magic", "package_type": "package", "sha256": "f49e15d5c579811d9a467b3def0589a023cf9e9ec96e751277b6314a1770a899", "unvendored_tests": false, "version": "0.4.27" }, "python-sat": { "depends": ["six"], "file_name": "python_sat-1.8.dev13-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pysat"], "install_dir": "site", "name": "python-sat", "package_type": "package", "sha256": "70e0ba336620930b3a1e35cc255b1390b7555d0c7fd8eb5aac03d88fd27482c0", "unvendored_tests": false, "version": "1.8.dev13" }, "python-solvespace": { "depends": [], "file_name": "python_solvespace-3.0.8-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["python_solvespace"], "install_dir": "site", "name": "python-solvespace", "package_type": "package", "sha256": "97e47b1dcfd4cf81779c3471d44c95ff12fb649386dd67fa20d025ff3574d027", "unvendored_tests": false, "version": "3.0.8" }, "pytz": { "depends": [], "file_name": "pytz-2024.1-py2.py3-none-any.whl", "imports": ["pytz"], "install_dir": "site", "name": "pytz", "package_type": "package", "sha256": "4d9fcdd0d31fed7ec88db3c09394c6d52611be122370aa3a5c20026aa4741d62", "unvendored_tests": false, "version": "2024.1" }, "pywavelets": { "depends": ["numpy", "matplotlib", "scipy"], "file_name": "pywavelets-1.7.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pywt"], "install_dir": "site", "name": "pywavelets", "package_type": "package", "sha256": "b8c9af00a05dfeb51007aad1e8b3b951b9875a3a2ee280ad09bbd41d82110c03", "unvendored_tests": true, "version": "1.7.0" }, "pywavelets-tests": { "depends": ["pywavelets"], "file_name": "pywavelets-tests.tar", "imports": [], "install_dir": "site", "name": "pywavelets-tests", "package_type": "package", "sha256": "c3db6bcc05f7fd4812ca15dfdca660f10ea8032baeb30636a00941f16c4d8b7d", "unvendored_tests": false, "version": "1.7.0" }, "pyxel": { "depends": [], "file_name": "pyxel-1.9.10-cp37-abi3-pyodide_2024_0_wasm32.whl", "imports": ["pyxel"], "install_dir": "site", "name": "pyxel", "package_type": "package", "sha256": "b68a1c2224968b7543e1b5234c02c4cc745d65f77f4de9b3a6fb3da29bb5e566", "unvendored_tests": false, "version": "1.9.10" }, "pyxirr": { "depends": [], "file_name": "pyxirr-0.10.6-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["pyxirr"], "install_dir": "site", "name": "pyxirr", "package_type": "package", "sha256": "524d903b66a70ea1a73c06f4b482d581d4144053a21af1878925dcda35dd32bc", "unvendored_tests": false, "version": "0.10.6" }, "pyyaml": { "depends": [], "file_name": "PyYAML-6.0.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["_yaml", "yaml"], "install_dir": "site", "name": "pyyaml", "package_type": "package", "sha256": "4f6d4fd462caf96fdce9171287b143dd1e68c88648ede044a531dd35d9c3ca78", "unvendored_tests": false, "version": "6.0.2" }, "rasterio": { "depends": [ "numpy", "affine", "gdal", "attrs", "certifi", "click", "cligj" ], "file_name": "rasterio-1.4.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["rasterio"], "install_dir": "site", "name": "rasterio", "package_type": "package", "sha256": "bfa3e9a5f3447c10c9a9ac74a3b95a2de228a8bc0df504caaef38021ef294695", "unvendored_tests": false, "version": "1.4.2" }, "rateslib": { "depends": ["numpy", "pandas", "matplotlib"], "file_name": "rateslib-1.6.0-cp39-abi3-pyodide_2024_0_wasm32.whl", "imports": ["rateslib"], "install_dir": "site", "name": "rateslib", "package_type": "package", "sha256": "e8991ec93ce310cca7f923774e3712a2a021ca6f40e15e29ce3c7d44f1639287", "unvendored_tests": false, "version": "1.6.0" }, "rebound": { "depends": ["numpy"], "file_name": "rebound-4.4.3-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["rebound"], "install_dir": "site", "name": "rebound", "package_type": "package", "sha256": "e8a97a34d4cd7aff7a1c3867a17d3590c7f3a8be31803ca24a0ca5a987e84632", "unvendored_tests": false, "version": "4.4.3" }, "reboundx": { "depends": ["rebound", "numpy"], "file_name": "reboundx-4.3.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["reboundx"], "install_dir": "site", "name": "reboundx", "package_type": "package", "sha256": "c87b5d60b259e67893d28f92fb364c9a7e0d578b22c07191ee844aef207840d7", "unvendored_tests": false, "version": "4.3.0" }, "referencing": { "depends": ["attrs", "rpds-py"], "file_name": "referencing-0.34.0-py3-none-any.whl", "imports": ["referencing"], "install_dir": "site", "name": "referencing", "package_type": "package", "sha256": "85a54b89cffad1552bb4c7f5c2cb5a69e8476cb1f331fe7b816bcf61361cd421", "unvendored_tests": true, "version": "0.34.0" }, "referencing-tests": { "depends": ["referencing"], "file_name": "referencing-tests.tar", "imports": [], "install_dir": "site", "name": "referencing-tests", "package_type": "package", "sha256": "4613870a7f02e4b9b9f46fce0941317d000c56356a2bf7d6233043350f70a2f7", "unvendored_tests": false, "version": "0.34.0" }, "regex": { "depends": [], "file_name": "regex-2024.9.11-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["regex"], "install_dir": "site", "name": "regex", "package_type": "package", "sha256": "360f8c42bb23821206a3aaa154705fce204c73cbf84adfe1f15296bce2fca306", "unvendored_tests": true, "version": "2024.9.11" }, "regex-tests": { "depends": ["regex"], "file_name": "regex-tests.tar", "imports": [], "install_dir": "site", "name": "regex-tests", "package_type": "package", "sha256": "585927f9a991d9ea07ee29fb3b3b24e02d6a287d32ba3c2568ddc25ab7e16dc5", "unvendored_tests": false, "version": "2024.9.11" }, "requests": { "depends": ["charset-normalizer", "idna", "urllib3", "certifi"], "file_name": "requests-2.31.0-py3-none-any.whl", "imports": ["requests"], "install_dir": "site", "name": "requests", "package_type": "package", "sha256": "989ea9ee570dbac26269e964d3d73a1b7792ded0a7d1124fede2d2d05859dedd", "unvendored_tests": false, "version": "2.31.0" }, "retrying": { "depends": ["six"], "file_name": "retrying-1.3.4-py3-none-any.whl", "imports": ["retrying"], "install_dir": "site", "name": "retrying", "package_type": "package", "sha256": "556d56c59a3a0fda6779008eee80b96aea5702c9a89dadaa2a412910f6c6c06f", "unvendored_tests": false, "version": "1.3.4" }, "rich": { "depends": [], "file_name": "rich-13.7.1-py3-none-any.whl", "imports": ["rich"], "install_dir": "site", "name": "rich", "package_type": "package", "sha256": "15538d6bed0d8eedf057bc426fe6671ec2383ac20de021935a11ddee2f3d32ea", "unvendored_tests": false, "version": "13.7.1" }, "river": { "depends": ["numpy", "pandas", "scipy"], "file_name": "river-0.22.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["river"], "install_dir": "site", "name": "river", "package_type": "package", "sha256": "e60b97729df668034042c05cbbbe01d69c35edba6bbf14d4015aac77ae99ad26", "unvendored_tests": true, "version": "0.22.0" }, "river-tests": { "depends": ["river"], "file_name": "river-tests.tar", "imports": [], "install_dir": "site", "name": "river-tests", "package_type": "package", "sha256": "c06a63bd9d84295df81c556f456af97f1eda1159880f90b385a6e081716f9ccc", "unvendored_tests": false, "version": "0.22.0" }, "robotraconteur": { "depends": ["numpy"], "file_name": "RobotRaconteur-1.2.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["RobotRaconteur"], "install_dir": "site", "name": "RobotRaconteur", "package_type": "package", "sha256": "9aec7f65a3fed58c82c5cfbc6bff46cc5bf8fa1b79481ccd4ea7cb476f08b328", "unvendored_tests": false, "version": "1.2.2" }, "rpds-py": { "depends": [], "file_name": "rpds_py-0.18.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["rpds"], "install_dir": "site", "name": "rpds-py", "package_type": "package", "sha256": "a3f26d0f7a2eb06781e2d2c6cc4c13bca3a66d667601620c679c6978e661a07f", "unvendored_tests": false, "version": "0.18.0" }, "ruamel-yaml": { "depends": [], "file_name": "ruamel.yaml-0.18.6-py3-none-any.whl", "imports": ["ruamel"], "install_dir": "site", "name": "ruamel.yaml", "package_type": "package", "sha256": "df384cdd24f45ba88606eb44649ec7fc0d73307e28c791c19c9b92b9e6b1a75a", "unvendored_tests": false, "version": "0.18.6" }, "rust-abi-test": { "depends": [], "file_name": "rust_abi_test-1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["rust-abi-test"], "install_dir": "site", "name": "rust-abi-test", "package_type": "package", "sha256": "dbb1b8c3c878b2d8c5a85444e2b0be2c87c0ae4463186fd20fc30c46283773cd", "unvendored_tests": false, "version": "1.0" }, "rust-panic-test": { "depends": [], "file_name": "rust_panic_test-1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["rust-panic-test"], "install_dir": "site", "name": "rust-panic-test", "package_type": "package", "sha256": "7a491b50df2a813efbb3e95f03c52ab8f4ebde95e252a48e92b6279666051f2d", "unvendored_tests": false, "version": "1.0" }, "scikit-image": { "depends": [ "packaging", "numpy", "scipy", "networkx", "pillow", "imageio", "pywavelets", "lazy_loader" ], "file_name": "scikit_image-0.25.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["skimage"], "install_dir": "site", "name": "scikit-image", "package_type": "package", "sha256": "54171d692a5e01eec859ff6a59f997bf5d055f1a0660d35d1d90ce38ed03ad2d", "unvendored_tests": true, "version": "0.25.0" }, "scikit-image-tests": { "depends": ["scikit-image"], "file_name": "scikit-image-tests.tar", "imports": [], "install_dir": "site", "name": "scikit-image-tests", "package_type": "package", "sha256": "4dc121ef29225f77f83d82babcc3714010bcc447c9c88045bfbd09d230b35cd4", "unvendored_tests": false, "version": "0.25.0" }, "scikit-learn": { "depends": ["scipy", "joblib", "threadpoolctl"], "file_name": "scikit_learn-1.6.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["sklearn"], "install_dir": "site", "name": "scikit-learn", "package_type": "package", "sha256": "366a683e6ee7b79f0755761489c7396b11db3086f07f5078f9b74ab4c6d3ddb8", "unvendored_tests": true, "version": "1.6.1" }, "scikit-learn-tests": { "depends": ["scikit-learn"], "file_name": "scikit-learn-tests.tar", "imports": [], "install_dir": "site", "name": "scikit-learn-tests", "package_type": "package", "sha256": "43f9b6c8dceba857b18349dee0323749eae4b402cd332d2dd1d192aafee89f5b", "unvendored_tests": false, "version": "1.6.1" }, "scipy": { "depends": ["numpy", "openblas"], "file_name": "scipy-1.14.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["scipy"], "install_dir": "site", "name": "scipy", "package_type": "package", "sha256": "eebec257caf28c3cc969b05878327a285437af1a44eec92fc6312cc0ed638499", "unvendored_tests": true, "version": "1.14.1" }, "scipy-tests": { "depends": ["scipy"], "file_name": "scipy-tests.tar", "imports": [], "install_dir": "site", "name": "scipy-tests", "package_type": "package", "sha256": "6f11b4e99496ec949b8cbc0da438d26be722a7623f23338506437a344ec0b209", "unvendored_tests": false, "version": "1.14.1" }, "screed": { "depends": [], "file_name": "screed-1.1.3-py2.py3-none-any.whl", "imports": ["bigtests", "screed"], "install_dir": "site", "name": "screed", "package_type": "package", "sha256": "c19d20a26988701e7a861444ee21b2d50079c92d96c966969e73f677873fe069", "unvendored_tests": true, "version": "1.1.3" }, "screed-tests": { "depends": ["screed"], "file_name": "screed-tests.tar", "imports": [], "install_dir": "site", "name": "screed-tests", "package_type": "package", "sha256": "46fb0a3f325489f9f6133136cb4eb3ea7370576e1b1b5d1cd0cdbb9519cc6168", "unvendored_tests": false, "version": "1.1.3" }, "setuptools": { "depends": ["pyparsing"], "file_name": "setuptools-69.5.1-py3-none-any.whl", "imports": ["_distutils_hack", "pkg_resources", "setuptools"], "install_dir": "site", "name": "setuptools", "package_type": "package", "sha256": "55db9a495173f61154429e94d917ec869c870fd6e8899eb3cc3a6fe9b9a045ec", "unvendored_tests": false, "version": "69.5.1" }, "shapely": { "depends": ["numpy"], "file_name": "shapely-2.0.6-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["shapely"], "install_dir": "site", "name": "shapely", "package_type": "package", "sha256": "369a877a70309114933c0b05a0921ce39cdb1bbce0d6ec6bc1f87cddb215eca3", "unvendored_tests": true, "version": "2.0.6" }, "shapely-tests": { "depends": ["shapely"], "file_name": "shapely-tests.tar", "imports": [], "install_dir": "site", "name": "shapely-tests", "package_type": "package", "sha256": "cd1bd5c16ea99d2d0ba36d955172e72e745197af1fefb25e68762741b8c52c9f", "unvendored_tests": false, "version": "2.0.6" }, "sharedlib-test": { "depends": [], "file_name": "sharedlib-test-1.0.zip", "imports": [], "install_dir": "dynlib", "name": "sharedlib-test", "package_type": "shared_library", "sha256": "f376932bff89a4fafda8b428ce09147ad66788e63d71ead2c8df2db6e72e895b", "unvendored_tests": false, "version": "1.0" }, "sharedlib-test-py": { "depends": ["sharedlib-test"], "file_name": "sharedlib_test_py-1.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["sharedlib_test"], "install_dir": "site", "name": "sharedlib-test-py", "package_type": "package", "sha256": "8b90ce5ed558817d4fa5fa4f6035eeb0e5b821c220e72bfc05186878ac4bb6a3", "unvendored_tests": false, "version": "1.0" }, "simplejson": { "depends": [], "file_name": "simplejson-3.19.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["simplejson"], "install_dir": "site", "name": "simplejson", "package_type": "package", "sha256": "0491048f30a890b40c5fa07ef072039d7514ca2c39f3310c773c698def4e81e8", "unvendored_tests": true, "version": "3.19.2" }, "simplejson-tests": { "depends": ["simplejson"], "file_name": "simplejson-tests.tar", "imports": [], "install_dir": "site", "name": "simplejson-tests", "package_type": "package", "sha256": "13d61686ff97f4d856cb9990c1eafc0f41e1a47b305d92818c264bf0590e5934", "unvendored_tests": false, "version": "3.19.2" }, "sisl": { "depends": [ "pyparsing", "numpy", "scipy", "tqdm", "xarray", "pandas", "matplotlib" ], "file_name": "sisl-0.15.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["sisl_toolbox", "sisl"], "install_dir": "site", "name": "sisl", "package_type": "package", "sha256": "cb3e398db1fb3ce4fe71d4dce36a995eb5830450bcc09cfbdf5fa9cbd6f5a6c5", "unvendored_tests": true, "version": "0.15.1" }, "sisl-tests": { "depends": ["sisl"], "file_name": "sisl-tests.tar", "imports": [], "install_dir": "site", "name": "sisl-tests", "package_type": "package", "sha256": "2f1ac8e121e6f4d52d6d45df395c0a7e399de162ec438b57a5671f0a5dfe5da7", "unvendored_tests": false, "version": "0.15.1" }, "six": { "depends": [], "file_name": "six-1.16.0-py2.py3-none-any.whl", "imports": ["six"], "install_dir": "site", "name": "six", "package_type": "package", "sha256": "9a9c3ac3a9305de225a2c8001171387acca73aa0a5c355a2ad49a8adbc6170db", "unvendored_tests": false, "version": "1.16.0" }, "smart-open": { "depends": ["wrapt"], "file_name": "smart_open-7.0.4-py3-none-any.whl", "imports": ["smart_open"], "install_dir": "site", "name": "smart-open", "package_type": "package", "sha256": "b5548ac9419a50ff7ab0502884f69c521a3d730842c6667de2aa513592815764", "unvendored_tests": false, "version": "7.0.4" }, "sortedcontainers": { "depends": [], "file_name": "sortedcontainers-2.4.0-py2.py3-none-any.whl", "imports": ["sortedcontainers"], "install_dir": "site", "name": "sortedcontainers", "package_type": "package", "sha256": "d40ce50e406b2c84e95b69d31fb13a9ecccc8dd83468f63da8e0d9484ae0942d", "unvendored_tests": false, "version": "2.4.0" }, "soupsieve": { "depends": [], "file_name": "soupsieve-2.5-py3-none-any.whl", "imports": ["soupsieve"], "install_dir": "site", "name": "soupsieve", "package_type": "package", "sha256": "e97cfa16d2a6cc246659bc085ca3749ac6c6107fd68b54bbcea843786beccf5d", "unvendored_tests": false, "version": "2.5" }, "sourmash": { "depends": [ "screed", "cffi", "deprecation", "cachetools", "numpy", "matplotlib", "scipy", "sqlite3", "bitstring" ], "file_name": "sourmash-4.8.11-py3-none-pyodide_2024_0_wasm32.whl", "imports": ["sourmash"], "install_dir": "site", "name": "sourmash", "package_type": "package", "sha256": "10f589da5c91e2fabef9bb5efe6cb325b231aea2a18388290df10e09e8efe82b", "unvendored_tests": false, "version": "4.8.11" }, "soxr": { "depends": ["numpy"], "file_name": "soxr-0.5.0.post1-cp312-abi3-pyodide_2024_0_wasm32.whl", "imports": ["soxr"], "install_dir": "site", "name": "soxr", "package_type": "package", "sha256": "a7ec50bbbe0425350b505de05ab1ba9f3718ac5f8d50a0f9026b99d098dcc6c2", "unvendored_tests": false, "version": "0.5.0.post1" }, "sparseqr": { "depends": ["pycparser", "cffi", "numpy", "scipy", "suitesparse"], "file_name": "sparseqr-1.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["sparseqr"], "install_dir": "site", "name": "sparseqr", "package_type": "package", "sha256": "99d7e6b87ba695691020d27ea24cf8abd827f7aa94ce7939a47979191067e6c8", "unvendored_tests": false, "version": "1.2" }, "sqlalchemy": { "depends": ["sqlite3", "typing-extensions"], "file_name": "SQLAlchemy-2.0.29-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["sqlalchemy"], "install_dir": "site", "name": "sqlalchemy", "package_type": "package", "sha256": "612b1a9126ec9ed32cf6a3bec5ba819bcf22129391ad36282c91968fa206f1ed", "unvendored_tests": true, "version": "2.0.29" }, "sqlalchemy-tests": { "depends": ["sqlalchemy"], "file_name": "sqlalchemy-tests.tar", "imports": [], "install_dir": "site", "name": "sqlalchemy-tests", "package_type": "package", "sha256": "22bc36d17fe77a36a82b47e683c40a85e76e43520973b81f9abb251229879025", "unvendored_tests": false, "version": "2.0.29" }, "sqlite3": { "depends": [], "file_name": "sqlite3-1.0.0-py2.py3-none-any.whl", "imports": ["sqlite3", "_sqlite3"], "install_dir": "site", "name": "sqlite3", "package_type": "cpython_module", "sha256": "23c51f8913c23ea67eb7c86ad80db7d26ce98f22e1ed48909d80be4452e9b20e", "unvendored_tests": false, "version": "1.0.0" }, "ssl": { "depends": ["openssl"], "file_name": "ssl-1.0.0-py2.py3-none-any.whl", "imports": ["ssl", "_ssl"], "install_dir": "site", "name": "ssl", "package_type": "cpython_module", "sha256": "cd62925e0170c80ea371c125dbc512a43c8018ddbf58ee9c71987f64700dbaf7", "unvendored_tests": false, "version": "1.0.0" }, "stack-data": { "depends": ["executing", "asttokens", "pure-eval"], "file_name": "stack_data-0.6.3-py3-none-any.whl", "imports": ["stack_data"], "install_dir": "site", "name": "stack-data", "package_type": "package", "sha256": "35c37da13e17cfaea4d2bef2b1fc92da298ac1e93483759e89d63eeca11e2d0c", "unvendored_tests": false, "version": "0.6.3" }, "statsmodels": { "depends": ["numpy", "scipy", "pandas", "patsy", "packaging"], "file_name": "statsmodels-0.14.4-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["statsmodels"], "install_dir": "site", "name": "statsmodels", "package_type": "package", "sha256": "bee8738734db2d59b7170a887d55815540d09b033be93b62c0fbf8177ac41254", "unvendored_tests": false, "version": "0.14.4" }, "strictyaml": { "depends": ["python-dateutil"], "file_name": "strictyaml-1.7.3-py3-none-any.whl", "imports": ["strictyaml"], "install_dir": "site", "name": "strictyaml", "package_type": "package", "sha256": "9950bd6669a0a3485bd3cad60c6cf7c385a449465b3869f54a09633b64963fdf", "unvendored_tests": false, "version": "1.7.3" }, "suitesparse": { "depends": ["openblas"], "file_name": "suitesparse-5.11.0.zip", "imports": [], "install_dir": "dynlib", "name": "suitesparse", "package_type": "shared_library", "sha256": "b49ce96e75146487e5ba801d75b50279f26811818b4fad628893dda9456da595", "unvendored_tests": false, "version": "5.11.0" }, "svgwrite": { "depends": [], "file_name": "svgwrite-1.4.3-py3-none-any.whl", "imports": ["svgwrite"], "install_dir": "site", "name": "svgwrite", "package_type": "package", "sha256": "ef5033956416944252eb7de0559845b3c9ecbe296519c9a8ecd1f20ce311bc3f", "unvendored_tests": false, "version": "1.4.3" }, "swiglpk": { "depends": [], "file_name": "swiglpk-5.0.10-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["swiglpk"], "install_dir": "site", "name": "swiglpk", "package_type": "package", "sha256": "84c624d8f2509a1b858eeb422b1be1d09b9f52e0c1deb3c6b0c91e0006ed51f2", "unvendored_tests": false, "version": "5.0.10" }, "sympy": { "depends": ["mpmath"], "file_name": "sympy-1.13.3-py3-none-any.whl", "imports": ["isympy", "sympy"], "install_dir": "site", "name": "sympy", "package_type": "package", "sha256": "31f9d8cf9e00efa868c9f30c7cafe644b347a48b01ce8fa492938986cf60deb1", "unvendored_tests": true, "version": "1.13.3" }, "sympy-tests": { "depends": ["sympy"], "file_name": "sympy-tests.tar", "imports": [], "install_dir": "site", "name": "sympy-tests", "package_type": "package", "sha256": "91793b52f4b017a8b16998b5b535f119b05992d4f4d7be9414013e517768c5a8", "unvendored_tests": false, "version": "1.13.3" }, "tblib": { "depends": [], "file_name": "tblib-3.0.0-py3-none-any.whl", "imports": ["tblib"], "install_dir": "site", "name": "tblib", "package_type": "package", "sha256": "d4401b1694ad5ff6c9913aa5314d566d443e91d4a469e4da2464e7d9d6dea92c", "unvendored_tests": false, "version": "3.0.0" }, "termcolor": { "depends": [], "file_name": "termcolor-2.4.0-py3-none-any.whl", "imports": ["termcolor"], "install_dir": "site", "name": "termcolor", "package_type": "package", "sha256": "188eb32ba80db2f541ac0e520b113b6b0eb90e15a15a188af99abfe829458456", "unvendored_tests": false, "version": "2.4.0" }, "test": { "depends": [], "file_name": "test-1.0.0-py2.py3-none-any.whl", "imports": ["test"], "install_dir": "site", "name": "test", "package_type": "cpython_module", "sha256": "d235bf78d343f00e089b59777f5484437c946010d9c08a71cbc9b9fd1a988f54", "unvendored_tests": false, "version": "1.0.0" }, "texttable": { "depends": [], "file_name": "texttable-1.7.0-py2.py3-none-any.whl", "imports": ["texttable"], "install_dir": "site", "name": "texttable", "package_type": "package", "sha256": "21b971f159c8c8316f7eb8f4be94cc96d0e13c7d8e7361d5a720c979f78a42fb", "unvendored_tests": false, "version": "1.7.0" }, "threadpoolctl": { "depends": [], "file_name": "threadpoolctl-3.5.0-py3-none-any.whl", "imports": ["threadpoolctl"], "install_dir": "site", "name": "threadpoolctl", "package_type": "package", "sha256": "85ba420ffa213e855bee04b2fabed30c9abdb6253b3698f2c40e1f9e320803d5", "unvendored_tests": false, "version": "3.5.0" }, "tiktoken": { "depends": ["regex", "requests"], "file_name": "tiktoken-0.8.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["tiktoken", "tiktoken_ext"], "install_dir": "site", "name": "tiktoken", "package_type": "package", "sha256": "9822dbab8a69df5651c2a60f369f58cd5df21af0be1bd8d5da45f972b9fb1c41", "unvendored_tests": false, "version": "0.8.0" }, "tomli": { "depends": [], "file_name": "tomli-2.0.1-py3-none-any.whl", "imports": ["tomli"], "install_dir": "site", "name": "tomli", "package_type": "package", "sha256": "6c8a227cbf699db514e7f9c6ba798c7a036993d7e3ba90295a8580d0403042c4", "unvendored_tests": false, "version": "2.0.1" }, "tomli-w": { "depends": [], "file_name": "tomli_w-1.0.0-py3-none-any.whl", "imports": ["tomli_w"], "install_dir": "site", "name": "tomli-w", "package_type": "package", "sha256": "6e5bda93cda389fdf85f047447c66207441194c50d3e2b307061c99c885ba6ac", "unvendored_tests": false, "version": "1.0.0" }, "toolz": { "depends": [], "file_name": "toolz-0.12.1-py3-none-any.whl", "imports": ["tlz", "toolz"], "install_dir": "site", "name": "toolz", "package_type": "package", "sha256": "fd37c03705cae0ce883ed9c8ebf86ce4a4314bcaa78e859673e157aac72c3140", "unvendored_tests": true, "version": "0.12.1" }, "toolz-tests": { "depends": ["toolz"], "file_name": "toolz-tests.tar", "imports": [], "install_dir": "site", "name": "toolz-tests", "package_type": "package", "sha256": "10dbb463b56bf32e6978e710d589ca4dea0ea75f15dc7050728a0a50d1d5dc61", "unvendored_tests": false, "version": "0.12.1" }, "tqdm": { "depends": [], "file_name": "tqdm-4.66.2-py3-none-any.whl", "imports": ["tqdm"], "install_dir": "site", "name": "tqdm", "package_type": "package", "sha256": "a44957de6b0d510b380670e81376be8625619b2d2eb10e34daf6168cab5c06c5", "unvendored_tests": false, "version": "4.66.2" }, "traitlets": { "depends": [], "file_name": "traitlets-5.14.3-py3-none-any.whl", "imports": ["traitlets"], "install_dir": "site", "name": "traitlets", "package_type": "package", "sha256": "95882d9bf2b8f18c37af4a8061bf83d2fdc7ffec71b70d752e68cda2a8b67f75", "unvendored_tests": true, "version": "5.14.3" }, "traitlets-tests": { "depends": ["traitlets"], "file_name": "traitlets-tests.tar", "imports": [], "install_dir": "site", "name": "traitlets-tests", "package_type": "package", "sha256": "10f443b3b34b6f3aa6e1e54c302862a3f0c32a184a23ecb182fe8210cfe4a2e0", "unvendored_tests": false, "version": "5.14.3" }, "traits": { "depends": [], "file_name": "traits-6.4.3-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["traits"], "install_dir": "site", "name": "traits", "package_type": "package", "sha256": "acb44eb4e8e37d18c38cad3b1b7be3ec578caedee5fae790c325f5836f01ee13", "unvendored_tests": true, "version": "6.4.3" }, "traits-tests": { "depends": ["traits"], "file_name": "traits-tests.tar", "imports": [], "install_dir": "site", "name": "traits-tests", "package_type": "package", "sha256": "6f3fcebfd58245b3b3297e3e91a11f54cf0d75cefd37ed76eb023d5baf7efc3d", "unvendored_tests": false, "version": "6.4.3" }, "tree-sitter": { "depends": [], "file_name": "tree_sitter-0.23.2-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["tree_sitter"], "install_dir": "site", "name": "tree-sitter", "package_type": "package", "sha256": "9ab83952dfec79c6b6d6c0eedda65b8573cc71394ab43286d7a8e750c991d3b0", "unvendored_tests": false, "version": "0.23.2" }, "tree-sitter-go": { "depends": ["tree-sitter"], "file_name": "tree_sitter_go-0.23.3-cp39-abi3-pyodide_2024_0_wasm32.whl", "imports": ["tree_sitter_go"], "install_dir": "site", "name": "tree-sitter-go", "package_type": "package", "sha256": "01c100fa55add2c85d95d4808eb90b4845048dc60354541e0511e80bf604a75d", "unvendored_tests": false, "version": "0.23.3" }, "tree-sitter-java": { "depends": ["tree-sitter"], "file_name": "tree_sitter_java-0.23.4-cp39-abi3-pyodide_2024_0_wasm32.whl", "imports": ["tree_sitter_java"], "install_dir": "site", "name": "tree-sitter-java", "package_type": "package", "sha256": "ead1b39ab00321bdc2b18f234d3a79b38c6ec628b48bbcb1bc1b0447e49d1bcc", "unvendored_tests": false, "version": "0.23.4" }, "tree-sitter-python": { "depends": ["tree-sitter"], "file_name": "tree_sitter_python-0.23.4-cp39-abi3-pyodide_2024_0_wasm32.whl", "imports": ["tree_sitter_python"], "install_dir": "site", "name": "tree-sitter-python", "package_type": "package", "sha256": "d08ec0bac125c8545fdd90606556622bb23074f322039d1376b035e25e626b48", "unvendored_tests": false, "version": "0.23.4" }, "tskit": { "depends": ["numpy", "svgwrite", "jsonschema", "rpds-py"], "file_name": "tskit-0.6.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["tskit"], "install_dir": "site", "name": "tskit", "package_type": "package", "sha256": "efaf091cd918de1aad68817ce739f3ae280c71b6e14226c9d738dc50b4846e62", "unvendored_tests": false, "version": "0.6.0" }, "typing-extensions": { "depends": [], "file_name": "typing_extensions-4.11.0-py3-none-any.whl", "imports": ["typing_extensions"], "install_dir": "site", "name": "typing-extensions", "package_type": "package", "sha256": "0de4dc28ee755d5ee6b946e8df60360d68ccb772a076c04277677646467425a9", "unvendored_tests": false, "version": "4.11.0" }, "tzdata": { "depends": [], "file_name": "tzdata-2024.1-py2.py3-none-any.whl", "imports": ["tzdata"], "install_dir": "site", "name": "tzdata", "package_type": "package", "sha256": "7aeeaaea345f1c810ff7ef2688b37975f918e757c818f8e7f351618caecd56bf", "unvendored_tests": false, "version": "2024.1" }, "uncertainties": { "depends": ["future"], "file_name": "uncertainties-3.1.7-py2.py3-none-any.whl", "imports": ["uncertainties"], "install_dir": "site", "name": "uncertainties", "package_type": "package", "sha256": "889e943b32290ac443f260299f2815a89782647f744bd3b07e44e601b98f8457", "unvendored_tests": true, "version": "3.1.7" }, "uncertainties-tests": { "depends": ["uncertainties"], "file_name": "uncertainties-tests.tar", "imports": [], "install_dir": "site", "name": "uncertainties-tests", "package_type": "package", "sha256": "ceb22e53c2a0a918441561ac54c9db63da459746888fc682bb8cebc20e31525f", "unvendored_tests": false, "version": "3.1.7" }, "unyt": { "depends": ["numpy", "packaging", "sympy"], "file_name": "unyt-3.0.3-py3-none-any.whl", "imports": ["unyt"], "install_dir": "site", "name": "unyt", "package_type": "package", "sha256": "45b906f5a31731886adb0b98f4e70689a729aa437de6c43fb0ca2d71a9ff82a0", "unvendored_tests": true, "version": "3.0.3" }, "unyt-tests": { "depends": ["unyt"], "file_name": "unyt-tests.tar", "imports": [], "install_dir": "site", "name": "unyt-tests", "package_type": "package", "sha256": "1842e022ce93f0493e581ce6bfe59d1b6be8b43d42bc95cd2a8dcf3e0f72a87a", "unvendored_tests": false, "version": "3.0.3" }, "urllib3": { "depends": [], "file_name": "urllib3-2.2.3-py3-none-any.whl", "imports": ["urllib3"], "install_dir": "site", "name": "urllib3", "package_type": "package", "sha256": "819458954209ef4ea434df1b04408982a4426b061e110a30e760677b80732864", "unvendored_tests": false, "version": "2.2.3" }, "vega-datasets": { "depends": ["pandas"], "file_name": "vega_datasets-0.9.0-py3-none-any.whl", "imports": ["vega_datasets"], "install_dir": "site", "name": "vega-datasets", "package_type": "package", "sha256": "6a46728c41def99f4c43b7965bd39306aeb1f50cb49bbe269eb80e436f2f5006", "unvendored_tests": true, "version": "0.9.0" }, "vega-datasets-tests": { "depends": ["vega-datasets"], "file_name": "vega-datasets-tests.tar", "imports": [], "install_dir": "site", "name": "vega-datasets-tests", "package_type": "package", "sha256": "40acee61cba9915a4e4e1351a8cb0d660efc53cfab8d381784476db74f5c2620", "unvendored_tests": false, "version": "0.9.0" }, "wcwidth": { "depends": [], "file_name": "wcwidth-0.2.13-py2.py3-none-any.whl", "imports": ["wcwidth"], "install_dir": "site", "name": "wcwidth", "package_type": "package", "sha256": "98f986298d7878d98e7a039e7dc81be26eab99c6ebe2bf9215bc735f87dd245c", "unvendored_tests": false, "version": "0.2.13" }, "webencodings": { "depends": [], "file_name": "webencodings-0.5.1-py2.py3-none-any.whl", "imports": ["webencodings"], "install_dir": "site", "name": "webencodings", "package_type": "package", "sha256": "4ddec4a758fd69b6faaae0e0e60cd6f807fa49d706c417eb6777f147743545f7", "unvendored_tests": false, "version": "0.5.1" }, "wordcloud": { "depends": ["matplotlib"], "file_name": "wordcloud-1.9.3-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["wordcloud"], "install_dir": "site", "name": "wordcloud", "package_type": "package", "sha256": "fd7b3a0612bd8a05c11e3db1656523afcb3323e1c7df37b656096f94bc298c21", "unvendored_tests": false, "version": "1.9.3" }, "wrapt": { "depends": [], "file_name": "wrapt-1.16.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["wrapt"], "install_dir": "site", "name": "wrapt", "package_type": "package", "sha256": "13a9aa1c04c1a492a11e841ffb37050a27d5ab1651b4692cf068b8b5678cadd3", "unvendored_tests": false, "version": "1.16.0" }, "xarray": { "depends": ["numpy", "packaging", "pandas"], "file_name": "xarray-2024.11.0-py3-none-any.whl", "imports": ["xarray"], "install_dir": "site", "name": "xarray", "package_type": "package", "sha256": "82381bccda787f00be93c156008f9c1f57c16348a99d014f004a541e756a6c92", "unvendored_tests": true, "version": "2024.11.0" }, "xarray-tests": { "depends": ["xarray"], "file_name": "xarray-tests.tar", "imports": [], "install_dir": "site", "name": "xarray-tests", "package_type": "package", "sha256": "ca06ab952e066d8a46f60855287a1bfb1b6c8b812b989a97ba512361a5df0612", "unvendored_tests": false, "version": "2024.11.0" }, "xgboost": { "depends": ["numpy", "scipy", "setuptools"], "file_name": "xgboost-2.1.2-py3-none-pyodide_2024_0_wasm32.whl", "imports": ["xgboost"], "install_dir": "site", "name": "xgboost", "package_type": "package", "sha256": "bde8e338a824d7853b59f36f252697609fb59f51da7af14c3e5b89e4b825d428", "unvendored_tests": false, "version": "2.1.2" }, "xlrd": { "depends": [], "file_name": "xlrd-2.0.1-py2.py3-none-any.whl", "imports": ["xlrd"], "install_dir": "site", "name": "xlrd", "package_type": "package", "sha256": "a74ca5c34708d1242c5bf1298089d82f8b5832ba22bcadb851bb44be5075970c", "unvendored_tests": false, "version": "2.0.1" }, "xxhash": { "depends": [], "file_name": "xxhash-3.4.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["xxhash"], "install_dir": "site", "name": "xxhash", "package_type": "package", "sha256": "6f099081ddf9ef8cba3ddbbd71b9400d52410334cae34210df58586642842bad", "unvendored_tests": false, "version": "3.4.1" }, "xyzservices": { "depends": [], "file_name": "xyzservices-2024.4.0-py3-none-any.whl", "imports": ["xyzservices"], "install_dir": "site", "name": "xyzservices", "package_type": "package", "sha256": "6845729ba7b006123b2d58fb7acc7c87eaaecf340c53fd10dce3a5230da6a106", "unvendored_tests": true, "version": "2024.4.0" }, "xyzservices-tests": { "depends": ["xyzservices"], "file_name": "xyzservices-tests.tar", "imports": [], "install_dir": "site", "name": "xyzservices-tests", "package_type": "package", "sha256": "66575df0f66976f0135e836852c77d2f6b95ab04a1e92a19961691d08207e341", "unvendored_tests": false, "version": "2024.4.0" }, "yarl": { "depends": ["multidict", "idna"], "file_name": "yarl-1.9.4-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["yarl"], "install_dir": "site", "name": "yarl", "package_type": "package", "sha256": "2381e151bd93da29c42303a822e5fc577eccc3b2c60075d44d1e0953b2553fea", "unvendored_tests": false, "version": "1.9.4" }, "yt": { "depends": [ "ewah_bool_utils", "numpy", "matplotlib", "sympy", "setuptools", "packaging", "unyt", "cmyt", "colorspacious", "tqdm", "tomli", "tomli-w" ], "file_name": "yt-4.3.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["yt"], "install_dir": "site", "name": "yt", "package_type": "package", "sha256": "ad7069a877ef72118b82681084c5001492f10be78cedee1b876851ad3312db25", "unvendored_tests": false, "version": "4.3.1" }, "zarr": { "depends": ["numpy", "asciitree", "numcodecs"], "file_name": "zarr-2.18.3-py3-none-any.whl", "imports": ["zarr"], "install_dir": "site", "name": "zarr", "package_type": "package", "sha256": "a8894ff4c8540817366b640ccdf9d0f3d02e4bc1a8afb227800d5073cebe0e30", "unvendored_tests": true, "version": "2.18.3" }, "zarr-tests": { "depends": ["zarr"], "file_name": "zarr-tests.tar", "imports": [], "install_dir": "site", "name": "zarr-tests", "package_type": "package", "sha256": "43d24bd575733c9d8fa5357fdc982b0b0bf37cbfd5ae20df3bddab2529183f7e", "unvendored_tests": false, "version": "2.18.3" }, "zengl": { "depends": [], "file_name": "zengl-2.7.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["zengl", "_zengl"], "install_dir": "site", "name": "zengl", "package_type": "package", "sha256": "019ddb30f04997051f01afa2ba247cbecdc87dc3bbce67dadff2ad2dbc1436e8", "unvendored_tests": false, "version": "2.7.1" }, "zfpy": { "depends": ["numpy"], "file_name": "zfpy-1.0.1-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["zfpy"], "install_dir": "site", "name": "zfpy", "package_type": "package", "sha256": "e85444e2511fdffec84de66045192dc20e6b171bbf0d5bd521556bf05140f05c", "unvendored_tests": false, "version": "1.0.1" }, "zstandard": { "depends": ["cffi"], "file_name": "zstandard-0.22.0-cp312-cp312-pyodide_2024_0_wasm32.whl", "imports": ["zstandard"], "install_dir": "site", "name": "zstandard", "package_type": "package", "sha256": "b945d822695f786ff81e15c905f255b450fce7102f30a54daa5c30a79c520497", "unvendored_tests": false, "version": "0.22.0" } } } ================================================ FILE: packages/app/public/pyodide/pyodide.asm.js ================================================ "use strict"; var _createPyodideModule = (() => { var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; if (typeof __filename != 'undefined') _scriptName ||= __filename; return ( function(moduleArg = {}) { var moduleRtn; var Module=Object.assign({},moduleArg);var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];if(!Module.wrapException){Module.wrapException=e=>e}var dynamicLibraries=Module["dynamicLibraries"]||[];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE!="undefined"&&ENVIRONMENT_IS_NODE){var buf=Buffer.from(s,"base64");return new Uint8Array(buf.buffer,buf.byteOffset,buf.length)}var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;ifilename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");var wasmBinaryFile;wasmBinaryFile="pyodide.asm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw`failed to load wasm binary file at '${binaryFile}'`}return response["arrayBuffer"]()}).catch(()=>getBinarySync(binaryFile))}else if(readAsync){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),reject)})}}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{"env":wasmImports,"wasi_snapshot_preview1":wasmImports,"GOT.mem":new Proxy(wasmImports,GOTHandler),"GOT.func":new Proxy(wasmImports,GOTHandler)}}function createWasm(){var info=getWasmImports();if(Module.adjustWasmImports){Module.adjustWasmImports(info)}function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=relocateExports(wasmExports,1024);var metadata=getDylinkMetadata(module);if(metadata.neededDynlibs){dynamicLibraries=metadata.neededDynlibs.concat(dynamicLibraries)}mergeLibSymbols(wasmExports,"main");LDSO.init();loadDylibs();wasmExports=applySignatureConversions(wasmExports);addOnInit(wasmExports["__wasm_call_ctors"]);__RELOC_FUNCS__.push(wasmExports["__wasm_apply_data_relocs"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var ASM_CONSTS={4579647:()=>{throw new Error("intentionally triggered fatal error!")},4579704:()=>{wasmImports["open64"]=wasmImports["open"]},4579753:()=>jspiSupported};function console_error(msg){let jsmsg=UTF8ToString(msg);console.error(jsmsg)}function console_error_obj(obj){console.error(obj)}function new_error(type,msg,err){return new API.PythonError(UTF8ToString(type),msg,err)}new_error.sig="eiei";function fail_test(){API.fail_test=true}fail_test.sig="v";function capture_stderr(){API.capture_stderr()}capture_stderr.sig="v";function restore_stderr(){return API.restore_stderr()}restore_stderr.sig="e";function raw_call_js(func){func()}raw_call_js.sig="ve";function hiwire_invalid_ref(type,ref){API.fail_test=!!1;if(type===1&&!ref){if(_PyErr_Occurred()){const e=_wrap_exception();console.error("Pyodide internal error: Argument to hiwire_get is falsy. This was "+"probably because the Python error indicator was set when get_value was "+"called. The Python error that caused this was:",e);throw e}else{const msg="Pyodide internal error: Argument to hiwire_get is falsy (but error "+"indicator is not set).";console.error(msg);throw new Error(msg)}}const typestr={[1]:"get",[2]:"incref",[3]:"decref"}[type];const msg=`hiwire_${typestr} on invalid reference ${ref}. This is most likely due `+"to use after free. It may also be due to memory corruption.";console.error(msg);throw new Error(msg)}hiwire_invalid_ref.sig="vii";function set_pyodide_module(mod){API._pyodide=mod}set_pyodide_module.sig="ve";function js2python_immutable_js(value){try{let result=Module.js2python_convertImmutable(value);if(result!==undefined){return result}return 0}catch(e){Module.handle_js_error(e);return 0}errNoRet()}js2python_immutable_js.sig="ie";function js2python_js(value){try{let result=Module.js2python_convertImmutable(value);if(result!==undefined){return result}return _JsProxy_create(value)}catch(e){Module.handle_js_error(e);return 0}errNoRet()}js2python_js.sig="ie";function js2python_convert(v,depth,defaultConverter){try{return Module.js2python_convert(v,{depth:depth,defaultConverter:defaultConverter})}catch(e){Module.handle_js_error(e);return 0}errNoRet()}js2python_convert.sig="ieie";function isReservedWord(word){if(!Module.pythonReservedWords){Module.pythonReservedWords=new Set(["False","await","else","import","pass","None","break","except","in","raise","True","class","finally","is","return","and","continue","for","lambda","try","as","def","from","nonlocal","while","assert","del","global","not","with","async","elif","if","or","yield"])}return Module.pythonReservedWords.has(word)}function normalizeReservedWords(word){const noTrailing_=word.replace(/_*$/,"");if(!isReservedWord(noTrailing_)){return word}if(noTrailing_!==word){return word.slice(0,-1)}return word}function JsProxy_GetAttr_js(jsobj,ptrkey){try{const jskey=normalizeReservedWords(UTF8ToString(ptrkey));const result=jsobj[jskey];if(result===undefined&&!(jskey in jsobj)){return null}return nullToUndefined(result)}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsProxy_GetAttr_js.sig="eei";function JsProxy_SetAttr_js(jsobj,ptrkey,jsval){try{let jskey=normalizeReservedWords(UTF8ToString(ptrkey));jsobj[jskey]=jsval}catch(e){Module.handle_js_error(e);return-1}return 0}JsProxy_SetAttr_js.sig="ieie";function JsProxy_DelAttr_js(jsobj,ptrkey){try{let jskey=normalizeReservedWords(UTF8ToString(ptrkey));delete jsobj[jskey]}catch(e){Module.handle_js_error(e);return-1}return 0}JsProxy_DelAttr_js.sig="iei";function JsProxy_GetIter_js(obj){try{return obj[Symbol.iterator]()}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsProxy_GetIter_js.sig="ee";function handle_next_result_js(res,done,msg){try{let errmsg;if(typeof res!=="object"){errmsg=`Result should have type "object" not "${typeof res}"`}else if(typeof res.done==="undefined"){if(typeof res.then==="function"){errmsg=`Result was a promise, use anext() / asend() / athrow() instead.`}else{errmsg=`Result has no "done" field.`}}if(errmsg){HEAPU32[(msg>>2)+0>>>0]=stringToNewUTF8(errmsg);HEAPU32[(done>>2)+0>>>0]=-1}HEAPU32[(done>>2)+0>>>0]=res.done;return res.value}catch(e){Module.handle_js_error(e);return-1}return 0}handle_next_result_js.sig="eeii";function JsException_new_helper(name_ptr,message_ptr,stack_ptr){try{let name=UTF8ToString(name_ptr);let message=UTF8ToString(message_ptr);let stack=UTF8ToString(stack_ptr);return API.deserializeError(name,message,stack)}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsException_new_helper.sig="eiii";function JsProxy_GetAsyncIter_js(obj){try{return obj[Symbol.asyncIterator]()}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsProxy_GetAsyncIter_js.sig="ee";function _agen_handle_result_js(p,msg,set_result,set_exception,closing){try{let errmsg;if(typeof p!=="object"){errmsg=`Result of anext() should be object not ${typeof p}`}else if(typeof p.then!=="function"){if(typeof p.done==="boolean"){errmsg=`Result of anext() was not a promise, use next() instead.`}else{errmsg=`Result of anext() was not a promise.`}}if(errmsg){HEAPU32[(msg>>2)+0>>>0]=stringToNewUTF8(errmsg);return-1}_Py_IncRef(set_result);_Py_IncRef(set_exception);p.then(({done:done,value:value})=>{__agen_handle_result_js_c(set_result,set_exception,done,value,closing)},err=>{__agen_handle_result_js_c(set_result,set_exception,-1,err,closing)}).finally(()=>{_Py_DecRef(set_result);_Py_DecRef(set_exception)});return 0}catch(e){Module.handle_js_error(e);return-1}return 0}_agen_handle_result_js.sig="ieiiii";function get_length_helper(val){try{let result;if(typeof val.size==="number"){result=val.size}else if(typeof val.length==="number"){result=val.length}else{return-2}if(result<0){return-3}if(result>2147483647){return-4}return result}catch(e){Module.handle_js_error(e);return-1}return 0}get_length_helper.sig="ie";function get_length_string(val){try{let result;if(typeof val.size==="number"){result=val.size}else if(typeof val.length==="number"){result=val.length}return stringToNewUTF8(" "+result.toString())}catch(e){Module.handle_js_error(e);return 0}errNoRet()}get_length_string.sig="ie";function destroy_jsarray_entries(array){for(let v of array){try{if(typeof v.destroy==="function"){v.destroy()}}catch(e){console.warn("Weird error:",e)}}}destroy_jsarray_entries.sig="ve";function JsArray_repeat_js(o,count){try{return Array.from({length:count},()=>o).flat()}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsArray_repeat_js.sig="eei";function JsArray_inplace_repeat_js(o,count){try{o.splice(0,o.length,...Array.from({length:count},()=>o).flat())}catch(e){Module.handle_js_error(e);return-1}return 0}JsArray_inplace_repeat_js.sig="iei";function JsArray_reversed_iterator(array){return new ReversedIterator(array)}class ReversedIterator{constructor(array){this._array=array;this._i=array.length-1}__length_hint__(){return this._array.length}[Symbol.toStringTag](){return"ReverseIterator"}next(){const i=this._i;const a=this._array;const done=i<0;const value=done?undefined:a[i];this._i--;return{done:done,value:value}}}JsArray_reversed_iterator.sig="ee";function JsArray_index_js(o,v,start,stop){try{for(let i=start;i{let c=s.charCodeAt(0);return c<48||c>57}).map(word=>isReservedWord(word.replace(/_*$/,""))?word+"_":word))}while(jsobj=Object.getPrototypeOf(jsobj));return result}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsProxy_Dir_js.sig="ee";function JsProxy_Bool_js(val){try{if(!val){return!!0}if(val.size===0){if(/HTML[A-Za-z]*Element/.test(getTypeTag(val))){return!!1}return!!0}if(val.length===0&&JsvArray_Check(val)){return!!0}if(val.byteLength===0){return!!0}return!!1}catch(e){return!!0}}JsProxy_Bool_js.sig="ie";function JsObjMap_GetIter_js(obj){try{return Module.iterObject(obj)}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsObjMap_GetIter_js.sig="ee";function JsObjMap_length_js(obj){try{let length=0;for(let _ of Module.iterObject(obj)){length++}return length}catch(e){Module.handle_js_error(e);return-1}return 0}JsObjMap_length_js.sig="ie";function JsObjMap_subscript_js(obj,key){try{if(!Object.prototype.hasOwnProperty.call(obj,key)){return null}return obj[key]}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsObjMap_subscript_js.sig="eee";function JsObjMap_ass_subscript_js(obj,key,value){try{if(value===null){if(!Object.prototype.hasOwnProperty.call(obj,key)){return-1}delete obj[key]}else{obj[key]=value}return 0}catch(e){Module.handle_js_error(e);return-1}return 0}JsObjMap_ass_subscript_js.sig="ieee";function JsObjMap_contains_js(obj,key){try{return Object.prototype.hasOwnProperty.call(obj,key)}catch(e){Module.handle_js_error(e);return-1}return 0}JsObjMap_contains_js.sig="iee";function JsBuffer_DecodeString_js(buffer,encoding){try{let encoding_js;if(encoding){encoding_js=UTF8ToString(encoding)}const decoder=new TextDecoder(encoding_js,{fatal:!!1,ignoreBOM:!!1});let res;try{res=decoder.decode(buffer)}catch(e){if(e instanceof TypeError){return null}throw e}return res}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsBuffer_DecodeString_js.sig="eei";function JsBuffer_get_info(jsobj,byteLength_ptr,format_ptr,size_ptr,checked_ptr){const[format_utf8,size,checked]=Module.get_buffer_datatype(jsobj);HEAPU32[(byteLength_ptr>>2)+0>>>0]=jsobj.byteLength;HEAPU32[(format_ptr>>2)+0>>>0]=format_utf8;HEAPU32[(size_ptr>>2)+0>>>0]=size;HEAPU8[checked_ptr+0>>>0]=checked}JsBuffer_get_info.sig="veiiii";function JsDoubleProxy_unwrap_helper(id){try{return Module.PyProxy_getPtr(id)}catch(e){Module.handle_js_error(e);return 0}errNoRet()}JsDoubleProxy_unwrap_helper.sig="ie";function JsProxy_compute_typeflags(obj,is_py_json){try{let type_flags=0;if(API.isPyProxy(obj)&&!pyproxyIsAlive(obj)){return 0}const typeTag=getTypeTag(obj);function safeBool(cb){try{return cb()}catch(e){return!!0}}const isBufferView=safeBool(()=>ArrayBuffer.isView(obj));const isArray=safeBool(()=>Array.isArray(obj));const constructorName=safeBool(()=>obj.constructor.name)||"";if(typeof obj==="function"){type_flags|=1<<9}if(hasMethod(obj,"then")){type_flags|=1<<7}if(hasMethod(obj,Symbol.iterator)){type_flags|=1<<0}if(hasMethod(obj,Symbol.asyncIterator)){type_flags|=1<<15}if(hasMethod(obj,"next")&&(hasMethod(obj,Symbol.iterator)||!hasMethod(obj,Symbol.asyncIterator))){type_flags|=1<<1}if(hasMethod(obj,"next")&&(!hasMethod(obj,Symbol.iterator)||hasMethod(obj,Symbol.asyncIterator))){type_flags|=1<<18}if(hasProperty(obj,"size")||hasProperty(obj,"length")&&typeof obj!=="function"){type_flags|=1<<2}if(hasMethod(obj,"get")){type_flags|=1<<3}if(hasMethod(obj,"set")){type_flags|=1<<4}if(hasMethod(obj,"has")){type_flags|=1<<5}if(hasMethod(obj,"includes")){type_flags|=1<<6}if((isBufferView||typeTag==="[object ArrayBuffer]")&&!(type_flags&1<<9)){type_flags|=1<<8}if(API.isPyProxy(obj)){type_flags|=1<<13}if(isArray){type_flags|=1<<10}if(typeTag==="[object HTMLCollection]"||typeTag==="[object NodeList]"){type_flags|=1<<11}if(isBufferView&&typeTag!=="[object DataView]"){type_flags|=1<<12}if(typeTag==="[object Generator]"){type_flags|=1<<16}if(typeTag==="[object AsyncGenerator]"){type_flags|=1<<17}if(hasProperty(obj,"name")&&hasProperty(obj,"message")&&(hasProperty(obj,"stack")||constructorName==="DOMException")&&!(type_flags&(1<<9|1<<8))){type_flags|=1<<19}if(is_py_json&&type_flags&(1<<10|1<<11|1<<1)){type_flags|=1<<21}if(is_py_json&&!(type_flags&(1<<10|1<<12|1<<11|1<<8|1<<13|1<<1|1<<9|1<<19))){type_flags|=1<<20}return type_flags}catch(e){Module.handle_js_error(e);return-1}return 0}JsProxy_compute_typeflags.sig="iei";function is_comlink_proxy(obj){try{return!!(API.Comlink&&value[API.Comlink.createEndpoint])}catch(e){return!!0}}is_comlink_proxy.sig="ie";function can_run_sync_js(){return!!validSuspender.value}can_run_sync_js.sig="i";function my_dict_converter(){return Object.fromEntries}my_dict_converter.sig="e";function get_async_js_call_done_callback(proxies){try{return function(result){let msg="This borrowed proxy was automatically destroyed "+"at the end of an asynchronous function call. Try "+"using create_proxy or create_once_callable.";for(let px of proxies){Module.pyproxy_destroy(px,msg,!!0)}if(API.isPyProxy(result)){Module.pyproxy_destroy(result,msg,!!0)}}}catch(e){Module.handle_js_error(e);return null}errNoRet()}get_async_js_call_done_callback.sig="ee";function wrap_generator(gen,proxies){try{proxies=new Set(proxies);const msg="This borrowed proxy was automatically destroyed "+"when a generator completed execution. Try "+"using create_proxy or create_once_callable.";function cleanup(){proxies.forEach(px=>Module.pyproxy_destroy(px,msg))}function wrap(funcname){return function(val){if(API.isPyProxy(val)){val=val.copy();proxies.add(val)}let res;try{res=gen[funcname](val)}catch(e){cleanup();throw e}if(res.done){proxies.delete(res.value);cleanup()}return res}}return{get[Symbol.toStringTag](){return"Generator"},[Symbol.iterator](){return this},next:wrap("next"),throw:wrap("throw"),return:wrap("return")}}catch(e){Module.handle_js_error(e);return null}errNoRet()}wrap_generator.sig="eee";function wrap_async_generator(gen,proxies){try{proxies=new Set(proxies);const msg="This borrowed proxy was automatically destroyed "+"when an asynchronous generator completed execution. Try "+"using create_proxy or create_once_callable.";function cleanup(){proxies.forEach(px=>Module.pyproxy_destroy(px,msg))}function wrap(funcname){return async function(val){if(API.isPyProxy(val)){val=val.copy();proxies.add(val)}let res;try{res=await gen[funcname](val)}catch(e){cleanup();throw e}if(res.done){proxies.delete(res.value);cleanup()}return res}}return{get[Symbol.toStringTag](){return"AsyncGenerator"},[Symbol.asyncIterator](){return this},next:wrap("next"),throw:wrap("throw"),return:wrap("return")}}catch(e){Module.handle_js_error(e);return null}errNoRet()}wrap_async_generator.sig="eee";function throw_no_gil(){throw new API.NoGilError("Attempted to use PyProxy when Python GIL not held")}throw_no_gil.sig="v";function pyproxy_Check(val){return API.isPyProxy(val)}pyproxy_Check.sig="ie";function pyproxy_AsPyObject(val){if(!API.isPyProxy(val)||!pyproxyIsAlive(val)){return 0}return Module.PyProxy_getPtr(val)}pyproxy_AsPyObject.sig="ie";function destroy_proxies(proxies,msg_ptr){let msg=undefined;if(msg_ptr){msg=_JsvString_FromId(msg_ptr)}for(let px of proxies){Module.pyproxy_destroy(px,msg,false)}}destroy_proxies.sig="vei";function gc_register_proxies(proxies){for(let px of proxies){Module.gc_register_proxy(Module.PyProxy_getAttrs(px).shared)}}gc_register_proxies.sig="ve";function destroy_proxy(px,msg_ptr){const{shared:shared,props:props}=Module.PyProxy_getAttrsQuiet(px);if(!shared.ptr){return}if(props.roundtrip){return}let msg=undefined;if(msg_ptr){msg=_JsvString_FromId(msg_ptr)}Module.pyproxy_destroy(px,msg,false)}destroy_proxy.sig="vei";function proxy_cache_get(proxyCache,descr){const proxy=proxyCache.get(descr);if(!proxy){return null}if(pyproxyIsAlive(proxy)){return proxy}else{proxyCache.delete(descr);return null}}proxy_cache_get.sig="eei";function proxy_cache_set(proxyCache,descr,proxy){proxyCache.set(descr,proxy)}proxy_cache_set.sig="veie";function _pyproxyGen_make_result(done,value){return{done:!!done,value:value}}_pyproxyGen_make_result.sig="eie";function array_to_js(array,len){return Array.from(HEAP32.subarray(array/4>>>0,array/4+len>>>0))}array_to_js.sig="eii";function _pyproxy_get_buffer_result(start_ptr,smallest_ptr,largest_ptr,readonly,format,itemsize,shape,strides,view,c_contiguous,f_contiguous,sentinel){format=UTF8ToString(format);return{start_ptr:start_ptr,smallest_ptr:smallest_ptr,largest_ptr:largest_ptr,readonly:readonly,format:format,itemsize:itemsize,shape:shape,strides:strides,view:view,c_contiguous:c_contiguous,f_contiguous:f_contiguous}}_pyproxy_get_buffer_result.sig="eiiiiiieeiiii";function pyproxy_new_ex(ptrobj,capture_this,roundtrip,gcRegister,jsonAdaptor){try{return Module.pyproxy_new(ptrobj,{props:{captureThis:!!capture_this,roundtrip:!!roundtrip},gcRegister:gcRegister,jsonAdaptor:jsonAdaptor})}catch(e){Module.handle_js_error(e);return null}errNoRet()}pyproxy_new_ex.sig="eiiiii";function pyproxy_new(ptrobj){try{return Module.pyproxy_new(ptrobj)}catch(e){Module.handle_js_error(e);return null}errNoRet()}pyproxy_new.sig="ei";function create_once_callable(obj,may_syncify){try{_Py_IncRef(obj);let alreadyCalled=!!0;function wrapper(...args){if(alreadyCalled){throw new Error("OnceProxy can only be called once")}try{if(may_syncify){return Module.callPyObjectMaybePromising(obj,args)}else{return Module.callPyObject(obj,args)}}finally{wrapper.destroy()}}wrapper.destroy=function(){if(alreadyCalled){throw new Error("OnceProxy has already been destroyed")}alreadyCalled=!!1;Module.finalizationRegistry.unregister(wrapper);_Py_DecRef(obj)};Module.finalizationRegistry.register(wrapper,[obj,undefined],wrapper);return wrapper}catch(e){Module.handle_js_error(e);return null}errNoRet()}create_once_callable.sig="eii";function create_promise_handles(handle_result,handle_exception,done_callback,js2py_converter){try{if(handle_result){_Py_IncRef(handle_result)}if(handle_exception){_Py_IncRef(handle_exception)}if(js2py_converter){_Py_IncRef(js2py_converter)}if(!done_callback){done_callback=x=>{}}let used=!!0;function checkUsed(){if(used){throw new Error("One of the promise handles has already been called.")}}function destroy(){checkUsed();used=!!1;if(handle_result){_Py_DecRef(handle_result)}if(handle_exception){_Py_DecRef(handle_exception)}if(js2py_converter){_Py_DecRef(js2py_converter)}}function onFulfilled(res){checkUsed();try{if(handle_result){return _create_promise_handles_result_helper(handle_result,js2py_converter,res)}}finally{done_callback(res);destroy()}}function onRejected(err){checkUsed();try{if(handle_exception){return Module.callPyObjectMaybePromising(handle_exception,[err])}}finally{done_callback(undefined);destroy()}}onFulfilled.destroy=destroy;onRejected.destroy=destroy;return[onFulfilled,onRejected]}catch(e){Module.handle_js_error(e);return null}errNoRet()}create_promise_handles.sig="eiiei";function _python2js_buffer_inner(buf,itemsize,ndim,format,shape,strides,suboffsets){try{let converter=Module.get_converter(format,itemsize);return Module._python2js_buffer_recursive(buf,0,{ndim:ndim,format:format,itemsize:itemsize,shape:shape,strides:strides,suboffsets:suboffsets,converter:converter})}catch(e){Module.handle_js_error(e);return null}errNoRet()}_python2js_buffer_inner.sig="eiiiiiii";function jslib_init_js(){try{HEAP32[_Jsr_undefined/4>>>0]=_hiwire_intern(undefined);HEAP32[_Jsr_true/4>>>0]=_hiwire_intern(true);HEAP32[_Jsr_false/4>>>0]=_hiwire_intern(false);HEAP32[_Jsr_novalue/4>>>0]=_hiwire_intern({noValueMarker:1});Module.novalue=_hiwire_get(HEAP32[_Jsr_novalue/4>>>0]);Hiwire.num_keys=_hiwire_num_refs;return 0}catch(e){Module.handle_js_error(e);return-1}return 0}jslib_init_js.sig="i";function JsvNoValue_Check(v){return v===Module.novalue}JsvNoValue_Check.sig="ie";function JsvNum_fromInt(x){return x}JsvNum_fromInt.sig="ei";function JsvNum_fromDouble(val){return val}JsvNum_fromDouble.sig="ed";function JsvNum_fromDigits(digits,ndigits){let result=BigInt(0);for(let i=0;i>2)+i>>>0])<>2)+ndigits-1>>>0]&2147483648)<=arr.length){return null}return arr.splice(idx,1)[0]}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvArray_Delete.sig="eei";function JsvArray_Push(arr,obj){return arr.push(obj)}JsvArray_Push.sig="iee";function JsvArray_Extend(arr,vals){arr.push(...vals)}JsvArray_Extend.sig="vee";function JsvArray_Insert(arr,idx,value){try{arr.splice(idx,0,value)}catch(e){Module.handle_js_error(e);return-1}return 0}JsvArray_Insert.sig="ieie";function JsvArray_ShallowCopy(arr){try{return"slice"in arr?arr.slice():Array.from(arr)}catch(e){Module.handle_js_error(e);return-1}return 0}JsvArray_ShallowCopy.sig="ee";function JsvArray_slice(obj,length,start,stop,step){try{let result;if(step===1){result=obj.slice(start,stop)}else{result=Array.from({length:length},(_,i)=>obj[start+i*step])}return result}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvArray_slice.sig="eeiiii";function JsvArray_slice_assign(obj,slicelength,start,stop,step,values_length,values){try{let jsvalues=[];for(let i=0;i>2)+i>>>0]);if(ref===null){return-1}jsvalues.push(ref)}if(step===1){obj.splice(start,slicelength,...jsvalues)}else{if(values!==0){for(let i=0;i=0;i--){obj.splice(start+i*step,1)}}}}catch(e){Module.handle_js_error(e);return-1}return 0}JsvArray_slice_assign.sig="ieiiiiii";function JsvObject_New(){return{}}JsvObject_New.sig="e";function JsvObject_SetAttr(obj,attr,value){try{obj[attr]=value}catch(e){Module.handle_js_error(e);return-1}return 0}JsvObject_SetAttr.sig="ieee";function JsvObject_Entries(obj){try{return Object.entries(obj)}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvObject_Entries.sig="ee";function JsvObject_Keys(obj){try{return Object.keys(obj)}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvObject_Keys.sig="ee";function JsvObject_Values(obj){try{return Object.values(obj)}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvObject_Values.sig="ee";function JsvObject_toString(obj){try{if(hasMethod(obj,"toString")){return obj.toString()}return Object.prototype.toString.call(obj)}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvObject_toString.sig="ee";function JsvObject_CallMethod(obj,meth,args){try{return nullToUndefined(obj[meth](...args))}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvObject_CallMethod.sig="eeee";function JsvObject_CallMethod_NoArgs(obj,meth){try{return nullToUndefined(obj[meth]())}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvObject_CallMethod_NoArgs.sig="eee";function JsvObject_CallMethod_OneArg(obj,meth,arg){try{return nullToUndefined(obj[meth](arg))}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvObject_CallMethod_OneArg.sig="eeee";function JsvObject_CallMethod_TwoArgs(obj,meth,arg1,arg2){try{return nullToUndefined(obj[meth](arg1,arg2))}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvObject_CallMethod_TwoArgs.sig="eeeee";function JsvFunction_Check(obj){try{return typeof obj==="function"}catch(e){return false}}JsvFunction_Check.sig="ie";function JsvFunction_CallBound(func,this_,args){try{return nullToUndefined(func.apply(this_,args))}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvFunction_CallBound.sig="eeee";function JsvFunction_Call_OneArg(func,arg){try{return nullToUndefined(func.apply(null,[arg]))}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvFunction_Call_OneArg.sig="eee";function JsvFunction_Construct(func,args){try{return nullToUndefined(Reflect.construct(func,args))}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvFunction_Construct.sig="eee";function JsvPromise_Check(obj){try{return isPromise(obj)}catch(e){return false}}JsvPromise_Check.sig="ie";function JsvPromise_Resolve(obj){try{return Promise.resolve(obj)}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvPromise_Resolve.sig="ee";function jslib_init_buffers_js(){try{const dtypes_str=Array.from("bBhHiIqQfd").join(String.fromCharCode(0));const dtypes_ptr=stringToNewUTF8(dtypes_str);const dtypes_map=Object.fromEntries(Object.entries(dtypes_str).map(([idx,val])=>[val,dtypes_ptr+ +idx]));const buffer_datatype_map=new Map([["Int8Array",[dtypes_map["b"],1,true]],["Uint8Array",[dtypes_map["B"],1,true]],["Uint8ClampedArray",[dtypes_map["B"],1,true]],["Int16Array",[dtypes_map["h"],2,true]],["Uint16Array",[dtypes_map["H"],2,true]],["Int32Array",[dtypes_map["i"],4,true]],["Uint32Array",[dtypes_map["I"],4,true]],["Float32Array",[dtypes_map["f"],4,true]],["Float64Array",[dtypes_map["d"],8,true]],["BigInt64Array",[dtypes_map["q"],8,true]],["BigUint64Array",[dtypes_map["Q"],8,true]],["DataView",[dtypes_map["B"],1,false]],["ArrayBuffer",[dtypes_map["B"],1,false]]]);Module.get_buffer_datatype=function(jsobj){return buffer_datatype_map.get(jsobj.constructor.name)||[0,0,false]}}catch(e){Module.handle_js_error(e);return-1}return 0}jslib_init_buffers_js.sig="i";function JsvBuffer_assignToPtr(buf,ptr){try{Module.HEAPU8.set(bufferAsUint8Array(buf),ptr)}catch(e){Module.handle_js_error(e);return-1}return 0}JsvBuffer_assignToPtr.sig="iei";function JsvBuffer_assignFromPtr(buf,ptr){try{bufferAsUint8Array(buf).set(Module.HEAPU8.subarray(ptr,ptr+buf.byteLength))}catch(e){Module.handle_js_error(e);return-1}return 0}JsvBuffer_assignFromPtr.sig="iei";function JsvBuffer_readFromFile(buf,fd){try{let uint8_buf=bufferAsUint8Array(buf);let stream=Module.FS.streams[fd];Module.FS.read(stream,uint8_buf,0,uint8_buf.byteLength)}catch(e){Module.handle_js_error(e);return-1}return 0}JsvBuffer_readFromFile.sig="iei";function JsvBuffer_writeToFile(buf,fd){try{let uint8_buf=bufferAsUint8Array(buf);let stream=Module.FS.streams[fd];Module.FS.write(stream,uint8_buf,0,uint8_buf.byteLength)}catch(e){Module.handle_js_error(e);return-1}return 0}JsvBuffer_writeToFile.sig="iei";function JsvBuffer_intoFile(buf,fd){try{let uint8_buf=bufferAsUint8Array(buf);let stream=Module.FS.streams[fd];Module.FS.write(stream,uint8_buf,0,uint8_buf.byteLength,undefined,true)}catch(e){Module.handle_js_error(e);return-1}return 0}JsvBuffer_intoFile.sig="iei";function JsvGenerator_Check(obj){try{return getTypeTag(obj)==="[object Generator]"}catch(e){return false}}JsvGenerator_Check.sig="ie";function JsvAsyncGenerator_Check(obj){try{return getTypeTag(obj)==="[object AsyncGenerator]"}catch(e){return false}}JsvAsyncGenerator_Check.sig="ie";function JsvError_Throw(e){throw e}JsvError_Throw.sig="ve";function Jsv_less_than(a,b){try{return!!(ab)}catch(e){return false}}Jsv_greater_than.sig="iee";function Jsv_greater_than_equal(a,b){try{return!!(a>=b)}catch(e){return false}}Jsv_greater_than_equal.sig="iee";function JsvMap_New(){try{return new Map}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvMap_New.sig="e";function JsvLiteralMap_New(){try{return new API.LiteralMap}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvLiteralMap_New.sig="e";function JsvMap_Set(map,key,val){try{map.set(key,val)}catch(e){Module.handle_js_error(e);return-1}return 0}JsvMap_Set.sig="ieee";function JsvSet_New(){try{return new Set}catch(e){Module.handle_js_error(e);return null}errNoRet()}JsvSet_New.sig="e";function JsvSet_Add(set,val){try{set.add(val)}catch(e){Module.handle_js_error(e);return-1}return 0}JsvSet_Add.sig="iee";function _python2js_addto_postprocess_list(list,parent,key,value){list.push([parent,key,value])}_python2js_addto_postprocess_list.sig="veeei";function _python2js_handle_postprocess_list(list,cache){for(const[parent,key,ptr]of list){let val=cache.get(ptr);if(parent.constructor.name==="LiteralMap"){parent.set(key,val)}else{parent[key]=val}}}_python2js_handle_postprocess_list.sig="vee";function _python2js_ucs1(ptr,len){try{let jsstr="";for(let i=0;i>>0])}return jsstr}catch(e){Module.handle_js_error(e);return null}errNoRet()}_python2js_ucs1.sig="eii";function _python2js_ucs2(ptr,len){try{let jsstr="";for(let i=0;i>1)+i>>>0])}return jsstr}catch(e){Module.handle_js_error(e);return null}errNoRet()}_python2js_ucs2.sig="eii";function _python2js_ucs4(ptr,len){try{let jsstr="";for(let i=0;i>2)+i>>>0])}return jsstr}catch(e){Module.handle_js_error(e);return null}errNoRet()}_python2js_ucs4.sig="eii";function _python2js_add_to_cache(cache,pyparent,jsparent){try{cache.set(pyparent,jsparent)}catch(e){Module.handle_js_error(e);return-1}return 0}_python2js_add_to_cache.sig="ieie";function _python2js_cache_lookup(cache,pyparent){return cache.get(pyparent)||null}_python2js_cache_lookup.sig="eei";function _JsArray_PushEntry_helper(array,key,value){try{array.push([key,value])}catch(e){Module.handle_js_error(e);return-1}return 0}_JsArray_PushEntry_helper.sig="ieee";function _JsArray_PostProcess_helper(jscontext,array){try{return jscontext.dict_converter(array)}catch(e){Module.handle_js_error(e);return null}errNoRet()}_JsArray_PostProcess_helper.sig="eee";function python2js__default_converter_js(jscontext,object){try{let proxy=Module.pyproxy_new(object);let result=jscontext.default_converter(proxy,jscontext.converter,jscontext.cacheConversion);proxy.destroy();return result}catch(e){Module.handle_js_error(e);return null}errNoRet()}python2js__default_converter_js.sig="eei";function python2js_custom__create_jscontext(context,cache,dict_converter,default_converter){try{let jscontext={};if(dict_converter){jscontext.dict_converter=dict_converter}if(default_converter){jscontext.default_converter=default_converter;jscontext.cacheConversion=function(input,output){if(!API.isPyProxy(input)){throw new TypeError("The first argument to cacheConversion must be a PyProxy.")}let input_ptr=Module.PyProxy_getPtr(input);cache.set(input_ptr,output)};jscontext.converter=function(x){if(!API.isPyProxy(x)){return x}let ptr=Module.PyProxy_getPtr(x);return __python2js(context,ptr)}}return jscontext}catch(e){Module.handle_js_error(e);return null}errNoRet()}python2js_custom__create_jscontext.sig="eieee";function destroy_proxies_js(proxies_id){try{for(const proxy of proxies_id){proxy.destroy()}}catch(e){Module.handle_js_error(e);return-1}return 0}destroy_proxies_js.sig="ie";function pyodide_js_init(){"use strict";(()=>{var Kr=Object.create;var mt=Object.defineProperty;var Jr=Object.getOwnPropertyDescriptor;var Vr=Object.getOwnPropertyNames;var qr=Object.getPrototypeOf,Yr=Object.prototype.hasOwnProperty;var i=(t,e)=>mt(t,"name",{value:e,configurable:!0}),S=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var Qr=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Vr(e))!Yr.call(t,o)&&o!==r&&mt(t,o,{get:()=>e[o],enumerable:!(n=Jr(e,o))||n.enumerable});return t};var D=(t,e,r)=>(r=t!=null?Kr(qr(t)):{},Qr(e||!t||!t.__esModule?mt(r,"default",{value:t,enumerable:!0}):r,t));var Ht=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)};var _=(t,e,r)=>(Ht(t,e,"read from private field"),r?r.call(t):e.get(t)),N=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r)},M=(t,e,r,n)=>(Ht(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r);function Xr(t){return!isNaN(parseFloat(t))&&isFinite(t)}i(Xr,"_isNumber");function j(t){return t.charAt(0).toUpperCase()+t.substring(1)}i(j,"_capitalize");function ht(t){return function(){return this[t]}}i(ht,"_getter");var W=["isConstructor","isEval","isNative","isToplevel"],z=["columnNumber","lineNumber"],G=["fileName","functionName","source"],Zr=["args"],en=["evalOrigin"],Re=W.concat(z,G,Zr,en);function I(t){if(t)for(var e=0;e-1&&(a=a.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(,.*$)/g,""));var s=a.replace(/^\s+/,"").replace(/\(eval code/g,"(").replace(/^.*?\s+/,""),l=s.match(/ (\(.+\)$)/);s=l?s.replace(l[0],""):s;var c=this.extractLocation(l?l[1]:s),u=l&&s||void 0,d=["eval",""].indexOf(c[0])>-1?void 0:c[0];return new $e({functionName:u,fileName:d,lineNumber:c[1],columnNumber:c[2],source:a})},this)},"ErrorStackParser$$parseV8OrIE"),parseFFOrSafari:i(function(n){var o=n.stack.split(`\n`).filter(function(a){return!a.match(e)},this);return o.map(function(a){if(a.indexOf(" > eval")>-1&&(a=a.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),a.indexOf("@")===-1&&a.indexOf(":")===-1)return new $e({functionName:a});var s=/((.*".+"[^@]*)?[^@]*)(?:@)/,l=a.match(s),c=l&&l[1]?l[1]:void 0,u=this.extractLocation(a.replace(s,""));return new $e({functionName:c,fileName:u[0],lineNumber:u[1],columnNumber:u[2],source:a})},this)},"ErrorStackParser$$parseFFOrSafari")}}i(tn,"ErrorStackParser");var rn=new tn;var bt=rn;function Gt(t){if(typeof t=="string")t=new Error(t);else if(t&&typeof t=="object"&&t.name==="ExitStatus"){let e=t.status;t=new K(t.message),t.status=e}else if(typeof t!="object"||t===null||typeof t.stack!="string"||typeof t.message!="string"){let e=API.getTypeTag(t),r=`A value of type ${typeof t} with tag ${e} was thrown as an error!`;try{r+=`\nString interpolation of the thrown value gives """${t}""".`}catch{r+=`\nString interpolation of the thrown value fails.`}try{r+=`\nThe thrown value's toString method returns """${t.toString()}""".`}catch{r+=`\nThe thrown value's toString method fails.`}t=new Error(r)}return t}i(Gt,"ensureCaughtObjectIsError");var te=class extends Error{constructor(r,n,o){n||(n=`The exception is an object of type ${r} at address ${o} which does not inherit from std::exception`);super(n);this.ty=r}};i(te,"CppException");Object.defineProperty(te.prototype,"name",{get(){return`${this.constructor.name} ${this.ty}`}});var nn=WebAssembly.Exception||function(){},Kt=i(t=>t instanceof nn,"isWasmException");function Jt(t){if(Kt(t))if(t.is(Module.jsWrapperTag))t=t.getArg(Module.jsWrapperTag,0);else return t;let[e,r]=Module.getExceptionMessage(t);return new te(e,r,t)}i(Jt,"convertCppException");Tests.convertCppException=Jt;var Wt=!1;API.fatal_error=function(t){if(t&&t.pyodide_fatal_error)return;if(Wt){console.error("Recursive call to fatal_error. Inner error was:"),console.error(t);return}if(t instanceof J)throw t;typeof t=="number"||Kt(t)?t=Jt(t):t=Gt(t),t.pyodide_fatal_error=!0,Wt=!0;let e=t instanceof K;e||(console.error("Pyodide has suffered a fatal error. Please report this to the Pyodide maintainers."),console.error("The cause of the fatal error was:"),API.inTestHoist?(console.error(t.toString()),console.error(t.stack)):console.error(t));try{e||_dump_traceback();let n=`Pyodide already ${e?"exited":"fatally failed"} and can no longer be used.`;for(let o of Reflect.ownKeys(API.public_api))typeof o=="string"&&o.startsWith("_")||o==="version"||Object.defineProperty(API.public_api,o,{enumerable:!0,configurable:!0,get:()=>{throw new Error(n)}});API.on_fatal&&API.on_fatal(t)}catch(r){console.error("Another error occurred while handling the fatal error:"),console.error(r)}throw t};API.maybe_fatal_error=function(t){API._skip_unwind_fatal_error&&t==="unwind"||API.fatal_error(t)};var Pt=[];API.capture_stderr=function(){Pt=[],FS.createDevice("/dev","capture_stderr",null,t=>Pt.push(t)),FS.closeStream(2),FS.open("/dev/capture_stderr",1)};API.restore_stderr=function(){return FS.closeStream(2),FS.unlink("/dev/capture_stderr"),FS.open("/dev/stderr",1),(new TextDecoder).decode(new Uint8Array(Pt))};API.fatal_loading_error=function(...t){let e=t.join(" ");if(_PyErr_Occurred()){API.capture_stderr(),_PyErr_Print();let r=API.restore_stderr();e+=`\n`+r}throw new re(e)};function vt(t){if(!t)return!1;let e=t.fileName||"";if(e.includes("wasm-function"))return!0;if(!e.includes("pyodide.asm.js"))return!1;let r=t.functionName||"";return r.startsWith("Object.")&&(r=r.slice(7)),API.public_api&&r in API.public_api&&r!=="PythonError"?(t.functionName=r,!1):!0}i(vt,"isPyodideFrame");function zt(t){return vt(t)&&t.functionName==="new_error"}i(zt,"isErrorStart");Module.handle_js_error=function(t){if(t&&t.pyodide_fatal_error)throw t;if(t instanceof E)return;let e=!1;t instanceof T&&(e=_restore_sys_last_exception(t.__error_address));let r,n;try{r=bt.parse(t)}catch{n=!0}if(n&&(t=Gt(t)),!e){let o=_JsProxy_create(t);_set_error(o),_Py_DecRef(o)}if(!n){if(zt(r[0])||zt(r[1]))for(;vt(r[0]);)r.shift();for(let o of r){if(vt(o))break;let a=stringToNewUTF8(o.functionName||"???"),s=stringToNewUTF8(o.fileName||"???.js");__PyTraceback_Add(a,s,o.lineNumber),_free(a),_free(s)}}};var T=class extends Error{constructor(r,n,o){let a=Error.stackTraceLimit;Error.stackTraceLimit=1/0;super(n);Error.stackTraceLimit=a,this.type=r,this.__error_address=o}};i(T,"PythonError");API.PythonError=T;var E=class extends Error{constructor(){super("If you are seeing this message, an internal Pyodide error has occurred. Please report it to the Pyodide maintainers.")}};i(E,"_PropagatePythonError");function on(t){Object.defineProperty(t.prototype,"name",{value:t.name})}i(on,"setName");var re=class extends Error{};i(re,"FatalPyodideError");var K=class extends Error{};i(K,"Exit");var J=class extends Error{};i(J,"NoGilError");[E,re,K,T,J].forEach(on);API.NoGilError=J;API.errorConstructors=new Map([EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError,globalThis.DOMException,globalThis.AssertionError,globalThis.SystemError].filter(t=>t).map(t=>[t.constructor.name,t]));API.deserializeError=function(t,e,r){let n=API.errorConstructors.get(t)||Error,o=new n(e);return API.errorConstructors.has(t)||(o.name=t),o.message=e,o.stack=r,o};function an(t){let e=0,r=0;for(let a of t){r++;let s=a.codePointAt(0);e=s>e?s:e}let n=_PyUnicode_New(r,e);if(n===0)throw new E;let o=_PyUnicode_Data(n);if(e>65535)for(let a of t)HEAPU32[o/4>>>0]=a.codePointAt(0),o+=4;else if(e>255)for(let a of t)HEAPU16[o/2>>>0]=a.codePointAt(0),o+=2;else for(let a of t)HEAPU8[o>>>0]=a.codePointAt(0),o+=1;return n}i(an,"js2python_string");function sn(t){let e=t,r=0;for(t<0&&(t=-t),t<<=BigInt(1);t;)r++,t>>=BigInt(32);let n=stackSave(),o=stackAlloc(r*4);t=e;for(let s=0;s>2)+s>>>0]=Number(t&BigInt(4294967295)),t>>=BigInt(32);let a=__PyLong_FromByteArray(o,r*4,!0,!0);return stackRestore(n),a}i(sn,"js2python_bigint");function ne(t){let e=ln(t);if(e===0)throw new E;return e}i(ne,"js2python_convertImmutable");Module.js2python_convertImmutable=ne;function ln(t){let e=typeof t;if(e==="string")return an(t);if(e==="number")return Number.isSafeInteger(t)?_PyLong_FromDouble(t):_PyFloat_FromDouble(t);if(e==="bigint")return sn(t);if(t==null)return __js2python_none();if(t===!0)return __js2python_true();if(t===!1)return __js2python_false();if(API.isPyProxy(t)){let{props:r,shared:n}=Module.PyProxy_getAttrs(t);return r.roundtrip?_JsProxy_create(t):__js2python_pyproxy(n.ptr)}}i(ln,"js2python_convertImmutableInner");function cn(t,e){let r=_PyList_New(t.length);if(r===0)return 0;let n=0;try{e.cache.set(t,r);for(let o=0;oModule.pyproxy_new(Le(o,n)),cacheConversion(o,a){if(API.isPyProxy(a))n.cache.set(o,Module.PyProxy_getPtr(a));else throw new Error("Second argument should be a PyProxy!")}};return Le(t,n)}i(yn,"js2python_convert");Module.js2python_convert=yn;Module.processBufferFormatString=function(t,e=""){if(t.length>2)throw new Error(`Expected format string to have length <= 2, got '${t}'.`+e);let r=t.slice(-1),n=t.slice(0,-1),o;switch(n){case"!":case">":o=!0;break;case"<":case"@":case"=":case"":o=!1;break;default:throw new Error(`Unrecognized alignment character ${n}.`+e)}let a;switch(r){case"b":a=Int8Array;break;case"s":case"p":case"c":case"B":case"?":a=Uint8Array;break;case"h":a=Int16Array;break;case"H":a=Uint16Array;break;case"i":case"l":case"n":a=Int32Array;break;case"I":case"L":case"N":case"P":a=Uint32Array;break;case"q":if(globalThis.BigInt64Array===void 0)throw new Error("BigInt64Array is not supported on this browser."+e);a=BigInt64Array;break;case"Q":if(globalThis.BigUint64Array===void 0)throw new Error("BigUint64Array is not supported on this browser."+e);a=BigUint64Array;break;case"f":a=Float32Array;break;case"d":a=Float64Array;break;case"e":throw new Error("Javascript has no Float16 support.");default:throw new Error(`Unrecognized format character '${r}'.`+e)}return[a,o]};Module.python2js_buffer_1d_contiguous=function(t,e,r){let n=e*r;return HEAP8.slice(t,t+n).buffer};Module.python2js_buffer_1d_noncontiguous=function(t,e,r,n,o){let a=o*n,s=new Uint8Array(a);for(let l=0;l=0&&(c=HEAPU32[(c>>2)+0>>>0]+r),s.set(HEAP8.subarray(c>>>0,c+o>>>0),l*o)}return s.buffer};Module._python2js_buffer_recursive=function(t,e,r){let{shape:n,strides:o,ndim:a,converter:s,itemsize:l,suboffsets:c}=r,u=HEAPU32[(n>>2)+e>>>0],d=HEAP32[(o>>2)+e>>>0],f=-1;if(a===0)return s(Module.python2js_buffer_1d_contiguous(t,l,1));if(c!==0&&(f=HEAP32[(c>>2)+e>>>0]),e===a-1){let p;return d===l&&f<0?p=Module.python2js_buffer_1d_contiguous(t,d,u):p=Module.python2js_buffer_1d_noncontiguous(t,d,f,u,l),s(p)}let y=[];for(let p=0;p=0&&(curptr=HEAPU32[(curptr>>2)+0>>>0]+f),y.push(Module._python2js_buffer_recursive(v,e+1,r))}return y};Module.get_converter=function(t,e){let r=UTF8ToString(t),[n,o]=Module.processBufferFormatString(r);switch(r.slice(-1)){case"s":let u=new TextDecoder("utf8",{ignoreBOM:!0});return d=>u.decode(d);case"?":return d=>Array.from(new Uint8Array(d),f=>!!f)}if(!o)return u=>new n(u);let s,l;switch(e){case 2:s="getUint16",l="setUint16";break;case 4:s="getUint32",l="setUint32";break;case 8:s="getFloat64",l="setFloat64";break;default:throw new Error(`Unexpected size ${e}`)}function c(u){let d=new DataView(u),f=d[s].bind(d),y=d[l].bind(d);for(let p=0;pnew n(c(u))};function pn(t){try{return t instanceof m}catch{return!1}}i(pn,"isPyProxy");API.isPyProxy=pn;globalThis.FinalizationRegistry?Module.finalizationRegistry=new FinalizationRegistry(({ptr:t,cache:e})=>{e&&(e.leaked=!0,nr(e));try{_check_gil();let r=validSuspender.value;validSuspender.value=!1,_Py_DecRef(t),validSuspender.value=r}catch(r){API.fatal_error(r)}}):Module.finalizationRegistry={register(){},unregister(){}};var xt=new Map;Module.pyproxy_alloc_map=xt;var St,At;Module.enable_pyproxy_allocation_tracing=function(){St=i(function(t){xt.set(t,Error().stack)},"trace_pyproxy_alloc"),At=i(function(t){xt.delete(t)},"trace_pyproxy_dealloc")};Module.disable_pyproxy_allocation_tracing=function(){St=i(function(t){},"trace_pyproxy_alloc"),At=i(function(t){},"trace_pyproxy_dealloc")};Module.disable_pyproxy_allocation_tracing();var er=Symbol("pyproxy.attrs");function fn(t,e){_check_gil();let r=validSuspender.value;validSuspender.value=!1;try{return _pyproxy_getflags(t,e)}finally{validSuspender.value=r}}i(fn,"pyproxy_getflags");function xe(t,{flags:e,cache:r,props:n,shared:o,gcRegister:a,jsonAdaptor:s}={}){a===void 0&&(a=!0);let l=e!==void 0?e:fn(t,!!s);l===-1&&_pythonexc2js();let c=l&8192,u=l&32768,d=Module.getPyProxyClass(l),f;l&256?(f=i(function(){},"target"),Object.setPrototypeOf(f,d.prototype),delete f.length,delete f.name,f.prototype=void 0):f=Object.create(d.prototype);let y=!!o;o||(r||(r={map:new Map,json_adaptor_map:new Map,refcnt:0}),r.refcnt++,o={ptr:t,cache:r,flags:l,promise:void 0,destroyed_msg:void 0,gcRegistered:!1},_Py_IncRef(t)),n=Object.assign({isBound:!1,captureThis:!1,boundArgs:[],roundtrip:!1},n);let p;u?p=wt:c?p=Sn:p=B;let v=new Proxy(f,p);!y&&a&&tr(o),y||St(v);let w={shared:o,props:n};return f[er]=w,v}i(xe,"pyproxy_new");Module.pyproxy_new=xe;function tr(t){let e=Object.assign({},t);t.gcRegistered=!0,Module.finalizationRegistry.register(t,e,t)}i(tr,"gc_register_proxy");Module.gc_register_proxy=tr;function Ze(t){return t[er]}i(Ze,"_getAttrsQuiet");Module.PyProxy_getAttrsQuiet=Ze;function F(t){let e=Ze(t);if(!e.shared.ptr)throw new Error(e.shared.destroyed_msg);return e}i(F,"_getAttrs");Module.PyProxy_getAttrs=F;function g(t){return F(t).shared.ptr}i(g,"_getPtr");function P(t){return Object.getPrototypeOf(t).$$flags}i(P,"_getFlags");function rr(t){return!!(P(t)&98304)}i(rr,"isJsonAdaptor");function Yt(t,e,r){let{captureThis:n,boundArgs:o,boundThis:a,isBound:s}=F(t).props;return n?s?[a].concat(o,r):[e].concat(r):s?o.concat(r):r}i(Yt,"_adjustArgs");var Qt=new Map;Module.getPyProxyClass=function(t){let e=[[1,je],[2,H],[4,R],[8,V],[16,He],[32,ze],[2048,Ge],[512,We],[1024,Ke],[4096,Je],[64,Ye],[128,Qe],[256,be],[8192,Ve],[16384,qe]],r=Qt.get(t);if(r)return r;let n={};for(let[l,c]of e)t&l&&Object.assign(n,Object.getOwnPropertyDescriptors(c.prototype));(t&8192||t&2)&&Object.assign(n,Object.getOwnPropertyDescriptors(Be.prototype)),n.constructor=Object.getOwnPropertyDescriptor(m.prototype,"constructor"),Object.assign(n,Object.getOwnPropertyDescriptors({$$flags:t}));let o=t&256?ar:or,a=Object.create(o,n);function s(){}return i(s,"NewPyProxyClass"),s.prototype=a,Qt.set(t,s),s};Module.PyProxy_getPtr=g;var Xt="This borrowed attribute proxy was automatically destroyed in the process of destroying the proxy it was borrowed from. Try using the 'copy' method.";function nr(t){if(t&&(t.refcnt--,!t.leaked&&t.refcnt===0)){for(let e of t.map.values())Module.pyproxy_destroy(e,Xt,!0);for(let e of t.json_adaptor_map.values())Module.pyproxy_destroy(e,Xt,!0)}}i(nr,"pyproxy_decref_cache");function _n(t,e){if(e=e||"Object has already been destroyed",API.debug_ffi){let r=t.type,n;try{n=t.toString()}catch(o){if(o.pyodide_fatal_error)throw o}e+=`\nThe object was of type "${r}" and `,n?e+=`had repr "${n}"`:e+="an error was raised when trying to generate its repr"}else e+="\nFor more information about the cause of this error, use `pyodide.setDebug(true)`";return e}i(_n,"generateDestroyedMessage");Module.pyproxy_destroy=function(t,e,r){let{shared:n,props:o}=Ze(t);if(!n.ptr||!r&&o.roundtrip)return;n.destroyed_msg=_n(t,e);let a=n.ptr;n.ptr=0,n.gcRegistered&&Module.finalizationRegistry.unregister(n),nr(n.cache);try{_check_gil();let s=validSuspender.value;validSuspender.value=!1,_Py_DecRef(a),At(t),validSuspender.value=s}catch(s){API.fatal_error(s)}};function Xe(t,e,r){let n=e.length,o=Object.keys(r),a=Object.values(r),s=o.length;e.push(...a);let l;try{_check_gil();let c=validSuspender.value;validSuspender.value=!1,l=__pyproxy_apply(t,e,n,o,s),validSuspender.value=c}catch(c){API.maybe_fatal_error(c);return}if(l===null&&_pythonexc2js(),l&&l.type==="coroutine"&&l._ensure_future){_check_gil();let c=validSuspender.value;validSuspender.value=!1;let u=__iscoroutinefunction(t);validSuspender.value=c,u&&l._ensure_future()}return l}i(Xe,"callPyObjectKwargs");async function Ue(t,e,r){if(!Module.jspiSupported)throw new Error("WebAssembly stack switching not supported in this JavaScript runtime");let n=e.length,o=Object.keys(r),a=Object.values(r),s=o.length;e.push(...a);let l=stackSave(),c=stackAlloc(4),u;try{_check_gil();let d=validSuspender.value;validSuspender.value=!1,u=await Module.promisingApply(t,e,n,o,s,c),validSuspender.value=d}catch(d){API.fatal_error(d)}if(u===null){_PyErr_SetRaisedException(HEAPU32[c/4>>>0]);try{_pythonexc2js()}finally{stackRestore(l)}}if(u&&u.type==="coroutine"&&u._ensure_future){_check_gil();let d=validSuspender.value;validSuspender.value=!1;let f=__iscoroutinefunction(t);validSuspender.value=d,f&&u._ensure_future()}return u}i(Ue,"callPyObjectKwargsPromising");Module.callPyObjectMaybePromising=async function(t,e){return Module.jspiSupported?await Ue(t,e,{}):Xe(t,e,{})};Module.callPyObject=function(t,e){return Xe(t,e,{})};var m=class{static[Symbol.hasInstance](e){return[m,ir].some(r=>Function.prototype[Symbol.hasInstance].call(r,e))}constructor(){throw new TypeError("PyProxy is not a constructor")}get[Symbol.toStringTag](){return"PyProxy"}get type(){let e=g(this);return __pyproxy_type(e)}toString(){let e=g(this),r;try{_check_gil();let n=validSuspender.value;validSuspender.value=!1,r=__pyproxy_repr(e),validSuspender.value=n}catch(n){API.fatal_error(n)}return r===null&&_pythonexc2js(),r}destroy(e={}){e=Object.assign({message:"",destroyRoundtrip:!0},e);let{message:r,destroyRoundtrip:n}=e;Module.pyproxy_destroy(this,r,n)}copy(){let e=F(this);return xe(e.shared.ptr,{flags:P(this),cache:e.shared.cache,props:e.props})}toJs({depth:e=-1,pyproxies:r=void 0,create_pyproxies:n=!0,dict_converter:o=void 0,default_converter:a=void 0}={}){let s=g(this),l,c;n?r?c=r:c=[]:c=null;try{_check_gil();let u=validSuspender.value;validSuspender.value=!1,l=_python2js_custom(s,e,c,o||null,a||null),validSuspender.value=u}catch(u){API.fatal_error(u)}return l===null&&_pythonexc2js(),l}};i(m,"PyProxy");var or=m.prototype;Tests.Function=Function;var ar=Object.create(Function.prototype,Object.getOwnPropertyDescriptors(or));function ir(){}i(ir,"PyProxyFunction");ir.prototype=ar;var oe=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&1)}};i(oe,"PyProxyWithLength");var je=class{get length(){let e=g(this),r;try{_check_gil();let n=validSuspender.value;validSuspender.value=!1,r=_PyObject_Size(e),validSuspender.value=n}catch(n){API.fatal_error(n)}return r===-1&&_pythonexc2js(),r}};i(je,"PyLengthMethods");var ae=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&2)}};i(ae,"PyProxyWithGet");var Be=class{asJsJson(){let{shared:e,props:r}=F(this),n=P(this);return n&8192?n|=65536:n|=32768,xe(e.ptr,{shared:e,flags:n,props:r})}};i(Be,"PyAsJsonAdaptorMethods");var H=class{get(e){let{shared:r}=F(this),n;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,n=__pyproxy_getitem(r.ptr,e,r.cache.json_adaptor_map,rr(this)),validSuspender.value=o}catch(o){API.fatal_error(o)}if(n===null)if(_PyErr_Occurred())_pythonexc2js();else return;return n}asJsJson(){throw new Error("Should not happen")}};i(H,"PyGetItemMethods");var ie=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&4)}};i(ie,"PyProxyWithSet");var R=class{set(e,r){let n=g(this),o;try{_check_gil();let a=validSuspender.value;validSuspender.value=!1,o=__pyproxy_setitem(n,e,r),validSuspender.value=a}catch(a){API.fatal_error(a)}o===-1&&_pythonexc2js()}delete(e){let r=g(this),n;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,n=__pyproxy_delitem(r,e),validSuspender.value=o}catch(o){API.fatal_error(o)}n===-1&&_pythonexc2js()}};i(R,"PySetItemMethods");var se=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&8)}};i(se,"PyProxyWithHas");var V=class{has(e){let r=g(this),n;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,n=__pyproxy_contains(r,e),validSuspender.value=o}catch(o){API.fatal_error(o)}return n===-1&&_pythonexc2js(),n===1}};i(V,"PyContainsMethods");function*gn(t,e,r,n){let o=[];try{for(;;){_check_gil();let a=validSuspender.value;validSuspender.value=!1;let s=__pyproxy_iter_next(t,r,n);if(validSuspender.value=a,s===null)break;yield s,!n&&API.isPyProxy(s)&&o.push(s)}}catch(a){API.fatal_error(a)}finally{Module.finalizationRegistry.unregister(e),_Py_DecRef(t)}try{o.forEach(a=>Module.pyproxy_destroy(a,"This borrowed proxy was automatically destroyed when an iterator was exhausted."))}catch{}_PyErr_Occurred()&&_pythonexc2js()}i(gn,"iter_helper");var le=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&48)}};i(le,"PyIterable");var He=class{[Symbol.iterator](){let{shared:e}=F(this),r={},n;try{_check_gil();let a=validSuspender.value;validSuspender.value=!1,n=_PyObject_GetIter(e.ptr),validSuspender.value=a}catch(a){API.fatal_error(a)}n===0&&_pythonexc2js();let o=gn(n,r,e.cache.json_adaptor_map,rr(this));return Module.finalizationRegistry.register(o,[n,void 0],r),o}};i(He,"PyIterableMethods");async function*mn(t,e){try{for(;;){let r;try{_check_gil();let n=validSuspender.value;if(validSuspender.value=!1,r=__pyproxy_aiter_next(t),validSuspender.value=n,r===null)break}catch(n){API.fatal_error(n)}try{yield await r}catch(n){if(n&&typeof n=="object"&&n.type==="StopAsyncIteration")return;throw n}finally{r.destroy()}}}finally{Module.finalizationRegistry.unregister(e),_Py_DecRef(t)}_PyErr_Occurred()&&_pythonexc2js()}i(mn,"aiter_helper");var ce=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&1536)}};i(ce,"PyAsyncIterable");var We=class{[Symbol.asyncIterator](){let e=g(this),r={},n;try{_check_gil();let a=validSuspender.value;validSuspender.value=!1,n=_PyObject_GetAIter(e),validSuspender.value=a}catch(a){API.fatal_error(a)}n===0&&_pythonexc2js();let o=mn(n,r);return Module.finalizationRegistry.register(o,[n,void 0],r),o}};i(We,"PyAsyncIterableMethods");var ue=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&32)}};i(ue,"PyIterator");var ze=class{[Symbol.iterator](){return this}next(e=void 0){let r,n;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,r=__pyproxyGen_Send(g(this),e),validSuspender.value=o}catch(o){API.fatal_error(o)}return r===null&&_pythonexc2js(),r}};i(ze,"PyIteratorMethods");var de=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&2048)}};i(de,"PyGenerator");var Ge=class{throw(e){let r;try{_check_gil();let n=validSuspender.value;validSuspender.value=!1,r=__pyproxyGen_throw(g(this),e),validSuspender.value=n}catch(n){API.fatal_error(n)}return r===null&&_pythonexc2js(),r}return(e){let r;try{_check_gil();let n=validSuspender.value;validSuspender.value=!1,r=__pyproxyGen_return(g(this),e),validSuspender.value=n}catch(n){API.fatal_error(n)}return r===null&&_pythonexc2js(),r}};i(Ge,"PyGeneratorMethods");var ye=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&1024)}};i(ye,"PyAsyncIterator");var Ke=class{[Symbol.asyncIterator](){return this}async next(e=void 0){let r;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,r=__pyproxyGen_asend(g(this),e),validSuspender.value=o}catch(o){API.fatal_error(o)}r===null&&_pythonexc2js();let n;try{n=await r}catch(o){if(o&&typeof o=="object"&&o.type==="StopAsyncIteration")return{done:!0,value:n};throw o}finally{r.destroy()}return{done:!1,value:n}}};i(Ke,"PyAsyncIteratorMethods");var pe=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&4096)}};i(pe,"PyAsyncGenerator");var Je=class{async throw(e){let r;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,r=__pyproxyGen_athrow(g(this),e),validSuspender.value=o}catch(o){API.fatal_error(o)}r===null&&_pythonexc2js();let n;try{n=await r}catch(o){if(o&&typeof o=="object"){if(o.type==="StopAsyncIteration")return{done:!0,value:n};if(o.type==="GeneratorExit")return{done:!0,value:n}}throw o}finally{r.destroy()}return{done:!1,value:n}}async return(e){let r;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,r=__pyproxyGen_areturn(g(this)),validSuspender.value=o}catch(o){API.fatal_error(o)}r===null&&_pythonexc2js();let n;try{n=await r}catch(o){if(o&&typeof o=="object"){if(o.type==="StopAsyncIteration")return{done:!0,value:n};if(o.type==="GeneratorExit")return{done:!0,value:e}}throw o}finally{r.destroy()}return{done:!1,value:n}}};i(Je,"PyAsyncGeneratorMethods");var fe=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&8192)}};i(fe,"PySequence");function hn(t,e){let r=t.toString(),n=e.toString();return r===n?0:r{this.insert(n,r)}),this.length}copyWithin(...e){return Array.prototype.copyWithin.apply(this,e),this}fill(...e){return Array.prototype.fill.apply(this,e),this}};i(qe,"PyMutableSequenceMethods");function bn(t,e){let r=g(t),n;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,n=__pyproxy_hasattr(r,e),validSuspender.value=o}catch(o){API.fatal_error(o)}return n===-1&&_pythonexc2js(),n!==0}i(bn,"python_hasattr");function Pn(t,e){let{shared:r}=F(t),n=r.cache.map,o;try{_check_gil();let a=validSuspender.value;validSuspender.value=!1,o=__pyproxy_getattr(r.ptr,e,n),validSuspender.value=a}catch(a){API.fatal_error(a)}if(o===null){_PyErr_Occurred()&&_pythonexc2js();return}return o}i(Pn,"python_getattr");function vn(t,e,r){let n=g(t),o;try{_check_gil();let a=validSuspender.value;validSuspender.value=!1,o=__pyproxy_setattr(n,e,r),validSuspender.value=a}catch(a){API.fatal_error(a)}o===-1&&_pythonexc2js()}i(vn,"python_setattr");function xn(t,e){let r=g(t),n;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,n=__pyproxy_delattr(r,e),validSuspender.value=o}catch(o){API.fatal_error(o)}n===-1&&_pythonexc2js()}i(xn,"python_delattr");function wn(t,e,r,n){let o=g(t),a;try{_check_gil();let s=validSuspender.value;validSuspender.value=!1,a=__pyproxy_slice_assign(o,e,r,n),validSuspender.value=s}catch(s){API.fatal_error(s)}return a===null&&_pythonexc2js(),a}i(wn,"python_slice_assign");function Zt(t,e){let r=g(t),n;try{_check_gil();let o=validSuspender.value;validSuspender.value=!1,n=__pyproxy_pop(r,e),validSuspender.value=o}catch(o){API.fatal_error(o)}return n===null&&_pythonexc2js(),n}i(Zt,"python_pop");function Ce(t,e,r){return t instanceof Function?e in t&&!["name","length","caller","arguments",r?"prototype":void 0].includes(e):e in t}i(Ce,"filteredHasKey");var B={isExtensible(){return!0},has(t,e){return Ce(t,e,!1)?!0:typeof e=="symbol"?!1:(e.startsWith("$")&&(e=e.slice(1)),bn(t,e))},get(t,e){return typeof e=="symbol"||Ce(t,e,!0)?Reflect.get(t,e):(e.startsWith("$")&&(e=e.slice(1)),Pn(t,e))},set(t,e,r){let n=Object.getOwnPropertyDescriptor(t,e);return n&&!n.writable&&!n.set?!1:typeof e=="symbol"||Ce(t,e,!0)?Reflect.set(t,e,r):(e.startsWith("$")&&(e=e.slice(1)),vn(t,e,r),!0)},deleteProperty(t,e){let r=Object.getOwnPropertyDescriptor(t,e);return r&&!r.configurable?!1:typeof e=="symbol"||Ce(t,e,!0)?Reflect.deleteProperty(t,e):(e.startsWith("$")&&(e=e.slice(1)),xn(t,e),!0)},ownKeys(t){let e=g(t),r;try{_check_gil();let n=validSuspender.value;validSuspender.value=!1,r=__pyproxy_ownKeys(e),validSuspender.value=n}catch(n){API.fatal_error(n)}return r===null&&_pythonexc2js(),r.push(...Reflect.ownKeys(t)),r},apply(t,e,r){return t.apply(e,r)}};function ge(t){return t&&typeof t=="object"&&t.constructor&&t.constructor.name==="PythonError"}i(ge,"isPythonError");var Sn={isExtensible(){return!0},has(t,e){return typeof e=="string"&&/^[0-9]+$/.test(e)?Number(e)n.toString())),e.push("length"),e}},wt={isExtensible(){return!0},has(t,e){return!!(V.prototype.has.call(t,e)||(typeof e=="string"&&/^[0-9]+$/.test(e)&&(e=Number(e)),V.prototype.has.call(t,e)))},get(t,e){let r;return["copy","constructor","$$flags","toString","destroy"].includes(e)||typeof e=="symbol"?Reflect.get(...arguments):(typeof e=="string"&&(r=H.prototype.get.call(t,e)),r||(typeof e=="string"&&/^[0-9]+$/.test(e)&&(e=Number(e),r=H.prototype.get.call(t,e)),r)?r:Reflect.get(...arguments))},set(t,e,r){if(typeof e=="string"){/^[0-9]+$/.test(e)&&(e=Number(e));try{return R.prototype.set.call(t,e,r),!0}catch(n){if(ge(n))return!1;throw n}}return!1},deleteProperty(t,e){if(typeof e=="string"&&/^[0-9]+$/.test(e))try{return R.prototype.delete.call(t,Number(e)),!0}catch(r){if(ge(r))return!1;throw r}return!1},getOwnPropertyDescriptor(t,e){return wt.has(t,e)?{configurable:!0,enumerable:!0,value:wt.get(t,e),writable:!0}:void 0},ownKeys(t){let e;e=B.get(t,"keys")();let r=Array.from(e);return e.destroy(),r}},me=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&64)}};i(me,"PyAwaitable");var Ye=class{_ensure_future(){let{shared:e}=Ze(this);if(e.promise)return e.promise;let r=e.ptr;r||F(this);let n,o,a=new Promise((l,c)=>{n=l,o=c}),s;try{_check_gil();let l=validSuspender.value;validSuspender.value=!1,s=__pyproxy_ensure_future(r,n,o),validSuspender.value=l}catch(l){API.fatal_error(l)}return s===-1&&_pythonexc2js(),e.promise=a,this.destroy(),a}then(e,r){return this._ensure_future().then(e,r)}catch(e){return this._ensure_future().catch(e)}finally(e){return this._ensure_future().finally(e)}};i(Ye,"PyAwaitableMethods");var he=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&256)}};i(he,"PyCallable");var be=class{apply(e,r){return r=function(...n){return n}.apply(void 0,r),r=Yt(this,e,r),Module.callPyObject(g(this),r)}call(e,...r){return r=Yt(this,e,r),Module.callPyObject(g(this),r)}callWithOptions({relaxed:e,kwargs:r,promising:n},...o){let a={};if(r){if(o.length===0)throw new TypeError("callWithOptions with 'kwargs: true' requires at least one argument (the key word argument object)");if(a=o.pop(),a.constructor!==void 0&&a.constructor.name!=="Object")throw new TypeError("kwargs argument is not an object")}let s=e?API.pyodide_code.relaxed_call:this;return e&&o.unshift(this),(n?Ue:Xe)(g(s),o,a)}callKwargs(...e){if(e.length===0)throw new TypeError("callKwargs requires at least one argument (the key word argument object)");let r=e.pop();if(r.constructor!==void 0&&r.constructor.name!=="Object")throw new TypeError("kwargs argument is not an object");return Xe(g(this),e,r)}callRelaxed(...e){return API.pyodide_code.relaxed_call(this,...e)}callKwargsRelaxed(...e){return API.pyodide_code.relaxed_call.callKwargs(this,...e)}callPromising(...e){return Ue(g(this),e,{})}callPromisingKwargs(...e){if(e.length===0)throw new TypeError("callKwargs requires at least one argument (the key word argument object)");let r=e.pop();if(r.constructor!==void 0&&r.constructor.name!=="Object")throw new TypeError("kwargs argument is not an object");return Ue(g(this),e,r)}bind(e,...r){let{shared:n,props:o}=F(this),{boundArgs:a,boundThis:s,isBound:l}=o,c=e;l&&(c=s);let u=a.concat(r);return o=Object.assign({},o,{boundArgs:u,isBound:!0,boundThis:c}),xe(n.ptr,{shared:n,flags:P(this),props:o})}captureThis(){let{props:e,shared:r}=F(this);return e=Object.assign({},e,{captureThis:!0}),xe(r.ptr,{shared:r,flags:P(this),props:e})}};i(be,"PyCallableMethods");be.prototype.prototype=Function.prototype;var An=new Map([["i8",Int8Array],["u8",Uint8Array],["u8clamped",Uint8ClampedArray],["i16",Int16Array],["u16",Uint16Array],["i32",Int32Array],["u32",Uint32Array],["i32",Int32Array],["u32",Uint32Array],["i64",globalThis.BigInt64Array],["u64",globalThis.BigUint64Array],["f32",Float32Array],["f64",Float64Array],["dataview",DataView]]),Pe=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&!!(P(e)&128)}};i(Pe,"PyBuffer");var Qe=class{getBuffer(e){let r;if(e&&(r=An.get(e),r===void 0))throw new Error(`Unknown type ${e}`);let n=g(this),o;try{_check_gil();let O=validSuspender.value;validSuspender.value=!1,o=__pyproxy_get_buffer(n),validSuspender.value=O}catch(O){API.fatal_error(O)}o===null&&_pythonexc2js();let{start_ptr:a,smallest_ptr:s,largest_ptr:l,readonly:c,format:u,itemsize:d,shape:f,strides:y,view:p,c_contiguous:v,f_contiguous:w}=o,_t=!1;try{let O=!1;r===void 0&&([r,O]=Module.processBufferFormatString(u," In this case, you can pass an explicit type argument."));let $=parseInt(r.name.replace(/[^0-9]/g,""))/8||1;if(O&&$>1)throw new Error("JavaScript has no native support for big endian buffers. In this case, you can pass an explicit type argument. For instance, `getBuffer('dataview')` will return a `DataView`which has native support for reading big endian data. Alternatively, toJs will automatically convert the buffer to little endian.");let Te=l-s;if(Te!==0&&(a%$!==0||s%$!==0||l%$!==0))throw new Error(`Buffer does not have valid alignment for a ${r.name}`);let Wr=Te/$,zr=(a-s)/$,gt;Te===0?gt=new r:gt=new r(HEAPU32.buffer,s,Wr);for(let Gr of y.keys())y[Gr]/=$;return _t=!0,Object.create(q.prototype,Object.getOwnPropertyDescriptors({offset:zr,readonly:c,format:u,itemsize:d,ndim:f.length,nbytes:Te,shape:f,strides:y,data:gt,c_contiguous:v,f_contiguous:w,_view_ptr:p,_released:!1}))}finally{if(!_t)try{_check_gil();let O=validSuspender.value;validSuspender.value=!1,_PyBuffer_Release(p),_PyMem_Free(p),validSuspender.value=O}catch(O){API.fatal_error(O)}}}};i(Qe,"PyBufferMethods");var ve=class extends m{static[Symbol.hasInstance](e){return API.isPyProxy(e)&&e.type==="dict"}};i(ve,"PyDict");var q=class{constructor(){throw new TypeError("PyBufferView is not a constructor")}release(){if(!this._released){try{_check_gil();let e=validSuspender.value;validSuspender.value=!1,_PyBuffer_Release(this._view_ptr),_PyMem_Free(this._view_ptr),validSuspender.value=e}catch(e){API.fatal_error(e)}this._released=!0,this.data=null}}};i(q,"PyBufferView");var sr={PyProxy:m,PyProxyWithLength:oe,PyProxyWithGet:ae,PyProxyWithSet:ie,PyProxyWithHas:se,PyDict:ve,PyIterable:le,PyAsyncIterable:ce,PyIterator:ue,PyAsyncIterator:ye,PyGenerator:de,PyAsyncGenerator:pe,PyAwaitable:me,PyCallable:he,PyBuffer:Pe,PyBufferView:q,PythonError:T,PySequence:fe,PyMutableSequence:_e};function lr(t){t.id!=="canvas"&&console.warn("If you are using canvas element for SDL library, it should have id 'canvas' to work properly."),Module.canvas=t}i(lr,"setCanvas2D");function cr(){return Module.canvas}i(cr,"getCanvas2D");function In(t){lr(t)}i(In,"setCanvas3D");function kn(){return cr()}i(kn,"getCanvas3D");var ur={setCanvas2D:lr,getCanvas2D:cr,setCanvas3D:In,getCanvas3D:kn};var h=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&!process.browser,It=h&&typeof module<"u"&&typeof module.exports<"u"&&typeof S<"u"&&typeof __dirname<"u",dr=h&&!It,En=typeof globalThis.Bun<"u",yr=typeof Deno<"u",kt=!h&&!yr,Y=kt&&typeof window=="object"&&typeof document=="object"&&typeof document.createElement=="function"&&"sessionStorage"in window&&typeof importScripts!="function",we=kt&&typeof importScripts=="function"&&typeof self=="object",Et=typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Chrome")==-1&&navigator.userAgent.indexOf("Safari")>-1;function pr(){return{IN_NODE:h,IN_NODE_COMMONJS:It,IN_NODE_ESM:dr,IN_BUN:En,IN_DENO:yr,IN_BROWSER:kt,IN_BROWSER_MAIN_THREAD:Y,IN_BROWSER_WEB_WORKER:we,IN_SAFARI:Et}}i(pr,"detectEnvironment");function Ft(){let t=i(()=>{},"_resolve"),e=i(()=>{},"_reject"),r=new Promise((n,o)=>{t=n,e=o});return r.resolve=t,r.reject=e,r}i(Ft,"createResolvable");function et(){let t=Promise.resolve();async function e(){let r=t,n;return t=new Promise(o=>n=o),await r,n}return i(e,"acquireLock"),e}i(et,"createLock");var Fn=/[-_.]+/g;function fr(t){return t.replace(Fn,"-").toLowerCase()}i(fr,"canonicalizePackageName");var On=/^.*?([^\/]*)\.whl$/;function _r(t){let e=On.exec(t);if(e){let r=e[1].toLowerCase().split("-");return{name:r[0],version:r[1],fileName:r.join("-")+".whl"}}}i(_r,"uriToPackageData");function gr(t){return btoa(t.match(/\w{2}/g).map(function(e){return String.fromCharCode(parseInt(e,16))}).join(""))}i(gr,"base16ToBase64");var mr,Nt,hr,tt,Q;async function br(){if(!h||(mr=(await import("node:url")).default,tt=await import("node:fs"),Q=await import("node:fs/promises"),hr=(await import("node:vm")).default,Nt=await import("node:path"),Pr=Nt.sep,typeof S<"u"))return;let t=tt,e=await import("node:crypto"),r=await import("ws"),n=await import("node:child_process"),o={fs:t,crypto:e,ws:r,child_process:n};globalThis.require=function(a){return o[a]}}i(br,"initNodeModules");function Nn(t,e){return Nt.resolve(e||".",t)}i(Nn,"node_resolvePath");function Mn(t,e){return e===void 0&&(e=location),new URL(t,e).toString()}i(Mn,"browser_resolvePath");var rt;h?rt=Nn:rt=Mn;var Pr;h||(Pr="/");function Dn(t,e){return t.startsWith("file://")&&(t=t.slice(7)),t.includes("://")?{response:fetch(t)}:{binary:Q.readFile(t).then(r=>new Uint8Array(r.buffer,r.byteOffset,r.byteLength))}}i(Dn,"node_getBinaryResponse");function Tn(t,e){let r=new URL(t,location);return{response:fetch(r,e?{integrity:e}:{})}}i(Tn,"browser_getBinaryResponse");var Mt;h?Mt=Dn:Mt=Tn;async function Se(t,e){let{response:r,binary:n}=Mt(t,e);if(n)return n;let o=await r;if(!o.ok)throw new Error(`Failed to load '${t}': request failed.`);return new Uint8Array(await o.arrayBuffer())}i(Se,"loadBinaryFile");var Ot;if(Y)Ot=i(async t=>await import(t),"loadScript");else if(we)Ot=i(async t=>{try{globalThis.importScripts(t)}catch(e){if(e instanceof TypeError)await import(t);else throw e}},"loadScript");else if(h)Ot=Rn;else throw new Error("Cannot determine runtime environment");async function Rn(t){t.startsWith("file://")&&(t=t.slice(7)),t.includes("://")?hr.runInThisContext(await(await fetch(t)).text()):await import(mr.pathToFileURL(t).href)}i(Rn,"nodeLoadScript");async function vr(t){if(h)try{await Q.stat(t)}catch{await Q.mkdir(t,{recursive:!0})}}i(vr,"ensureDirNode");var Z,b,X=class{constructor(e,r){N(this,Z,void 0);N(this,b,void 0);this._lock=et();M(this,Z,e),M(this,b,r)}*getSubDirs(e){let r=_(this,b).FS.readdir(e);for(let n of r){if(n==="."||n==="..")continue;let o=_(this,b).PATH.join2(e,n),a=_(this,b).FS.lookupPath(o);if(a.node===null)continue;let s=a.node.mode;_(this,b).FS.isDir(s)&&(yield o,yield*this.getSubDirs(o))}}createDynlibFS(e,r){let n=e.substring(0,e.lastIndexOf("/")),o=r||[];o=o.concat(_(this,Z).defaultLdLibraryPath,[n]);let a=i(c=>{if(_(this,b).PATH.isAbs(c))return c;for(let u of o){let d=_(this,b).PATH.join2(u,c);if(_(this,b).FS.findObject(d)!==null)return d}for(let u of this.getSubDirs(n)){let d=_(this,b).PATH.join2(u,c);if(_(this,b).FS.findObject(d)!==null)return d}return c},"resolvePath");return{findObject:(c,u)=>_(this,b).FS.findObject(a(c),u),readFile:i(c=>_(this,b).FS.readFile(a(c)),"readFile")}}async loadDynlib(e,r,n){let o=await this._lock(),a=this.createDynlibFS(e,n),s=r?null:{};try{if(await _(this,b).loadDynamicLibrary(e,{loadAsync:!0,nodelete:!0,allowUndefined:!0,global:r,fs:a},s),_(this,b).PATH.isAbs(e)){let l=_(this,b).PATH.basename(e);_(this,b).LDSO.loadedLibsByName[l]||(_(this,b).LDSO.loadedLibsByName[l]=_(this,b).LDSO.loadedLibsByName[e])}}catch(l){if(l&&l.message&&l.message.includes("need to see wasm magic number")){console.warn(`Failed to load dynlib ${e}. We probably just tried to load a linux .so file or something.`);return}throw l}finally{o()}}async loadDynlibsFromPackage(e,r){let n=`${_(this,Z).sitepackages}/${e.file_name.split("-")[0]}.libs`;for(let o of r)await this.loadDynlib(o,!1,[n])}};i(X,"DynlibLoader"),Z=new WeakMap,b=new WeakMap;if(typeof API<"u"&&typeof Module<"u"){let t=new X(API,Module);API.loadDynlib=t.loadDynlib.bind(t),API.loadDynlibsFromPackage=t.loadDynlibsFromPackage.bind(t)}var Ae,Ie,ee=class{constructor(e,r){N(this,Ae,void 0);N(this,Ie,void 0);M(this,Ae,e),M(this,Ie,new X(e,r))}async install(e,r,n,o,a){let s=_(this,Ae).package_loader.unpack_buffer.callKwargs({buffer:e,filename:r,extract_dir:n,installer:o,source:a,calculate_dynlibs:!0});await _(this,Ie).loadDynlibsFromPackage({file_name:r},s)}};i(ee,"Installer"),Ae=new WeakMap,Ie=new WeakMap;var xr;if(typeof API<"u"&&typeof Module<"u"){let t=new ee(API,Module);xr=t.install.bind(t),API.install=xr}async function $n(t){await br();let e=await t;if(!e.packages)throw new Error("Loaded pyodide lock file does not contain the expected key 'packages'.");if(e.info.version!==API.version)throw new Error(`Lock file version doesn't match Pyodide version.\n lockfile version: ${e.info.version}\n pyodide version: ${API.version}`);API.lockfile_info=e.info,API.lockfile_packages=e.packages,API.lockfile_unvendored_stdlibs_and_test=[],API.repodata_info=e.info,API.repodata_packages=e.packages,API._import_name_to_package_name=new Map;for(let o of Object.keys(API.lockfile_packages)){let a=API.lockfile_packages[o];for(let s of a.imports)API._import_name_to_package_name.set(s,o);a.package_type==="cpython_module"&&API.lockfile_unvendored_stdlibs_and_test.push(o)}API.lockfile_unvendored_stdlibs=API.lockfile_unvendored_stdlibs_and_test.filter(o=>o!=="test");let r=API.config.packages;API.config.fullStdLib&&(r=[...r,...API.lockfile_unvendored_stdlibs]),await Oe(r,{messageCallback(){}}),await API.bootstrapFinalizedPromise,API._pyodide._importhook.register_module_not_found_hook(API._import_name_to_package_name,API.lockfile_unvendored_stdlibs_and_test),API.package_loader.init_loaded_packages()}i($n,"initializePackageIndex");var Ln="default channel",Cn="pyodide.loadPackage",A,Ee,Fe,nt=class{constructor(e,r){N(this,A,void 0);N(this,Ee,void 0);N(this,Fe,void 0);this.cdnURL="";this.loadedPackages={};this._lock=et();this.stdout=console.log;this.stderr=console.error;this.defaultChannel=Ln;M(this,A,e),M(this,Ee,r),M(this,Fe,new ee(e,r))}async loadPackage(e,r={checkIntegrity:!0}){let n=new Set,{messageCallback:o,errorCallback:a}=r,s=jn(e),l=this.recursiveDependencies(s,a);for(let[f,{name:y,normalizedName:p,channel:v}]of l){let w=this.getLoadedPackageChannel(y);w&&(l.delete(p),w===v||v===this.defaultChannel?this.logStdout(`${y} already loaded from ${w}`,o):this.logStderr(`URI mismatch, attempting to load package ${y} from ${v} while it is already loaded from ${w}. To override a dependency, load the custom package first.`,a))}if(l.size===0)return this.logStdout("No new packages to load",o),[];let c=Array.from(l.values(),({name:f})=>f).sort().join(", "),u=new Map,d=await this._lock();try{this.logStdout(`Loading ${c}`,o);for(let[f,y]of l){if(this.getLoadedPackageChannel(y.name)){l.delete(y.normalizedName);continue}y.installPromise=this.downloadAndInstall(y,l,n,u,r.checkIntegrity)}if(await Promise.all(Array.from(l.values()).map(({installPromise:f})=>f)),_(this,Ee).reportUndefinedSymbols(),n.size>0){let f=Array.from(n,y=>y.name).sort().join(", ");this.logStdout(`Loaded ${f}`,o)}if(u.size>0){let f=Array.from(u.keys()).sort().join(", ");this.logStdout(`Failed to load ${f}`,o);for(let[y,p]of u)this.logStderr(`The following error occurred while loading ${y}:`,a),this.logStderr(p.message,a)}return _(this,A).importlib.invalidate_caches(),Array.from(n,Un)}finally{d()}}addPackageToLoad(e,r){let n=fr(e);if(r.has(n))return;let o=_(this,A).lockfile_packages[n];if(!o)throw new Error(`No known package with name '${e}'`);if(r.set(n,{name:o.name,normalizedName:n,channel:this.defaultChannel,depends:o.depends,installPromise:void 0,done:Ft(),packageData:o}),!this.getLoadedPackageChannel(o.name))for(let a of o.depends)this.addPackageToLoad(a,r)}recursiveDependencies(e,r){let n=new Map;for(let o of e){let a=_r(o);if(a===void 0){this.addPackageToLoad(o,n);continue}let{name:s,version:l,fileName:c}=a,u=o;if(n.has(s)&&n.get(s).channel!==u){this.logStderr(`Loading same package ${s} from ${u} and ${n.get(s).channel}`,r);continue}n.set(s,{name:s,normalizedName:s,channel:u,depends:[],installPromise:void 0,done:Ft(),packageData:{name:s,version:l,file_name:c,install_dir:"site",sha256:"",package_type:"package",imports:[],depends:[]}})}return n}async downloadPackage(e,r=!0){let n=h?_(this,A).config.packageCacheDir:_(this,A).config.indexURL;await vr(n);let o,a,s;if(e.channel===this.defaultChannel){if(!(e.normalizedName in _(this,A).lockfile_packages))throw new Error(`Internal error: no entry for package named ${name}`);let c=_(this,A).lockfile_packages[e.normalizedName];o=c.file_name,a=rt(o,n),s="sha256-"+gr(c.sha256)}else a=e.channel,s=void 0;r||(s=void 0);try{return await Se(a,s)}catch(c){if(!h||e.channel!==this.defaultChannel)throw c}console.log(`Didn't find package ${o} locally, attempting to load from ${this.cdnURL}`);let l=await Se(this.cdnURL+o);return console.log(`Package ${o} loaded from ${this.cdnURL}, caching the wheel in node_modules for future use.`),await Q.writeFile(a,l),l}async installPackage(e,r){let n=_(this,A).lockfile_packages[e.normalizedName];n||(n=e.packageData);let o=n.file_name,a=_(this,A).package_loader.get_install_dir(n.install_dir);await _(this,Fe).install(r,o,a,Cn,e.channel===this.defaultChannel?"pyodide":e.channel)}async downloadAndInstall(e,r,n,o,a=!0){if(ke[e.name]===void 0)try{let s=await this.downloadPackage(e,a),l=e.depends.map(c=>r.has(c)?r.get(c).done:Promise.resolve());await _(this,A).bootstrapFinalizedPromise,await Promise.all(l),await this.installPackage(e,s),n.add(e.packageData),ke[e.name]=e.channel}catch(s){o.set(e.name,s)}finally{e.done.resolve()}}setCdnUrl(e){this.cdnURL=e}getLoadedPackageChannel(e){let r=this.loadedPackages[e];return r===void 0?null:r}logStdout(e,r){r?r(e):this.stdout(e)}logStderr(e,r){r?r(e):this.stderr(e)}};i(nt,"PackageManager"),A=new WeakMap,Ee=new WeakMap,Fe=new WeakMap;function Un({name:t,version:e,file_name:r,package_type:n}){return{name:t,version:e,fileName:r,packageType:n}}i(Un,"filterPackageData");function jn(t){return typeof t.toJs=="function"&&(t=t.toJs()),Array.isArray(t)||(t=[t]),t}i(jn,"toStringArray");var Oe,ke;if(typeof API<"u"&&typeof Module<"u"){let t=new nt(API,Module);Oe=t.loadPackage.bind(t),ke=t.loadedPackages,API.recursiveDependencies=t.recursiveDependencies.bind(t),API.setCdnUrl=t.setCdnUrl.bind(t),API.lockFilePromise&&(API.packageIndexReady=$n(API.lockFilePromise))}var wr="0.27.2";var Rt=h?S("node:fs"):void 0,kr=h?S("node:tty"):void 0;function Er(t){try{Rt.fsyncSync(t)}catch(e){if(e&&e.code==="EINVAL")return;throw e}}i(Er,"nodeFsync");var Fr=!1,ct={},k={};function Tt(t){ct[k.stdin]=t}i(Tt,"_setStdinOps");function Bn(t){ct[k.stdout]=t}i(Bn,"_setStdoutOps");function Hn(t){ct[k.stderr]=t}i(Hn,"_setStderrOps");function Wn(t){return t&&typeof t=="object"&&"errno"in t}i(Wn,"isErrnoError");var zn=new Int32Array(new WebAssembly.Memory({shared:!0,initial:1,maximum:1}).buffer);function Gn(t){try{return Atomics.wait(zn,0,0,t),!0}catch{return!1}}i(Gn,"syncSleep");function Kn(t){for(;;)try{return t()}catch(e){if(e&&e.code==="EAGAIN"&&Gn(100))continue;throw e}}i(Kn,"handleEAGAIN");function Sr(t,e,r){let n;try{n=Kn(e)}catch(o){throw o&&o.code&&Module.ERRNO_CODES[o.code]?new FS.ErrnoError(Module.ERRNO_CODES[o.code]):Wn(o)?o:(console.error("Error thrown in read:"),console.error(o),new FS.ErrnoError(29))}if(n===void 0)throw console.warn(`${r} returned undefined; a correct implementation must return a number`),new FS.ErrnoError(29);return n!==0&&(t.node.timestamp=Date.now()),n}i(Sr,"readWriteHelper");var Ar=i((t,e,r)=>API.typedArrayAsUint8Array(t).subarray(e,e+r),"prepareBuffer"),Dt={open:function(t){let e=ct[t.node.rdev];if(!e)throw new FS.ErrnoError(43);t.devops=e,t.tty=t.devops.isatty,t.seekable=!1},close:function(t){t.stream_ops.fsync(t)},fsync:function(t){let e=t.devops;e.fsync&&e.fsync()},read:function(t,e,r,n,o){return e=Ar(e,r,n),Sr(t,()=>t.devops.read(e),"read")},write:function(t,e,r,n,o){return e=Ar(e,r,n),Sr(t,()=>t.devops.write(e),"write")}};function ut(){Fr&&(FS.closeStream(0),FS.closeStream(1),FS.closeStream(2),FS.open("/dev/stdin",0),FS.open("/dev/stdout",1),FS.open("/dev/stderr",1))}i(ut,"refreshStreams");API.initializeStreams=function(t,e,r){let n=FS.createDevice.major++;k.stdin=FS.makedev(n,0),k.stdout=FS.makedev(n,1),k.stderr=FS.makedev(n,2),FS.registerDevice(k.stdin,Dt),FS.registerDevice(k.stdout,Dt),FS.registerDevice(k.stderr,Dt),FS.unlink("/dev/stdin"),FS.unlink("/dev/stdout"),FS.unlink("/dev/stderr"),FS.mkdev("/dev/stdin",k.stdin),FS.mkdev("/dev/stdout",k.stdout),FS.mkdev("/dev/stderr",k.stderr),Me({stdin:t}),$t({batched:e}),Lt({batched:r}),Fr=!0,ut()};function Jn(){Me(h?new at(process.stdin.fd):{stdin:()=>prompt()})}i(Jn,"setDefaultStdin");function Vn(){Tt(new ot),ut()}i(Vn,"setStdinError");function Me(t={}){let{stdin:e,error:r,isatty:n,autoEOF:o,read:a}=t,s=+!!e+ +!!r+ +!!a;if(s>1)throw new TypeError("At most one of stdin, read, and error must be provided.");if(!e&&o!==void 0)throw new TypeError("The 'autoEOF' option can only be used with the 'stdin' option");if(s===0){Jn();return}r&&Vn(),e&&(o=o===void 0?!0:o,Tt(new it(e.bind(t),!!n,o))),a&&Tt(t),ut()}i(Me,"setStdin");function Or(t,e,r){let{raw:n,isatty:o,batched:a,write:s}=t,l=+!!n+ +!!a+ +!!s;if(l===0&&(t=r(),({raw:n,isatty:o,batched:a,write:s}=t)),l>1)throw new TypeError("At most one of 'raw', 'batched', and 'write' must be passed");if(!n&&!s&&o)throw new TypeError("Cannot set 'isatty' to true unless 'raw' or 'write' is provided");n&&e(new st(n.bind(t),!!o)),a&&e(new lt(a.bind(t))),s&&e(t),ut()}i(Or,"_setStdwrite");function qn(){return h?new Ne(process.stdout.fd):{batched:t=>console.log(t)}}i(qn,"_getStdoutDefaults");function Yn(){return h?new Ne(process.stderr.fd):{batched:t=>console.warn(t)}}i(Yn,"_getStderrDefaults");function $t(t={}){Or(t,Bn,qn)}i($t,"setStdout");function Lt(t={}){Or(t,Hn,Yn)}i(Lt,"setStderr");var Qn=new TextEncoder,Ir=new TextDecoder,ot=class{read(e){throw new FS.ErrnoError(29)}};i(ot,"ErrorReader");var at=class{constructor(e){this.fd=e,this.isatty=kr.isatty(e)}read(e){try{return Rt.readSync(this.fd,e)}catch(r){if(r.toString().includes("EOF"))return 0;throw r}}fsync(){Er(this.fd)}};i(at,"NodeReader");var it=class{constructor(e,r,n){this.infunc=e,this.isatty=r,this.autoEOF=n,this.index=0,this.saved=void 0,this.insertEOF=!1}_getInput(){if(this.saved)return this.saved;let e=this.infunc();if(typeof e=="number")return e;if(e!=null){if(ArrayBuffer.isView(e)){if(e.BYTES_PER_ELEMENT!==1)throw console.warn(`Expected BYTES_PER_ELEMENT to be 1, infunc gave ${e.constructor}`),new FS.ErrnoError(29);return e}if(typeof e=="string")return e.endsWith(`\n`)||(e+=`\n`),e;if(Object.prototype.toString.call(e)==="[object ArrayBuffer]")return new Uint8Array(e);throw console.warn("Expected result to be undefined, null, string, array buffer, or array buffer view"),new FS.ErrnoError(29)}}read(e){if(this.insertEOF)return this.insertEOF=!1,0;let r=0;for(;;){let n=this._getInput();if(typeof n=="number"){e[0]=n,e=e.subarray(1),r++;continue}let o;if(n&&n.length>0)if(typeof n=="string"){let{read:a,written:s}=Qn.encodeInto(n,e);this.saved=n.slice(a),r+=s,o=e[s-1],e=e.subarray(s)}else{let a;n.length>e.length?(e.set(n.subarray(0,e.length)),this.saved=n.subarray(e.length),a=e.length):(e.set(n),this.saved=void 0,a=n.length),r+=a,o=e[a-1],e=e.subarray(a)}if(!(n&&n.length>0)||this.autoEOF||e.length===0)return this.insertEOF=r>0&&this.autoEOF&&o!==10,r}}fsync(){}};i(it,"LegacyReader");var st=class{constructor(e,r){this.out=e,this.isatty=r}write(e){for(let r of e)this.out(r);return e.length}};i(st,"CharacterCodeWriter");var lt=class{constructor(e){this.isatty=!1;this.out=e,this.output=[]}write(e){for(let r of e)r===10?(this.out(Ir.decode(new Uint8Array(this.output))),this.output=[]):r!==0&&this.output.push(r);return e.length}fsync(){this.output&&this.output.length>0&&(this.out(Ir.decode(new Uint8Array(this.output))),this.output=[])}};i(lt,"StringWriter");var Ne=class{constructor(e){this.fd=e,this.isatty=kr.isatty(e)}write(e){return Rt.writeSync(this.fd,e)}fsync(){Er(this.fd)}};i(Ne,"NodeWriter");var Ut="sched$"+Math.random().toString(36).slice(2)+"$",jt={},Ct=0;function Xn(){if(!Y)return;let t=i(e=>{if(typeof e.data=="string"&&e.data.indexOf(Ut)===0){let r=+e.data.slice(Ut.length),n=jt[r];if(!n)return;try{n()}finally{delete jt[r]}}},"onGlobalMessage");globalThis.addEventListener("message",t,!1)}i(Xn,"installPostMessageHandler");Xn();function Zn(t){if(h)setImmediate(t);else if(Y&&typeof globalThis.postMessage=="function")jt[Ct]=t,globalThis.postMessage(Ut+Ct,"*"),Ct++;else if(we&&!Et&&typeof MessageChannel=="function"){let e=new MessageChannel;e.port1.onmessage=()=>t(),e.port2.postMessage("")}else setTimeout(t,0)}i(Zn,"scheduleCallbackImmediate");function dt(t,e=0){e<=2?Zn(t):setTimeout(t,e)}i(dt,"scheduleCallback");var{get:eo,getOwnPropertyDescriptor:to,ownKeys:ro}=Reflect,no=i(t=>({value:t,enumerable:!0,writable:!0,configurable:!0}),"getPropertyDescriptor"),Mr=Symbol(),Nr="prototype",oo={deleteProperty:(t,e)=>t.has(e)?t.delete(e):delete t[e],get(t,e,r){if(e===Mr)return t;let n=t[e];return typeof n=="function"&&e!=="constructor"&&(n=n.bind(t)),n||(n=t.get(e)),n},getOwnPropertyDescriptor(t,e){if(t.has(e))return no(t.get(e));if(e in t)return to(t,e)},has:(t,e)=>t.has(e)||e in t,ownKeys:t=>[...t.keys(),...ro(t)].filter(e=>["string","symbol"].includes(typeof e)),set:(t,e,r)=>(t.set(e,r),!0)},ao=new Proxy(i(class extends Map{constructor(...e){return new Proxy(super(...e),oo)}},"LiteralMap"),{get(t,e,...r){return e!==Nr&&e in t[Nr]?(n,...o)=>{let a=n[Mr],s=a[e];return typeof s=="function"&&(s=s.apply(a,o)),s===a?n:s}:eo(t,e,...r)}}),Dr=ao;var yt=new FinalizationRegistry(t=>void t());function io(t){let e=new AbortController;for(let l of t)if(l.aborted)return e.abort(l.reason),e.signal;let r=new WeakRef(e),n=[],o=t.length;t.forEach(l=>{let c=new WeakRef(l);function u(){r.deref()?.abort(c.deref()?.reason)}i(u,"abort"),l.addEventListener("abort",u),n.push([c,u]),yt.register(l,()=>!--o&&a(),l)});function a(){n.forEach(([l,c])=>{let u=l.deref();u&&(u.removeEventListener("abort",c),yt.unregister(u));let d=r.deref();d&&(yt.unregister(d.signal),delete d.signal.__controller)})}i(a,"clear");let{signal:s}=e;return yt.register(s,a,s),s.addEventListener("abort",a),s.__controller=e,s}i(io,"abortSignalAny");var Tr=io;function $r(){return[null,Bt,API.config.jsglobals,API.public_api,API,dt,API,{}]}i($r,"getExpectedKeys");var Lr=Symbol("getAccessorList");function pt(t,e=[]){return new Proxy(t,{get(r,n,o){if(n===Lr)return e;let a=Reflect.get(...arguments),s=Reflect.getOwnPropertyDescriptor(r,n);return s&&s.writable===!1&&!s.configurable||s&&s.set&&!s.get||!["object","function"].includes(typeof a)?a:pt(a,[...e,n])},getPrototypeOf(){return pt(Reflect.getPrototypeOf(...arguments),[...e,"[getProtoTypeOf]"])}})}i(pt,"makeGlobalsProxy");var Cr=1886286592,ft=4+4+4+4+32;function so(t,e){if(e.length!==8)throw new Error("Expected 256 bit buffer");for(let r=0;r<32;r++)e[r]=parseInt(t.slice(r*8,(r+1)*8),16)}i(so,"encodeBuildId");function lo(t){if(t.length!==8)throw new Error("Expected 256 bit buffer");return Array.from(t,e=>e.toString(16).padStart(8,"0")).join("")}i(lo,"decodeBuildId");var De=5;API.makeSnapshot=function(t){if(!API.config._makeSnapshot)throw new Error("makeSnapshot only works if you passed the makeSnapshot option to loadPyodide");let e=[],r=$r();for(let y=0;yRr(a,o)),e.hiwireKeys.forEach((o,a)=>{let s;if(!o)s=o;else if("path"in o)s=o.path.reduce((l,c)=>l[c],t)||null;else{if(!r)throw new Error("You must pass an appropriate deserializer as _snapshotDeserializer");s=r(o.serialized)}Rr(n.length+a,s)}),e.immortalKeys.forEach(o=>Module.__hiwire_immortal_add(o))}i(jr,"syncUpSnapshotLoad2");API.loadBinaryFile=Se;API.rawRun=i(function(e){let r=Module.stringToNewUTF8(e);Module.API.capture_stderr();let n=_PyRun_SimpleString(r);_free(r);let o=Module.API.restore_stderr().trim();return[n,o]},"rawRun");API.runPythonInternal=function(t){return API._pyodide._base.eval_code(t,API.runPythonInternal_dict)};API.setPyProxyToStringMethod=function(t){Module.HEAP8[Module._compat_to_string_repr]=+t};API.saveState=()=>API.pyodide_py._state.save_state();API.restoreState=t=>API.pyodide_py._state.restore_state(t);API.scheduleCallback=dt;API.detectEnvironment=pr;AbortSignal.any?API.abortSignalAny=AbortSignal.any:API.abortSignalAny=Tr;API.LiteralMap=Dr;function Br(t){Module.FS.mkdirTree(t);let{node:e}=Module.FS.lookupPath(t,{follow_mount:!1});if(FS.isMountpoint(e))throw new Error(`path '${t}' is already a file system mount point`);if(!FS.isDir(e.mode))throw new Error(`path '${t}' points to a file not a directory`);for(let r in e.contents)throw new Error(`directory '${t}' is not empty`)}i(Br,"ensureMountPathExists");var x=class{static async loadPackagesFromImports(e,r={checkIntegrity:!0}){let n=API.pyodide_code.find_imports(e),o;try{o=n.toJs()}finally{n.destroy()}if(o.length===0)return[];let a=API._import_name_to_package_name,s=new Set;for(let l of o)a.has(l)&&s.add(a.get(l));return s.size?await Oe(Array.from(s),r):[]}static runPython(e,r={}){return r.globals||(r.globals=API.globals),API.pyodide_code.eval_code.callKwargs(e,r)}static async runPythonAsync(e,r={}){return r.globals||(r.globals=API.globals),await API.pyodide_code.eval_code_async.callKwargs(e,r)}static registerJsModule(e,r){API.pyodide_ffi.register_js_module(e,r)}static unregisterJsModule(e){API.pyodide_ffi.unregister_js_module(e)}static toPy(e,{depth:r,defaultConverter:n}={depth:-1}){switch(typeof e){case"string":case"number":case"boolean":case"bigint":case"undefined":return e}if(!e||API.isPyProxy(e))return e;let o=0,a=0;try{o=Module.js2python_convert(e,{depth:r,defaultConverter:n})}catch(s){throw s instanceof Module._PropagatePythonError&&_pythonexc2js(),s}try{if(_JsProxy_Check(o))return e;a=_python2js(o),a===null&&_pythonexc2js()}finally{_Py_DecRef(o)}return a}static pyimport(e){return API.pyodide_base.pyimport_impl(e)}static unpackArchive(e,r,n={}){if(!ArrayBuffer.isView(e)&&API.getTypeTag(e)!=="[object ArrayBuffer]")throw new TypeError("Expected argument 'buffer' to be an ArrayBuffer or an ArrayBuffer view");API.typedArrayAsUint8Array(e);let o=n.extractDir;API.package_loader.unpack_buffer.callKwargs({buffer:e,format:r,extract_dir:o,installer:"pyodide.unpackArchive"})}static async mountNativeFS(e,r){if(r.constructor.name!=="FileSystemDirectoryHandle")throw new TypeError("Expected argument 'fileSystemHandle' to be a FileSystemDirectoryHandle");return Br(e),Module.FS.mount(Module.FS.filesystems.NATIVEFS_ASYNC,{fileSystemHandle:r},e),await new Promise((n,o)=>Module.FS.syncfs(!0,n)),{syncfs:async()=>new Promise((n,o)=>Module.FS.syncfs(!1,n))}}static mountNodeFS(e,r){if(!h)throw new Error("mountNodeFS only works in Node");Br(e);let n;try{n=tt.lstatSync(r)}catch{throw new Error(`hostPath '${r}' does not exist`)}if(!n.isDirectory())throw new Error(`hostPath '${r}' is not a directory`);Module.FS.mount(Module.FS.filesystems.NODEFS,{root:r},e)}static registerComlink(e){API._Comlink=e}static setInterruptBuffer(e){Module.HEAP8[Module._Py_EMSCRIPTEN_SIGNAL_HANDLING]=+!!e,Module.Py_EmscriptenSignalBuffer=e}static checkInterrupt(){if(_PyGILState_Check()){__PyErr_CheckSignals()&&_pythonexc2js();return}else{let e=Module.Py_EmscriptenSignalBuffer;if(e&&e[0]===2)throw new Module.FS.ErrnoError(27)}}static setDebug(e){let r=!!API.debug_ffi;return API.debug_ffi=e,r}static makeMemorySnapshot({serializer:e}={}){if(!API.config._makeSnapshot)throw new Error("Can only use pyodide.makeMemorySnapshot if the _makeSnapshot option is passed to loadPyodide");return API.makeSnapshot(e)}};i(x,"PyodideAPI"),x.version=wr,x.loadPackage=Oe,x.loadedPackages=ke,x.ffi=sr,x.setStdin=Me,x.setStdout=$t,x.setStderr=Lt,x.globals={},x.FS={},x.PATH={},x.canvas=ur,x.ERRNO_CODES={},x.pyodide_py={};function co(){let t=Object.getOwnPropertyDescriptors(x);delete t.prototype;let e=Object.create({},t);return API.public_api=e,e.FS=Module.FS,e.PATH=Module.PATH,e.ERRNO_CODES=Module.ERRNO_CODES,e._module=Module,e._api=API,e}i(co,"makePublicAPI");function uo(t,e){return new Proxy(t,{get(r,n){return n==="get"?o=>{let a=r.get(o);return a===void 0&&(a=e.get(o)),a}:n==="has"?o=>r.has(o)||e.has(o):Reflect.get(r,n)}})}i(uo,"wrapPythonGlobals");var Hr;API.bootstrapFinalizedPromise=new Promise(t=>Hr=t);function Bt(t){"__all__"in t||Object.defineProperty(t,"__all__",{get:()=>API.public_api.toPy(Object.getOwnPropertyNames(t).filter(e=>e!=="__all__")),enumerable:!1,configurable:!0})}i(Bt,"jsFinderHook");API.finalizeBootstrap=function(t,e){t&&Ur();let[r,n]=API.rawRun("import _pyodide_core");r&&API.fatal_loading_error(`Failed to import _pyodide_core\n`,n),API.runPythonInternal_dict=API._pyodide._base.eval_code("{}"),API.importlib=API.runPythonInternal("import importlib; importlib");let o=API.importlib.import_module;API.sys=o("sys"),API.os=o("os");let a=API.runPythonInternal("import __main__; __main__.__dict__"),s=API.runPythonInternal("import builtins; builtins.__dict__");API.globals=uo(a,s);let l=API._pyodide._importhook,c=co();API.config._makeSnapshot&&(API.config.jsglobals=pt(API.config.jsglobals));let u=API.config.jsglobals;return t?jr(u,t,e):(l.register_js_finder.callKwargs({hook:Bt}),l.register_js_module("js",u),l.register_js_module("pyodide_js",c)),API.pyodide_py=o("pyodide"),API.pyodide_code=o("pyodide.code"),API.pyodide_ffi=o("pyodide.ffi"),API.package_loader=o("pyodide._package_loader"),API.pyodide_base=o("_pyodide._base"),API.sitepackages=API.package_loader.SITE_PACKAGES.__str__(),API.dsodir=API.package_loader.DSO_DIR.__str__(),API.defaultLdLibraryPath=[API.dsodir,API.sitepackages],API.os.environ.__setitem__("LD_LIBRARY_PATH",API.defaultLdLibraryPath.join(":")),c.pyodide_py=API.pyodide_py,c.globals=API.globals,Hr(),c}})()}var StackSwitching=(()=>{var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var stack_switching_exports={};__export(stack_switching_exports,{StackState:()=>StackState,createPromising:()=>createPromising,jsWrapperTag:()=>jsWrapperTag,jspiSupported:()=>jspiSupported,newJspiSupported:()=>newJspiSupported,oldJspiSupported:()=>oldJspiSupported,promisingApply:()=>promisingApply,suspenderGlobal:()=>suspenderGlobal,validSuspender:()=>validSuspender});var WASM_PRELUDE=[0,97,115,109,1,0,0,0];function insertSectionPrefix(sectionCode,sectionBody){var section=[sectionCode];uleb128Encode(sectionBody.length,section);section.push(...sectionBody);return section}var typeCodes={i32:127,i64:126,f32:125,f64:124,externref:111,void:64};var constCodes={i32:65,i64:66,f32:67,f64:68};function emscriptenSigToWasm(sig){const lookup={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",v:""};const parameters=sig.split("").map(x=>lookup[x]);const result=parameters.shift();const results=result?[result]:[];return{parameters:parameters,results:results}}var TypeSection=class{constructor(){this._numTypes=0;this._section=[0]}addEmscripten(sig){return this.addWasm(emscriptenSigToWasm(sig))}addWasm({parameters:parameters,results:results}){this._section.push(96);uleb128Encode(parameters.length,this._section);for(let p of parameters){this._section.push(typeCodes[p])}uleb128Encode(results.length,this._section);for(let p of results){this._section.push(typeCodes[p])}return this._numTypes++}generate(){this._section[0]=this._numTypes;return insertSectionPrefix(1,this._section)}};function encodeStr(s){const buf=(new TextEncoder).encode(s);return[buf.length,...buf]}var ImportSection=class{constructor(){this._numImports=0;this.numGlobals=0;this.numFuncs=0;this._section=[0]}_addName(name){this._section.push(...ImportSection._module);this._section.push(...encodeStr(name))}addFunction(name,sig){this._addName(name);this._section.push(ImportSection.descr.func,sig);this._numImports++;return this.numFuncs++}addTable(name){this._addName(name);this._section.push(ImportSection.descr.table,112,0,0);this._numImports++}addGlobal(name,type){this._addName(name);this._section.push(ImportSection.descr.global,typeCodes[type],1);this._numImports++;return this.numGlobals++}addTag(name,sig){this._addName(name);this._section.push(ImportSection.descr.tag,0,sig);this._numImports++}generate(){this._section[0]=this._numImports;return insertSectionPrefix(2,this._section)}};ImportSection._module=encodeStr("e");ImportSection.descr={func:0,table:1,mem:2,global:3,tag:4};var CodeSection=class{constructor(...locals){this._section=[];this.add(locals.length);for(let l of locals){this.add(1,typeCodes[l])}}add(...args){this._section.push(...args)}local_get(idx){this.add(32,idx)}local_set(idx){this.add(33,idx)}local_tee(idx){this.add(34,idx)}global_get(idx){this.add(35,idx)}global_set(idx){this.add(36,idx)}call(func){this.add(16,func)}call_indirect(func){this.add(17,func,0)}const(type,...val){this.add(constCodes[type],...val)}end(){this.add(11)}generate(){this.end();return insertSectionPrefix(10,insertSectionPrefix(1,this._section))}};var WasmModule=class{constructor(){this._sections=[WASM_PRELUDE]}addSection(section){this._sections.push(section.generate())}addSectionBody(sectionCode,sectionBody){this._sections.push(insertSectionPrefix(sectionCode,sectionBody))}addImportSection(imports){this.addSection(imports);this._numImportFuncs=imports.numFuncs}setExportType(type){const functionSection=[1,type];this.addSectionBody(3,functionSection);const exportSection=[1,...encodeStr("o"),0,this._numImportFuncs];this.addSectionBody(7,exportSection)}generate(){const bytes=new Uint8Array(this._sections.flat());return new WebAssembly.Module(bytes)}};function createInvokeModule(sig){const mod=new WasmModule;const types=new TypeSection;const invoke_sig=emscriptenSigToWasm(sig);const export_sig=structuredClone(invoke_sig);export_sig.parameters.unshift("i32");const invoke_tidx=types.addWasm(invoke_sig);const export_tidx=types.addWasm(export_sig);const try_tidx=typeCodes[invoke_sig.results[0]||"void"];const tag_tidx=types.addEmscripten("ve");const save_tidx=types.addEmscripten("i");const restore_tidx=types.addEmscripten("vi");const setThrew_tidx=types.addEmscripten("vii");mod.addSection(types);const imports=new ImportSection;imports.addTable("t");imports.addTag("tag",tag_tidx);const save_stack_func=imports.addFunction("s",save_tidx);const restore_stack_func=imports.addFunction("r",restore_tidx);const set_threw_func=imports.addFunction("q",setThrew_tidx);mod.addImportSection(imports);mod.setExportType(export_tidx);const code=new CodeSection(["i32"]);const stackLocal=export_sig.parameters.length;code.call(save_stack_func);code.local_set(stackLocal);code.add(6,try_tidx);for(let i=1;inew WebAssembly.Exception(jsWrapperTag,[e]);function createInvoke(sig){if(!jsWrapperTag){return createInvokeFunction(sig)}const module=createInvokeModule(sig);const instance=new WebAssembly.Instance(module,{e:{t:wasmTable,s:()=>stackSave(),r:x=>stackRestore(x),q:(x,y)=>_setThrew(x,y),tag:jsWrapperTag}});return instance.exports["o"]}function adjustWasmImports(wasmImports){const i="invoke_";for(let name of Object.keys(wasmImports.env)){if(!name.startsWith(i)){continue}wasmImports.env[name]=createInvoke(name.slice(i.length))}}var suspenderGlobal={value:null};var validSuspender={value:false};var promisingApplyHandler;function promisingApply(...args){validSuspender.value=true;Module.stackStop=stackSave();Module.origCframe=_get_cframe();return promisingApplyHandler(...args)}function createPromising(wasm_func){if(Module.newJspiSupported){const promisingFunc=WebAssembly.promising(wasm_func);async function wrapper(...args){const orig=validSuspender.value;validSuspender.value=true;try{return await promisingFunc(null,...args)}finally{validSuspender.value=orig}}return wrapper}const{parameters:parameters}=wasmFunctionType(wasm_func);parameters.shift();return new WebAssembly.Function({parameters:parameters,results:["externref"]},wasm_func,{promising:"first"})}function initSuspenders(){promisingApplyHandler=createPromising(wasmExports._pyproxy_apply_promising)}var stackStates=[];var StackState=class{constructor(){this.start=stackSave();this.stop=Module.stackStop;this._copy=new Uint8Array(0);if(this.start!==this.stop){stackStates.push(this)}}restore(){let total=0;while(stackStates.length>0&&stackStates[stackStates.length-1].stop>>0,this.start+sz2>>>0);const c=new Uint8Array(sz2);c.set(this._copy);c.set(new_segment,sz1);this._copy=c;return sz2}_save(){return this._save_up_to(this.stop)}};var canConstructWasm=true;try{new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0]))}catch(e){canConstructWasm=false}var newJspiSupported=canConstructWasm&&"Suspending"in WebAssembly;var oldJspiSupported=canConstructWasm&&"Suspender"in WebAssembly;var jspiSupported=newJspiSupported||oldJspiSupported;Module.newJspiSupported=newJspiSupported;Module.oldJspiSupported=oldJspiSupported;Module.jspiSupported=jspiSupported;if(jspiSupported){Module.preRun.push(initSuspenders);Module.adjustWasmImports=adjustWasmImports;Module.wrapException=wrapException;Module.createInvoke=createInvoke}return __toCommonJS(stack_switching_exports)})();const{StackState:StackState,createPromising:createPromising,jsWrapperTag:jsWrapperTag,jspiSupported:jspiSupported,newJspiSupported:newJspiSupported,oldJspiSupported:oldJspiSupported,promisingApply:promisingApply,suspenderGlobal:suspenderGlobal,validSuspender:validSuspender}=StackSwitching;Object.assign(Module,StackSwitching);const API=Module.API;const Hiwire={};const Tests={};API.tests=Tests;API.version="0.27.2";Module.hiwire=Hiwire;function getTypeTag(x){try{return Object.prototype.toString.call(x)}catch(e){return""}}API.getTypeTag=getTypeTag;function hasProperty(obj,prop){try{while(obj){if(Object.getOwnPropertyDescriptor(obj,prop)){return true}obj=Object.getPrototypeOf(obj)}}catch(e){}return false}function hasMethod(obj,prop){try{return typeof obj[prop]==="function"}catch(e){return false}}const pyproxyIsAlive=px=>!!Module.PyProxy_getAttrsQuiet(px).shared.ptr;API.pyproxyIsAlive=pyproxyIsAlive;const errNoRet=()=>{throw new Error("Assertion error: control reached end of function without return")};Module.reportUndefinedSymbols=()=>{};const nullToUndefined=x=>x===null?undefined:x;function isPromise(obj){try{return!!obj&&typeof obj.then==="function"}catch(e){return false}}API.isPromise=isPromise;function bufferAsUint8Array(arg){if(ArrayBuffer.isView(arg)){return new Uint8Array(arg.buffer,arg.byteOffset,arg.byteLength)}else{return new Uint8Array(arg)}}API.typedArrayAsUint8Array=bufferAsUint8Array;Module.iterObject=function*(object){for(let k in object){if(Object.prototype.hasOwnProperty.call(object,k)){yield k}}};function wasmFunctionType(wasm_func){if(!WebAssembly.Function){throw new Error("No type reflection")}if(WebAssembly.Function.type){return WebAssembly.Function.type(wasm_func)}return wasm_func.type()}pyodide_js_init();pyodide_js_init.sig="v";function set_suspender(suspender){suspenderGlobal.value=suspender}set_suspender.sig="ve";function get_suspender(){return suspenderGlobal.value}get_suspender.sig="e";function syncifyHandler(x,y){return null}async function inner(x,y){try{return nullToUndefined(await(x??y))}catch(e){if(e&&e.pyodide_fatal_error){throw e}Module.syncify_error=e;return null}}if(newJspiSupported){syncifyHandler=new WebAssembly.Suspending(inner)}else if(oldJspiSupported){syncifyHandler=new WebAssembly.Function({parameters:["externref","externref"],results:["externref"]},inner,{suspending:"first"})}syncifyHandler.sig="eee";function JsvPromise_Syncify_handleError(){if(!Module.syncify_error){return}Module.handle_js_error(Module.syncify_error);delete Module.syncify_error}JsvPromise_Syncify_handleError.sig="v";function saveState(){if(!validSuspender.value){return null}const stackState=new StackState;const threadState=_captureThreadState();const origCframe=Module.origCframe;_restore_cframe(origCframe);return{threadState:threadState,stackState:stackState,suspender:suspenderGlobal.value,origCframe:origCframe}}saveState.sig="e";function restoreState(state){state.stackState.restore();Module.origCframe=state.origCframe;_restoreThreadState(state.threadState);suspenderGlobal.value=state.suspender;validSuspender.value=true}restoreState.sig="ve";function _PyImport_InitFunc_TrampolineCall(func){return wasmTable.get(func)()}_PyImport_InitFunc_TrampolineCall.sig="ii";function _Py_emscripten_runtime(){var info;if(typeof navigator=="object"){info=navigator.userAgent}else if(typeof process=="object"){info="Node.js ".concat(process.version)}else{info="UNKNOWN"}var len=lengthBytesUTF8(info)+1;var res=_malloc(len);if(res)stringToUTF8(info,res,len);return res}_Py_emscripten_runtime.sig="i";function _Py_CheckEmscriptenSignals_Helper(){if(!Module.Py_EmscriptenSignalBuffer){return 0}try{let result=Module.Py_EmscriptenSignalBuffer[0];Module.Py_EmscriptenSignalBuffer[0]=0;return result}catch(e){return 0}}_Py_CheckEmscriptenSignals_Helper.sig="i";function _PyEM_GetCountArgsPtr(){return Module._PyEM_CountArgsPtr}addOnPreRun(()=>{const code=new Uint8Array([0,97,115,109,1,0,0,0,1,27,5,96,0,1,127,96,1,127,1,127,96,2,127,127,1,127,96,3,127,127,127,1,127,96,1,127,0,2,9,1,1,101,1,116,1,112,0,0,3,2,1,1,7,5,1,1,102,0,0,10,68,1,66,1,1,112,32,0,37,0,34,1,251,20,3,2,4,69,13,0,65,3,15,11,32,1,251,20,2,2,4,69,13,0,65,2,15,11,32,1,251,20,1,2,4,69,13,0,65,1,15,11,32,1,251,20,0,2,4,69,13,0,65,0,15,11,65,127,11]);let ptr=0;try{const mod=new WebAssembly.Module(code);const inst=new WebAssembly.Instance(mod,{e:{t:wasmTable}});ptr=addFunction(inst.exports.f)}catch(e){}Module._PyEM_CountArgsPtr=ptr;const offset=HEAP32[__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET/4>>>0];HEAP32[(__PyRuntime+offset)/4>>>0]=ptr});_PyEM_GetCountArgsPtr.sig="i";function _PyEM_TrampolineCall_JS(func,arg1,arg2,arg3){return wasmTable.get(func)(arg1,arg2,arg3)}_PyEM_TrampolineCall_JS.sig="iiiii";function unbox_small_structs(type_ptr){var type_id=HEAPU16[(type_ptr+6>>1)+0>>>0];while(type_id===13){var elements=HEAPU32[(type_ptr+8>>2)+0>>>0];var first_element=HEAPU32[(elements>>2)+0>>>0];if(first_element===0){type_id=0;break}else if(HEAPU32[(elements>>2)+1>>>0]===0){type_ptr=first_element;type_id=HEAPU16[(first_element+6>>1)+0>>>0]}else{break}}return[type_ptr,type_id]}function ffi_call_js(cif,fn,rvalue,avalue){var abi=HEAPU32[(cif>>2)+0>>>0];var nargs=HEAPU32[(cif>>2)+1>>>0];var nfixedargs=HEAPU32[(cif>>2)+6>>>0];var arg_types_ptr=HEAPU32[(cif>>2)+2>>>0];var rtype_unboxed=unbox_small_structs(HEAPU32[(cif>>2)+3>>>0]);var rtype_ptr=rtype_unboxed[0];var rtype_id=rtype_unboxed[1];var orig_stack_ptr=stackSave();var cur_stack_ptr=orig_stack_ptr;var args=[];var ret_by_arg=false;if(rtype_id===15){throw new Error("complex ret marshalling nyi")}if(rtype_id<0||rtype_id>15){throw new Error("Unexpected rtype "+rtype_id)}if(rtype_id===4||rtype_id===13){args.push(rvalue);ret_by_arg=true}for(var i=0;i>2)+i>>>0];var arg_unboxed=unbox_small_structs(HEAPU32[(arg_types_ptr>>2)+i>>>0]);var arg_type_ptr=arg_unboxed[0];var arg_type_id=arg_unboxed[1];switch(arg_type_id){case 1:case 10:case 9:case 14:args.push(HEAPU32[(arg_ptr>>2)+0>>>0]);break;case 2:args.push(HEAPF32[(arg_ptr>>2)+0>>>0]);break;case 3:args.push(HEAPF64[(arg_ptr>>3)+0>>>0]);break;case 5:args.push(HEAPU8[arg_ptr+0>>>0]);break;case 6:args.push(HEAP8[arg_ptr+0>>>0]);break;case 7:args.push(HEAPU16[(arg_ptr>>1)+0>>>0]);break;case 8:args.push(HEAP16[(arg_ptr>>1)+0>>>0]);break;case 11:case 12:args.push(HEAPU64[(arg_ptr>>3)+0]);break;case 4:args.push(HEAPU64[(arg_ptr>>3)+0]);args.push(HEAPU64[(arg_ptr>>3)+1]);break;case 13:var size=HEAPU32[(arg_type_ptr>>2)+0>>>0];var align=HEAPU16[(arg_type_ptr+4>>1)+0>>>0];cur_stack_ptr-=size,cur_stack_ptr&=~(align-1);HEAP8.subarray(cur_stack_ptr>>>0,cur_stack_ptr+size>>>0).set(HEAP8.subarray(arg_ptr>>>0,arg_ptr+size>>>0));args.push(cur_stack_ptr);break;case 15:throw new Error("complex marshalling nyi");default:throw new Error("Unexpected type "+arg_type_id)}}if(nfixedargs!=nargs){var struct_arg_info=[];for(var i=nargs-1;i>=nfixedargs;i--){var arg_ptr=HEAPU32[(avalue>>2)+i>>>0];var arg_unboxed=unbox_small_structs(HEAPU32[(arg_types_ptr>>2)+i>>>0]);var arg_type_ptr=arg_unboxed[0];var arg_type_id=arg_unboxed[1];switch(arg_type_id){case 5:case 6:cur_stack_ptr-=1,cur_stack_ptr&=~(1-1);HEAPU8[cur_stack_ptr+0>>>0]=HEAPU8[arg_ptr+0>>>0];break;case 7:case 8:cur_stack_ptr-=2,cur_stack_ptr&=~(2-1);HEAPU16[(cur_stack_ptr>>1)+0>>>0]=HEAPU16[(arg_ptr>>1)+0>>>0];break;case 1:case 9:case 10:case 14:case 2:cur_stack_ptr-=4,cur_stack_ptr&=~(4-1);HEAPU32[(cur_stack_ptr>>2)+0>>>0]=HEAPU32[(arg_ptr>>2)+0>>>0];break;case 3:case 11:case 12:cur_stack_ptr-=8,cur_stack_ptr&=~(8-1);HEAPU32[(cur_stack_ptr>>2)+0>>>0]=HEAPU32[(arg_ptr>>2)+0>>>0];HEAPU32[(cur_stack_ptr>>2)+1>>>0]=HEAPU32[(arg_ptr>>2)+1>>>0];break;case 4:cur_stack_ptr-=16,cur_stack_ptr&=~(8-1);HEAPU32[(cur_stack_ptr>>2)+0>>>0]=HEAPU32[(arg_ptr>>2)+0>>>0];HEAPU32[(cur_stack_ptr>>2)+1>>>0]=HEAPU32[(arg_ptr>>2)+1>>>0];HEAPU32[(cur_stack_ptr>>2)+2>>>0]=HEAPU32[(arg_ptr>>2)+2>>>0];HEAPU32[(cur_stack_ptr>>2)+3>>>0]=HEAPU32[(arg_ptr>>2)+3>>>0];break;case 13:cur_stack_ptr-=4,cur_stack_ptr&=~(4-1);struct_arg_info.push([cur_stack_ptr,arg_ptr,HEAPU32[(arg_type_ptr>>2)+0>>>0],HEAPU16[(arg_type_ptr+4>>1)+0>>>0]]);break;case 15:throw new Error("complex arg marshalling nyi");default:throw new Error("Unexpected argtype "+arg_type_id)}}args.push(cur_stack_ptr);for(var i=0;i>>0,cur_stack_ptr+size>>>0).set(HEAP8.subarray(arg_ptr>>>0,arg_ptr+size>>>0));HEAPU32[(arg_target>>2)+0>>>0]=cur_stack_ptr}}stackRestore(cur_stack_ptr);stackAlloc(0);var result=(0,getWasmTableEntry(fn).apply(null,args));stackRestore(orig_stack_ptr);if(ret_by_arg){return}switch(rtype_id){case 0:break;case 1:case 9:case 10:case 14:HEAPU32[(rvalue>>2)+0>>>0]=result;break;case 2:HEAPF32[(rvalue>>2)+0>>>0]=result;break;case 3:HEAPF64[(rvalue>>3)+0>>>0]=result;break;case 5:case 6:HEAPU8[rvalue+0>>>0]=result;break;case 7:case 8:HEAPU16[(rvalue>>1)+0>>>0]=result;break;case 11:case 12:HEAPU64[(rvalue>>3)+0]=result;break;case 15:throw new Error("complex ret marshalling nyi");default:throw new Error("Unexpected rtype "+rtype_id)}}ffi_call_js.sig="viiii";function ffi_closure_alloc_js(size,code){var closure=_malloc(size);var index=getEmptyTableSlot();HEAPU32[(code>>2)+0>>>0]=index;HEAPU32[(closure>>2)+0>>>0]=index;return closure}ffi_closure_alloc_js.sig="iii";function ffi_closure_free_js(closure){var index=HEAPU32[(closure>>2)+0>>>0];freeTableIndexes.push(index);_free(closure)}ffi_closure_free_js.sig="vi";function ffi_prep_closure_loc_js(closure,cif,fun,user_data,codeloc){var abi=HEAPU32[(cif>>2)+0>>>0];var nargs=HEAPU32[(cif>>2)+1>>>0];var nfixedargs=HEAPU32[(cif>>2)+6>>>0];var arg_types_ptr=HEAPU32[(cif>>2)+2>>>0];var rtype_unboxed=unbox_small_structs(HEAPU32[(cif>>2)+3>>>0]);var rtype_ptr=rtype_unboxed[0];var rtype_id=rtype_unboxed[1];var sig;var ret_by_arg=false;switch(rtype_id){case 0:sig="v";break;case 13:case 4:sig="vi";ret_by_arg=true;break;case 1:case 5:case 6:case 7:case 8:case 9:case 10:case 14:sig="i";break;case 2:sig="f";break;case 3:sig="d";break;case 11:case 12:sig="j";break;case 15:throw new Error("complex ret marshalling nyi");default:throw new Error("Unexpected rtype "+rtype_id)}var unboxed_arg_type_id_list=[];var unboxed_arg_type_info_list=[];for(var i=0;i>2)+i>>>0]);var arg_type_ptr=arg_unboxed[0];var arg_type_id=arg_unboxed[1];unboxed_arg_type_id_list.push(arg_type_id);unboxed_arg_type_info_list.push([HEAPU32[(arg_type_ptr>>2)+0>>>0],HEAPU16[(arg_type_ptr+4>>1)+0>>>0]])}for(var i=0;i>2)+carg_idx>>>0]=cur_ptr;HEAPU8[cur_ptr+0>>>0]=cur_arg;break;case 7:case 8:cur_ptr-=2,cur_ptr&=~(4-1);HEAPU32[(args_ptr>>2)+carg_idx>>>0]=cur_ptr;HEAPU16[(cur_ptr>>1)+0>>>0]=cur_arg;break;case 1:case 9:case 10:case 14:cur_ptr-=4,cur_ptr&=~(4-1);HEAPU32[(args_ptr>>2)+carg_idx>>>0]=cur_ptr;HEAPU32[(cur_ptr>>2)+0>>>0]=cur_arg;break;case 13:cur_ptr-=arg_size,cur_ptr&=~(arg_align-1);HEAP8.subarray(cur_ptr>>>0,cur_ptr+arg_size>>>0).set(HEAP8.subarray(cur_arg>>>0,cur_arg+arg_size>>>0));HEAPU32[(args_ptr>>2)+carg_idx>>>0]=cur_ptr;break;case 2:cur_ptr-=4,cur_ptr&=~(4-1);HEAPU32[(args_ptr>>2)+carg_idx>>>0]=cur_ptr;HEAPF32[(cur_ptr>>2)+0>>>0]=cur_arg;break;case 3:cur_ptr-=8,cur_ptr&=~(8-1);HEAPU32[(args_ptr>>2)+carg_idx>>>0]=cur_ptr;HEAPF64[(cur_ptr>>3)+0>>>0]=cur_arg;break;case 11:case 12:cur_ptr-=8,cur_ptr&=~(8-1);HEAPU32[(args_ptr>>2)+carg_idx>>>0]=cur_ptr;HEAPU64[(cur_ptr>>3)+0]=cur_arg;break;case 4:cur_ptr-=16,cur_ptr&=~(8-1);HEAPU32[(args_ptr>>2)+carg_idx>>>0]=cur_ptr;HEAPU64[(cur_ptr>>3)+0]=cur_arg;cur_arg=args[jsarg_idx++];HEAPU64[(cur_ptr>>3)+1]=cur_arg;break}}var varargs=args[args.length-1];for(;carg_idx>2)+0>>>0];cur_ptr-=arg_size,cur_ptr&=~(arg_align-1);HEAP8.subarray(cur_ptr>>>0,cur_ptr+arg_size>>>0).set(HEAP8.subarray(struct_ptr>>>0,struct_ptr+arg_size>>>0));HEAPU32[(args_ptr>>2)+carg_idx>>>0]=cur_ptr}else{HEAPU32[(args_ptr>>2)+carg_idx>>>0]=varargs}varargs+=4}stackRestore(cur_ptr);stackAlloc(0);0;getWasmTableEntry(HEAPU32[(closure>>2)+2>>>0])(HEAPU32[(closure>>2)+1>>>0],ret_ptr,args_ptr,HEAPU32[(closure>>2)+3>>>0]);stackRestore(orig_stack_ptr);if(!ret_by_arg){switch(sig[0]){case"i":return HEAPU32[(ret_ptr>>2)+0>>>0];case"j":return HEAPU64[(ret_ptr>>3)+0];case"d":return HEAPF64[(ret_ptr>>3)+0>>>0];case"f":return HEAPF32[(ret_ptr>>2)+0>>>0]}}}try{var wasm_trampoline=convertJsFunctionToWasm(trampoline,sig)}catch(e){return 1}setWasmTableEntry(codeloc,wasm_trampoline);HEAPU32[(closure>>2)+1>>>0]=cif;HEAPU32[(closure>>2)+2>>>0]=fun;HEAPU32[(closure>>2)+3>>>0]=user_data;return 0}ffi_prep_closure_loc_js.sig="iiiiii";function __hiwire_deduplicate_new(){return new Map}__hiwire_deduplicate_new.sig="e";function __hiwire_deduplicate_get(map,value){return map.get(value)}__hiwire_deduplicate_get.sig="iee";function __hiwire_deduplicate_set(map,value,ref){map.set(value,ref)}__hiwire_deduplicate_set.sig="veei";function __hiwire_deduplicate_delete(map,value){map.delete(value)}__hiwire_deduplicate_delete.sig="vee";function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}Module["ExitStatus"]=ExitStatus;var GOT={};Module["GOT"]=GOT;var currentModuleWeakSymbols=new Set([]);Module["currentModuleWeakSymbols"]=currentModuleWeakSymbols;var GOTHandler={get(obj,symName){var rtn=GOT[symName];if(!rtn){rtn=GOT[symName]=new WebAssembly.Global({"value":"i32","mutable":true})}if(!currentModuleWeakSymbols.has(symName)){rtn.required=true}return rtn}};Module["GOTHandler"]=GOTHandler;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};Module["callRuntimeCallbacks"]=callRuntimeCallbacks;var decrementExceptionRefcount=ptr=>___cxa_decrement_exception_refcount(ptr);Module["decrementExceptionRefcount"]=decrementExceptionRefcount;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;Module["UTF8Decoder"]=UTF8Decoder;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{idx>>>=0;var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};Module["UTF8ArrayToString"]=UTF8ArrayToString;var getDylinkMetadata=binary=>{var offset=0;var end=0;function getU8(){return binary[offset++]}function getLEB(){var ret=0;var mul=1;while(1){var byte=binary[offset++];ret+=(byte&127)*mul;mul*=128;if(!(byte&128))break}return ret}function getString(){var len=getLEB();offset+=len;return UTF8ArrayToString(binary,offset-len,len)}function failIf(condition,message){if(condition)throw new Error(message)}var name="dylink.0";if(binary instanceof WebAssembly.Module){var dylinkSection=WebAssembly.Module.customSections(binary,name);if(dylinkSection.length===0){name="dylink";dylinkSection=WebAssembly.Module.customSections(binary,name)}failIf(dylinkSection.length===0,"need dylink section");binary=new Uint8Array(dylinkSection[0]);end=binary.length}else{var int32View=new Uint32Array(new Uint8Array(binary.subarray(0,24)).buffer);var magicNumberFound=int32View[0]==1836278016;failIf(!magicNumberFound,"need to see wasm magic number");failIf(binary[8]!==0,"need the dylink section to be first");offset=9;var section_size=getLEB();end=offset+section_size;name=getString()}var customSection={neededDynlibs:[],tlsExports:new Set,weakImports:new Set};if(name=="dylink"){customSection.memorySize=getLEB();customSection.memoryAlign=getLEB();customSection.tableSize=getLEB();customSection.tableAlign=getLEB();var neededDynlibsCount=getLEB();for(var i=0;i_emscripten_stack_get_current();Module["stackSave"]=stackSave;var stackRestore=val=>__emscripten_stack_restore(val);Module["stackRestore"]=stackRestore;var stackAlloc=sz=>__emscripten_stack_alloc(sz);Module["stackAlloc"]=stackAlloc;var UTF8ToString=(ptr,maxBytesToRead)=>{ptr>>>=0;return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""};Module["UTF8ToString"]=UTF8ToString;var getExceptionMessageCommon=ptr=>{var sp=stackSave();var type_addr_addr=stackAlloc(4);var message_addr_addr=stackAlloc(4);___get_exception_message(ptr,type_addr_addr,message_addr_addr);var type_addr=HEAPU32[type_addr_addr>>>2>>>0];var message_addr=HEAPU32[message_addr_addr>>>2>>>0];var type=UTF8ToString(type_addr);_free(type_addr);var message;if(message_addr){message=UTF8ToString(message_addr);_free(message_addr)}stackRestore(sp);return[type,message]};Module["getExceptionMessageCommon"]=getExceptionMessageCommon;var getExceptionMessage=ptr=>getExceptionMessageCommon(ptr);Module["getExceptionMessage"]=getExceptionMessage;function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>>0];case"i8":return HEAP8[ptr>>>0];case"i16":return HEAP16[ptr>>>1>>>0];case"i32":return HEAP32[ptr>>>2>>>0];case"i64":return HEAP64[ptr>>>3];case"float":return HEAPF32[ptr>>>2>>>0];case"double":return HEAPF64[ptr>>>3>>>0];case"*":return HEAPU32[ptr>>>2>>>0];default:abort(`invalid type for getValue: ${type}`)}}Module["getValue"]=getValue;var incrementExceptionRefcount=ptr=>___cxa_increment_exception_refcount(ptr);Module["incrementExceptionRefcount"]=incrementExceptionRefcount;var newDSO=(name,handle,syms)=>{var dso={refcount:Infinity,name:name,exports:syms,global:true};LDSO.loadedLibsByName[name]=dso;if(handle!=undefined){LDSO.loadedLibsByHandle[handle]=dso}return dso};Module["newDSO"]=newDSO;var LDSO={loadedLibsByName:{},loadedLibsByHandle:{},init(){newDSO("__main__",0,wasmImports)}};Module["LDSO"]=LDSO;var ___heap_base=9881584;Module["___heap_base"]=___heap_base;var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};Module["zeroMemory"]=zeroMemory;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;Module["alignMemory"]=alignMemory;var getMemory=size=>{if(runtimeInitialized){return zeroMemory(_malloc(size),size)}var ret=___heap_base;var end=ret+alignMemory(size,16);___heap_base=end;GOT["__heap_base"].value=end;return ret};Module["getMemory"]=getMemory;var isInternalSym=symName=>["__cpp_exception","__c_longjmp","__wasm_apply_data_relocs","__dso_handle","__tls_size","__tls_align","__set_stack_limits","_emscripten_tls_init","__wasm_init_tls","__wasm_call_ctors","__start_em_asm","__stop_em_asm","__start_em_js","__stop_em_js"].includes(symName)||symName.startsWith("__em_js__");Module["isInternalSym"]=isInternalSym;var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};Module["uleb128Encode"]=uleb128Encode;var sigToWasmTypes=sig=>{var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64","e":"externref","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={"i":127,"p":127,"j":126,"f":125,"d":124,"e":111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push(...typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{"e":{"f":func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};Module["convertJsFunctionToWasm"]=convertJsFunctionToWasm;var wasmTableMirror=[];Module["wasmTableMirror"]=wasmTableMirror;var wasmTable=new WebAssembly.Table({"initial":6648,"element":"anyfunc"});Module["wasmTable"]=wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};Module["getWasmTableEntry"]=getWasmTableEntry;var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};Module["getFunctionAddress"]=getFunctionAddress;var freeTableIndexes=[];Module["freeTableIndexes"]=freeTableIndexes;var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};Module["getEmptyTableSlot"]=getEmptyTableSlot;var setWasmTableEntry=(idx,func)=>{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};Module["setWasmTableEntry"]=setWasmTableEntry;var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};Module["addFunction"]=addFunction;var updateGOT=(exports,replace)=>{for(var symName in exports){if(isInternalSym(symName)){continue}var value=exports[symName];GOT[symName]||=new WebAssembly.Global({"value":"i32","mutable":true});if(replace||GOT[symName].value==0){if(typeof value=="function"){GOT[symName].value=addFunction(value)}else if(typeof value=="number"){GOT[symName].value=value}else{err(`unhandled export type for '${symName}': ${typeof value}`)}}}};Module["updateGOT"]=updateGOT;var relocateExports=(exports,memoryBase,replace)=>{var relocated={};for(var e in exports){var value=exports[e];if(typeof value=="object"){value=value.value}if(typeof value=="number"){value+=memoryBase}relocated[e]=value}updateGOT(relocated,replace);return relocated};Module["relocateExports"]=relocateExports;var isSymbolDefined=symName=>{var existing=wasmImports[symName];if(!existing||existing.stub){return false}return true};Module["isSymbolDefined"]=isSymbolDefined;var dynCall=(sig,ptr,args=[])=>{var rtn=getWasmTableEntry(ptr)(...args);return sig[0]=="p"?rtn>>>0:rtn};Module["dynCall"]=dynCall;var createInvokeFunction=sig=>function(){var sp=stackSave();try{return dynCall(sig,arguments[0],Array.prototype.slice.call(arguments,1))}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);if(sig[0]=="j")return 0n}};Module["createInvokeFunction"]=createInvokeFunction;var resolveGlobalSymbol=(symName,direct=false)=>{var sym;if(isSymbolDefined(symName)){sym=wasmImports[symName]}else if(symName.startsWith("invoke_")){sym=wasmImports[symName]=Module.createInvoke(symName.split("_")[1])}else if(symName.startsWith("__cxa_find_matching_catch_")){sym=wasmImports[symName]=function(){var args=Array.from(arguments);var rtn=findMatchingCatch(args);return rtn}}return{sym:sym,name:symName}};Module["resolveGlobalSymbol"]=resolveGlobalSymbol;var loadWebAssemblyModule=(binary,flags,libName,localScope,handle)=>{var metadata=getDylinkMetadata(binary);currentModuleWeakSymbols=metadata.weakImports;function loadModule(){var firstLoad=!handle||!HEAP8[handle+8>>>0];if(firstLoad){var memAlign=Math.pow(2,metadata.memoryAlign);var memoryBase=metadata.memorySize?alignMemory(getMemory(metadata.memorySize+memAlign),memAlign):0;var tableBase=metadata.tableSize?wasmTable.length:0;if(handle){HEAP8[handle+8>>>0]=1;HEAPU32[handle+12>>>2>>>0]=memoryBase;HEAP32[handle+16>>>2>>>0]=metadata.memorySize;HEAPU32[handle+20>>>2>>>0]=tableBase;HEAP32[handle+24>>>2>>>0]=metadata.tableSize}}else{memoryBase=HEAPU32[handle+12>>>2>>>0];tableBase=HEAPU32[handle+20>>>2>>>0]}var tableGrowthNeeded=tableBase+metadata.tableSize-wasmTable.length;if(tableGrowthNeeded>0){wasmTable.grow(tableGrowthNeeded)}var moduleExports;function resolveSymbol(sym){var resolved=resolveGlobalSymbol(sym).sym;if(!resolved&&localScope){resolved=localScope[sym]}if(!resolved){resolved=moduleExports[sym]}return resolved}var proxyHandler={get(stubs,prop){switch(prop){case"__memory_base":return memoryBase;case"__table_base":return tableBase}if(prop in wasmImports&&!wasmImports[prop].stub){return wasmImports[prop]}if(!(prop in stubs)){var resolved;stubs[prop]=(...args)=>{resolved||=resolveSymbol(prop);if(!resolved){throw new Error(`Dynamic linking error: cannot resolve symbol ${prop}`)}return resolved(...args)}}return stubs[prop]}};var proxy=new Proxy({},proxyHandler);var info={"GOT.mem":new Proxy({},GOTHandler),"GOT.func":new Proxy({},GOTHandler),"env":proxy,"wasi_snapshot_preview1":proxy};function postInstantiation(module,instance){updateTableMap(tableBase,metadata.tableSize);moduleExports=relocateExports(instance.exports,memoryBase);if(!flags.allowUndefined){reportUndefinedSymbols()}function addEmAsm(addr,body){var args=[];var arity=0;for(;arity<16;arity++){if(body.indexOf("$"+arity)!=-1){args.push("$"+arity)}else{break}}args=args.join(",");var func=`(${args}) => { ${body} };`;ASM_CONSTS[start]=eval(func)}if("__start_em_asm"in moduleExports){var start=moduleExports["__start_em_asm"];var stop=moduleExports["__stop_em_asm"];while(start ${body};`;moduleExports[name]=eval(func)}for(var name in moduleExports){if(name.startsWith("__em_js__")){var start=moduleExports[name];var jsString=UTF8ToString(start);var parts=jsString.split("<::>");addEmJs(name.replace("__em_js__",""),parts[0],parts[1]);delete moduleExports[name]}}var applyRelocs=moduleExports["__wasm_apply_data_relocs"];if(applyRelocs){if(runtimeInitialized){applyRelocs()}else{__RELOC_FUNCS__.push(applyRelocs)}}var init=moduleExports["__wasm_call_ctors"];if(init){if(runtimeInitialized){init()}else{__ATINIT__.push(init)}}return moduleExports}if(flags.loadAsync){if(binary instanceof WebAssembly.Module){var instance=new WebAssembly.Instance(binary,info);return Promise.resolve(postInstantiation(binary,instance))}return WebAssembly.instantiate(binary,info).then(result=>postInstantiation(result.module,result.instance))}var module=binary instanceof WebAssembly.Module?binary:new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return postInstantiation(module,instance)}if(flags.loadAsync){return metadata.neededDynlibs.reduce((chain,dynNeeded)=>chain.then(()=>loadDynamicLibrary(dynNeeded,flags,localScope)),Promise.resolve()).then(loadModule)}metadata.neededDynlibs.forEach(needed=>loadDynamicLibrary(needed,flags,localScope));return loadModule()};Module["loadWebAssemblyModule"]=loadWebAssemblyModule;var mergeLibSymbols=(exports,libName)=>{for(var[sym,exp]of Object.entries(exports)){const setImport=target=>{if(!isSymbolDefined(target)){wasmImports[target]=exp}};setImport(sym);const main_alias="__main_argc_argv";if(sym=="main"){setImport(main_alias)}if(sym==main_alias){setImport("main")}if(sym.startsWith("dynCall_")&&!Module.hasOwnProperty(sym)){Module[sym]=exp}}};Module["mergeLibSymbols"]=mergeLibSymbols;var asyncLoad=(url,onload,onerror,noRunDep)=>{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};Module["asyncLoad"]=asyncLoad;var preloadPlugins=Module["preloadPlugins"]||[];Module["preloadPlugins"]=preloadPlugins;var registerWasmPlugin=()=>{var wasmPlugin={"promiseChainEnd":Promise.resolve(),"canHandle":name=>!Module.noWasmDecoding&&name.endsWith(".so"),"handle":(byteArray,name,onload,onerror)=>{wasmPlugin["promiseChainEnd"]=wasmPlugin["promiseChainEnd"].then(()=>loadWebAssemblyModule(byteArray,{loadAsync:true,nodelete:true},name,{})).then(exports=>{preloadedWasm[name]=exports;onload(byteArray)},error=>{err(`failed to instantiate wasm: ${name}: ${error}`);onerror()})}};preloadPlugins.push(wasmPlugin)};Module["registerWasmPlugin"]=registerWasmPlugin;var preloadedWasm={};Module["preloadedWasm"]=preloadedWasm;function loadDynamicLibrary(libName,flags={global:true,nodelete:true},localScope,handle){var dso=LDSO.loadedLibsByName[libName];if(dso){if(!flags.global){if(localScope){Object.assign(localScope,dso.exports)}}else if(!dso.global){dso.global=true;mergeLibSymbols(dso.exports,libName)}if(flags.nodelete&&dso.refcount!==Infinity){dso.refcount=Infinity}dso.refcount++;if(handle){LDSO.loadedLibsByHandle[handle]=dso}return flags.loadAsync?Promise.resolve(true):true}dso=newDSO(libName,handle,"loading");dso.refcount=flags.nodelete?Infinity:1;dso.global=flags.global;function loadLibData(){var libData;if(handle){var data=HEAPU32[handle+28>>>2>>>0];var dataSize=HEAPU32[handle+32>>>2>>>0];if(data&&dataSize){libData=HEAP8.slice(data,data+dataSize)}}if(!libData&&flags.fs&&flags.fs.findObject(libName)){libData=flags.fs.readFile(libName,{encoding:"binary"});if(!(libData instanceof Uint8Array)){libData=new Uint8Array(libData)}}if(libData){return flags.loadAsync?Promise.resolve(libData):libData}var libFile=locateFile(libName);if(flags.loadAsync){return new Promise(function(resolve,reject){asyncLoad(libFile,resolve,reject)})}if(!readBinary){throw new Error(`${libFile}: file not found, and synchronous loading of external files is not available`)}return readBinary(libFile)}function getExports(){var preloaded=preloadedWasm[libName];if(preloaded){return flags.loadAsync?Promise.resolve(preloaded):preloaded}if(flags.loadAsync){return loadLibData().then(libData=>loadWebAssemblyModule(libData,flags,libName,localScope,handle))}return loadWebAssemblyModule(loadLibData(),flags,libName,localScope,handle)}function moduleLoaded(exports){if(dso.global){mergeLibSymbols(exports,libName)}else if(localScope){Object.assign(localScope,exports)}dso.exports=exports}if(flags.loadAsync){return getExports().then(exports=>{moduleLoaded(exports);return true})}moduleLoaded(getExports());return true}Module["loadDynamicLibrary"]=loadDynamicLibrary;var reportUndefinedSymbols=()=>{for(var[symName,entry]of Object.entries(GOT)){if(entry.value==0){var value=resolveGlobalSymbol(symName,true).sym;if(!value&&!entry.required){continue}if(typeof value=="function"){entry.value=addFunction(value,value.sig)}else if(typeof value=="number"){entry.value=value}else{throw new Error(`bad export type for '${symName}': ${typeof value}`)}}}};Module["reportUndefinedSymbols"]=reportUndefinedSymbols;var loadDylibs=()=>{if(!dynamicLibraries.length){reportUndefinedSymbols();return}addRunDependency("loadDylibs");dynamicLibraries.reduce((chain,lib)=>chain.then(()=>loadDynamicLibrary(lib,{loadAsync:true,global:true,nodelete:true,allowUndefined:true})),Promise.resolve()).then(()=>{reportUndefinedSymbols();removeRunDependency("loadDylibs")})};Module["loadDylibs"]=loadDylibs;var noExitRuntime=Module["noExitRuntime"]||true;Module["noExitRuntime"]=noExitRuntime;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>>0]=value;break;case"i8":HEAP8[ptr>>>0]=value;break;case"i16":HEAP16[ptr>>>1>>>0]=value;break;case"i32":HEAP32[ptr>>>2>>>0]=value;break;case"i64":HEAP64[ptr>>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>>2>>>0]=value;break;case"double":HEAPF64[ptr>>>3>>>0]=value;break;case"*":HEAPU32[ptr>>>2>>>0]=value;break;default:abort(`invalid type for setValue: ${type}`)}}Module["setValue"]=setValue;var MAX_INT53=9007199254740992;Module["MAX_INT53"]=MAX_INT53;var MIN_INT53=-9007199254740992;Module["MIN_INT53"]=MIN_INT53;var bigintToI53Checked=num=>numMAX_INT53?NaN:Number(num);Module["bigintToI53Checked"]=bigintToI53Checked;function ___assert_fail(condition,filename,line,func){condition>>>=0;filename>>>=0;func>>>=0;abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}Module["___assert_fail"]=___assert_fail;___assert_fail.sig="vppip";function ___call_sighandler(fp,sig){fp>>>=0;return getWasmTableEntry(fp)(sig)}Module["___call_sighandler"]=___call_sighandler;___call_sighandler.sig="vpi";var exceptionCaught=[];Module["exceptionCaught"]=exceptionCaught;var uncaughtExceptionCount=0;Module["uncaughtExceptionCount"]=uncaughtExceptionCount;function ___cxa_begin_catch(ptr){ptr>>>=0;var info=new ExceptionInfo(ptr);if(!info.get_caught()){info.set_caught(true);uncaughtExceptionCount--}info.set_rethrown(false);exceptionCaught.push(info);___cxa_increment_exception_refcount(info.excPtr);return info.get_exception_ptr()}Module["___cxa_begin_catch"]=___cxa_begin_catch;___cxa_begin_catch.sig="pp";function ___cxa_current_primary_exception(){if(!exceptionCaught.length){return 0}var info=exceptionCaught[exceptionCaught.length-1];___cxa_increment_exception_refcount(info.excPtr);return info.excPtr}Module["___cxa_current_primary_exception"]=___cxa_current_primary_exception;___cxa_current_primary_exception.sig="p";var exceptionLast=0;Module["exceptionLast"]=exceptionLast;var ___cxa_end_catch=()=>{_setThrew(0,0);var info=exceptionCaught.pop();___cxa_decrement_exception_refcount(info.excPtr);exceptionLast=0};Module["___cxa_end_catch"]=___cxa_end_catch;___cxa_end_catch.sig="v";class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>>2>>>0]=type}get_type(){return HEAPU32[this.ptr+4>>>2>>>0]}set_destructor(destructor){HEAPU32[this.ptr+8>>>2>>>0]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>>2>>>0]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12>>>0]=caught}get_caught(){return HEAP8[this.ptr+12>>>0]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>>0]=rethrown}get_rethrown(){return HEAP8[this.ptr+13>>>0]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>>2>>>0]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>>2>>>0]}get_exception_ptr(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>>2>>>0]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}Module["ExceptionInfo"]=ExceptionInfo;function ___resumeException(ptr){ptr>>>=0;if(!exceptionLast){exceptionLast=ptr}throw Module.wrapException(exceptionLast)}Module["___resumeException"]=___resumeException;___resumeException.sig="vp";var setTempRet0=val=>__emscripten_tempret_set(val);Module["setTempRet0"]=setTempRet0;var findMatchingCatch=args=>{var thrown=exceptionLast;if(!thrown){setTempRet0(0);return 0}var info=new ExceptionInfo(thrown);info.set_adjusted_ptr(thrown);var thrownType=info.get_type();if(!thrownType){setTempRet0(0);return thrown}for(var arg in args){var caughtType=args[arg];if(caughtType===0||caughtType===thrownType){break}var adjusted_ptr_addr=info.ptr+16;if(___cxa_can_catch(caughtType,thrownType,adjusted_ptr_addr)){setTempRet0(caughtType);return thrown}}setTempRet0(thrownType);return thrown};Module["findMatchingCatch"]=findMatchingCatch;function ___cxa_find_matching_catch_2(){return findMatchingCatch([])}Module["___cxa_find_matching_catch_2"]=___cxa_find_matching_catch_2;___cxa_find_matching_catch_2.sig="p";function ___cxa_find_matching_catch_3(arg0){arg0>>>=0;return findMatchingCatch([arg0])}Module["___cxa_find_matching_catch_3"]=___cxa_find_matching_catch_3;___cxa_find_matching_catch_3.sig="pp";var ___cxa_rethrow=()=>{var info=exceptionCaught.pop();if(!info){abort("no exception to throw")}var ptr=info.excPtr;if(!info.get_rethrown()){exceptionCaught.push(info);info.set_rethrown(true);info.set_caught(false);uncaughtExceptionCount++}exceptionLast=ptr;throw Module.wrapException(exceptionLast)};Module["___cxa_rethrow"]=___cxa_rethrow;___cxa_rethrow.sig="v";function ___cxa_rethrow_primary_exception(ptr){ptr>>>=0;if(!ptr)return;var info=new ExceptionInfo(ptr);exceptionCaught.push(info);info.set_rethrown(true);___cxa_rethrow()}Module["___cxa_rethrow_primary_exception"]=___cxa_rethrow_primary_exception;___cxa_rethrow_primary_exception.sig="vp";function ___cxa_throw(ptr,type,destructor){ptr>>>=0;type>>>=0;destructor>>>=0;var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw Module.wrapException(exceptionLast)}Module["___cxa_throw"]=___cxa_throw;___cxa_throw.sig="vppp";var ___cxa_uncaught_exceptions=()=>uncaughtExceptionCount;Module["___cxa_uncaught_exceptions"]=___cxa_uncaught_exceptions;___cxa_uncaught_exceptions.sig="i";var ___memory_base=new WebAssembly.Global({"value":"i32","mutable":false},1024);Module["___memory_base"]=___memory_base;var ___stack_high=9881584;Module["___stack_high"]=___stack_high;var ___stack_low=4638704;Module["___stack_low"]=___stack_low;var ___stack_pointer=new WebAssembly.Global({"value":"i32","mutable":true},9881584);Module["___stack_pointer"]=___stack_pointer;var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};Module["PATH"]=PATH;var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};Module["initRandomFill"]=initRandomFill;var randomFill=view=>(randomFill=initRandomFill())(view);Module["randomFill"]=randomFill;var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};Module["lengthBytesUTF8"]=lengthBytesUTF8;var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{outIdx>>>=0;if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++>>>0]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++>>>0]=192|u>>6;heap[outIdx++>>>0]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++>>>0]=224|u>>12;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++>>>0]=240|u>>18;heap[outIdx++>>>0]=128|u>>12&63;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}}heap[outIdx>>>0]=0;return outIdx-startIdx};Module["stringToUTF8Array"]=stringToUTF8Array;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};Module["FS_stdin_getChar"]=FS_stdin_getChar;var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};Module["TTY"]=TTY;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)};Module["mmapAlloc"]=mmapAlloc;var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length>>0)}return{ptr:ptr,allocated:allocated}},msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};Module["MEMFS"]=MEMFS;var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};Module["FS_createDataFile"]=FS_createDataFile;var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};Module["FS_handledByPreloadPlugin"]=FS_handledByPreloadPlugin;var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};Module["FS_createPreloadedFile"]=FS_createPreloadedFile;var FS_modeStringToFlags=str=>{var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};Module["FS_modeStringToFlags"]=FS_modeStringToFlags;var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};Module["FS_getMode"]=FS_getMode;var IDBFS={dbs:{},indexedDB:()=>{if(typeof indexedDB!="undefined")return indexedDB;var ret=null;if(typeof window=="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:(...args)=>MEMFS.mount(...args),syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(value=>value.close());IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=e=>{callback(e.target.error);e.preventDefault()}},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>PATH.join2(root,p)}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push(...FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={"timestamp":stat.mtime}}return callback(null,{type:"local",entries:entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=e=>{callback(e.target.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={"timestamp":cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{"timestamp":stat.mtime,"mode":stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{"timestamp":stat.mtime,"mode":stat.mode,"contents":node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=event=>callback(null,event.target.result);req.onerror=e=>{callback(e.target.error);e.preventDefault()}},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=event=>callback();req.onerror=e=>{callback(e.target.error);e.preventDefault()}},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=event=>callback();req.onerror=e=>{callback(e.target.error);e.preventDefault()}},reconcile:(src,dst,callback)=>{var total=0;var create=[];Object.keys(src.entries).forEach(function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(function(key){if(!src.entries[key]){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=transaction.onabort=e=>{done(e.target.error);e.preventDefault()};transaction.oncomplete=e=>{if(!errored){callback(null)}};create.sort().forEach(path=>{if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(path=>{if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};Module["IDBFS"]=IDBFS;var ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};Module["ERRNO_CODES"]=ERRNO_CODES;var NODEFS={isWindows:false,staticInit(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process.binding("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],256:flags["O_NOCTTY"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"],131072:flags["O_NOFOLLOW"]}},convertNodeCode(e){var code=e.code;return ERRNO_CODES[code]},mount(mount){return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(28)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}return stat.mode},realPath(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join(...parts)},flagsForNode(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;flags&=~65536;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(flags){throw new FS.ErrnoError(28)}return newFlags},node_ops:{getattr(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},lookup(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}return node},rename(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}oldNode.name=newName},unlink(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},rmdir(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},readdir(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},symlink(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},readlink(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=nodePath.relative(nodePath.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;if(e.code==="UNKNOWN")throw new FS.ErrnoError(28);throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}}},stream_ops:{open(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.shared.refcount=1;stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},close(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd&&--stream.shared.refcount===0){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},dup(stream){stream.shared.refcount++},read(stream,buffer,offset,length,position){if(length===0)return 0;try{return fs.readSync(stream.nfd,new Int8Array(buffer.buffer,offset,length),{position:position})}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},write(stream,buffer,offset,length,position){try{return fs.writeSync(stream.nfd,new Int8Array(buffer.buffer,offset,length),{position:position})}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr=mmapAlloc(length);NODEFS.stream_ops.read(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}},msync(stream,buffer,offset,length,mmapFlags){NODEFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};Module["NODEFS"]=NODEFS;var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size},write(stream,buffer,offset,length,position){throw new FS.ErrnoError(29)},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(28)}return position}}};Module["WORKERFS"]=WORKERFS;var PROXYFS={mount(mount){return PROXYFS.createNode(null,"/",mount.opts.fs.lstat(mount.opts.root).mode,0)},createNode(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=PROXYFS.node_ops;node.stream_ops=PROXYFS.stream_ops;return node},realPath(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join(...parts)},node_ops:{getattr(node){var path=PROXYFS.realPath(node);var stat;try{stat=node.mount.opts.fs.lstat(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr(node,attr){var path=PROXYFS.realPath(node);try{if(attr.mode!==undefined){node.mount.opts.fs.chmod(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);node.mount.opts.fs.utime(path,date,date)}if(attr.size!==undefined){node.mount.opts.fs.truncate(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},lookup(parent,name){try{var path=PATH.join2(PROXYFS.realPath(parent),name);var mode=parent.mount.opts.fs.lstat(path).mode;var node=PROXYFS.createNode(parent,name,mode);return node}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},mknod(parent,name,mode,dev){var node=PROXYFS.createNode(parent,name,mode,dev);var path=PROXYFS.realPath(node);try{if(FS.isDir(node.mode)){node.mount.opts.fs.mkdir(path,node.mode)}else{node.mount.opts.fs.writeFile(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node},rename(oldNode,newDir,newName){var oldPath=PROXYFS.realPath(oldNode);var newPath=PATH.join2(PROXYFS.realPath(newDir),newName);try{oldNode.mount.opts.fs.rename(oldPath,newPath);oldNode.name=newName;oldNode.parent=newDir}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},unlink(parent,name){var path=PATH.join2(PROXYFS.realPath(parent),name);try{parent.mount.opts.fs.unlink(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},rmdir(parent,name){var path=PATH.join2(PROXYFS.realPath(parent),name);try{parent.mount.opts.fs.rmdir(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},readdir(node){var path=PROXYFS.realPath(node);try{return node.mount.opts.fs.readdir(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},symlink(parent,newName,oldPath){var newPath=PATH.join2(PROXYFS.realPath(parent),newName);try{parent.mount.opts.fs.symlink(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},readlink(node){var path=PROXYFS.realPath(node);try{return node.mount.opts.fs.readlink(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}},stream_ops:{open(stream){var path=PROXYFS.realPath(stream.node);try{stream.nfd=stream.node.mount.opts.fs.open(path,stream.flags)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},close(stream){try{stream.node.mount.opts.fs.close(stream.nfd)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},read(stream,buffer,offset,length,position){try{return stream.node.mount.opts.fs.read(stream.nfd,buffer,offset,length,position)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},write(stream,buffer,offset,length,position){try{return stream.node.mount.opts.fs.write(stream.nfd,buffer,offset,length,position)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=stream.node.node_ops.getattr(stream.node);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}}};Module["PROXYFS"]=PROXYFS;var LZ4={DIR_MODE:16895,FILE_MODE:33279,CHUNK_SIZE:-1,codec:null,init(){if(LZ4.codec)return;LZ4.codec=function(){var MiniLZ4=function(){var exports={};exports.uncompress=function(input,output,sIdx,eIdx){sIdx=sIdx||0;eIdx=eIdx||input.length-sIdx;for(var i=sIdx,n=eIdx,j=0;i>4;if(literals_length>0){var l=literals_length+240;while(l===255){l=input[i++];literals_length+=l}var end=i+literals_length;while(ij)return-(i-2);var match_length=token&15;var l=match_length+240;while(l===255){l=input[i++];match_length+=l}var pos=j-offset;var end=j+match_length+4;while(jmaxInputSize?0:isize+isize/255+16|0};exports.compress=function(src,dst,sIdx,eIdx){hashTable.set(empty);return compressBlock(src,dst,0,sIdx||0,eIdx||dst.length)};function compressBlock(src,dst,pos,sIdx,eIdx){var dpos=sIdx;var dlen=eIdx-sIdx;var anchor=0;if(src.length>=maxInputSize)throw new Error("input too large");if(src.length>mfLimit){var n=exports.compressBound(src.length);if(dlen>>hashShift;var ref=hashTable[hash]-1;hashTable[hash]=pos+1;if(ref<0||pos-ref>>>16>0||((src[ref+3]<<8|src[ref+2])!=sequenceHighBits||(src[ref+1]<<8|src[ref])!=sequenceLowBits)){step=findMatchAttempts++>>skipStrength;pos+=step;continue}findMatchAttempts=(1<=runMask){dst[dpos++]=(runMask<254;len-=255){dst[dpos++]=255}dst[dpos++]=len}else{dst[dpos++]=(literals_length<>8;if(match_length>=mlMask){match_length-=mlMask;while(match_length>=255){match_length-=255;dst[dpos++]=255}dst[dpos++]=match_length}anchor=pos}}if(anchor==0)return 0;literals_length=src.length-anchor;if(literals_length>=runMask){dst[dpos++]=runMask<254;ln-=255){dst[dpos++]=255}dst[dpos++]=ln}else{dst[dpos++]=literals_length<0){assert(compressedSize<=bound);compressed=compressed.subarray(0,compressedSize);compressedChunks.push(compressed);total+=compressedSize;successes.push(1);if(verify){var back=exports.uncompress(compressed,temp);assert(back===chunk.length,[back,chunk.length]);for(var i=0;i{var dir=PATH.dirname(file.filename);var name=PATH.basename(file.filename);FS.createPath("",dir,true,true);var parent=FS.analyzePath(dir).object;LZ4.createNode(parent,name,LZ4.FILE_MODE,0,{compressedData:compressedData,start:file.start,end:file.end})});if(preloadPlugin){Browser.init();pack["metadata"].files.forEach(file=>{var handled=false;var fullname=file.filename;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){var dep=getUniqueRunDependency("fp "+fullname);addRunDependency(dep);var finish=()=>removeRunDependency(dep);var byteArray=FS.readFile(fullname);plugin["handle"](byteArray,fullname,finish,finish);handled=true}})})}},createNode(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=LZ4.node_ops;node.stream_ops=LZ4.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(LZ4.FILE_MODE!==LZ4.DIR_MODE);if(mode===LZ4.FILE_MODE){node.size=contents.end-contents.start;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node},node_ops:{getattr(node){return{dev:1,ino:node.id,mode:node.mode,nlink:1,uid:0,gid:0,rdev:0,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}},lookup(parent,name){throw new FS.ErrnoError(44)},mknod(parent,name,mode,dev){throw new FS.ErrnoError(63)},rename(oldNode,newDir,newName){throw new FS.ErrnoError(63)},unlink(parent,name){throw new FS.ErrnoError(63)},rmdir(parent,name){throw new FS.ErrnoError(63)},readdir(node){throw new FS.ErrnoError(63)},symlink(parent,newName,oldPath){throw new FS.ErrnoError(63)}},stream_ops:{read(stream,buffer,offset,length,position){length=Math.min(length,stream.node.size-position);if(length<=0)return 0;var contents=stream.node.contents;var compressedData=contents.compressedData;var written=0;while(written=0){currChunk=compressedData["cachedChunks"][found]}else{compressedData["cachedIndexes"].pop();compressedData["cachedIndexes"].unshift(chunkIndex);currChunk=compressedData["cachedChunks"].pop();compressedData["cachedChunks"].unshift(currChunk);if(compressedData["debug"]){out("decompressing chunk "+chunkIndex);Module["decompressedChunks"]=(Module["decompressedChunks"]||0)+1}var compressed=compressedData["data"].subarray(compressedStart,compressedStart+compressedSize);var originalSize=LZ4.codec.uncompress(compressed,currChunk);if(chunkIndex8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;if(FS.trackingDelegate["onMakeDirectory"]){FS.trackingDelegate["onMakeDirectory"](path,mode)}return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""});FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS,"PROXYFS":PROXYFS}},init(input,output,error){FS.init.initialized=true;Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;_fflush(0);for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};Module["FS"]=FS;var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>>2>>>0]=stat.dev;HEAP32[buf+4>>>2>>>0]=stat.mode;HEAPU32[buf+8>>>2>>>0]=stat.nlink;HEAP32[buf+12>>>2>>>0]=stat.uid;HEAP32[buf+16>>>2>>>0]=stat.gid;HEAP32[buf+20>>>2>>>0]=stat.rdev;HEAP64[buf+24>>>3]=BigInt(stat.size);HEAP32[buf+32>>>2>>>0]=4096;HEAP32[buf+36>>>2>>>0]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>>2>>>0]=atime%1e3*1e3;HEAP64[buf+56>>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>>2>>>0]=mtime%1e3*1e3;HEAP64[buf+72>>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>>2>>>0]=ctime%1e3*1e3;HEAP64[buf+88>>>3]=BigInt(stat.ino);return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};Module["SYSCALLS"]=SYSCALLS;function ___syscall__newselect(nfds,readfds,writefds,exceptfds,timeout){readfds>>>=0;writefds>>>=0;exceptfds>>>=0;timeout>>>=0;try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>>2>>>0]:0,srcReadHigh=readfds?HEAP32[readfds+4>>>2>>>0]:0;var srcWriteLow=writefds?HEAP32[writefds>>>2>>>0]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>>2>>>0]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>>2>>>0]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>>2>>>0]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>>2>>>0]:0)|(writefds?HEAP32[writefds>>>2>>>0]:0)|(exceptfds?HEAP32[exceptfds>>>2>>>0]:0);var allHigh=(readfds?HEAP32[readfds+4>>>2>>>0]:0)|(writefds?HEAP32[writefds+4>>>2>>>0]:0)|(exceptfds?HEAP32[exceptfds+4>>>2>>>0]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd>>2>>>0]:0,tv_usec=readfds?HEAP32[timeout+4>>>2>>>0]:0;timeoutInMillis=(tv_sec+tv_usec/1e6)*1e3}flags=stream.stream_ops.poll(stream,timeoutInMillis)}if(flags&1&&check(fd,srcReadLow,srcReadHigh,mask)){fd<32?dstReadLow=dstReadLow|mask:dstReadHigh=dstReadHigh|mask;total++}if(flags&4&&check(fd,srcWriteLow,srcWriteHigh,mask)){fd<32?dstWriteLow=dstWriteLow|mask:dstWriteHigh=dstWriteHigh|mask;total++}if(flags&2&&check(fd,srcExceptLow,srcExceptHigh,mask)){fd<32?dstExceptLow=dstExceptLow|mask:dstExceptHigh=dstExceptHigh|mask;total++}}if(readfds){HEAP32[readfds>>>2>>>0]=dstReadLow;HEAP32[readfds+4>>>2>>>0]=dstReadHigh}if(writefds){HEAP32[writefds>>>2>>>0]=dstWriteLow;HEAP32[writefds+4>>>2>>>0]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>>2>>>0]=dstExceptLow;HEAP32[exceptfds+4>>>2>>>0]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall__newselect"]=___syscall__newselect;___syscall__newselect.sig="iipppp";var SOCKFS={mount(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer(sock,addr,port){return sock.peers[addr+":"+port]},addPeer(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>>2>>>0]=bytes;return 0;default:return 28}},close(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i{var socket=SOCKFS.getSocket(fd);if(!socket)throw new FS.ErrnoError(8);return socket};Module["getSocketFromFD"]=getSocketFromFD;var Sockets={BUFFER_SIZE:10240,MAX_BUFFER_SIZE:10485760,nextFd:1,fds:{},nextport:1,maxport:65535,peer:null,connections:{},portmap:{},localAddr:4261412874,addrPool:[33554442,50331658,67108874,83886090,100663306,117440522,134217738,150994954,167772170,184549386,201326602,218103818,234881034]};Module["Sockets"]=Sockets;var inetPton4=str=>{var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0};Module["inetPton4"]=inetPton4;var jstoi_q=str=>parseInt(str);Module["jstoi_q"]=jstoi_q;var inetPton6=str=>{var words;var w,offset,z,i;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w{switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){HEAP32[addrlen>>>2>>>0]=16}HEAP16[sa>>>1>>>0]=family;HEAP32[sa+4>>>2>>>0]=addr;HEAP16[sa+2>>>1>>>0]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>>2>>>0]=28}HEAP32[sa>>>2>>>0]=family;HEAP32[sa+8>>>2>>>0]=addr[0];HEAP32[sa+12>>>2>>>0]=addr[1];HEAP32[sa+16>>>2>>>0]=addr[2];HEAP32[sa+20>>>2>>>0]=addr[3];HEAP16[sa+2>>>1>>>0]=_htons(port);break;default:return 5}return 0};Module["writeSockaddr"]=writeSockaddr;var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};Module["DNS"]=DNS;function ___syscall_accept4(fd,addr,addrlen,flags,d1,d2){addr>>>=0;addrlen>>>=0;try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_accept4"]=___syscall_accept4;___syscall_accept4.sig="iippiii";var inetNtop4=addr=>(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255);Module["inetNtop4"]=inetNtop4;var inetNtop6=ints=>{var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word{var family=HEAP16[sa>>>1>>>0];var port=_ntohs(HEAPU16[sa+2>>>1>>>0]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>>2>>>0];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>>2>>>0],HEAP32[sa+12>>>2>>>0],HEAP32[sa+16>>>2>>>0],HEAP32[sa+20>>>2>>>0]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}};Module["readSockaddr"]=readSockaddr;var getSocketAddress=(addrp,addrlen,allowNull)=>{if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info};Module["getSocketAddress"]=getSocketAddress;function ___syscall_bind(fd,addr,addrlen,d1,d2,d3){addr>>>=0;addrlen>>>=0;try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_bind"]=___syscall_bind;___syscall_bind.sig="iippiii";function ___syscall_chdir(path){path>>>=0;try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_chdir"]=___syscall_chdir;___syscall_chdir.sig="ip";function ___syscall_chmod(path,mode){path>>>=0;try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_chmod"]=___syscall_chmod;___syscall_chmod.sig="ipi";function ___syscall_connect(fd,addr,addrlen,d1,d2,d3){addr>>>=0;addrlen>>>=0;try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_connect"]=___syscall_connect;___syscall_connect.sig="iippiii";function ___syscall_dup(fd){try{var old=SYSCALLS.getStreamFromFD(fd);return FS.dupStream(old).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_dup"]=___syscall_dup;___syscall_dup.sig="ii";function ___syscall_dup3(fd,newfd,flags){try{var old=SYSCALLS.getStreamFromFD(fd);if(old.fd===newfd)return-28;var existing=FS.getStream(newfd);if(existing)FS.close(existing);return FS.dupStream(old,newfd).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_dup3"]=___syscall_dup3;___syscall_dup3.sig="iiii";function ___syscall_faccessat(dirfd,path,amode,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_faccessat"]=___syscall_faccessat;___syscall_faccessat.sig="iipii";var ___syscall_fadvise64=(fd,offset,len,advice)=>0;Module["___syscall_fadvise64"]=___syscall_fadvise64;___syscall_fadvise64.sig="iijji";function ___syscall_fallocate(fd,mode,offset,len){offset=bigintToI53Checked(offset);len=bigintToI53Checked(len);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.allocate(stream,offset,len);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fallocate"]=___syscall_fallocate;___syscall_fallocate.sig="iiijj";function ___syscall_fchdir(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.chdir(stream.path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchdir"]=___syscall_fchdir;___syscall_fchdir.sig="ii";function ___syscall_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchmod"]=___syscall_fchmod;___syscall_fchmod.sig="iii";function ___syscall_fchmodat2(dirfd,path,mode,flags){path>>>=0;try{var nofollow=flags&256;path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);FS.chmod(path,mode,nofollow);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchmodat2"]=___syscall_fchmodat2;___syscall_fchmodat2.sig="iipii";function ___syscall_fchown32(fd,owner,group){try{FS.fchown(fd,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchown32"]=___syscall_fchown32;___syscall_fchown32.sig="iiii";function ___syscall_fchownat(dirfd,path,owner,group,flags){path>>>=0;try{path=SYSCALLS.getStr(path);var nofollow=flags&256;flags=flags&~256;path=SYSCALLS.calculateAt(dirfd,path);(nofollow?FS.lchown:FS.chown)(path,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fchownat"]=___syscall_fchownat;___syscall_fchownat.sig="iipiii";function syscallGetVarargI(){var ret=HEAP32[+SYSCALLS.varargs>>>2>>>0];SYSCALLS.varargs+=4;return ret}Module["syscallGetVarargI"]=syscallGetVarargI;var syscallGetVarargP=syscallGetVarargI;Module["syscallGetVarargP"]=syscallGetVarargP;function ___syscall_fcntl64(fd,cmd,varargs){varargs>>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>>1>>>0]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fcntl64"]=___syscall_fcntl64;___syscall_fcntl64.sig="iiip";function ___syscall_fdatasync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fdatasync"]=___syscall_fdatasync;___syscall_fdatasync.sig="ii";function ___syscall_fstat64(fd,buf){buf>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fstat64"]=___syscall_fstat64;___syscall_fstat64.sig="iip";function ___syscall_statfs64(path,size,buf){path>>>=0;size>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>>2>>>0]=4096;HEAP32[buf+40>>>2>>>0]=4096;HEAP32[buf+8>>>2>>>0]=1e6;HEAP32[buf+12>>>2>>>0]=5e5;HEAP32[buf+16>>>2>>>0]=5e5;HEAP32[buf+20>>>2>>>0]=FS.nextInode;HEAP32[buf+24>>>2>>>0]=1e6;HEAP32[buf+28>>>2>>>0]=42;HEAP32[buf+44>>>2>>>0]=2;HEAP32[buf+36>>>2>>>0]=255;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_statfs64"]=___syscall_statfs64;___syscall_statfs64.sig="ippp";function ___syscall_fstatfs64(fd,size,buf){size>>>=0;buf>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);return ___syscall_statfs64(0,size,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_fstatfs64"]=___syscall_fstatfs64;___syscall_fstatfs64.sig="iipp";function ___syscall_ftruncate64(fd,length){length=bigintToI53Checked(length);try{if(isNaN(length))return 61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_ftruncate64"]=___syscall_ftruncate64;___syscall_ftruncate64.sig="iij";var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);Module["stringToUTF8"]=stringToUTF8;function ___syscall_getcwd(buf,size){buf>>>=0;size>>>=0;try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>=0;count>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);stream.getdents||=FS.readdir(stream.path);var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var idx=Math.floor(off/struct_size);while(idx>>3]=BigInt(id);HEAP64[dirp+pos+8>>>3]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>>1>>>0]=280;HEAP8[dirp+pos+18>>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_getdents64"]=___syscall_getdents64;___syscall_getdents64.sig="iipp";function ___syscall_getpeername(fd,addr,addrlen,d1,d2,d3){addr>>>=0;addrlen>>>=0;try{var sock=getSocketFromFD(fd);if(!sock.daddr){return-53}var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.daddr),sock.dport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_getpeername"]=___syscall_getpeername;___syscall_getpeername.sig="iippiii";function ___syscall_getsockname(fd,addr,addrlen,d1,d2,d3){addr>>>=0;addrlen>>>=0;try{var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_getsockname"]=___syscall_getsockname;___syscall_getsockname.sig="iippiii";function ___syscall_getsockopt(fd,level,optname,optval,optlen,d1){optval>>>=0;optlen>>>=0;try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>>2>>>0]=sock.error;HEAP32[optlen>>>2>>>0]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_getsockopt"]=___syscall_getsockopt;___syscall_getsockopt.sig="iiiippi";function ___syscall_ioctl(fd,op,varargs){varargs>>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=termios.c_iflag||0;HEAP32[argp+4>>>2>>>0]=termios.c_oflag||0;HEAP32[argp+8>>>2>>>0]=termios.c_cflag||0;HEAP32[argp+12>>>2>>>0]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>>2>>>0];var c_oflag=HEAP32[argp+4>>>2>>>0];var c_cflag=HEAP32[argp+8>>>2>>>0];var c_lflag=HEAP32[argp+12>>>2>>>0];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>>1>>>0]=winsize[0];HEAP16[argp+2>>>1>>>0]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_ioctl"]=___syscall_ioctl;___syscall_ioctl.sig="iiip";function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_listen"]=___syscall_listen;___syscall_listen.sig="iiiiiii";function ___syscall_lstat64(path,buf){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_lstat64"]=___syscall_lstat64;___syscall_lstat64.sig="ipp";function ___syscall_mkdirat(dirfd,path,mode){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_mkdirat"]=___syscall_mkdirat;___syscall_mkdirat.sig="iipi";function ___syscall_mknodat(dirfd,path,mode,dev){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_mknodat"]=___syscall_mknodat;___syscall_mknodat.sig="iipii";function ___syscall_newfstatat(dirfd,path,buf,flags){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_newfstatat"]=___syscall_newfstatat;___syscall_newfstatat.sig="iippi";function ___syscall_openat(dirfd,path,flags,varargs){path>>>=0;varargs>>>=0;SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_openat"]=___syscall_openat;___syscall_openat.sig="iipip";var PIPEFS={BUCKET_BUFFER_SIZE:8192,mount(mount){return FS.createNode(null,"/",16384|511,0)},createPipe(){var pipe={buckets:[],refcnt:2};pipe.buckets.push({buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0});var rName=PIPEFS.nextname();var wName=PIPEFS.nextname();var rNode=FS.createNode(PIPEFS.root,rName,4096,0);var wNode=FS.createNode(PIPEFS.root,wName,4096,0);rNode.pipe=pipe;wNode.pipe=pipe;var readableStream=FS.createStream({path:rName,node:rNode,flags:0,seekable:false,stream_ops:PIPEFS.stream_ops});rNode.stream=readableStream;var writableStream=FS.createStream({path:wName,node:wNode,flags:1,seekable:false,stream_ops:PIPEFS.stream_ops});wNode.stream=writableStream;return{readable_fd:readableStream.fd,writable_fd:writableStream.fd}},stream_ops:{poll(stream){var pipe=stream.node.pipe;if((stream.flags&2097155)===1){return 256|4}if(pipe.buckets.length>0){for(var i=0;i0){return 64|1}}}return 0},ioctl(stream,request,varargs){return 28},fsync(stream){return 28},read(stream,buffer,offset,length,position){var pipe=stream.node.pipe;var currentLength=0;for(var i=0;i=dataLen){currBucket.buffer.set(data,currBucket.offset);currBucket.offset+=dataLen;return dataLen}else if(freeBytesInCurrBuffer>0){currBucket.buffer.set(data.subarray(0,freeBytesInCurrBuffer),currBucket.offset);currBucket.offset+=freeBytesInCurrBuffer;data=data.subarray(freeBytesInCurrBuffer,data.byteLength)}var numBuckets=data.byteLength/PIPEFS.BUCKET_BUFFER_SIZE|0;var remElements=data.byteLength%PIPEFS.BUCKET_BUFFER_SIZE;for(var i=0;i0){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:data.byteLength,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data)}return dataLen},close(stream){var pipe=stream.node.pipe;pipe.refcnt--;if(pipe.refcnt===0){pipe.buckets=null}}},nextname(){if(!PIPEFS.nextname.current){PIPEFS.nextname.current=0}return"pipe["+PIPEFS.nextname.current+++"]"}};Module["PIPEFS"]=PIPEFS;function ___syscall_pipe(fdPtr){fdPtr>>>=0;try{if(fdPtr==0){throw new FS.ErrnoError(21)}var res=PIPEFS.createPipe();HEAP32[fdPtr>>>2>>>0]=res.readable_fd;HEAP32[fdPtr+4>>>2>>>0]=res.writable_fd;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_pipe"]=___syscall_pipe;___syscall_pipe.sig="ip";function ___syscall_poll(fds,nfds,timeout){fds>>>=0;try{var nonzero=0;for(var i=0;i>>2>>>0];var events=HEAP16[pollfd+4>>>1>>>0];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream,-1)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>>1>>>0]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_poll"]=___syscall_poll;___syscall_poll.sig="ipii";function ___syscall_readlinkat(dirfd,path,buf,bufsize){path>>>=0;buf>>>=0;bufsize>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len>>>0];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len>>>0]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_readlinkat"]=___syscall_readlinkat;___syscall_readlinkat.sig="iippp";function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){buf>>>=0;len>>>=0;addr>>>=0;addrlen>>>=0;try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf>>>0);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_recvfrom"]=___syscall_recvfrom;___syscall_recvfrom.sig="iippipp";function ___syscall_recvmsg(fd,message,flags,d1,d2,d3){message>>>=0;try{var sock=getSocketFromFD(fd);var iov=HEAPU32[message+8>>>2>>>0];var num=HEAP32[message+12>>>2>>>0];var total=0;for(var i=0;i>>2>>>0]}var msg=sock.sock_ops.recvmsg(sock,total);if(!msg)return 0;var name=HEAPU32[message>>>2>>>0];if(name){var errno=writeSockaddr(name,sock.family,DNS.lookup_name(msg.addr),msg.port)}var bytesRead=0;var bytesRemaining=msg.buffer.byteLength;for(var i=0;bytesRemaining>0&&i>>2>>>0];var iovlen=HEAP32[iov+(8*i+4)>>>2>>>0];if(!iovlen){continue}var length=Math.min(iovlen,bytesRemaining);var buf=msg.buffer.subarray(bytesRead,bytesRead+length);HEAPU8.set(buf,iovbase+bytesRead>>>0);bytesRead+=length;bytesRemaining-=length}return bytesRead}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_recvmsg"]=___syscall_recvmsg;___syscall_recvmsg.sig="iipiiii";function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){oldpath>>>=0;newpath>>>=0;try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_renameat"]=___syscall_renameat;___syscall_renameat.sig="iipip";function ___syscall_rmdir(path){path>>>=0;try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_rmdir"]=___syscall_rmdir;___syscall_rmdir.sig="ip";function ___syscall_sendmsg(fd,message,flags,d1,d2,d3){message>>>=0;d1>>>=0;d2>>>=0;try{var sock=getSocketFromFD(fd);var iov=HEAPU32[message+8>>>2>>>0];var num=HEAP32[message+12>>>2>>>0];var addr,port;var name=HEAPU32[message>>>2>>>0];var namelen=HEAP32[message+4>>>2>>>0];if(name){var info=readSockaddr(name,namelen);if(info.errno)return-info.errno;port=info.port;addr=DNS.lookup_addr(info.addr)||info.addr}var total=0;for(var i=0;i>>2>>>0]}var view=new Uint8Array(total);var offset=0;for(var i=0;i>>2>>>0];var iovlen=HEAP32[iov+(8*i+4)>>>2>>>0];for(var j=0;j>>0]}}return sock.sock_ops.sendmsg(sock,view,0,total,addr,port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_sendmsg"]=___syscall_sendmsg;___syscall_sendmsg.sig="iipippi";function ___syscall_sendto(fd,message,length,flags,addr,addr_len){message>>>=0;length>>>=0;addr>>>=0;addr_len>>>=0;try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_sendto"]=___syscall_sendto;___syscall_sendto.sig="iippipp";function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_socket"]=___syscall_socket;___syscall_socket.sig="iiiiiii";function ___syscall_stat64(path,buf){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_stat64"]=___syscall_stat64;___syscall_stat64.sig="ipp";function ___syscall_symlink(target,linkpath){target>>>=0;linkpath>>>=0;try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_symlink"]=___syscall_symlink;___syscall_symlink.sig="ipp";function ___syscall_symlinkat(target,newdirfd,linkpath){target>>>=0;linkpath>>>=0;try{linkpath=SYSCALLS.calculateAt(newdirfd,linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_symlinkat"]=___syscall_symlinkat;___syscall_symlinkat.sig="ipip";function ___syscall_truncate64(path,length){path>>>=0;length=bigintToI53Checked(length);try{if(isNaN(length))return 61;path=SYSCALLS.getStr(path);FS.truncate(path,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_truncate64"]=___syscall_truncate64;___syscall_truncate64.sig="ipj";function ___syscall_unlinkat(dirfd,path,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_unlinkat"]=___syscall_unlinkat;___syscall_unlinkat.sig="iipi";var readI53FromI64=ptr=>HEAPU32[ptr>>>2>>>0]+HEAP32[ptr+4>>>2>>>0]*4294967296;Module["readI53FromI64"]=readI53FromI64;function ___syscall_utimensat(dirfd,path,times,flags){path>>>=0;times>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);if(!times){var atime=Date.now();var mtime=atime}else{var seconds=readI53FromI64(times);var nanoseconds=HEAP32[times+8>>>2>>>0];atime=seconds*1e3+nanoseconds/(1e3*1e3);times+=16;seconds=readI53FromI64(times);nanoseconds=HEAP32[times+8>>>2>>>0];mtime=seconds*1e3+nanoseconds/(1e3*1e3)}FS.utime(path,atime,mtime);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["___syscall_utimensat"]=___syscall_utimensat;___syscall_utimensat.sig="iippi";var ___table_base=new WebAssembly.Global({"value":"i32","mutable":false},1);Module["___table_base"]=___table_base;var ENV={};Module["ENV"]=ENV;var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};Module["stringToUTF8OnStack"]=stringToUTF8OnStack;var dlSetError=msg=>{var sp=stackSave();var cmsg=stringToUTF8OnStack(msg);___dl_seterr(cmsg,0);stackRestore(sp)};Module["dlSetError"]=dlSetError;var dlopenInternal=(handle,jsflags)=>{var filename=UTF8ToString(handle+36);var flags=HEAP32[handle+4>>>2>>>0];filename=PATH.normalize(filename);var searchpaths=[];var global=Boolean(flags&256);var localScope=global?null:{};var combinedFlags={global:global,nodelete:Boolean(flags&4096),loadAsync:jsflags.loadAsync};if(jsflags.loadAsync){return loadDynamicLibrary(filename,combinedFlags,localScope,handle)}try{return loadDynamicLibrary(filename,combinedFlags,localScope,handle)}catch(e){dlSetError(`Could not load dynamic lib: ${filename}\n${e}`);return 0}};Module["dlopenInternal"]=dlopenInternal;function __dlopen_js(handle){handle>>>=0;return dlopenInternal(handle,{loadAsync:false})}Module["__dlopen_js"]=__dlopen_js;__dlopen_js.sig="pp";function __dlsym_js(handle,symbol,symbolIndex){handle>>>=0;symbol>>>=0;symbolIndex>>>=0;symbol=UTF8ToString(symbol);var result;var newSymIndex;var lib=LDSO.loadedLibsByHandle[handle];if(!lib.exports.hasOwnProperty(symbol)||lib.exports[symbol].stub){dlSetError(`Tried to lookup unknown symbol "${symbol}" in dynamic lib: ${lib.name}`);return 0}newSymIndex=Object.keys(lib.exports).indexOf(symbol);result=lib.exports[symbol];if(typeof result=="function"){var addr=getFunctionAddress(result);if(addr){result=addr}else{result=addFunction(result,result.sig);HEAPU32[symbolIndex>>>2>>>0]=newSymIndex}}return result}Module["__dlsym_js"]=__dlsym_js;__dlsym_js.sig="pppp";var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};Module["handleException"]=handleException;var runtimeKeepaliveCounter=0;Module["runtimeKeepaliveCounter"]=runtimeKeepaliveCounter;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;Module["keepRuntimeAlive"]=keepRuntimeAlive;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};Module["_proc_exit"]=_proc_exit;_proc_exit.sig="vi";var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};Module["exitJS"]=exitJS;var _exit=exitJS;Module["_exit"]=_exit;_exit.sig="vi";var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};Module["maybeExit"]=maybeExit;var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};Module["callUserCallback"]=callUserCallback;function __emscripten_dlopen_js(handle,onsuccess,onerror,user_data){handle>>>=0;onsuccess>>>=0;onerror>>>=0;user_data>>>=0;function errorCallback(e){var filename=UTF8ToString(handle+36);dlSetError(`'Could not load dynamic lib: ${filename}\n${e}`);callUserCallback(()=>getWasmTableEntry(onerror)(handle,user_data))}function successCallback(){callUserCallback(()=>getWasmTableEntry(onsuccess)(handle,user_data))}var promise=dlopenInternal(handle,{loadAsync:true});if(promise){promise.then(successCallback,errorCallback)}else{errorCallback()}}Module["__emscripten_dlopen_js"]=__emscripten_dlopen_js;__emscripten_dlopen_js.sig="vpppp";var nowIsMonotonic=1;Module["nowIsMonotonic"]=nowIsMonotonic;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;Module["__emscripten_get_now_is_monotonic"]=__emscripten_get_now_is_monotonic;__emscripten_get_now_is_monotonic.sig="i";function __emscripten_get_progname(str,len){str>>>=0;stringToUTF8(thisProgram,str,len)}Module["__emscripten_get_progname"]=__emscripten_get_progname;__emscripten_get_progname.sig="vpi";function __emscripten_lookup_name(name){name>>>=0;var nameString=UTF8ToString(name);return inetPton4(DNS.lookup_name(nameString))}Module["__emscripten_lookup_name"]=__emscripten_lookup_name;__emscripten_lookup_name.sig="ip";var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};Module["__emscripten_runtime_keepalive_clear"]=__emscripten_runtime_keepalive_clear;__emscripten_runtime_keepalive_clear.sig="v";function __emscripten_system(command){command>>>=0;if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGINT":return 2;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15}return 2};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;return-52}Module["__emscripten_system"]=__emscripten_system;__emscripten_system.sig="ip";var __emscripten_throw_longjmp=()=>{throw Module.wrapException(Infinity)};Module["__emscripten_throw_longjmp"]=__emscripten_throw_longjmp;__emscripten_throw_longjmp.sig="v";function __gmtime_js(time,tmPtr){time=bigintToI53Checked(time);tmPtr>>>=0;var date=new Date(time*1e3);HEAP32[tmPtr>>>2>>>0]=date.getUTCSeconds();HEAP32[tmPtr+4>>>2>>>0]=date.getUTCMinutes();HEAP32[tmPtr+8>>>2>>>0]=date.getUTCHours();HEAP32[tmPtr+12>>>2>>>0]=date.getUTCDate();HEAP32[tmPtr+16>>>2>>>0]=date.getUTCMonth();HEAP32[tmPtr+20>>>2>>>0]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>>2>>>0]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>>2>>>0]=yday}Module["__gmtime_js"]=__gmtime_js;__gmtime_js.sig="vjp";var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);Module["isLeapYear"]=isLeapYear;var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];Module["MONTH_DAYS_LEAP_CUMULATIVE"]=MONTH_DAYS_LEAP_CUMULATIVE;var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];Module["MONTH_DAYS_REGULAR_CUMULATIVE"]=MONTH_DAYS_REGULAR_CUMULATIVE;var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};Module["ydayFromDate"]=ydayFromDate;function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);tmPtr>>>=0;var date=new Date(time*1e3);HEAP32[tmPtr>>>2>>>0]=date.getSeconds();HEAP32[tmPtr+4>>>2>>>0]=date.getMinutes();HEAP32[tmPtr+8>>>2>>>0]=date.getHours();HEAP32[tmPtr+12>>>2>>>0]=date.getDate();HEAP32[tmPtr+16>>>2>>>0]=date.getMonth();HEAP32[tmPtr+20>>>2>>>0]=date.getFullYear()-1900;HEAP32[tmPtr+24>>>2>>>0]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>>2>>>0]=yday;HEAP32[tmPtr+36>>>2>>>0]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>>2>>>0]=dst}Module["__localtime_js"]=__localtime_js;__localtime_js.sig="vjp";var __mktime_js=function(tmPtr){tmPtr>>>=0;var ret=(()=>{var date=new Date(HEAP32[tmPtr+20>>>2>>>0]+1900,HEAP32[tmPtr+16>>>2>>>0],HEAP32[tmPtr+12>>>2>>>0],HEAP32[tmPtr+8>>>2>>>0],HEAP32[tmPtr+4>>>2>>>0],HEAP32[tmPtr>>>2>>>0],0);var dst=HEAP32[tmPtr+32>>>2>>>0];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>>2>>>0]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>>2>>>0]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>>2>>>0]=yday;HEAP32[tmPtr>>>2>>>0]=date.getSeconds();HEAP32[tmPtr+4>>>2>>>0]=date.getMinutes();HEAP32[tmPtr+8>>>2>>>0]=date.getHours();HEAP32[tmPtr+12>>>2>>>0]=date.getDate();HEAP32[tmPtr+16>>>2>>>0]=date.getMonth();HEAP32[tmPtr+20>>>2>>>0]=date.getYear();var timeMs=date.getTime();if(isNaN(timeMs)){return-1}return timeMs/1e3})();return BigInt(ret)};Module["__mktime_js"]=__mktime_js;__mktime_js.sig="jp";function __mmap_js(len,prot,flags,fd,offset,allocated,addr){len>>>=0;offset=bigintToI53Checked(offset);allocated>>>=0;addr>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>>2>>>0]=res.allocated;HEAPU32[addr>>>2>>>0]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["__mmap_js"]=__mmap_js;__mmap_js.sig="ipiiijpp";function __msync_js(addr,len,prot,flags,fd,offset){addr>>>=0;len>>>=0;offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;SYSCALLS.doMsync(addr,SYSCALLS.getStreamFromFD(fd),len,flags,offset);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["__msync_js"]=__msync_js;__msync_js.sig="ippiiij";function __munmap_js(addr,len,prot,flags,fd,offset){addr>>>=0;len>>>=0;offset=bigintToI53Checked(offset);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}Module["__munmap_js"]=__munmap_js;__munmap_js.sig="ippiiij";var timers={};Module["timers"]=timers;var _emscripten_get_now;_emscripten_get_now=()=>performance.now();Module["_emscripten_get_now"]=_emscripten_get_now;_emscripten_get_now.sig="d";var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id:id,timeout_ms:timeout_ms};return 0};Module["__setitimer_js"]=__setitimer_js;__setitimer_js.sig="iid";var __timegm_js=function(tmPtr){tmPtr>>>=0;var ret=(()=>{var time=Date.UTC(HEAP32[tmPtr+20>>>2>>>0]+1900,HEAP32[tmPtr+16>>>2>>>0],HEAP32[tmPtr+12>>>2>>>0],HEAP32[tmPtr+8>>>2>>>0],HEAP32[tmPtr+4>>>2>>>0],HEAP32[tmPtr>>>2>>>0],0);var date=new Date(time);HEAP32[tmPtr+24>>>2>>>0]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>>2>>>0]=yday;return date.getTime()/1e3})();return BigInt(ret)};Module["__timegm_js"]=__timegm_js;__timegm_js.sig="jp";var __tzset_js=function(timezone,daylight,std_name,dst_name){timezone>>>=0;daylight>>>=0;std_name>>>=0;dst_name>>>=0;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>>2>>>0]=stdTimezoneOffset*60;HEAP32[daylight>>>2>>>0]=Number(winterOffset!=summerOffset);var extractZone=date=>date.toLocaleTimeString(undefined,{hour12:false,timeZoneName:"short"}).split(" ")[1];var winterName=extractZone(winter);var summerName=extractZone(summer);if(summerOffset{abort("")};Module["_abort"]=_abort;_abort.sig="v";var readEmAsmArgsArray=[];Module["readEmAsmArgsArray"]=readEmAsmArgsArray;var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++>>>0]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>>2>>>0]:ch==106?HEAP64[buf>>>3]:ch==105?HEAP32[buf>>>2>>>0]:HEAPF64[buf>>>3>>>0]);buf+=wide?8:4}return readEmAsmArgsArray};Module["readEmAsmArgs"]=readEmAsmArgs;var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};Module["runEmAsmFunction"]=runEmAsmFunction;function _emscripten_asm_const_int(code,sigPtr,argbuf){code>>>=0;sigPtr>>>=0;argbuf>>>=0;return runEmAsmFunction(code,sigPtr,argbuf)}Module["_emscripten_asm_const_int"]=_emscripten_asm_const_int;_emscripten_asm_const_int.sig="ippp";function _emscripten_console_error(str){str>>>=0;console.error(UTF8ToString(str))}Module["_emscripten_console_error"]=_emscripten_console_error;_emscripten_console_error.sig="vp";function _emscripten_console_log(str){str>>>=0;console.log(UTF8ToString(str))}Module["_emscripten_console_log"]=_emscripten_console_log;_emscripten_console_log.sig="vp";function _emscripten_console_warn(str){str>>>=0;console.warn(UTF8ToString(str))}Module["_emscripten_console_warn"]=_emscripten_console_warn;_emscripten_console_warn.sig="vp";var _emscripten_date_now=()=>Date.now();Module["_emscripten_date_now"]=_emscripten_date_now;_emscripten_date_now.sig="d";function _emscripten_err(str){str>>>=0;return err(UTF8ToString(str))}Module["_emscripten_err"]=_emscripten_err;_emscripten_err.sig="vp";var _emscripten_exit_with_live_runtime=()=>{throw"unwind"};Module["_emscripten_exit_with_live_runtime"]=_emscripten_exit_with_live_runtime;_emscripten_exit_with_live_runtime.sig="v";var getHeapMax=()=>4294901760;Module["getHeapMax"]=getHeapMax;function _emscripten_get_heap_max(){return getHeapMax()}Module["_emscripten_get_heap_max"]=_emscripten_get_heap_max;_emscripten_get_heap_max.sig="p";var _emscripten_get_now_res=()=>{if(ENVIRONMENT_IS_NODE){return 1}return 1e3};Module["_emscripten_get_now_res"]=_emscripten_get_now_res;_emscripten_get_now_res.sig="d";var webgl_enable_ANGLE_instanced_arrays=ctx=>{var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=(index,divisor)=>ext["vertexAttribDivisorANGLE"](index,divisor);ctx["drawArraysInstanced"]=(mode,first,count,primcount)=>ext["drawArraysInstancedANGLE"](mode,first,count,primcount);ctx["drawElementsInstanced"]=(mode,count,type,indices,primcount)=>ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount);return 1}};Module["webgl_enable_ANGLE_instanced_arrays"]=webgl_enable_ANGLE_instanced_arrays;var webgl_enable_OES_vertex_array_object=ctx=>{var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=()=>ext["createVertexArrayOES"]();ctx["deleteVertexArray"]=vao=>ext["deleteVertexArrayOES"](vao);ctx["bindVertexArray"]=vao=>ext["bindVertexArrayOES"](vao);ctx["isVertexArray"]=vao=>ext["isVertexArrayOES"](vao);return 1}};Module["webgl_enable_OES_vertex_array_object"]=webgl_enable_OES_vertex_array_object;var webgl_enable_WEBGL_draw_buffers=ctx=>{var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=(n,bufs)=>ext["drawBuffersWEBGL"](n,bufs);return 1}};Module["webgl_enable_WEBGL_draw_buffers"]=webgl_enable_WEBGL_draw_buffers;var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));Module["webgl_enable_WEBGL_multi_draw"]=webgl_enable_WEBGL_multi_draw;var getEmscriptenSupportedExtensions=ctx=>{var supportedExtensions=["ANGLE_instanced_arrays","EXT_blend_minmax","EXT_disjoint_timer_query","EXT_frag_depth","EXT_shader_texture_lod","EXT_sRGB","OES_element_index_uint","OES_fbo_render_mipmap","OES_standard_derivatives","OES_texture_float","OES_texture_half_float","OES_texture_half_float_linear","OES_vertex_array_object","WEBGL_color_buffer_float","WEBGL_depth_texture","WEBGL_draw_buffers","EXT_color_buffer_half_float","EXT_depth_clamp","EXT_float_blend","EXT_texture_compression_bptc","EXT_texture_compression_rgtc","EXT_texture_filter_anisotropic","KHR_parallel_shader_compile","OES_texture_float_linear","WEBGL_blend_func_extended","WEBGL_compressed_texture_astc","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_etc1","WEBGL_compressed_texture_s3tc","WEBGL_compressed_texture_s3tc_srgb","WEBGL_debug_renderer_info","WEBGL_debug_shaders","WEBGL_lose_context","WEBGL_multi_draw"];return(ctx.getSupportedExtensions()||[]).filter(ext=>supportedExtensions.includes(ext))};Module["getEmscriptenSupportedExtensions"]=getEmscriptenSupportedExtensions;var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:errorCode=>{if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i{for(var i=0;i>>2>>>0]=id}},getSource:(shader,count,string,length)=>{var source="";for(var i=0;i>>2>>>0]:undefined;source+=UTF8ToString(HEAPU32[string+i*4>>>2>>>0],len)}return source},createContext:(canvas,webGLContextAttributes)=>{var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:(ctx,webGLContextAttributes)=>{var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:contextHandle=>{GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext?.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle]){GL.currentContext=null}if(typeof JSEvents=="object"){JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas)}if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas){GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined}GL.contexts[contextHandle]=null},initExtensions:context=>{context||=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_ANGLE_instanced_arrays(GLctx);webgl_enable_OES_vertex_array_object(GLctx);webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}webgl_enable_WEBGL_multi_draw(GLctx);getEmscriptenSupportedExtensions(GLctx).forEach(ext=>{if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};Module["GL"]=GL;var _glActiveTexture=x0=>GLctx.activeTexture(x0);Module["_glActiveTexture"]=_glActiveTexture;_glActiveTexture.sig="vi";var _emscripten_glActiveTexture=_glActiveTexture;Module["_emscripten_glActiveTexture"]=_emscripten_glActiveTexture;_emscripten_glActiveTexture.sig="vi";var _glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};Module["_glAttachShader"]=_glAttachShader;_glAttachShader.sig="vii";var _emscripten_glAttachShader=_glAttachShader;Module["_emscripten_glAttachShader"]=_emscripten_glAttachShader;_emscripten_glAttachShader.sig="vii";var _glBeginQueryEXT=(target,id)=>{GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])};Module["_glBeginQueryEXT"]=_glBeginQueryEXT;_glBeginQueryEXT.sig="vii";var _emscripten_glBeginQueryEXT=_glBeginQueryEXT;Module["_emscripten_glBeginQueryEXT"]=_emscripten_glBeginQueryEXT;function _glBindAttribLocation(program,index,name){name>>>=0;GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}Module["_glBindAttribLocation"]=_glBindAttribLocation;_glBindAttribLocation.sig="viip";var _emscripten_glBindAttribLocation=_glBindAttribLocation;Module["_emscripten_glBindAttribLocation"]=_emscripten_glBindAttribLocation;_emscripten_glBindAttribLocation.sig="viip";var _glBindBuffer=(target,buffer)=>{GLctx.bindBuffer(target,GL.buffers[buffer])};Module["_glBindBuffer"]=_glBindBuffer;_glBindBuffer.sig="vii";var _emscripten_glBindBuffer=_glBindBuffer;Module["_emscripten_glBindBuffer"]=_emscripten_glBindBuffer;_emscripten_glBindBuffer.sig="vii";var _glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])};Module["_glBindFramebuffer"]=_glBindFramebuffer;_glBindFramebuffer.sig="vii";var _emscripten_glBindFramebuffer=_glBindFramebuffer;Module["_emscripten_glBindFramebuffer"]=_emscripten_glBindFramebuffer;_emscripten_glBindFramebuffer.sig="vii";var _glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};Module["_glBindRenderbuffer"]=_glBindRenderbuffer;_glBindRenderbuffer.sig="vii";var _emscripten_glBindRenderbuffer=_glBindRenderbuffer;Module["_emscripten_glBindRenderbuffer"]=_emscripten_glBindRenderbuffer;_emscripten_glBindRenderbuffer.sig="vii";var _glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};Module["_glBindTexture"]=_glBindTexture;_glBindTexture.sig="vii";var _emscripten_glBindTexture=_glBindTexture;Module["_emscripten_glBindTexture"]=_emscripten_glBindTexture;_emscripten_glBindTexture.sig="vii";var _glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao])};Module["_glBindVertexArray"]=_glBindVertexArray;_glBindVertexArray.sig="vi";var _glBindVertexArrayOES=_glBindVertexArray;Module["_glBindVertexArrayOES"]=_glBindVertexArrayOES;_glBindVertexArrayOES.sig="vi";var _emscripten_glBindVertexArrayOES=_glBindVertexArrayOES;Module["_emscripten_glBindVertexArrayOES"]=_emscripten_glBindVertexArrayOES;_emscripten_glBindVertexArrayOES.sig="vi";var _glBlendColor=(x0,x1,x2,x3)=>GLctx.blendColor(x0,x1,x2,x3);Module["_glBlendColor"]=_glBlendColor;_glBlendColor.sig="vffff";var _emscripten_glBlendColor=_glBlendColor;Module["_emscripten_glBlendColor"]=_emscripten_glBlendColor;_emscripten_glBlendColor.sig="vffff";var _glBlendEquation=x0=>GLctx.blendEquation(x0);Module["_glBlendEquation"]=_glBlendEquation;_glBlendEquation.sig="vi";var _emscripten_glBlendEquation=_glBlendEquation;Module["_emscripten_glBlendEquation"]=_emscripten_glBlendEquation;_emscripten_glBlendEquation.sig="vi";var _glBlendEquationSeparate=(x0,x1)=>GLctx.blendEquationSeparate(x0,x1);Module["_glBlendEquationSeparate"]=_glBlendEquationSeparate;_glBlendEquationSeparate.sig="vii";var _emscripten_glBlendEquationSeparate=_glBlendEquationSeparate;Module["_emscripten_glBlendEquationSeparate"]=_emscripten_glBlendEquationSeparate;_emscripten_glBlendEquationSeparate.sig="vii";var _glBlendFunc=(x0,x1)=>GLctx.blendFunc(x0,x1);Module["_glBlendFunc"]=_glBlendFunc;_glBlendFunc.sig="vii";var _emscripten_glBlendFunc=_glBlendFunc;Module["_emscripten_glBlendFunc"]=_emscripten_glBlendFunc;_emscripten_glBlendFunc.sig="vii";var _glBlendFuncSeparate=(x0,x1,x2,x3)=>GLctx.blendFuncSeparate(x0,x1,x2,x3);Module["_glBlendFuncSeparate"]=_glBlendFuncSeparate;_glBlendFuncSeparate.sig="viiii";var _emscripten_glBlendFuncSeparate=_glBlendFuncSeparate;Module["_emscripten_glBlendFuncSeparate"]=_emscripten_glBlendFuncSeparate;_emscripten_glBlendFuncSeparate.sig="viiii";function _glBufferData(target,size,data,usage){size>>>=0;data>>>=0;GLctx.bufferData(target,data?HEAPU8.subarray(data>>>0,data+size>>>0):size,usage)}Module["_glBufferData"]=_glBufferData;_glBufferData.sig="vippi";var _emscripten_glBufferData=_glBufferData;Module["_emscripten_glBufferData"]=_emscripten_glBufferData;_emscripten_glBufferData.sig="vippi";function _glBufferSubData(target,offset,size,data){offset>>>=0;size>>>=0;data>>>=0;GLctx.bufferSubData(target,offset,HEAPU8.subarray(data>>>0,data+size>>>0))}Module["_glBufferSubData"]=_glBufferSubData;_glBufferSubData.sig="vippp";var _emscripten_glBufferSubData=_glBufferSubData;Module["_emscripten_glBufferSubData"]=_emscripten_glBufferSubData;_emscripten_glBufferSubData.sig="vippp";var _glCheckFramebufferStatus=x0=>GLctx.checkFramebufferStatus(x0);Module["_glCheckFramebufferStatus"]=_glCheckFramebufferStatus;_glCheckFramebufferStatus.sig="ii";var _emscripten_glCheckFramebufferStatus=_glCheckFramebufferStatus;Module["_emscripten_glCheckFramebufferStatus"]=_emscripten_glCheckFramebufferStatus;_emscripten_glCheckFramebufferStatus.sig="ii";var _glClear=x0=>GLctx.clear(x0);Module["_glClear"]=_glClear;_glClear.sig="vi";var _emscripten_glClear=_glClear;Module["_emscripten_glClear"]=_emscripten_glClear;_emscripten_glClear.sig="vi";var _glClearColor=(x0,x1,x2,x3)=>GLctx.clearColor(x0,x1,x2,x3);Module["_glClearColor"]=_glClearColor;_glClearColor.sig="vffff";var _emscripten_glClearColor=_glClearColor;Module["_emscripten_glClearColor"]=_emscripten_glClearColor;_emscripten_glClearColor.sig="vffff";var _glClearDepthf=x0=>GLctx.clearDepth(x0);Module["_glClearDepthf"]=_glClearDepthf;_glClearDepthf.sig="vf";var _emscripten_glClearDepthf=_glClearDepthf;Module["_emscripten_glClearDepthf"]=_emscripten_glClearDepthf;_emscripten_glClearDepthf.sig="vf";var _glClearStencil=x0=>GLctx.clearStencil(x0);Module["_glClearStencil"]=_glClearStencil;_glClearStencil.sig="vi";var _emscripten_glClearStencil=_glClearStencil;Module["_emscripten_glClearStencil"]=_emscripten_glClearStencil;_emscripten_glClearStencil.sig="vi";var _glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};Module["_glColorMask"]=_glColorMask;_glColorMask.sig="viiii";var _emscripten_glColorMask=_glColorMask;Module["_emscripten_glColorMask"]=_emscripten_glColorMask;_emscripten_glColorMask.sig="viiii";var _glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};Module["_glCompileShader"]=_glCompileShader;_glCompileShader.sig="vi";var _emscripten_glCompileShader=_glCompileShader;Module["_emscripten_glCompileShader"]=_emscripten_glCompileShader;_emscripten_glCompileShader.sig="vi";function _glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){data>>>=0;GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data>>>0,data+imageSize>>>0):null)}Module["_glCompressedTexImage2D"]=_glCompressedTexImage2D;_glCompressedTexImage2D.sig="viiiiiiip";var _emscripten_glCompressedTexImage2D=_glCompressedTexImage2D;Module["_emscripten_glCompressedTexImage2D"]=_emscripten_glCompressedTexImage2D;_emscripten_glCompressedTexImage2D.sig="viiiiiiip";function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){data>>>=0;GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data>>>0,data+imageSize>>>0):null)}Module["_glCompressedTexSubImage2D"]=_glCompressedTexSubImage2D;_glCompressedTexSubImage2D.sig="viiiiiiiip";var _emscripten_glCompressedTexSubImage2D=_glCompressedTexSubImage2D;Module["_emscripten_glCompressedTexSubImage2D"]=_emscripten_glCompressedTexSubImage2D;_emscripten_glCompressedTexSubImage2D.sig="viiiiiiiip";var _glCopyTexImage2D=(x0,x1,x2,x3,x4,x5,x6,x7)=>GLctx.copyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7);Module["_glCopyTexImage2D"]=_glCopyTexImage2D;_glCopyTexImage2D.sig="viiiiiiii";var _emscripten_glCopyTexImage2D=_glCopyTexImage2D;Module["_emscripten_glCopyTexImage2D"]=_emscripten_glCopyTexImage2D;_emscripten_glCopyTexImage2D.sig="viiiiiiii";var _glCopyTexSubImage2D=(x0,x1,x2,x3,x4,x5,x6,x7)=>GLctx.copyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7);Module["_glCopyTexSubImage2D"]=_glCopyTexSubImage2D;_glCopyTexSubImage2D.sig="viiiiiiii";var _emscripten_glCopyTexSubImage2D=_glCopyTexSubImage2D;Module["_emscripten_glCopyTexSubImage2D"]=_emscripten_glCopyTexSubImage2D;_emscripten_glCopyTexSubImage2D.sig="viiiiiiii";var _glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};Module["_glCreateProgram"]=_glCreateProgram;_glCreateProgram.sig="i";var _emscripten_glCreateProgram=_glCreateProgram;Module["_emscripten_glCreateProgram"]=_emscripten_glCreateProgram;_emscripten_glCreateProgram.sig="i";var _glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};Module["_glCreateShader"]=_glCreateShader;_glCreateShader.sig="ii";var _emscripten_glCreateShader=_glCreateShader;Module["_emscripten_glCreateShader"]=_emscripten_glCreateShader;_emscripten_glCreateShader.sig="ii";var _glCullFace=x0=>GLctx.cullFace(x0);Module["_glCullFace"]=_glCullFace;_glCullFace.sig="vi";var _emscripten_glCullFace=_glCullFace;Module["_emscripten_glCullFace"]=_emscripten_glCullFace;_emscripten_glCullFace.sig="vi";function _glDeleteBuffers(n,buffers){buffers>>>=0;for(var i=0;i>>2>>>0];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null}}Module["_glDeleteBuffers"]=_glDeleteBuffers;_glDeleteBuffers.sig="vip";var _emscripten_glDeleteBuffers=_glDeleteBuffers;Module["_emscripten_glDeleteBuffers"]=_emscripten_glDeleteBuffers;_emscripten_glDeleteBuffers.sig="vip";function _glDeleteFramebuffers(n,framebuffers){framebuffers>>>=0;for(var i=0;i>>2>>>0];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}Module["_glDeleteFramebuffers"]=_glDeleteFramebuffers;_glDeleteFramebuffers.sig="vip";var _emscripten_glDeleteFramebuffers=_glDeleteFramebuffers;Module["_emscripten_glDeleteFramebuffers"]=_emscripten_glDeleteFramebuffers;_emscripten_glDeleteFramebuffers.sig="vip";var _glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};Module["_glDeleteProgram"]=_glDeleteProgram;_glDeleteProgram.sig="vi";var _emscripten_glDeleteProgram=_glDeleteProgram;Module["_emscripten_glDeleteProgram"]=_emscripten_glDeleteProgram;_emscripten_glDeleteProgram.sig="vi";function _glDeleteQueriesEXT(n,ids){ids>>>=0;for(var i=0;i>>2>>>0];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}}Module["_glDeleteQueriesEXT"]=_glDeleteQueriesEXT;_glDeleteQueriesEXT.sig="vip";var _emscripten_glDeleteQueriesEXT=_glDeleteQueriesEXT;Module["_emscripten_glDeleteQueriesEXT"]=_emscripten_glDeleteQueriesEXT;function _glDeleteRenderbuffers(n,renderbuffers){renderbuffers>>>=0;for(var i=0;i>>2>>>0];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}Module["_glDeleteRenderbuffers"]=_glDeleteRenderbuffers;_glDeleteRenderbuffers.sig="vip";var _emscripten_glDeleteRenderbuffers=_glDeleteRenderbuffers;Module["_emscripten_glDeleteRenderbuffers"]=_emscripten_glDeleteRenderbuffers;_emscripten_glDeleteRenderbuffers.sig="vip";var _glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};Module["_glDeleteShader"]=_glDeleteShader;_glDeleteShader.sig="vi";var _emscripten_glDeleteShader=_glDeleteShader;Module["_emscripten_glDeleteShader"]=_emscripten_glDeleteShader;_emscripten_glDeleteShader.sig="vi";function _glDeleteTextures(n,textures){textures>>>=0;for(var i=0;i>>2>>>0];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}Module["_glDeleteTextures"]=_glDeleteTextures;_glDeleteTextures.sig="vip";var _emscripten_glDeleteTextures=_glDeleteTextures;Module["_emscripten_glDeleteTextures"]=_emscripten_glDeleteTextures;_emscripten_glDeleteTextures.sig="vip";function _glDeleteVertexArrays(n,vaos){vaos>>>=0;for(var i=0;i>>2>>>0];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}}Module["_glDeleteVertexArrays"]=_glDeleteVertexArrays;_glDeleteVertexArrays.sig="vip";var _glDeleteVertexArraysOES=_glDeleteVertexArrays;Module["_glDeleteVertexArraysOES"]=_glDeleteVertexArraysOES;_glDeleteVertexArraysOES.sig="vip";var _emscripten_glDeleteVertexArraysOES=_glDeleteVertexArraysOES;Module["_emscripten_glDeleteVertexArraysOES"]=_emscripten_glDeleteVertexArraysOES;_emscripten_glDeleteVertexArraysOES.sig="vip";var _glDepthFunc=x0=>GLctx.depthFunc(x0);Module["_glDepthFunc"]=_glDepthFunc;_glDepthFunc.sig="vi";var _emscripten_glDepthFunc=_glDepthFunc;Module["_emscripten_glDepthFunc"]=_emscripten_glDepthFunc;_emscripten_glDepthFunc.sig="vi";var _glDepthMask=flag=>{GLctx.depthMask(!!flag)};Module["_glDepthMask"]=_glDepthMask;_glDepthMask.sig="vi";var _emscripten_glDepthMask=_glDepthMask;Module["_emscripten_glDepthMask"]=_emscripten_glDepthMask;_emscripten_glDepthMask.sig="vi";var _glDepthRangef=(x0,x1)=>GLctx.depthRange(x0,x1);Module["_glDepthRangef"]=_glDepthRangef;_glDepthRangef.sig="vff";var _emscripten_glDepthRangef=_glDepthRangef;Module["_emscripten_glDepthRangef"]=_emscripten_glDepthRangef;_emscripten_glDepthRangef.sig="vff";var _glDetachShader=(program,shader)=>{GLctx.detachShader(GL.programs[program],GL.shaders[shader])};Module["_glDetachShader"]=_glDetachShader;_glDetachShader.sig="vii";var _emscripten_glDetachShader=_glDetachShader;Module["_emscripten_glDetachShader"]=_emscripten_glDetachShader;_emscripten_glDetachShader.sig="vii";var _glDisable=x0=>GLctx.disable(x0);Module["_glDisable"]=_glDisable;_glDisable.sig="vi";var _emscripten_glDisable=_glDisable;Module["_emscripten_glDisable"]=_emscripten_glDisable;_emscripten_glDisable.sig="vi";var _glDisableVertexAttribArray=index=>{GLctx.disableVertexAttribArray(index)};Module["_glDisableVertexAttribArray"]=_glDisableVertexAttribArray;_glDisableVertexAttribArray.sig="vi";var _emscripten_glDisableVertexAttribArray=_glDisableVertexAttribArray;Module["_emscripten_glDisableVertexAttribArray"]=_emscripten_glDisableVertexAttribArray;_emscripten_glDisableVertexAttribArray.sig="vi";var _glDrawArrays=(mode,first,count)=>{GLctx.drawArrays(mode,first,count)};Module["_glDrawArrays"]=_glDrawArrays;_glDrawArrays.sig="viii";var _emscripten_glDrawArrays=_glDrawArrays;Module["_emscripten_glDrawArrays"]=_emscripten_glDrawArrays;_emscripten_glDrawArrays.sig="viii";var _glDrawArraysInstanced=(mode,first,count,primcount)=>{GLctx.drawArraysInstanced(mode,first,count,primcount)};Module["_glDrawArraysInstanced"]=_glDrawArraysInstanced;_glDrawArraysInstanced.sig="viiii";var _glDrawArraysInstancedANGLE=_glDrawArraysInstanced;Module["_glDrawArraysInstancedANGLE"]=_glDrawArraysInstancedANGLE;var _emscripten_glDrawArraysInstancedANGLE=_glDrawArraysInstancedANGLE;Module["_emscripten_glDrawArraysInstancedANGLE"]=_emscripten_glDrawArraysInstancedANGLE;var tempFixedLengthArray=[];Module["tempFixedLengthArray"]=tempFixedLengthArray;function _glDrawBuffers(n,bufs){bufs>>>=0;var bufArray=tempFixedLengthArray[n];for(var i=0;i>>2>>>0]}GLctx.drawBuffers(bufArray)}Module["_glDrawBuffers"]=_glDrawBuffers;_glDrawBuffers.sig="vip";var _glDrawBuffersWEBGL=_glDrawBuffers;Module["_glDrawBuffersWEBGL"]=_glDrawBuffersWEBGL;var _emscripten_glDrawBuffersWEBGL=_glDrawBuffersWEBGL;Module["_emscripten_glDrawBuffersWEBGL"]=_emscripten_glDrawBuffersWEBGL;function _glDrawElements(mode,count,type,indices){indices>>>=0;GLctx.drawElements(mode,count,type,indices)}Module["_glDrawElements"]=_glDrawElements;_glDrawElements.sig="viiip";var _emscripten_glDrawElements=_glDrawElements;Module["_emscripten_glDrawElements"]=_emscripten_glDrawElements;_emscripten_glDrawElements.sig="viiip";function _glDrawElementsInstanced(mode,count,type,indices,primcount){indices>>>=0;GLctx.drawElementsInstanced(mode,count,type,indices,primcount)}Module["_glDrawElementsInstanced"]=_glDrawElementsInstanced;_glDrawElementsInstanced.sig="viiipi";var _glDrawElementsInstancedANGLE=_glDrawElementsInstanced;Module["_glDrawElementsInstancedANGLE"]=_glDrawElementsInstancedANGLE;var _emscripten_glDrawElementsInstancedANGLE=_glDrawElementsInstancedANGLE;Module["_emscripten_glDrawElementsInstancedANGLE"]=_emscripten_glDrawElementsInstancedANGLE;var _glEnable=x0=>GLctx.enable(x0);Module["_glEnable"]=_glEnable;_glEnable.sig="vi";var _emscripten_glEnable=_glEnable;Module["_emscripten_glEnable"]=_emscripten_glEnable;_emscripten_glEnable.sig="vi";var _glEnableVertexAttribArray=index=>{GLctx.enableVertexAttribArray(index)};Module["_glEnableVertexAttribArray"]=_glEnableVertexAttribArray;_glEnableVertexAttribArray.sig="vi";var _emscripten_glEnableVertexAttribArray=_glEnableVertexAttribArray;Module["_emscripten_glEnableVertexAttribArray"]=_emscripten_glEnableVertexAttribArray;_emscripten_glEnableVertexAttribArray.sig="vi";var _glEndQueryEXT=target=>{GLctx.disjointTimerQueryExt["endQueryEXT"](target)};Module["_glEndQueryEXT"]=_glEndQueryEXT;_glEndQueryEXT.sig="vi";var _emscripten_glEndQueryEXT=_glEndQueryEXT;Module["_emscripten_glEndQueryEXT"]=_emscripten_glEndQueryEXT;var _glFinish=()=>GLctx.finish();Module["_glFinish"]=_glFinish;_glFinish.sig="v";var _emscripten_glFinish=_glFinish;Module["_emscripten_glFinish"]=_emscripten_glFinish;_emscripten_glFinish.sig="v";var _glFlush=()=>GLctx.flush();Module["_glFlush"]=_glFlush;_glFlush.sig="v";var _emscripten_glFlush=_glFlush;Module["_emscripten_glFlush"]=_emscripten_glFlush;_emscripten_glFlush.sig="v";var _glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};Module["_glFramebufferRenderbuffer"]=_glFramebufferRenderbuffer;_glFramebufferRenderbuffer.sig="viiii";var _emscripten_glFramebufferRenderbuffer=_glFramebufferRenderbuffer;Module["_emscripten_glFramebufferRenderbuffer"]=_emscripten_glFramebufferRenderbuffer;_emscripten_glFramebufferRenderbuffer.sig="viiii";var _glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};Module["_glFramebufferTexture2D"]=_glFramebufferTexture2D;_glFramebufferTexture2D.sig="viiiii";var _emscripten_glFramebufferTexture2D=_glFramebufferTexture2D;Module["_emscripten_glFramebufferTexture2D"]=_emscripten_glFramebufferTexture2D;_emscripten_glFramebufferTexture2D.sig="viiiii";var _glFrontFace=x0=>GLctx.frontFace(x0);Module["_glFrontFace"]=_glFrontFace;_glFrontFace.sig="vi";var _emscripten_glFrontFace=_glFrontFace;Module["_emscripten_glFrontFace"]=_emscripten_glFrontFace;_emscripten_glFrontFace.sig="vi";function _glGenBuffers(n,buffers){buffers>>>=0;GL.genObject(n,buffers,"createBuffer",GL.buffers)}Module["_glGenBuffers"]=_glGenBuffers;_glGenBuffers.sig="vip";var _emscripten_glGenBuffers=_glGenBuffers;Module["_emscripten_glGenBuffers"]=_emscripten_glGenBuffers;_emscripten_glGenBuffers.sig="vip";function _glGenFramebuffers(n,ids){ids>>>=0;GL.genObject(n,ids,"createFramebuffer",GL.framebuffers)}Module["_glGenFramebuffers"]=_glGenFramebuffers;_glGenFramebuffers.sig="vip";var _emscripten_glGenFramebuffers=_glGenFramebuffers;Module["_emscripten_glGenFramebuffers"]=_emscripten_glGenFramebuffers;_emscripten_glGenFramebuffers.sig="vip";function _glGenQueriesEXT(n,ids){ids>>>=0;for(var i=0;i>>2>>>0]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;HEAP32[ids+i*4>>>2>>>0]=id}}Module["_glGenQueriesEXT"]=_glGenQueriesEXT;_glGenQueriesEXT.sig="vip";var _emscripten_glGenQueriesEXT=_glGenQueriesEXT;Module["_emscripten_glGenQueriesEXT"]=_emscripten_glGenQueriesEXT;function _glGenRenderbuffers(n,renderbuffers){renderbuffers>>>=0;GL.genObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}Module["_glGenRenderbuffers"]=_glGenRenderbuffers;_glGenRenderbuffers.sig="vip";var _emscripten_glGenRenderbuffers=_glGenRenderbuffers;Module["_emscripten_glGenRenderbuffers"]=_emscripten_glGenRenderbuffers;_emscripten_glGenRenderbuffers.sig="vip";function _glGenTextures(n,textures){textures>>>=0;GL.genObject(n,textures,"createTexture",GL.textures)}Module["_glGenTextures"]=_glGenTextures;_glGenTextures.sig="vip";var _emscripten_glGenTextures=_glGenTextures;Module["_emscripten_glGenTextures"]=_emscripten_glGenTextures;_emscripten_glGenTextures.sig="vip";function _glGenVertexArrays(n,arrays){arrays>>>=0;GL.genObject(n,arrays,"createVertexArray",GL.vaos)}Module["_glGenVertexArrays"]=_glGenVertexArrays;_glGenVertexArrays.sig="vip";var _glGenVertexArraysOES=_glGenVertexArrays;Module["_glGenVertexArraysOES"]=_glGenVertexArraysOES;_glGenVertexArraysOES.sig="vip";var _emscripten_glGenVertexArraysOES=_glGenVertexArraysOES;Module["_emscripten_glGenVertexArraysOES"]=_emscripten_glGenVertexArraysOES;_emscripten_glGenVertexArraysOES.sig="vip";var _glGenerateMipmap=x0=>GLctx.generateMipmap(x0);Module["_glGenerateMipmap"]=_glGenerateMipmap;_glGenerateMipmap.sig="vi";var _emscripten_glGenerateMipmap=_glGenerateMipmap;Module["_emscripten_glGenerateMipmap"]=_emscripten_glGenerateMipmap;_emscripten_glGenerateMipmap.sig="vi";var __glGetActiveAttribOrUniform=(funcName,program,index,bufSize,length,size,type,name)=>{program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>>2>>>0]=numBytesWrittenExclNull;if(size)HEAP32[size>>>2>>>0]=info.size;if(type)HEAP32[type>>>2>>>0]=info.type}};Module["__glGetActiveAttribOrUniform"]=__glGetActiveAttribOrUniform;function _glGetActiveAttrib(program,index,bufSize,length,size,type,name){length>>>=0;size>>>=0;type>>>=0;name>>>=0;__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}Module["_glGetActiveAttrib"]=_glGetActiveAttrib;_glGetActiveAttrib.sig="viiipppp";var _emscripten_glGetActiveAttrib=_glGetActiveAttrib;Module["_emscripten_glGetActiveAttrib"]=_emscripten_glGetActiveAttrib;_emscripten_glGetActiveAttrib.sig="viiipppp";function _glGetActiveUniform(program,index,bufSize,length,size,type,name){length>>>=0;size>>>=0;type>>>=0;name>>>=0;__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}Module["_glGetActiveUniform"]=_glGetActiveUniform;_glGetActiveUniform.sig="viiipppp";var _emscripten_glGetActiveUniform=_glGetActiveUniform;Module["_emscripten_glGetActiveUniform"]=_emscripten_glGetActiveUniform;_emscripten_glGetActiveUniform.sig="viiipppp";function _glGetAttachedShaders(program,maxCount,count,shaders){count>>>=0;shaders>>>=0;var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>>2>>>0]=len;for(var i=0;i>>2>>>0]=id}}Module["_glGetAttachedShaders"]=_glGetAttachedShaders;_glGetAttachedShaders.sig="viipp";var _emscripten_glGetAttachedShaders=_glGetAttachedShaders;Module["_emscripten_glGetAttachedShaders"]=_emscripten_glGetAttachedShaders;_emscripten_glGetAttachedShaders.sig="viipp";function _glGetAttribLocation(program,name){name>>>=0;return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}Module["_glGetAttribLocation"]=_glGetAttribLocation;_glGetAttribLocation.sig="iip";var _emscripten_glGetAttribLocation=_glGetAttribLocation;Module["_emscripten_glGetAttribLocation"]=_emscripten_glGetAttribLocation;_emscripten_glGetAttribLocation.sig="iip";var writeI53ToI64=(ptr,num)=>{HEAPU32[ptr>>>2>>>0]=num;var lower=HEAPU32[ptr>>>2>>>0];HEAPU32[ptr+4>>>2>>>0]=(num-lower)/4294967296};Module["writeI53ToI64"]=writeI53ToI64;var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>>2>>>0]=result[i];break;case 2:HEAPF32[p+i*4>>>2>>>0]=result[i];break;case 4:HEAP8[p+i>>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Unknown object returned from WebGL getParameter(${name_})! (error: ${e})`);return}}break;default:GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Native code calling glGet${type}v(${name_}) and it returns ${result} of type ${typeof result}!`);return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>>2>>>0]=ret;break;case 2:HEAPF32[p>>>2>>>0]=ret;break;case 4:HEAP8[p>>>0]=ret?1:0;break}};Module["emscriptenWebGLGet"]=emscriptenWebGLGet;function _glGetBooleanv(name_,p){p>>>=0;return emscriptenWebGLGet(name_,p,4)}Module["_glGetBooleanv"]=_glGetBooleanv;_glGetBooleanv.sig="vip";var _emscripten_glGetBooleanv=_glGetBooleanv;Module["_emscripten_glGetBooleanv"]=_emscripten_glGetBooleanv;_emscripten_glGetBooleanv.sig="vip";function _glGetBufferParameteriv(target,value,data){data>>>=0;if(!data){GL.recordError(1281);return}HEAP32[data>>>2>>>0]=GLctx.getBufferParameter(target,value)}Module["_glGetBufferParameteriv"]=_glGetBufferParameteriv;_glGetBufferParameteriv.sig="viip";var _emscripten_glGetBufferParameteriv=_glGetBufferParameteriv;Module["_emscripten_glGetBufferParameteriv"]=_emscripten_glGetBufferParameteriv;_emscripten_glGetBufferParameteriv.sig="viip";var _glGetError=()=>{var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error};Module["_glGetError"]=_glGetError;_glGetError.sig="i";var _emscripten_glGetError=_glGetError;Module["_emscripten_glGetError"]=_emscripten_glGetError;_emscripten_glGetError.sig="i";function _glGetFloatv(name_,p){p>>>=0;return emscriptenWebGLGet(name_,p,2)}Module["_glGetFloatv"]=_glGetFloatv;_glGetFloatv.sig="vip";var _emscripten_glGetFloatv=_glGetFloatv;Module["_emscripten_glGetFloatv"]=_emscripten_glGetFloatv;_emscripten_glGetFloatv.sig="vip";function _glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){params>>>=0;var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>>2>>>0]=result}Module["_glGetFramebufferAttachmentParameteriv"]=_glGetFramebufferAttachmentParameteriv;_glGetFramebufferAttachmentParameteriv.sig="viiip";var _emscripten_glGetFramebufferAttachmentParameteriv=_glGetFramebufferAttachmentParameteriv;Module["_emscripten_glGetFramebufferAttachmentParameteriv"]=_emscripten_glGetFramebufferAttachmentParameteriv;_emscripten_glGetFramebufferAttachmentParameteriv.sig="viiip";function _glGetIntegerv(name_,p){p>>>=0;return emscriptenWebGLGet(name_,p,0)}Module["_glGetIntegerv"]=_glGetIntegerv;_glGetIntegerv.sig="vip";var _emscripten_glGetIntegerv=_glGetIntegerv;Module["_emscripten_glGetIntegerv"]=_emscripten_glGetIntegerv;_emscripten_glGetIntegerv.sig="vip";function _glGetProgramInfoLog(program,maxLength,length,infoLog){length>>>=0;infoLog>>>=0;var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>>2>>>0]=numBytesWrittenExclNull}Module["_glGetProgramInfoLog"]=_glGetProgramInfoLog;_glGetProgramInfoLog.sig="viipp";var _emscripten_glGetProgramInfoLog=_glGetProgramInfoLog;Module["_emscripten_glGetProgramInfoLog"]=_emscripten_glGetProgramInfoLog;_emscripten_glGetProgramInfoLog.sig="viipp";function _glGetProgramiv(program,pname,p){p>>>=0;if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>>2>>>0]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>>2>>>0]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>>2>>>0]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>>2>>>0]=program.maxUniformBlockNameLength}else{HEAP32[p>>>2>>>0]=GLctx.getProgramParameter(program,pname)}}Module["_glGetProgramiv"]=_glGetProgramiv;_glGetProgramiv.sig="viip";var _emscripten_glGetProgramiv=_glGetProgramiv;Module["_emscripten_glGetProgramiv"]=_emscripten_glGetProgramiv;_emscripten_glGetProgramiv.sig="viip";function _glGetQueryObjecti64vEXT(id,pname,params){params>>>=0;if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;{param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}Module["_glGetQueryObjecti64vEXT"]=_glGetQueryObjecti64vEXT;_glGetQueryObjecti64vEXT.sig="viip";var _emscripten_glGetQueryObjecti64vEXT=_glGetQueryObjecti64vEXT;Module["_emscripten_glGetQueryObjecti64vEXT"]=_emscripten_glGetQueryObjecti64vEXT;function _glGetQueryObjectivEXT(id,pname,params){params>>>=0;if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>>2>>>0]=ret}Module["_glGetQueryObjectivEXT"]=_glGetQueryObjectivEXT;_glGetQueryObjectivEXT.sig="viip";var _emscripten_glGetQueryObjectivEXT=_glGetQueryObjectivEXT;Module["_emscripten_glGetQueryObjectivEXT"]=_emscripten_glGetQueryObjectivEXT;var _glGetQueryObjectui64vEXT=_glGetQueryObjecti64vEXT;Module["_glGetQueryObjectui64vEXT"]=_glGetQueryObjectui64vEXT;var _emscripten_glGetQueryObjectui64vEXT=_glGetQueryObjectui64vEXT;Module["_emscripten_glGetQueryObjectui64vEXT"]=_emscripten_glGetQueryObjectui64vEXT;var _glGetQueryObjectuivEXT=_glGetQueryObjectivEXT;Module["_glGetQueryObjectuivEXT"]=_glGetQueryObjectuivEXT;var _emscripten_glGetQueryObjectuivEXT=_glGetQueryObjectuivEXT;Module["_emscripten_glGetQueryObjectuivEXT"]=_emscripten_glGetQueryObjectuivEXT;function _glGetQueryivEXT(target,pname,params){params>>>=0;if(!params){GL.recordError(1281);return}HEAP32[params>>>2>>>0]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}Module["_glGetQueryivEXT"]=_glGetQueryivEXT;_glGetQueryivEXT.sig="viip";var _emscripten_glGetQueryivEXT=_glGetQueryivEXT;Module["_emscripten_glGetQueryivEXT"]=_emscripten_glGetQueryivEXT;function _glGetRenderbufferParameteriv(target,pname,params){params>>>=0;if(!params){GL.recordError(1281);return}HEAP32[params>>>2>>>0]=GLctx.getRenderbufferParameter(target,pname)}Module["_glGetRenderbufferParameteriv"]=_glGetRenderbufferParameteriv;_glGetRenderbufferParameteriv.sig="viip";var _emscripten_glGetRenderbufferParameteriv=_glGetRenderbufferParameteriv;Module["_emscripten_glGetRenderbufferParameteriv"]=_emscripten_glGetRenderbufferParameteriv;_emscripten_glGetRenderbufferParameteriv.sig="viip";function _glGetShaderInfoLog(shader,maxLength,length,infoLog){length>>>=0;infoLog>>>=0;var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>>2>>>0]=numBytesWrittenExclNull}Module["_glGetShaderInfoLog"]=_glGetShaderInfoLog;_glGetShaderInfoLog.sig="viipp";var _emscripten_glGetShaderInfoLog=_glGetShaderInfoLog;Module["_emscripten_glGetShaderInfoLog"]=_emscripten_glGetShaderInfoLog;_emscripten_glGetShaderInfoLog.sig="viipp";function _glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){range>>>=0;precision>>>=0;var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>>2>>>0]=result.rangeMin;HEAP32[range+4>>>2>>>0]=result.rangeMax;HEAP32[precision>>>2>>>0]=result.precision}Module["_glGetShaderPrecisionFormat"]=_glGetShaderPrecisionFormat;_glGetShaderPrecisionFormat.sig="viipp";var _emscripten_glGetShaderPrecisionFormat=_glGetShaderPrecisionFormat;Module["_emscripten_glGetShaderPrecisionFormat"]=_emscripten_glGetShaderPrecisionFormat;_emscripten_glGetShaderPrecisionFormat.sig="viipp";function _glGetShaderSource(shader,bufSize,length,source){length>>>=0;source>>>=0;var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>>2>>>0]=numBytesWrittenExclNull}Module["_glGetShaderSource"]=_glGetShaderSource;_glGetShaderSource.sig="viipp";var _emscripten_glGetShaderSource=_glGetShaderSource;Module["_emscripten_glGetShaderSource"]=_emscripten_glGetShaderSource;_emscripten_glGetShaderSource.sig="viipp";function _glGetShaderiv(shader,pname,p){p>>>=0;if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>>2>>>0]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>>2>>>0]=sourceLength}else{HEAP32[p>>>2>>>0]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}Module["_glGetShaderiv"]=_glGetShaderiv;_glGetShaderiv.sig="viip";var _emscripten_glGetShaderiv=_glGetShaderiv;Module["_emscripten_glGetShaderiv"]=_emscripten_glGetShaderiv;_emscripten_glGetShaderiv.sig="viip";var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};Module["stringToNewUTF8"]=stringToNewUTF8;var webglGetExtensions=function $webglGetExtensions(){var exts=getEmscriptenSupportedExtensions(GLctx);exts=exts.concat(exts.map(e=>"GL_"+e));return exts};Module["webglGetExtensions"]=webglGetExtensions;function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:ret=stringToNewUTF8(webglGetExtensions().join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s?stringToNewUTF8(s):0;break;case 7938:var glVersion=GLctx.getParameter(7938);{glVersion=`OpenGL ES 2.0 (${glVersion})`}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion=`OpenGL ES GLSL ES ${ver_num[1]} (${glslVersion})`}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}Module["_glGetString"]=_glGetString;_glGetString.sig="pi";var _emscripten_glGetString=_glGetString;Module["_emscripten_glGetString"]=_emscripten_glGetString;_emscripten_glGetString.sig="pi";function _glGetTexParameterfv(target,pname,params){params>>>=0;if(!params){GL.recordError(1281);return}HEAPF32[params>>>2>>>0]=GLctx.getTexParameter(target,pname)}Module["_glGetTexParameterfv"]=_glGetTexParameterfv;_glGetTexParameterfv.sig="viip";var _emscripten_glGetTexParameterfv=_glGetTexParameterfv;Module["_emscripten_glGetTexParameterfv"]=_emscripten_glGetTexParameterfv;_emscripten_glGetTexParameterfv.sig="viip";function _glGetTexParameteriv(target,pname,params){params>>>=0;if(!params){GL.recordError(1281);return}HEAP32[params>>>2>>>0]=GLctx.getTexParameter(target,pname)}Module["_glGetTexParameteriv"]=_glGetTexParameteriv;_glGetTexParameteriv.sig="viip";var _emscripten_glGetTexParameteriv=_glGetTexParameteriv;Module["_emscripten_glGetTexParameteriv"]=_emscripten_glGetTexParameteriv;_emscripten_glGetTexParameteriv.sig="viip";var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");Module["webglGetLeftBracePos"]=webglGetLeftBracePos;var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j>>=0;name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?`[${webglLoc}]`:""))}return webglLoc}else{GL.recordError(1282)}};Module["webglGetUniformLocation"]=webglGetUniformLocation;var emscriptenWebGLGetUniform=(program,location,params,type)=>{if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>>2>>>0]=data;break;case 2:HEAPF32[params>>>2>>>0]=data;break}}else{for(var i=0;i>>2>>>0]=data[i];break;case 2:HEAPF32[params+i*4>>>2>>>0]=data[i];break}}}};Module["emscriptenWebGLGetUniform"]=emscriptenWebGLGetUniform;function _glGetUniformfv(program,location,params){params>>>=0;emscriptenWebGLGetUniform(program,location,params,2)}Module["_glGetUniformfv"]=_glGetUniformfv;_glGetUniformfv.sig="viip";var _emscripten_glGetUniformfv=_glGetUniformfv;Module["_emscripten_glGetUniformfv"]=_emscripten_glGetUniformfv;_emscripten_glGetUniformfv.sig="viip";function _glGetUniformiv(program,location,params){params>>>=0;emscriptenWebGLGetUniform(program,location,params,0)}Module["_glGetUniformiv"]=_glGetUniformiv;_glGetUniformiv.sig="viip";var _emscripten_glGetUniformiv=_glGetUniformiv;Module["_emscripten_glGetUniformiv"]=_emscripten_glGetUniformiv;_emscripten_glGetUniformiv.sig="viip";function _glGetVertexAttribPointerv(index,pname,pointer){pointer>>>=0;if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>>2>>>0]=GLctx.getVertexAttribOffset(index,pname)}Module["_glGetVertexAttribPointerv"]=_glGetVertexAttribPointerv;_glGetVertexAttribPointerv.sig="viip";var _emscripten_glGetVertexAttribPointerv=_glGetVertexAttribPointerv;Module["_emscripten_glGetVertexAttribPointerv"]=_emscripten_glGetVertexAttribPointerv;_emscripten_glGetVertexAttribPointerv.sig="viip";var emscriptenWebGLGetVertexAttrib=(index,pname,params,type)=>{if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>>2>>>0]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>>2>>>0]=data;break;case 2:HEAPF32[params>>>2>>>0]=data;break;case 5:HEAP32[params>>>2>>>0]=Math.fround(data);break}}else{for(var i=0;i>>2>>>0]=data[i];break;case 2:HEAPF32[params+i*4>>>2>>>0]=data[i];break;case 5:HEAP32[params+i*4>>>2>>>0]=Math.fround(data[i]);break}}}};Module["emscriptenWebGLGetVertexAttrib"]=emscriptenWebGLGetVertexAttrib;function _glGetVertexAttribfv(index,pname,params){params>>>=0;emscriptenWebGLGetVertexAttrib(index,pname,params,2)}Module["_glGetVertexAttribfv"]=_glGetVertexAttribfv;_glGetVertexAttribfv.sig="viip";var _emscripten_glGetVertexAttribfv=_glGetVertexAttribfv;Module["_emscripten_glGetVertexAttribfv"]=_emscripten_glGetVertexAttribfv;_emscripten_glGetVertexAttribfv.sig="viip";function _glGetVertexAttribiv(index,pname,params){params>>>=0;emscriptenWebGLGetVertexAttrib(index,pname,params,5)}Module["_glGetVertexAttribiv"]=_glGetVertexAttribiv;_glGetVertexAttribiv.sig="viip";var _emscripten_glGetVertexAttribiv=_glGetVertexAttribiv;Module["_emscripten_glGetVertexAttribiv"]=_emscripten_glGetVertexAttribiv;_emscripten_glGetVertexAttribiv.sig="viip";var _glHint=(x0,x1)=>GLctx.hint(x0,x1);Module["_glHint"]=_glHint;_glHint.sig="vii";var _emscripten_glHint=_glHint;Module["_emscripten_glHint"]=_emscripten_glHint;_emscripten_glHint.sig="vii";var _glIsBuffer=buffer=>{var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)};Module["_glIsBuffer"]=_glIsBuffer;_glIsBuffer.sig="ii";var _emscripten_glIsBuffer=_glIsBuffer;Module["_emscripten_glIsBuffer"]=_emscripten_glIsBuffer;_emscripten_glIsBuffer.sig="ii";var _glIsEnabled=x0=>GLctx.isEnabled(x0);Module["_glIsEnabled"]=_glIsEnabled;_glIsEnabled.sig="ii";var _emscripten_glIsEnabled=_glIsEnabled;Module["_emscripten_glIsEnabled"]=_emscripten_glIsEnabled;_emscripten_glIsEnabled.sig="ii";var _glIsFramebuffer=framebuffer=>{var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)};Module["_glIsFramebuffer"]=_glIsFramebuffer;_glIsFramebuffer.sig="ii";var _emscripten_glIsFramebuffer=_glIsFramebuffer;Module["_emscripten_glIsFramebuffer"]=_emscripten_glIsFramebuffer;_emscripten_glIsFramebuffer.sig="ii";var _glIsProgram=program=>{program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)};Module["_glIsProgram"]=_glIsProgram;_glIsProgram.sig="ii";var _emscripten_glIsProgram=_glIsProgram;Module["_emscripten_glIsProgram"]=_emscripten_glIsProgram;_emscripten_glIsProgram.sig="ii";var _glIsQueryEXT=id=>{var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)};Module["_glIsQueryEXT"]=_glIsQueryEXT;_glIsQueryEXT.sig="ii";var _emscripten_glIsQueryEXT=_glIsQueryEXT;Module["_emscripten_glIsQueryEXT"]=_emscripten_glIsQueryEXT;var _glIsRenderbuffer=renderbuffer=>{var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)};Module["_glIsRenderbuffer"]=_glIsRenderbuffer;_glIsRenderbuffer.sig="ii";var _emscripten_glIsRenderbuffer=_glIsRenderbuffer;Module["_emscripten_glIsRenderbuffer"]=_emscripten_glIsRenderbuffer;_emscripten_glIsRenderbuffer.sig="ii";var _glIsShader=shader=>{var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)};Module["_glIsShader"]=_glIsShader;_glIsShader.sig="ii";var _emscripten_glIsShader=_glIsShader;Module["_emscripten_glIsShader"]=_emscripten_glIsShader;_emscripten_glIsShader.sig="ii";var _glIsTexture=id=>{var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)};Module["_glIsTexture"]=_glIsTexture;_glIsTexture.sig="ii";var _emscripten_glIsTexture=_glIsTexture;Module["_emscripten_glIsTexture"]=_emscripten_glIsTexture;_emscripten_glIsTexture.sig="ii";var _glIsVertexArray=array=>{var vao=GL.vaos[array];if(!vao)return 0;return GLctx.isVertexArray(vao)};Module["_glIsVertexArray"]=_glIsVertexArray;_glIsVertexArray.sig="ii";var _glIsVertexArrayOES=_glIsVertexArray;Module["_glIsVertexArrayOES"]=_glIsVertexArrayOES;_glIsVertexArrayOES.sig="ii";var _emscripten_glIsVertexArrayOES=_glIsVertexArrayOES;Module["_emscripten_glIsVertexArrayOES"]=_emscripten_glIsVertexArrayOES;_emscripten_glIsVertexArrayOES.sig="ii";var _glLineWidth=x0=>GLctx.lineWidth(x0);Module["_glLineWidth"]=_glLineWidth;_glLineWidth.sig="vf";var _emscripten_glLineWidth=_glLineWidth;Module["_emscripten_glLineWidth"]=_emscripten_glLineWidth;_emscripten_glLineWidth.sig="vf";var _glLinkProgram=program=>{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};Module["_glLinkProgram"]=_glLinkProgram;_glLinkProgram.sig="vi";var _emscripten_glLinkProgram=_glLinkProgram;Module["_emscripten_glLinkProgram"]=_emscripten_glLinkProgram;_emscripten_glLinkProgram.sig="vi";var _glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)};Module["_glPixelStorei"]=_glPixelStorei;_glPixelStorei.sig="vii";var _emscripten_glPixelStorei=_glPixelStorei;Module["_emscripten_glPixelStorei"]=_emscripten_glPixelStorei;_emscripten_glPixelStorei.sig="vii";var _glPolygonOffset=(x0,x1)=>GLctx.polygonOffset(x0,x1);Module["_glPolygonOffset"]=_glPolygonOffset;_glPolygonOffset.sig="vff";var _emscripten_glPolygonOffset=_glPolygonOffset;Module["_emscripten_glPolygonOffset"]=_emscripten_glPolygonOffset;_emscripten_glPolygonOffset.sig="vff";var _glQueryCounterEXT=(id,target)=>{GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)};Module["_glQueryCounterEXT"]=_glQueryCounterEXT;_glQueryCounterEXT.sig="vii";var _emscripten_glQueryCounterEXT=_glQueryCounterEXT;Module["_emscripten_glQueryCounterEXT"]=_emscripten_glQueryCounterEXT;var computeUnpackAlignedImageSize=(width,height,sizePerPixel,alignment)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize};Module["computeUnpackAlignedImageSize"]=computeUnpackAlignedImageSize;var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4};return colorChannels[format-6402]||1};Module["colorChannelsInGlTextureFormat"]=colorChannelsInGlTextureFormat;var heapObjectForWebGLType=type=>{type-=5120;if(type==1)return HEAPU8;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922)return HEAPU32;return HEAPU16};Module["heapObjectForWebGLType"]=heapObjectForWebGLType;var toTypedArrayIndex=(pointer,heap)=>pointer>>>31-Math.clz32(heap.BYTES_PER_ELEMENT);Module["toTypedArrayIndex"]=toTypedArrayIndex;var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var sizePerPixel=colorChannelsInGlTextureFormat(format)*heap.BYTES_PER_ELEMENT;var bytes=computeUnpackAlignedImageSize(width,height,sizePerPixel,GL.unpackAlignment);return heap.subarray(toTypedArrayIndex(pixels,heap)>>>0,toTypedArrayIndex(pixels+bytes,heap)>>>0)};Module["emscriptenWebGLGetTexPixelData"]=emscriptenWebGLGetTexPixelData;function _glReadPixels(x,y,width,height,format,type,pixels){pixels>>>=0;var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}Module["_glReadPixels"]=_glReadPixels;_glReadPixels.sig="viiiiiip";var _emscripten_glReadPixels=_glReadPixels;Module["_emscripten_glReadPixels"]=_emscripten_glReadPixels;_emscripten_glReadPixels.sig="viiiiiip";var _glReleaseShaderCompiler=()=>{};Module["_glReleaseShaderCompiler"]=_glReleaseShaderCompiler;_glReleaseShaderCompiler.sig="v";var _emscripten_glReleaseShaderCompiler=_glReleaseShaderCompiler;Module["_emscripten_glReleaseShaderCompiler"]=_emscripten_glReleaseShaderCompiler;_emscripten_glReleaseShaderCompiler.sig="v";var _glRenderbufferStorage=(x0,x1,x2,x3)=>GLctx.renderbufferStorage(x0,x1,x2,x3);Module["_glRenderbufferStorage"]=_glRenderbufferStorage;_glRenderbufferStorage.sig="viiii";var _emscripten_glRenderbufferStorage=_glRenderbufferStorage;Module["_emscripten_glRenderbufferStorage"]=_emscripten_glRenderbufferStorage;_emscripten_glRenderbufferStorage.sig="viiii";var _glSampleCoverage=(value,invert)=>{GLctx.sampleCoverage(value,!!invert)};Module["_glSampleCoverage"]=_glSampleCoverage;_glSampleCoverage.sig="vfi";var _emscripten_glSampleCoverage=_glSampleCoverage;Module["_emscripten_glSampleCoverage"]=_emscripten_glSampleCoverage;_emscripten_glSampleCoverage.sig="vfi";var _glScissor=(x0,x1,x2,x3)=>GLctx.scissor(x0,x1,x2,x3);Module["_glScissor"]=_glScissor;_glScissor.sig="viiii";var _emscripten_glScissor=_glScissor;Module["_emscripten_glScissor"]=_emscripten_glScissor;_emscripten_glScissor.sig="viiii";function _glShaderBinary(count,shaders,binaryformat,binary,length){shaders>>>=0;binary>>>=0;GL.recordError(1280)}Module["_glShaderBinary"]=_glShaderBinary;_glShaderBinary.sig="vipipi";var _emscripten_glShaderBinary=_glShaderBinary;Module["_emscripten_glShaderBinary"]=_emscripten_glShaderBinary;_emscripten_glShaderBinary.sig="vipipi";function _glShaderSource(shader,count,string,length){string>>>=0;length>>>=0;var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}Module["_glShaderSource"]=_glShaderSource;_glShaderSource.sig="viipp";var _emscripten_glShaderSource=_glShaderSource;Module["_emscripten_glShaderSource"]=_emscripten_glShaderSource;_emscripten_glShaderSource.sig="viipp";var _glStencilFunc=(x0,x1,x2)=>GLctx.stencilFunc(x0,x1,x2);Module["_glStencilFunc"]=_glStencilFunc;_glStencilFunc.sig="viii";var _emscripten_glStencilFunc=_glStencilFunc;Module["_emscripten_glStencilFunc"]=_emscripten_glStencilFunc;_emscripten_glStencilFunc.sig="viii";var _glStencilFuncSeparate=(x0,x1,x2,x3)=>GLctx.stencilFuncSeparate(x0,x1,x2,x3);Module["_glStencilFuncSeparate"]=_glStencilFuncSeparate;_glStencilFuncSeparate.sig="viiii";var _emscripten_glStencilFuncSeparate=_glStencilFuncSeparate;Module["_emscripten_glStencilFuncSeparate"]=_emscripten_glStencilFuncSeparate;_emscripten_glStencilFuncSeparate.sig="viiii";var _glStencilMask=x0=>GLctx.stencilMask(x0);Module["_glStencilMask"]=_glStencilMask;_glStencilMask.sig="vi";var _emscripten_glStencilMask=_glStencilMask;Module["_emscripten_glStencilMask"]=_emscripten_glStencilMask;_emscripten_glStencilMask.sig="vi";var _glStencilMaskSeparate=(x0,x1)=>GLctx.stencilMaskSeparate(x0,x1);Module["_glStencilMaskSeparate"]=_glStencilMaskSeparate;_glStencilMaskSeparate.sig="vii";var _emscripten_glStencilMaskSeparate=_glStencilMaskSeparate;Module["_emscripten_glStencilMaskSeparate"]=_emscripten_glStencilMaskSeparate;_emscripten_glStencilMaskSeparate.sig="vii";var _glStencilOp=(x0,x1,x2)=>GLctx.stencilOp(x0,x1,x2);Module["_glStencilOp"]=_glStencilOp;_glStencilOp.sig="viii";var _emscripten_glStencilOp=_glStencilOp;Module["_emscripten_glStencilOp"]=_emscripten_glStencilOp;_emscripten_glStencilOp.sig="viii";var _glStencilOpSeparate=(x0,x1,x2,x3)=>GLctx.stencilOpSeparate(x0,x1,x2,x3);Module["_glStencilOpSeparate"]=_glStencilOpSeparate;_glStencilOpSeparate.sig="viiii";var _emscripten_glStencilOpSeparate=_glStencilOpSeparate;Module["_emscripten_glStencilOpSeparate"]=_emscripten_glStencilOpSeparate;_emscripten_glStencilOpSeparate.sig="viiii";function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){pixels>>>=0;var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null;GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixelData)}Module["_glTexImage2D"]=_glTexImage2D;_glTexImage2D.sig="viiiiiiiip";var _emscripten_glTexImage2D=_glTexImage2D;Module["_emscripten_glTexImage2D"]=_emscripten_glTexImage2D;_emscripten_glTexImage2D.sig="viiiiiiiip";var _glTexParameterf=(x0,x1,x2)=>GLctx.texParameterf(x0,x1,x2);Module["_glTexParameterf"]=_glTexParameterf;_glTexParameterf.sig="viif";var _emscripten_glTexParameterf=_glTexParameterf;Module["_emscripten_glTexParameterf"]=_emscripten_glTexParameterf;_emscripten_glTexParameterf.sig="viif";function _glTexParameterfv(target,pname,params){params>>>=0;var param=HEAPF32[params>>>2>>>0];GLctx.texParameterf(target,pname,param)}Module["_glTexParameterfv"]=_glTexParameterfv;_glTexParameterfv.sig="viip";var _emscripten_glTexParameterfv=_glTexParameterfv;Module["_emscripten_glTexParameterfv"]=_emscripten_glTexParameterfv;_emscripten_glTexParameterfv.sig="viip";var _glTexParameteri=(x0,x1,x2)=>GLctx.texParameteri(x0,x1,x2);Module["_glTexParameteri"]=_glTexParameteri;_glTexParameteri.sig="viii";var _emscripten_glTexParameteri=_glTexParameteri;Module["_emscripten_glTexParameteri"]=_emscripten_glTexParameteri;_emscripten_glTexParameteri.sig="viii";function _glTexParameteriv(target,pname,params){params>>>=0;var param=HEAP32[params>>>2>>>0];GLctx.texParameteri(target,pname,param)}Module["_glTexParameteriv"]=_glTexParameteriv;_glTexParameteriv.sig="viip";var _emscripten_glTexParameteriv=_glTexParameteriv;Module["_emscripten_glTexParameteriv"]=_emscripten_glTexParameteriv;_emscripten_glTexParameteriv.sig="viip";function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){pixels>>>=0;var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0):null;GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}Module["_glTexSubImage2D"]=_glTexSubImage2D;_glTexSubImage2D.sig="viiiiiiiip";var _emscripten_glTexSubImage2D=_glTexSubImage2D;Module["_emscripten_glTexSubImage2D"]=_emscripten_glTexSubImage2D;_emscripten_glTexSubImage2D.sig="viiiiiiiip";var _glUniform1f=(location,v0)=>{GLctx.uniform1f(webglGetUniformLocation(location),v0)};Module["_glUniform1f"]=_glUniform1f;_glUniform1f.sig="vif";var _emscripten_glUniform1f=_glUniform1f;Module["_emscripten_glUniform1f"]=_emscripten_glUniform1f;_emscripten_glUniform1f.sig="vif";var miniTempWebGLFloatBuffers=[];Module["miniTempWebGLFloatBuffers"]=miniTempWebGLFloatBuffers;function _glUniform1fv(location,count,value){value>>>=0;if(count<=288){var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>>2>>>0]}}else{var view=HEAPF32.subarray(value>>>2>>>0,value+count*4>>>2>>>0)}GLctx.uniform1fv(webglGetUniformLocation(location),view)}Module["_glUniform1fv"]=_glUniform1fv;_glUniform1fv.sig="viip";var _emscripten_glUniform1fv=_glUniform1fv;Module["_emscripten_glUniform1fv"]=_emscripten_glUniform1fv;_emscripten_glUniform1fv.sig="viip";var _glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};Module["_glUniform1i"]=_glUniform1i;_glUniform1i.sig="vii";var _emscripten_glUniform1i=_glUniform1i;Module["_emscripten_glUniform1i"]=_emscripten_glUniform1i;_emscripten_glUniform1i.sig="vii";var miniTempWebGLIntBuffers=[];Module["miniTempWebGLIntBuffers"]=miniTempWebGLIntBuffers;function _glUniform1iv(location,count,value){value>>>=0;if(count<=288){var view=miniTempWebGLIntBuffers[count];for(var i=0;i>>2>>>0]}}else{var view=HEAP32.subarray(value>>>2>>>0,value+count*4>>>2>>>0)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}Module["_glUniform1iv"]=_glUniform1iv;_glUniform1iv.sig="viip";var _emscripten_glUniform1iv=_glUniform1iv;Module["_emscripten_glUniform1iv"]=_emscripten_glUniform1iv;_emscripten_glUniform1iv.sig="viip";var _glUniform2f=(location,v0,v1)=>{GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)};Module["_glUniform2f"]=_glUniform2f;_glUniform2f.sig="viff";var _emscripten_glUniform2f=_glUniform2f;Module["_emscripten_glUniform2f"]=_emscripten_glUniform2f;_emscripten_glUniform2f.sig="viff";function _glUniform2fv(location,count,value){value>>>=0;if(count<=144){var view=miniTempWebGLFloatBuffers[2*count];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>>2>>>0];view[i+1]=HEAPF32[value+(4*i+4)>>>2>>>0]}}else{var view=HEAPF32.subarray(value>>>2>>>0,value+count*8>>>2>>>0)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}Module["_glUniform2fv"]=_glUniform2fv;_glUniform2fv.sig="viip";var _emscripten_glUniform2fv=_glUniform2fv;Module["_emscripten_glUniform2fv"]=_emscripten_glUniform2fv;_emscripten_glUniform2fv.sig="viip";var _glUniform2i=(location,v0,v1)=>{GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)};Module["_glUniform2i"]=_glUniform2i;_glUniform2i.sig="viii";var _emscripten_glUniform2i=_glUniform2i;Module["_emscripten_glUniform2i"]=_emscripten_glUniform2i;_emscripten_glUniform2i.sig="viii";function _glUniform2iv(location,count,value){value>>>=0;if(count<=144){var view=miniTempWebGLIntBuffers[2*count];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>>2>>>0];view[i+1]=HEAP32[value+(4*i+4)>>>2>>>0]}}else{var view=HEAP32.subarray(value>>>2>>>0,value+count*8>>>2>>>0)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}Module["_glUniform2iv"]=_glUniform2iv;_glUniform2iv.sig="viip";var _emscripten_glUniform2iv=_glUniform2iv;Module["_emscripten_glUniform2iv"]=_emscripten_glUniform2iv;_emscripten_glUniform2iv.sig="viip";var _glUniform3f=(location,v0,v1,v2)=>{GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)};Module["_glUniform3f"]=_glUniform3f;_glUniform3f.sig="vifff";var _emscripten_glUniform3f=_glUniform3f;Module["_emscripten_glUniform3f"]=_emscripten_glUniform3f;_emscripten_glUniform3f.sig="vifff";function _glUniform3fv(location,count,value){value>>>=0;if(count<=96){var view=miniTempWebGLFloatBuffers[3*count];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>>2>>>0];view[i+1]=HEAPF32[value+(4*i+4)>>>2>>>0];view[i+2]=HEAPF32[value+(4*i+8)>>>2>>>0]}}else{var view=HEAPF32.subarray(value>>>2>>>0,value+count*12>>>2>>>0)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}Module["_glUniform3fv"]=_glUniform3fv;_glUniform3fv.sig="viip";var _emscripten_glUniform3fv=_glUniform3fv;Module["_emscripten_glUniform3fv"]=_emscripten_glUniform3fv;_emscripten_glUniform3fv.sig="viip";var _glUniform3i=(location,v0,v1,v2)=>{GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)};Module["_glUniform3i"]=_glUniform3i;_glUniform3i.sig="viiii";var _emscripten_glUniform3i=_glUniform3i;Module["_emscripten_glUniform3i"]=_emscripten_glUniform3i;_emscripten_glUniform3i.sig="viiii";function _glUniform3iv(location,count,value){value>>>=0;if(count<=96){var view=miniTempWebGLIntBuffers[3*count];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>>2>>>0];view[i+1]=HEAP32[value+(4*i+4)>>>2>>>0];view[i+2]=HEAP32[value+(4*i+8)>>>2>>>0]}}else{var view=HEAP32.subarray(value>>>2>>>0,value+count*12>>>2>>>0)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}Module["_glUniform3iv"]=_glUniform3iv;_glUniform3iv.sig="viip";var _emscripten_glUniform3iv=_glUniform3iv;Module["_emscripten_glUniform3iv"]=_emscripten_glUniform3iv;_emscripten_glUniform3iv.sig="viip";var _glUniform4f=(location,v0,v1,v2,v3)=>{GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)};Module["_glUniform4f"]=_glUniform4f;_glUniform4f.sig="viffff";var _emscripten_glUniform4f=_glUniform4f;Module["_emscripten_glUniform4f"]=_emscripten_glUniform4f;_emscripten_glUniform4f.sig="viffff";function _glUniform4fv(location,count,value){value>>>=0;if(count<=72){var view=miniTempWebGLFloatBuffers[4*count];var heap=HEAPF32;value=value>>>2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst>>>0];view[i+1]=heap[dst+1>>>0];view[i+2]=heap[dst+2>>>0];view[i+3]=heap[dst+3>>>0]}}else{var view=HEAPF32.subarray(value>>>2>>>0,value+count*16>>>2>>>0)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}Module["_glUniform4fv"]=_glUniform4fv;_glUniform4fv.sig="viip";var _emscripten_glUniform4fv=_glUniform4fv;Module["_emscripten_glUniform4fv"]=_emscripten_glUniform4fv;_emscripten_glUniform4fv.sig="viip";var _glUniform4i=(location,v0,v1,v2,v3)=>{GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)};Module["_glUniform4i"]=_glUniform4i;_glUniform4i.sig="viiiii";var _emscripten_glUniform4i=_glUniform4i;Module["_emscripten_glUniform4i"]=_emscripten_glUniform4i;_emscripten_glUniform4i.sig="viiiii";function _glUniform4iv(location,count,value){value>>>=0;if(count<=72){var view=miniTempWebGLIntBuffers[4*count];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>>2>>>0];view[i+1]=HEAP32[value+(4*i+4)>>>2>>>0];view[i+2]=HEAP32[value+(4*i+8)>>>2>>>0];view[i+3]=HEAP32[value+(4*i+12)>>>2>>>0]}}else{var view=HEAP32.subarray(value>>>2>>>0,value+count*16>>>2>>>0)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}Module["_glUniform4iv"]=_glUniform4iv;_glUniform4iv.sig="viip";var _emscripten_glUniform4iv=_glUniform4iv;Module["_emscripten_glUniform4iv"]=_emscripten_glUniform4iv;_emscripten_glUniform4iv.sig="viip";function _glUniformMatrix2fv(location,count,transpose,value){value>>>=0;if(count<=72){var view=miniTempWebGLFloatBuffers[4*count];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>>2>>>0];view[i+1]=HEAPF32[value+(4*i+4)>>>2>>>0];view[i+2]=HEAPF32[value+(4*i+8)>>>2>>>0];view[i+3]=HEAPF32[value+(4*i+12)>>>2>>>0]}}else{var view=HEAPF32.subarray(value>>>2>>>0,value+count*16>>>2>>>0)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}Module["_glUniformMatrix2fv"]=_glUniformMatrix2fv;_glUniformMatrix2fv.sig="viiip";var _emscripten_glUniformMatrix2fv=_glUniformMatrix2fv;Module["_emscripten_glUniformMatrix2fv"]=_emscripten_glUniformMatrix2fv;_emscripten_glUniformMatrix2fv.sig="viiip";function _glUniformMatrix3fv(location,count,transpose,value){value>>>=0;if(count<=32){var view=miniTempWebGLFloatBuffers[9*count];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>>2>>>0];view[i+1]=HEAPF32[value+(4*i+4)>>>2>>>0];view[i+2]=HEAPF32[value+(4*i+8)>>>2>>>0];view[i+3]=HEAPF32[value+(4*i+12)>>>2>>>0];view[i+4]=HEAPF32[value+(4*i+16)>>>2>>>0];view[i+5]=HEAPF32[value+(4*i+20)>>>2>>>0];view[i+6]=HEAPF32[value+(4*i+24)>>>2>>>0];view[i+7]=HEAPF32[value+(4*i+28)>>>2>>>0];view[i+8]=HEAPF32[value+(4*i+32)>>>2>>>0]}}else{var view=HEAPF32.subarray(value>>>2>>>0,value+count*36>>>2>>>0)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}Module["_glUniformMatrix3fv"]=_glUniformMatrix3fv;_glUniformMatrix3fv.sig="viiip";var _emscripten_glUniformMatrix3fv=_glUniformMatrix3fv;Module["_emscripten_glUniformMatrix3fv"]=_emscripten_glUniformMatrix3fv;_emscripten_glUniformMatrix3fv.sig="viiip";function _glUniformMatrix4fv(location,count,transpose,value){value>>>=0;if(count<=18){var view=miniTempWebGLFloatBuffers[16*count];var heap=HEAPF32;value=value>>>2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst>>>0];view[i+1]=heap[dst+1>>>0];view[i+2]=heap[dst+2>>>0];view[i+3]=heap[dst+3>>>0];view[i+4]=heap[dst+4>>>0];view[i+5]=heap[dst+5>>>0];view[i+6]=heap[dst+6>>>0];view[i+7]=heap[dst+7>>>0];view[i+8]=heap[dst+8>>>0];view[i+9]=heap[dst+9>>>0];view[i+10]=heap[dst+10>>>0];view[i+11]=heap[dst+11>>>0];view[i+12]=heap[dst+12>>>0];view[i+13]=heap[dst+13>>>0];view[i+14]=heap[dst+14>>>0];view[i+15]=heap[dst+15>>>0]}}else{var view=HEAPF32.subarray(value>>>2>>>0,value+count*64>>>2>>>0)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}Module["_glUniformMatrix4fv"]=_glUniformMatrix4fv;_glUniformMatrix4fv.sig="viiip";var _emscripten_glUniformMatrix4fv=_glUniformMatrix4fv;Module["_emscripten_glUniformMatrix4fv"]=_emscripten_glUniformMatrix4fv;_emscripten_glUniformMatrix4fv.sig="viiip";var _glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};Module["_glUseProgram"]=_glUseProgram;_glUseProgram.sig="vi";var _emscripten_glUseProgram=_glUseProgram;Module["_emscripten_glUseProgram"]=_emscripten_glUseProgram;_emscripten_glUseProgram.sig="vi";var _glValidateProgram=program=>{GLctx.validateProgram(GL.programs[program])};Module["_glValidateProgram"]=_glValidateProgram;_glValidateProgram.sig="vi";var _emscripten_glValidateProgram=_glValidateProgram;Module["_emscripten_glValidateProgram"]=_emscripten_glValidateProgram;_emscripten_glValidateProgram.sig="vi";var _glVertexAttrib1f=(x0,x1)=>GLctx.vertexAttrib1f(x0,x1);Module["_glVertexAttrib1f"]=_glVertexAttrib1f;_glVertexAttrib1f.sig="vif";var _emscripten_glVertexAttrib1f=_glVertexAttrib1f;Module["_emscripten_glVertexAttrib1f"]=_emscripten_glVertexAttrib1f;_emscripten_glVertexAttrib1f.sig="vif";function _glVertexAttrib1fv(index,v){v>>>=0;GLctx.vertexAttrib1f(index,HEAPF32[v>>>2])}Module["_glVertexAttrib1fv"]=_glVertexAttrib1fv;_glVertexAttrib1fv.sig="vip";var _emscripten_glVertexAttrib1fv=_glVertexAttrib1fv;Module["_emscripten_glVertexAttrib1fv"]=_emscripten_glVertexAttrib1fv;_emscripten_glVertexAttrib1fv.sig="vip";var _glVertexAttrib2f=(x0,x1,x2)=>GLctx.vertexAttrib2f(x0,x1,x2);Module["_glVertexAttrib2f"]=_glVertexAttrib2f;_glVertexAttrib2f.sig="viff";var _emscripten_glVertexAttrib2f=_glVertexAttrib2f;Module["_emscripten_glVertexAttrib2f"]=_emscripten_glVertexAttrib2f;_emscripten_glVertexAttrib2f.sig="viff";function _glVertexAttrib2fv(index,v){v>>>=0;GLctx.vertexAttrib2f(index,HEAPF32[v>>>2],HEAPF32[v+4>>>2])}Module["_glVertexAttrib2fv"]=_glVertexAttrib2fv;_glVertexAttrib2fv.sig="vip";var _emscripten_glVertexAttrib2fv=_glVertexAttrib2fv;Module["_emscripten_glVertexAttrib2fv"]=_emscripten_glVertexAttrib2fv;_emscripten_glVertexAttrib2fv.sig="vip";var _glVertexAttrib3f=(x0,x1,x2,x3)=>GLctx.vertexAttrib3f(x0,x1,x2,x3);Module["_glVertexAttrib3f"]=_glVertexAttrib3f;_glVertexAttrib3f.sig="vifff";var _emscripten_glVertexAttrib3f=_glVertexAttrib3f;Module["_emscripten_glVertexAttrib3f"]=_emscripten_glVertexAttrib3f;_emscripten_glVertexAttrib3f.sig="vifff";function _glVertexAttrib3fv(index,v){v>>>=0;GLctx.vertexAttrib3f(index,HEAPF32[v>>>2],HEAPF32[v+4>>>2],HEAPF32[v+8>>>2])}Module["_glVertexAttrib3fv"]=_glVertexAttrib3fv;_glVertexAttrib3fv.sig="vip";var _emscripten_glVertexAttrib3fv=_glVertexAttrib3fv;Module["_emscripten_glVertexAttrib3fv"]=_emscripten_glVertexAttrib3fv;_emscripten_glVertexAttrib3fv.sig="vip";var _glVertexAttrib4f=(x0,x1,x2,x3,x4)=>GLctx.vertexAttrib4f(x0,x1,x2,x3,x4);Module["_glVertexAttrib4f"]=_glVertexAttrib4f;_glVertexAttrib4f.sig="viffff";var _emscripten_glVertexAttrib4f=_glVertexAttrib4f;Module["_emscripten_glVertexAttrib4f"]=_emscripten_glVertexAttrib4f;_emscripten_glVertexAttrib4f.sig="viffff";function _glVertexAttrib4fv(index,v){v>>>=0;GLctx.vertexAttrib4f(index,HEAPF32[v>>>2],HEAPF32[v+4>>>2],HEAPF32[v+8>>>2],HEAPF32[v+12>>>2])}Module["_glVertexAttrib4fv"]=_glVertexAttrib4fv;_glVertexAttrib4fv.sig="vip";var _emscripten_glVertexAttrib4fv=_glVertexAttrib4fv;Module["_emscripten_glVertexAttrib4fv"]=_emscripten_glVertexAttrib4fv;_emscripten_glVertexAttrib4fv.sig="vip";var _glVertexAttribDivisor=(index,divisor)=>{GLctx.vertexAttribDivisor(index,divisor)};Module["_glVertexAttribDivisor"]=_glVertexAttribDivisor;_glVertexAttribDivisor.sig="vii";var _glVertexAttribDivisorANGLE=_glVertexAttribDivisor;Module["_glVertexAttribDivisorANGLE"]=_glVertexAttribDivisorANGLE;var _emscripten_glVertexAttribDivisorANGLE=_glVertexAttribDivisorANGLE;Module["_emscripten_glVertexAttribDivisorANGLE"]=_emscripten_glVertexAttribDivisorANGLE;function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){ptr>>>=0;GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}Module["_glVertexAttribPointer"]=_glVertexAttribPointer;_glVertexAttribPointer.sig="viiiiip";var _emscripten_glVertexAttribPointer=_glVertexAttribPointer;Module["_emscripten_glVertexAttribPointer"]=_emscripten_glVertexAttribPointer;_emscripten_glVertexAttribPointer.sig="viiiiip";var _glViewport=(x0,x1,x2,x3)=>GLctx.viewport(x0,x1,x2,x3);Module["_glViewport"]=_glViewport;_glViewport.sig="viiii";var _emscripten_glViewport=_glViewport;Module["_emscripten_glViewport"]=_emscripten_glViewport;_emscripten_glViewport.sig="viiii";function _emscripten_out(str){str>>>=0;return out(UTF8ToString(str))}Module["_emscripten_out"]=_emscripten_out;_emscripten_out.sig="vp";class HandleAllocator{constructor(){this.allocated=[undefined];this.freelist=[]}get(id){return this.allocated[id]}has(id){return this.allocated[id]!==undefined}allocate(handle){var id=this.freelist.pop()||this.allocated.length;this.allocated[id]=handle;return id}free(id){this.allocated[id]=undefined;this.freelist.push(id)}}Module["HandleAllocator"]=HandleAllocator;var promiseMap=new HandleAllocator;Module["promiseMap"]=promiseMap;var makePromise=()=>{var promiseInfo={};promiseInfo.promise=new Promise((resolve,reject)=>{promiseInfo.reject=reject;promiseInfo.resolve=resolve});promiseInfo.id=promiseMap.allocate(promiseInfo);return promiseInfo};Module["makePromise"]=makePromise;function _emscripten_promise_create(){return makePromise().id}Module["_emscripten_promise_create"]=_emscripten_promise_create;_emscripten_promise_create.sig="p";function _emscripten_promise_destroy(id){id>>>=0;promiseMap.free(id)}Module["_emscripten_promise_destroy"]=_emscripten_promise_destroy;_emscripten_promise_destroy.sig="vp";var getPromise=id=>promiseMap.get(id).promise;Module["getPromise"]=getPromise;function _emscripten_promise_resolve(id,result,value){id>>>=0;value>>>=0;var info=promiseMap.get(id);switch(result){case 0:info.resolve(value);return;case 1:info.resolve(getPromise(value));return;case 2:info.resolve(getPromise(value));_emscripten_promise_destroy(value);return;case 3:info.reject(value);return}}Module["_emscripten_promise_resolve"]=_emscripten_promise_resolve;_emscripten_promise_resolve.sig="vpip";var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};Module["growMemory"]=growMemory;function _emscripten_resize_heap(requestedSize){requestedSize>>>=0;var oldSize=HEAPU8.length;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false}Module["_emscripten_resize_heap"]=_emscripten_resize_heap;_emscripten_resize_heap.sig="ip";var getExecutableName=()=>thisProgram||"./this.program";Module["getExecutableName"]=getExecutableName;var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};Module["getEnvStrings"]=getEnvStrings;var stringToAscii=(str,buffer)=>{for(var i=0;i>>0]=str.charCodeAt(i)}HEAP8[buffer>>>0]=0};Module["stringToAscii"]=stringToAscii;var _environ_get=function(__environ,environ_buf){__environ>>>=0;environ_buf>>>=0;var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>>2>>>0]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};Module["_environ_get"]=_environ_get;_environ_get.sig="ipp";var _environ_sizes_get=function(penviron_count,penviron_buf_size){penviron_count>>>=0;penviron_buf_size>>>=0;var strings=getEnvStrings();HEAPU32[penviron_count>>>2>>>0]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>>2>>>0]=bufSize;return 0};Module["_environ_sizes_get"]=_environ_sizes_get;_environ_sizes_get.sig="ipp";function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_close"]=_fd_close;_fd_close.sig="ii";function _fd_fdstat_get(fd,pbuf){pbuf>>>=0;try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf>>>0]=type;HEAP16[pbuf+2>>>1>>>0]=flags;HEAP64[pbuf+8>>>3]=BigInt(rightsBase);HEAP64[pbuf+16>>>3]=BigInt(rightsInheriting);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_fdstat_get"]=_fd_fdstat_get;_fd_fdstat_get.sig="iip";var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;offset=bigintToI53Checked(offset);pnum>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt,offset);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_pread"]=_fd_pread;_fd_pread.sig="iippjp";var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!="undefined"){offset+=curr}}return ret};Module["doWritev"]=doWritev;function _fd_pwrite(fd,iov,iovcnt,offset,pnum){iov>>>=0;iovcnt>>>=0;offset=bigintToI53Checked(offset);pnum>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt,offset);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_pwrite"]=_fd_pwrite;_fd_pwrite.sig="iippjp";function _fd_read(fd,iov,iovcnt,pnum){iov>>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_read"]=_fd_read;_fd_read.sig="iippp";function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);newOffset>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_seek"]=_fd_seek;_fd_seek.sig="iijip";function _fd_sync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);if(stream.stream_ops?.fsync){return stream.stream_ops.fsync(stream)}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_sync"]=_fd_sync;_fd_sync.sig="ii";function _fd_write(fd,iov,iovcnt,pnum){iov>>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_fd_write"]=_fd_write;_fd_write.sig="iippp";function _getaddrinfo(node,service,hint,out){node>>>=0;service>>>=0;hint>>>=0;out>>>=0;var addrs=[];var canon=null;var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai,last;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>>2>>>0]=family;HEAP32[ai+8>>>2>>>0]=type;HEAP32[ai+12>>>2>>>0]=proto;HEAPU32[ai+24>>>2>>>0]=canon;HEAPU32[ai+20>>>2>>>0]=sa;if(family===10){HEAP32[ai+16>>>2>>>0]=28}else{HEAP32[ai+16>>>2>>>0]=16}HEAP32[ai+28>>>2>>>0]=0;return ai}if(hint){flags=HEAP32[hint>>>2>>>0];family=HEAP32[hint+4>>>2>>>0];type=HEAP32[hint+8>>>2>>>0];proto=HEAP32[hint+12>>>2>>>0]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>>2>>>0]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>>2>>>0]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>>2>>>0]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>>2>>>0]=ai;return 0}Module["_getaddrinfo"]=_getaddrinfo;_getaddrinfo.sig="ipppp";function _getentropy(buffer,size){buffer>>>=0;size>>>=0;randomFill(HEAPU8.subarray(buffer>>>0,buffer+size>>>0));return 0}Module["_getentropy"]=_getentropy;_getentropy.sig="ipp";function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){sa>>>=0;node>>>=0;serv>>>=0;var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}Module["_getnameinfo"]=_getnameinfo;_getnameinfo.sig="ipipipii";var Protocols={list:[],map:{}};Module["Protocols"]=Protocols;var _setprotoent=stayopen=>{function allocprotoent(name,proto,aliases){var nameBuf=_malloc(name.length+1);stringToAscii(name,nameBuf);var j=0;var length=aliases.length;var aliasListBuf=_malloc((length+1)*4);for(var i=0;i>>2>>>0]=aliasBuf}HEAPU32[aliasListBuf+j>>>2>>>0]=0;var pe=_malloc(12);HEAPU32[pe>>>2>>>0]=nameBuf;HEAPU32[pe+4>>>2>>>0]=aliasListBuf;HEAP32[pe+8>>>2>>>0]=proto;return pe}var list=Protocols.list;var map=Protocols.map;if(list.length===0){var entry=allocprotoent("tcp",6,["TCP"]);list.push(entry);map["tcp"]=map["6"]=entry;entry=allocprotoent("udp",17,["UDP"]);list.push(entry);map["udp"]=map["17"]=entry}_setprotoent.index=0};Module["_setprotoent"]=_setprotoent;_setprotoent.sig="vi";function _getprotobyname(name){name>>>=0;name=UTF8ToString(name);_setprotoent(true);var result=Protocols.map[name];return result}Module["_getprotobyname"]=_getprotobyname;_getprotobyname.sig="pp";var arraySum=(array,index)=>{var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum};Module["arraySum"]=arraySum;var MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];Module["MONTH_DAYS_LEAP"]=MONTH_DAYS_LEAP;var MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];Module["MONTH_DAYS_REGULAR"]=MONTH_DAYS_REGULAR;var addDays=(date,days)=>{var newDate=new Date(date.getTime());while(days>0){var leap=isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate};Module["addDays"]=addDays;var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer>>>0)};Module["writeArrayToMemory"]=writeArrayToMemory;function _strftime(s,maxsize,format,tm){s>>>=0;maxsize>>>=0;format>>>=0;tm>>>=0;var tm_zone=HEAPU32[tm+40>>>2>>>0];var date={tm_sec:HEAP32[tm>>>2>>>0],tm_min:HEAP32[tm+4>>>2>>>0],tm_hour:HEAP32[tm+8>>>2>>>0],tm_mday:HEAP32[tm+12>>>2>>>0],tm_mon:HEAP32[tm+16>>>2>>>0],tm_year:HEAP32[tm+20>>>2>>>0],tm_wday:HEAP32[tm+24>>>2>>>0],tm_yday:HEAP32[tm+28>>>2>>>0],tm_isdst:HEAP32[tm+32>>>2>>>0],tm_gmtoff:HEAP32[tm+36>>>2>>>0],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":date=>WEEKDAYS[date.tm_wday].substring(0,3),"%A":date=>WEEKDAYS[date.tm_wday],"%b":date=>MONTHS[date.tm_mon].substring(0,3),"%B":date=>MONTHS[date.tm_mon],"%C":date=>{var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":date=>leadingNulls(date.tm_mday,2),"%e":date=>leadingSomething(date.tm_mday,2," "),"%g":date=>getWeekBasedYear(date).toString().substring(2),"%G":getWeekBasedYear,"%H":date=>leadingNulls(date.tm_hour,2),"%I":date=>{var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":date=>leadingNulls(date.tm_mday+arraySum(isLeapYear(date.tm_year+1900)?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,date.tm_mon-1),3),"%m":date=>leadingNulls(date.tm_mon+1,2),"%M":date=>leadingNulls(date.tm_min,2),"%n":()=>"\n","%p":date=>{if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":date=>leadingNulls(date.tm_sec,2),"%t":()=>"\t","%u":date=>date.tm_wday||7,"%U":date=>{var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":date=>{var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":date=>date.tm_wday,"%W":date=>{var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":date=>(date.tm_year+1900).toString().substring(2),"%Y":date=>date.tm_year+1900,"%z":date=>{var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":date=>date.tm_zone,"%%":()=>"%"};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}Module["_strftime"]=_strftime;_strftime.sig="ppppp";function _strftime_l(s,maxsize,format,tm,loc){s>>>=0;maxsize>>>=0;format>>>=0;tm>>>=0;loc>>>=0;return _strftime(s,maxsize,format,tm)}Module["_strftime_l"]=_strftime_l;_strftime_l.sig="pppppp";var _stackAlloc=stackAlloc;Module["_stackAlloc"]=_stackAlloc;var _stackRestore=stackSave;Module["_stackRestore"]=_stackRestore;var _stackSave=stackSave;Module["_stackSave"]=_stackSave;var FS_unlink=path=>FS.unlink(path);Module["FS_unlink"]=FS_unlink;var writeI53ToI64Clamped=(ptr,num)=>{if(num>0x8000000000000000){HEAPU32[ptr>>>2>>>0]=4294967295;HEAPU32[ptr+4>>>2>>>0]=2147483647}else if(num<-0x8000000000000000){HEAPU32[ptr>>>2>>>0]=0;HEAPU32[ptr+4>>>2>>>0]=2147483648}else{writeI53ToI64(ptr,num)}};Module["writeI53ToI64Clamped"]=writeI53ToI64Clamped;var writeI53ToI64Signaling=(ptr,num)=>{if(num>0x8000000000000000||num<-0x8000000000000000){throw`RangeError: ${num}`}writeI53ToI64(ptr,num)};Module["writeI53ToI64Signaling"]=writeI53ToI64Signaling;var writeI53ToU64Clamped=(ptr,num)=>{if(num>0x10000000000000000){HEAPU32[ptr>>>2>>>0]=4294967295;HEAPU32[ptr+4>>>2>>>0]=4294967295}else if(num<0){HEAPU32[ptr>>>2>>>0]=0;HEAPU32[ptr+4>>>2>>>0]=0}else{writeI53ToI64(ptr,num)}};Module["writeI53ToU64Clamped"]=writeI53ToU64Clamped;var writeI53ToU64Signaling=(ptr,num)=>{if(num<0||num>0x10000000000000000){throw`RangeError: ${num}`}writeI53ToI64(ptr,num)};Module["writeI53ToU64Signaling"]=writeI53ToU64Signaling;var readI53FromU64=ptr=>HEAPU32[ptr>>>2>>>0]+HEAPU32[ptr+4>>>2>>>0]*4294967296;Module["readI53FromU64"]=readI53FromU64;var convertI32PairToI53=(lo,hi)=>(lo>>>0)+hi*4294967296;Module["convertI32PairToI53"]=convertI32PairToI53;var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;Module["convertI32PairToI53Checked"]=convertI32PairToI53Checked;var convertU32PairToI53=(lo,hi)=>(lo>>>0)+(hi>>>0)*4294967296;Module["convertU32PairToI53"]=convertU32PairToI53;var getTempRet0=val=>__emscripten_tempret_get();Module["getTempRet0"]=getTempRet0;var ptrToString=ptr=>"0x"+ptr.toString(16).padStart(8,"0");Module["ptrToString"]=ptrToString;function _emscripten_notify_memory_growth(memoryIndex){memoryIndex>>>=0;updateMemoryViews()}Module["_emscripten_notify_memory_growth"]=_emscripten_notify_memory_growth;_emscripten_notify_memory_growth.sig="vp";function ___asctime_r(tmPtr,buf){tmPtr>>>=0;buf>>>=0;var date={tm_sec:HEAP32[tmPtr>>>2>>>0],tm_min:HEAP32[tmPtr+4>>>2>>>0],tm_hour:HEAP32[tmPtr+8>>>2>>>0],tm_mday:HEAP32[tmPtr+12>>>2>>>0],tm_mon:HEAP32[tmPtr+16>>>2>>>0],tm_year:HEAP32[tmPtr+20>>>2>>>0],tm_wday:HEAP32[tmPtr+24>>>2>>>0]};var days=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var s=days[date.tm_wday]+" "+months[date.tm_mon]+(date.tm_mday<10?" ":" ")+date.tm_mday+(date.tm_hour<10?" 0":" ")+date.tm_hour+(date.tm_min<10?":0":":")+date.tm_min+(date.tm_sec<10?":0":":")+date.tm_sec+" "+(1900+date.tm_year)+"\n";stringToUTF8(s,buf,26);return buf}Module["___asctime_r"]=___asctime_r;___asctime_r.sig="ppp";var withStackSave=f=>{var stack=stackSave();var ret=f();stackRestore(stack);return ret};Module["withStackSave"]=withStackSave;function _strptime(buf,format,tm){buf>>>=0;format>>>=0;tm>>>=0;var pattern=UTF8ToString(format);var SPECIAL_CHARS="\\!@#$^&*()+=-[]/{}|:<>?,.";for(var i=0,ii=SPECIAL_CHARS.length;iEQUIVALENT_MATCHERS[c]||m).replace(/%(.)/g,(_,c)=>{let pat=DATE_PATTERNS[c];if(pat){capture.push(c);return`(${pat})`}else{return c}}).replace(/\s+/g,"\\s*");var matches=new RegExp("^"+pattern_out,"i").exec(UTF8ToString(buf));function initDate(){function fixup(value,min,max){return typeof value!="number"||isNaN(value)?min:value>=min?value<=max?value:max:min}return{year:fixup(HEAP32[tm+20>>>2>>>0]+1900,1970,9999),month:fixup(HEAP32[tm+16>>>2>>>0],0,11),day:fixup(HEAP32[tm+12>>>2>>>0],1,31),hour:fixup(HEAP32[tm+8>>>2>>>0],0,23),min:fixup(HEAP32[tm+4>>>2>>>0],0,59),sec:fixup(HEAP32[tm>>>2>>>0],0,59),gmtoff:0}}if(matches){var date=initDate();var value;var getMatch=symbol=>{var pos=capture.indexOf(symbol);if(pos>=0){return matches[pos+1]}return};if(value=getMatch("S")){date.sec=jstoi_q(value)}if(value=getMatch("M")){date.min=jstoi_q(value)}if(value=getMatch("H")){date.hour=jstoi_q(value)}else if(value=getMatch("I")){var hour=jstoi_q(value);if(value=getMatch("p")){hour+=value.toUpperCase()[0]==="P"?12:0}date.hour=hour}if(value=getMatch("Y")){date.year=jstoi_q(value)}else if(value=getMatch("y")){var year=jstoi_q(value);if(value=getMatch("C")){year+=jstoi_q(value)*100}else{year+=year<69?2e3:1900}date.year=year}if(value=getMatch("m")){date.month=jstoi_q(value)-1}else if(value=getMatch("b")){date.month=MONTH_NUMBERS[value.substring(0,3).toUpperCase()]||0}if(value=getMatch("d")){date.day=jstoi_q(value)}else if(value=getMatch("j")){var day=jstoi_q(value);var leapYear=isLeapYear(date.year);for(var month=0;month<12;++month){var daysUntilMonth=arraySum(leapYear?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,month-1);if(day<=daysUntilMonth+(leapYear?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[month]){date.day=day-daysUntilMonth}}}else if(value=getMatch("a")){var weekDay=value.substring(0,3).toUpperCase();if(value=getMatch("U")){var weekDayNumber=DAY_NUMBERS_SUN_FIRST[weekDay];var weekNumber=jstoi_q(value);var janFirst=new Date(date.year,0,1);var endDate;if(janFirst.getDay()===0){endDate=addDays(janFirst,weekDayNumber+7*(weekNumber-1))}else{endDate=addDays(janFirst,7-janFirst.getDay()+weekDayNumber+7*(weekNumber-1))}date.day=endDate.getDate();date.month=endDate.getMonth()}else if(value=getMatch("W")){var weekDayNumber=DAY_NUMBERS_MON_FIRST[weekDay];var weekNumber=jstoi_q(value);var janFirst=new Date(date.year,0,1);var endDate;if(janFirst.getDay()===1){endDate=addDays(janFirst,weekDayNumber+7*(weekNumber-1))}else{endDate=addDays(janFirst,7-janFirst.getDay()+1+weekDayNumber+7*(weekNumber-1))}date.day=endDate.getDate();date.month=endDate.getMonth()}}if(value=getMatch("z")){if(value.toLowerCase()==="z"){date.gmtoff=0}else{var match=value.match(/^((?:\-|\+)\d\d):?(\d\d)?/);date.gmtoff=match[1]*3600;if(match[2]){date.gmtoff+=date.gmtoff>0?match[2]*60:-match[2]*60}}}var fullDate=new Date(date.year,date.month,date.day,date.hour,date.min,date.sec,0);HEAP32[tm>>>2>>>0]=fullDate.getSeconds();HEAP32[tm+4>>>2>>>0]=fullDate.getMinutes();HEAP32[tm+8>>>2>>>0]=fullDate.getHours();HEAP32[tm+12>>>2>>>0]=fullDate.getDate();HEAP32[tm+16>>>2>>>0]=fullDate.getMonth();HEAP32[tm+20>>>2>>>0]=fullDate.getFullYear()-1900;HEAP32[tm+24>>>2>>>0]=fullDate.getDay();HEAP32[tm+28>>>2>>>0]=arraySum(isLeapYear(fullDate.getFullYear())?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,fullDate.getMonth()-1)+fullDate.getDate()-1;HEAP32[tm+32>>>2>>>0]=0;HEAP32[tm+36>>>2>>>0]=date.gmtoff;return buf+intArrayFromString(matches[0]).length-1}return 0}Module["_strptime"]=_strptime;_strptime.sig="pppp";function _strptime_l(buf,format,tm,locale){buf>>>=0;format>>>=0;tm>>>=0;locale>>>=0;return _strptime(buf,format,tm)}Module["_strptime_l"]=_strptime_l;_strptime_l.sig="ppppp";var ERRNO_MESSAGES={0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"};Module["ERRNO_MESSAGES"]=ERRNO_MESSAGES;var _endprotoent=()=>{};Module["_endprotoent"]=_endprotoent;_endprotoent.sig="v";function _getprotoent(number){if(_setprotoent.index===Protocols.list.length){return 0}var result=Protocols.list[_setprotoent.index++];return result}Module["_getprotoent"]=_getprotoent;_getprotoent.sig="p";function _getprotobynumber(number){_setprotoent(true);var result=Protocols.map[number];return result}Module["_getprotobynumber"]=_getprotobynumber;_getprotobynumber.sig="pi";function _emscripten_run_script(ptr){ptr>>>=0;eval(UTF8ToString(ptr))}Module["_emscripten_run_script"]=_emscripten_run_script;_emscripten_run_script.sig="vp";function _emscripten_run_script_int(ptr){ptr>>>=0;return eval(UTF8ToString(ptr))|0}Module["_emscripten_run_script_int"]=_emscripten_run_script_int;_emscripten_run_script_int.sig="ip";function _emscripten_run_script_string(ptr){ptr>>>=0;var s=eval(UTF8ToString(ptr));if(s==null){return 0}s+="";var me=_emscripten_run_script_string;var len=lengthBytesUTF8(s);if(!me.bufferSize||me.bufferSizeMath.random();Module["_emscripten_random"]=_emscripten_random;_emscripten_random.sig="f";var warnOnce=text=>{warnOnce.shown||={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}};Module["warnOnce"]=warnOnce;function jsStackTrace(){return(new Error).stack.toString()}Module["jsStackTrace"]=jsStackTrace;function getCallstack(flags){var callstack=jsStackTrace();var iThisFunc=callstack.lastIndexOf("_emscripten_log");var iThisFunc2=callstack.lastIndexOf("_emscripten_get_callstack");var iNextLine=callstack.indexOf("\n",Math.max(iThisFunc,iThisFunc2))+1;callstack=callstack.slice(iNextLine);if(flags&8&&typeof emscripten_source_map=="undefined"){warnOnce('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with "--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js" linker flag to add source map loading to code.');flags^=8;flags|=16}var lines=callstack.split("\n");callstack="";var newFirefoxRe=new RegExp("\\s*(.*?)@(.*?):([0-9]+):([0-9]+)");var firefoxRe=new RegExp("\\s*(.*?)@(.*):(.*)(:(.*))?");var chromeRe=new RegExp("\\s*at (.*?) \\((.*):(.*):(.*)\\)");for(var l in lines){var line=lines[l];var symbolName="";var file="";var lineno=0;var column=0;var parts=chromeRe.exec(line);if(parts&&parts.length==5){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]}else{parts=newFirefoxRe.exec(line);if(!parts)parts=firefoxRe.exec(line);if(parts&&parts.length>=4){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]|0}else{callstack+=line+"\n";continue}}var haveSourceMap=false;if(flags&8){var orig=emscripten_source_map.originalPositionFor({line:lineno,column:column});haveSourceMap=orig?.source;if(haveSourceMap){if(flags&64){orig.source=orig.source.substring(orig.source.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=` at ${symbolName} (${orig.source}:${orig.line}:${orig.column})\n`}}if(flags&16||!haveSourceMap){if(flags&64){file=file.substring(file.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=(haveSourceMap?` = ${symbolName}`:` at ${symbolName}`)+` (${file}:${lineno}:${column})\n`}}callstack=callstack.replace(/\s+$/,"");return callstack}Module["getCallstack"]=getCallstack;var emscriptenLog=(flags,str)=>{if(flags&24){str=str.replace(/\s+$/,"");str+=(str.length>0?"\n":"")+getCallstack(flags)}if(flags&1){if(flags&4){console.error(str)}else if(flags&2){console.warn(str)}else if(flags&512){console.info(str)}else if(flags&256){console.debug(str)}else{console.log(str)}}else if(flags&6){err(str)}else{out(str)}};Module["emscriptenLog"]=emscriptenLog;var reallyNegative=x=>x<0||x===0&&1/x===-Infinity;Module["reallyNegative"]=reallyNegative;var reSign=(value,bits)=>{if(value<=0){return value}var half=bits<=32?Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value};Module["reSign"]=reSign;var unSign=(value,bits)=>{if(value>=0){return value}return bits<=32?2*Math.abs(1<{var end=ptr;while(HEAPU8[end>>>0])++end;return end-ptr};Module["strLen"]=strLen;var formatString=(format,varargs)=>{var textIndex=format;var argIndex=varargs;function prepVararg(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){ptr+=4}}else{}return ptr}function getNextArg(type){var ret;argIndex=prepVararg(argIndex,type);if(type==="double"){ret=HEAPF64[argIndex>>>3>>>0];argIndex+=8}else if(type=="i64"){ret=[HEAP32[argIndex>>>2>>>0],HEAP32[argIndex+4>>>2>>>0]];argIndex+=8}else{type="i32";ret=HEAP32[argIndex>>>2>>>0];argIndex+=4}return ret}var ret=[];var curr,next,currArg;while(1){var startTextIndex=textIndex;curr=HEAP8[textIndex>>>0];if(curr===0)break;next=HEAP8[textIndex+1>>>0];if(curr==37){var flagAlwaysSigned=false;var flagLeftAlign=false;var flagAlternative=false;var flagZeroPad=false;var flagPadSign=false;flagsLoop:while(1){switch(next){case 43:flagAlwaysSigned=true;break;case 45:flagLeftAlign=true;break;case 35:flagAlternative=true;break;case 48:if(flagZeroPad){break flagsLoop}else{flagZeroPad=true;break}case 32:flagPadSign=true;break;default:break flagsLoop}textIndex++;next=HEAP8[textIndex+1>>>0]}var width=0;if(next==42){width=getNextArg("i32");textIndex++;next=HEAP8[textIndex+1>>>0]}else{while(next>=48&&next<=57){width=width*10+(next-48);textIndex++;next=HEAP8[textIndex+1>>>0]}}var precisionSet=false,precision=-1;if(next==46){precision=0;precisionSet=true;textIndex++;next=HEAP8[textIndex+1>>>0];if(next==42){precision=getNextArg("i32");textIndex++}else{while(1){var precisionChr=HEAP8[textIndex+1>>>0];if(precisionChr<48||precisionChr>57)break;precision=precision*10+(precisionChr-48);textIndex++}}next=HEAP8[textIndex+1>>>0]}if(precision<0){precision=6;precisionSet=false}var argSize;switch(String.fromCharCode(next)){case"h":var nextNext=HEAP8[textIndex+2>>>0];if(nextNext==104){textIndex++;argSize=1}else{argSize=2}break;case"l":var nextNext=HEAP8[textIndex+2>>>0];if(nextNext==108){textIndex++;argSize=8}else{argSize=4}break;case"L":case"q":case"j":argSize=8;break;case"z":case"t":case"I":argSize=4;break;default:argSize=null}if(argSize)textIndex++;next=HEAP8[textIndex+1>>>0];switch(String.fromCharCode(next)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":{var signed=next==100||next==105;argSize=argSize||4;currArg=getNextArg("i"+argSize*8);var argText;if(argSize==8){currArg=next==117?convertU32PairToI53(currArg[0],currArg[1]):convertI32PairToI53(currArg[0],currArg[1])}if(argSize<=4){var limit=Math.pow(256,argSize)-1;currArg=(signed?reSign:unSign)(currArg&limit,argSize*8)}var currAbsArg=Math.abs(currArg);var prefix="";if(next==100||next==105){argText=reSign(currArg,8*argSize).toString(10)}else if(next==117){argText=unSign(currArg,8*argSize).toString(10);currArg=Math.abs(currArg)}else if(next==111){argText=(flagAlternative?"0":"")+currAbsArg.toString(8)}else if(next==120||next==88){prefix=flagAlternative&&currArg!=0?"0x":"";if(currArg<0){currArg=-currArg;argText=(currAbsArg-1).toString(16);var buffer=[];for(var i=0;i=0){if(flagAlwaysSigned){prefix="+"+prefix}else if(flagPadSign){prefix=" "+prefix}}if(argText.charAt(0)=="-"){prefix="-"+prefix;argText=argText.substr(1)}while(prefix.length+argText.lengthexponent&&exponent>=-4){next=(next==103?"f":"F").charCodeAt(0);precision-=exponent+1}else{next=(next==103?"e":"E").charCodeAt(0);precision--}effectivePrecision=Math.min(precision,20)}if(next==101||next==69){argText=currArg.toExponential(effectivePrecision);if(/[eE][-+]\d$/.test(argText)){argText=argText.slice(0,-1)+"0"+argText.slice(-1)}}else if(next==102||next==70){argText=currArg.toFixed(effectivePrecision);if(currArg===0&&reallyNegative(currArg)){argText="-"+argText}}var parts=argText.split("e");if(isGeneral&&!flagAlternative){while(parts[0].length>1&&parts[0].includes(".")&&(parts[0].slice(-1)=="0"||parts[0].slice(-1)==".")){parts[0]=parts[0].slice(0,-1)}}else{if(flagAlternative&&argText.indexOf(".")==-1)parts[0]+=".";while(precision>effectivePrecision++)parts[0]+="0"}argText=parts[0]+(parts.length>1?"e"+parts[1]:"");if(next==69)argText=argText.toUpperCase();if(currArg>=0){if(flagAlwaysSigned){argText="+"+argText}else if(flagPadSign){argText=" "+argText}}}while(argText.length>>0])}}else{ret=ret.concat(intArrayFromString("(null)".substr(0,argLength),true))}if(flagLeftAlign){while(argLength0){ret.push(32)}if(!flagLeftAlign)ret.push(getNextArg("i8"));break}case"n":{var ptr=getNextArg("i32*");HEAP32[ptr>>>2>>>0]=ret.length;break}case"%":{ret.push(curr);break}default:{for(var i=startTextIndex;i>>0])}}}textIndex+=2}else{ret.push(curr);textIndex+=1}}return ret};Module["formatString"]=formatString;function _emscripten_log(flags,format,varargs){format>>>=0;varargs>>>=0;var result=formatString(format,varargs);var str=UTF8ArrayToString(result,0);emscriptenLog(flags,str)}Module["_emscripten_log"]=_emscripten_log;_emscripten_log.sig="vipp";function _emscripten_get_compiler_setting(name){name>>>=0;throw"You must build with -sRETAIN_COMPILER_SETTINGS for getCompilerSetting or emscripten_get_compiler_setting to work"}Module["_emscripten_get_compiler_setting"]=_emscripten_get_compiler_setting;_emscripten_get_compiler_setting.sig="pp";var _emscripten_has_asyncify=()=>0;Module["_emscripten_has_asyncify"]=_emscripten_has_asyncify;_emscripten_has_asyncify.sig="i";function _emscripten_debugger(){debugger}Module["_emscripten_debugger"]=_emscripten_debugger;_emscripten_debugger.sig="v";function _emscripten_print_double(x,to,max){to>>>=0;var str=x+"";if(to)return stringToUTF8(str,to,max);else return lengthBytesUTF8(str)}Module["_emscripten_print_double"]=_emscripten_print_double;_emscripten_print_double.sig="idpi";function _emscripten_get_module_name(buf,length){buf>>>=0;length>>>=0;return stringToUTF8(wasmBinaryFile,buf,length)}Module["_emscripten_get_module_name"]=_emscripten_get_module_name;_emscripten_get_module_name.sig="ppp";function _emscripten_asm_const_double(code,sigPtr,argbuf){code>>>=0;sigPtr>>>=0;argbuf>>>=0;return runEmAsmFunction(code,sigPtr,argbuf)}Module["_emscripten_asm_const_double"]=_emscripten_asm_const_double;_emscripten_asm_const_double.sig="dppp";function _emscripten_asm_const_ptr(code,sigPtr,argbuf){code>>>=0;sigPtr>>>=0;argbuf>>>=0;return runEmAsmFunction(code,sigPtr,argbuf)}Module["_emscripten_asm_const_ptr"]=_emscripten_asm_const_ptr;_emscripten_asm_const_ptr.sig="pppp";var runMainThreadEmAsm=(emAsmAddr,sigPtr,argbuf,sync)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[emAsmAddr](...args)};Module["runMainThreadEmAsm"]=runMainThreadEmAsm;function _emscripten_asm_const_int_sync_on_main_thread(emAsmAddr,sigPtr,argbuf){emAsmAddr>>>=0;sigPtr>>>=0;argbuf>>>=0;return runMainThreadEmAsm(emAsmAddr,sigPtr,argbuf,1)}Module["_emscripten_asm_const_int_sync_on_main_thread"]=_emscripten_asm_const_int_sync_on_main_thread;_emscripten_asm_const_int_sync_on_main_thread.sig="ippp";function _emscripten_asm_const_ptr_sync_on_main_thread(emAsmAddr,sigPtr,argbuf){emAsmAddr>>>=0;sigPtr>>>=0;argbuf>>>=0;return runMainThreadEmAsm(emAsmAddr,sigPtr,argbuf,1)}Module["_emscripten_asm_const_ptr_sync_on_main_thread"]=_emscripten_asm_const_ptr_sync_on_main_thread;_emscripten_asm_const_ptr_sync_on_main_thread.sig="pppp";var _emscripten_asm_const_double_sync_on_main_thread=_emscripten_asm_const_int_sync_on_main_thread;Module["_emscripten_asm_const_double_sync_on_main_thread"]=_emscripten_asm_const_double_sync_on_main_thread;_emscripten_asm_const_double_sync_on_main_thread.sig="dppp";function _emscripten_asm_const_async_on_main_thread(emAsmAddr,sigPtr,argbuf){emAsmAddr>>>=0;sigPtr>>>=0;argbuf>>>=0;return runMainThreadEmAsm(emAsmAddr,sigPtr,argbuf,0)}Module["_emscripten_asm_const_async_on_main_thread"]=_emscripten_asm_const_async_on_main_thread;_emscripten_asm_const_async_on_main_thread.sig="vppp";var jstoi_s=Number;Module["jstoi_s"]=jstoi_s;function __Unwind_Backtrace(func,arg){func>>>=0;arg>>>=0;var trace=getCallstack();var parts=trace.split("\n");for(var i=0;i>>=0;ipBefore>>>=0;return abort("Unwind_GetIPInfo")}Module["__Unwind_GetIPInfo"]=__Unwind_GetIPInfo;__Unwind_GetIPInfo.sig="ppp";function __Unwind_FindEnclosingFunction(ip){ip>>>=0;return 0}Module["__Unwind_FindEnclosingFunction"]=__Unwind_FindEnclosingFunction;__Unwind_FindEnclosingFunction.sig="pp";function __Unwind_RaiseException(ex){ex>>>=0;err("Warning: _Unwind_RaiseException is not correctly implemented");return ___cxa_throw(ex,0,0)}Module["__Unwind_RaiseException"]=__Unwind_RaiseException;__Unwind_RaiseException.sig="ip";function __Unwind_DeleteException(ex){ex>>>=0;err("TODO: Unwind_DeleteException")}Module["__Unwind_DeleteException"]=__Unwind_DeleteException;__Unwind_DeleteException.sig="vp";var listenOnce=(object,event,func)=>{object.addEventListener(event,func,{"once":true})};Module["listenOnce"]=listenOnce;var autoResumeAudioContext=(ctx,elements)=>{if(!elements){elements=[document,document.getElementById("canvas")]}["keydown","mousedown","touchstart"].forEach(event=>{elements.forEach(element=>{if(element){listenOnce(element,event,()=>{if(ctx.state==="suspended")ctx.resume()})}})})};Module["autoResumeAudioContext"]=autoResumeAudioContext;var getDynCaller=(sig,ptr)=>(...args)=>dynCall(sig,ptr,args);Module["getDynCaller"]=getDynCaller;var _emscripten_force_exit=status=>{__emscripten_runtime_keepalive_clear();_exit(status)};Module["_emscripten_force_exit"]=_emscripten_force_exit;_emscripten_force_exit.sig="vi";function _emscripten_outn(str,len){str>>>=0;len>>>=0;return out(UTF8ToString(str,len))}Module["_emscripten_outn"]=_emscripten_outn;_emscripten_outn.sig="vpp";function _emscripten_errn(str,len){str>>>=0;len>>>=0;return err(UTF8ToString(str,len))}Module["_emscripten_errn"]=_emscripten_errn;_emscripten_errn.sig="vpp";var _emscripten_throw_number=number=>{throw number};Module["_emscripten_throw_number"]=_emscripten_throw_number;_emscripten_throw_number.sig="vd";function _emscripten_throw_string(str){str>>>=0;throw UTF8ToString(str)}Module["_emscripten_throw_string"]=_emscripten_throw_string;_emscripten_throw_string.sig="vp";var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};Module["runtimeKeepalivePush"]=runtimeKeepalivePush;runtimeKeepalivePush.sig="v";var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};Module["runtimeKeepalivePop"]=runtimeKeepalivePop;runtimeKeepalivePop.sig="v";var _emscripten_runtime_keepalive_push=runtimeKeepalivePush;Module["_emscripten_runtime_keepalive_push"]=_emscripten_runtime_keepalive_push;_emscripten_runtime_keepalive_push.sig="v";var _emscripten_runtime_keepalive_pop=runtimeKeepalivePop;Module["_emscripten_runtime_keepalive_pop"]=_emscripten_runtime_keepalive_pop;_emscripten_runtime_keepalive_pop.sig="v";var _emscripten_runtime_keepalive_check=keepRuntimeAlive;Module["_emscripten_runtime_keepalive_check"]=_emscripten_runtime_keepalive_check;_emscripten_runtime_keepalive_check.sig="i";var asmjsMangle=x=>{if(x=="__main_argc_argv"){x="main"}return x.startsWith("dynCall_")?x:"_"+x};Module["asmjsMangle"]=asmjsMangle;var ___global_base=1024;Module["___global_base"]=___global_base;function __emscripten_fs_load_embedded_files(ptr){ptr>>>=0;do{var name_addr=HEAPU32[ptr>>>2>>>0];ptr+=4;var len=HEAPU32[ptr>>>2>>>0];ptr+=4;var content=HEAPU32[ptr>>>2>>>0];ptr+=4;var name=UTF8ToString(name_addr);FS.createPath("/",PATH.dirname(name),true,true);FS.createDataFile(name,null,HEAP8.subarray(content>>>0,content+len>>>0),true,true,true)}while(HEAPU32[ptr>>>2>>>0])}Module["__emscripten_fs_load_embedded_files"]=__emscripten_fs_load_embedded_files;__emscripten_fs_load_embedded_files.sig="vp";var POINTER_SIZE=4;Module["POINTER_SIZE"]=POINTER_SIZE;function getNativeTypeSize(type){switch(type){case"i1":case"i8":case"u8":return 1;case"i16":case"u16":return 2;case"i32":case"u32":return 4;case"i64":case"u64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return POINTER_SIZE}if(type[0]==="i"){const bits=Number(type.substr(1));assert(bits%8===0,`getNativeTypeSize invalid bits ${bits}, ${type} type`);return bits/8}return 0}}}Module["getNativeTypeSize"]=getNativeTypeSize;var STACK_SIZE=5242880;Module["STACK_SIZE"]=STACK_SIZE;var STACK_ALIGN=16;Module["STACK_ALIGN"]=STACK_ALIGN;var ASSERTIONS=0;Module["ASSERTIONS"]=ASSERTIONS;var getCFunc=ident=>{var func=Module["_"+ident];return func};Module["getCFunc"]=getCFunc;var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};Module["cwrap"]=cwrap;var removeFunction=index=>{functionsInTableMap.delete(getWasmTableEntry(index));setWasmTableEntry(index,null);freeTableIndexes.push(index)};Module["removeFunction"]=removeFunction;var _emscripten_math_cbrt=Math.cbrt;Module["_emscripten_math_cbrt"]=_emscripten_math_cbrt;_emscripten_math_cbrt.sig="dd";var _emscripten_math_pow=Math.pow;Module["_emscripten_math_pow"]=_emscripten_math_pow;_emscripten_math_pow.sig="ddd";var _emscripten_math_random=Math.random;Module["_emscripten_math_random"]=_emscripten_math_random;_emscripten_math_random.sig="d";var _emscripten_math_sign=Math.sign;Module["_emscripten_math_sign"]=_emscripten_math_sign;_emscripten_math_sign.sig="dd";var _emscripten_math_sqrt=Math.sqrt;Module["_emscripten_math_sqrt"]=_emscripten_math_sqrt;_emscripten_math_sqrt.sig="dd";var _emscripten_math_exp=Math.exp;Module["_emscripten_math_exp"]=_emscripten_math_exp;_emscripten_math_exp.sig="dd";var _emscripten_math_expm1=Math.expm1;Module["_emscripten_math_expm1"]=_emscripten_math_expm1;_emscripten_math_expm1.sig="dd";var _emscripten_math_fmod=(x,y)=>x%y;Module["_emscripten_math_fmod"]=_emscripten_math_fmod;_emscripten_math_fmod.sig="ddd";var _emscripten_math_log=Math.log;Module["_emscripten_math_log"]=_emscripten_math_log;_emscripten_math_log.sig="dd";var _emscripten_math_log1p=Math.log1p;Module["_emscripten_math_log1p"]=_emscripten_math_log1p;_emscripten_math_log1p.sig="dd";var _emscripten_math_log10=Math.log10;Module["_emscripten_math_log10"]=_emscripten_math_log10;_emscripten_math_log10.sig="dd";var _emscripten_math_log2=Math.log2;Module["_emscripten_math_log2"]=_emscripten_math_log2;_emscripten_math_log2.sig="dd";var _emscripten_math_round=Math.round;Module["_emscripten_math_round"]=_emscripten_math_round;_emscripten_math_round.sig="dd";var _emscripten_math_acos=Math.acos;Module["_emscripten_math_acos"]=_emscripten_math_acos;_emscripten_math_acos.sig="dd";var _emscripten_math_acosh=Math.acosh;Module["_emscripten_math_acosh"]=_emscripten_math_acosh;_emscripten_math_acosh.sig="dd";var _emscripten_math_asin=Math.asin;Module["_emscripten_math_asin"]=_emscripten_math_asin;_emscripten_math_asin.sig="dd";var _emscripten_math_asinh=Math.asinh;Module["_emscripten_math_asinh"]=_emscripten_math_asinh;_emscripten_math_asinh.sig="dd";var _emscripten_math_atan=Math.atan;Module["_emscripten_math_atan"]=_emscripten_math_atan;_emscripten_math_atan.sig="dd";var _emscripten_math_atanh=Math.atanh;Module["_emscripten_math_atanh"]=_emscripten_math_atanh;_emscripten_math_atanh.sig="dd";var _emscripten_math_atan2=Math.atan2;Module["_emscripten_math_atan2"]=_emscripten_math_atan2;_emscripten_math_atan2.sig="ddd";var _emscripten_math_cos=Math.cos;Module["_emscripten_math_cos"]=_emscripten_math_cos;_emscripten_math_cos.sig="dd";var _emscripten_math_cosh=Math.cosh;Module["_emscripten_math_cosh"]=_emscripten_math_cosh;_emscripten_math_cosh.sig="dd";function _emscripten_math_hypot(count,varargs){varargs>>>=0;var args=[];for(var i=0;i>>3>>>0])}return Math.hypot(...args)}Module["_emscripten_math_hypot"]=_emscripten_math_hypot;_emscripten_math_hypot.sig="dip";var _emscripten_math_sin=Math.sin;Module["_emscripten_math_sin"]=_emscripten_math_sin;_emscripten_math_sin.sig="dd";var _emscripten_math_sinh=Math.sinh;Module["_emscripten_math_sinh"]=_emscripten_math_sinh;_emscripten_math_sinh.sig="dd";var _emscripten_math_tan=Math.tan;Module["_emscripten_math_tan"]=_emscripten_math_tan;_emscripten_math_tan.sig="dd";var _emscripten_math_tanh=Math.tanh;Module["_emscripten_math_tanh"]=_emscripten_math_tanh;_emscripten_math_tanh.sig="dd";function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;var AsciiToString=ptr=>{ptr>>>=0;var str="";while(1){var ch=HEAPU8[ptr++>>>0];if(!ch)return str;str+=String.fromCharCode(ch)}};Module["AsciiToString"]=AsciiToString;var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;Module["UTF16Decoder"]=UTF16Decoder;var UTF16ToString=(ptr,maxBytesToRead)=>{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx>>>0])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr>>>0,endPtr>>>0));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>>1>>>0];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};Module["UTF16ToString"]=UTF16ToString;var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>>1>>>0]=codeUnit;outPtr+=2}HEAP16[outPtr>>>1>>>0]=0;return outPtr-startPtr};Module["stringToUTF16"]=stringToUTF16;var lengthBytesUTF16=str=>str.length*2;Module["lengthBytesUTF16"]=lengthBytesUTF16;var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>>2>>>0];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};Module["UTF32ToString"]=UTF32ToString;var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{outPtr>>>=0;maxBytesToWrite??=2147483647;if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>>2>>>0]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>>2>>>0]=0;return outPtr-startPtr};Module["stringToUTF32"]=stringToUTF32;var lengthBytesUTF32=str=>{var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len};Module["lengthBytesUTF32"]=lengthBytesUTF32;var JSEvents={removeAllEventListeners(){while(JSEvents.eventHandlers.length){JSEvents._removeHandler(JSEvents.eventHandlers.length-1)}JSEvents.deferredCalls=[]},inEventHandler:0,deferredCalls:[],deferCall(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort((x,y)=>x.precedence{for(var i=0;icString>2?UTF8ToString(cString):cString;Module["maybeCStringToJsString"]=maybeCStringToJsString;var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];Module["specialHTMLTargets"]=specialHTMLTargets;var findEventTarget=target=>{target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement};Module["findEventTarget"]=findEventTarget;var registerKeyEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.keyEvent)JSEvents.keyEvent=_malloc(176);var keyEventHandlerFunc=e=>{var keyEventData=JSEvents.keyEvent;HEAPF64[keyEventData>>>3>>>0]=e.timeStamp;var idx=keyEventData>>>2;HEAP32[idx+2>>>0]=e.location;HEAP32[idx+3>>>0]=e.ctrlKey;HEAP32[idx+4>>>0]=e.shiftKey;HEAP32[idx+5>>>0]=e.altKey;HEAP32[idx+6>>>0]=e.metaKey;HEAP32[idx+7>>>0]=e.repeat;HEAP32[idx+8>>>0]=e.charCode;HEAP32[idx+9>>>0]=e.keyCode;HEAP32[idx+10>>>0]=e.which;stringToUTF8(e.key||"",keyEventData+44,32);stringToUTF8(e.code||"",keyEventData+76,32);stringToUTF8(e.char||"",keyEventData+108,32);stringToUTF8(e.locale||"",keyEventData+140,32);if(getWasmTableEntry(callbackfunc)(eventTypeId,keyEventData,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:keyEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerKeyEventCallback"]=registerKeyEventCallback;var findCanvasEventTarget=findEventTarget;Module["findCanvasEventTarget"]=findCanvasEventTarget;function _emscripten_set_keypress_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerKeyEventCallback(target,userData,useCapture,callbackfunc,1,"keypress",targetThread)}Module["_emscripten_set_keypress_callback_on_thread"]=_emscripten_set_keypress_callback_on_thread;_emscripten_set_keypress_callback_on_thread.sig="ippipp";function _emscripten_set_keydown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerKeyEventCallback(target,userData,useCapture,callbackfunc,2,"keydown",targetThread)}Module["_emscripten_set_keydown_callback_on_thread"]=_emscripten_set_keydown_callback_on_thread;_emscripten_set_keydown_callback_on_thread.sig="ippipp";function _emscripten_set_keyup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerKeyEventCallback(target,userData,useCapture,callbackfunc,3,"keyup",targetThread)}Module["_emscripten_set_keyup_callback_on_thread"]=_emscripten_set_keyup_callback_on_thread;_emscripten_set_keyup_callback_on_thread.sig="ippipp";var getBoundingClientRect=e=>specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{"left":0,"top":0};Module["getBoundingClientRect"]=getBoundingClientRect;var fillMouseEventData=(eventStruct,e,target)=>{HEAPF64[eventStruct>>>3>>>0]=e.timeStamp;var idx=eventStruct>>>2;HEAP32[idx+2>>>0]=e.screenX;HEAP32[idx+3>>>0]=e.screenY;HEAP32[idx+4>>>0]=e.clientX;HEAP32[idx+5>>>0]=e.clientY;HEAP32[idx+6>>>0]=e.ctrlKey;HEAP32[idx+7>>>0]=e.shiftKey;HEAP32[idx+8>>>0]=e.altKey;HEAP32[idx+9>>>0]=e.metaKey;HEAP16[idx*2+20>>>0]=e.button;HEAP16[idx*2+21>>>0]=e.buttons;HEAP32[idx+11>>>0]=e["movementX"];HEAP32[idx+12>>>0]=e["movementY"];var rect=getBoundingClientRect(target);HEAP32[idx+13>>>0]=e.clientX-(rect.left|0);HEAP32[idx+14>>>0]=e.clientY-(rect.top|0)};Module["fillMouseEventData"]=fillMouseEventData;var registerMouseEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.mouseEvent)JSEvents.mouseEvent=_malloc(72);target=findEventTarget(target);var mouseEventHandlerFunc=(e=event)=>{fillMouseEventData(JSEvents.mouseEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerMouseEventCallback"]=registerMouseEventCallback;function _emscripten_set_click_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,4,"click",targetThread)}Module["_emscripten_set_click_callback_on_thread"]=_emscripten_set_click_callback_on_thread;_emscripten_set_click_callback_on_thread.sig="ippipp";function _emscripten_set_mousedown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,5,"mousedown",targetThread)}Module["_emscripten_set_mousedown_callback_on_thread"]=_emscripten_set_mousedown_callback_on_thread;_emscripten_set_mousedown_callback_on_thread.sig="ippipp";function _emscripten_set_mouseup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,6,"mouseup",targetThread)}Module["_emscripten_set_mouseup_callback_on_thread"]=_emscripten_set_mouseup_callback_on_thread;_emscripten_set_mouseup_callback_on_thread.sig="ippipp";function _emscripten_set_dblclick_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,7,"dblclick",targetThread)}Module["_emscripten_set_dblclick_callback_on_thread"]=_emscripten_set_dblclick_callback_on_thread;_emscripten_set_dblclick_callback_on_thread.sig="ippipp";function _emscripten_set_mousemove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,8,"mousemove",targetThread)}Module["_emscripten_set_mousemove_callback_on_thread"]=_emscripten_set_mousemove_callback_on_thread;_emscripten_set_mousemove_callback_on_thread.sig="ippipp";function _emscripten_set_mouseenter_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,33,"mouseenter",targetThread)}Module["_emscripten_set_mouseenter_callback_on_thread"]=_emscripten_set_mouseenter_callback_on_thread;_emscripten_set_mouseenter_callback_on_thread.sig="ippipp";function _emscripten_set_mouseleave_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,34,"mouseleave",targetThread)}Module["_emscripten_set_mouseleave_callback_on_thread"]=_emscripten_set_mouseleave_callback_on_thread;_emscripten_set_mouseleave_callback_on_thread.sig="ippipp";function _emscripten_set_mouseover_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,35,"mouseover",targetThread)}Module["_emscripten_set_mouseover_callback_on_thread"]=_emscripten_set_mouseover_callback_on_thread;_emscripten_set_mouseover_callback_on_thread.sig="ippipp";function _emscripten_set_mouseout_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerMouseEventCallback(target,userData,useCapture,callbackfunc,36,"mouseout",targetThread)}Module["_emscripten_set_mouseout_callback_on_thread"]=_emscripten_set_mouseout_callback_on_thread;_emscripten_set_mouseout_callback_on_thread.sig="ippipp";function _emscripten_get_mouse_status(mouseState){mouseState>>>=0;if(!JSEvents.mouseEvent)return-7;HEAP8.set(HEAP8.subarray(JSEvents.mouseEvent>>>0,JSEvents.mouseEvent+72>>>0),mouseState>>>0);return 0}Module["_emscripten_get_mouse_status"]=_emscripten_get_mouse_status;_emscripten_get_mouse_status.sig="ip";var registerWheelEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.wheelEvent)JSEvents.wheelEvent=_malloc(104);var wheelHandlerFunc=(e=event)=>{var wheelEvent=JSEvents.wheelEvent;fillMouseEventData(wheelEvent,e,target);HEAPF64[wheelEvent+72>>>3>>>0]=e["deltaX"];HEAPF64[wheelEvent+80>>>3>>>0]=e["deltaY"];HEAPF64[wheelEvent+88>>>3>>>0]=e["deltaZ"];HEAP32[wheelEvent+96>>>2>>>0]=e["deltaMode"];if(getWasmTableEntry(callbackfunc)(eventTypeId,wheelEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:wheelHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerWheelEventCallback"]=registerWheelEventCallback;function _emscripten_set_wheel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;target=findEventTarget(target);if(!target)return-4;if(typeof target.onwheel!="undefined"){return registerWheelEventCallback(target,userData,useCapture,callbackfunc,9,"wheel",targetThread)}else{return-1}}Module["_emscripten_set_wheel_callback_on_thread"]=_emscripten_set_wheel_callback_on_thread;_emscripten_set_wheel_callback_on_thread.sig="ippipp";var registerUiEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.uiEvent)JSEvents.uiEvent=_malloc(36);target=findEventTarget(target);var uiEventHandlerFunc=(e=event)=>{if(e.target!=target){return}var b=document.body;if(!b){return}var uiEvent=JSEvents.uiEvent;HEAP32[uiEvent>>>2>>>0]=0;HEAP32[uiEvent+4>>>2>>>0]=b.clientWidth;HEAP32[uiEvent+8>>>2>>>0]=b.clientHeight;HEAP32[uiEvent+12>>>2>>>0]=innerWidth;HEAP32[uiEvent+16>>>2>>>0]=innerHeight;HEAP32[uiEvent+20>>>2>>>0]=outerWidth;HEAP32[uiEvent+24>>>2>>>0]=outerHeight;HEAP32[uiEvent+28>>>2>>>0]=pageXOffset|0;HEAP32[uiEvent+32>>>2>>>0]=pageYOffset|0;if(getWasmTableEntry(callbackfunc)(eventTypeId,uiEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:uiEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerUiEventCallback"]=registerUiEventCallback;function _emscripten_set_resize_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerUiEventCallback(target,userData,useCapture,callbackfunc,10,"resize",targetThread)}Module["_emscripten_set_resize_callback_on_thread"]=_emscripten_set_resize_callback_on_thread;_emscripten_set_resize_callback_on_thread.sig="ippipp";function _emscripten_set_scroll_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerUiEventCallback(target,userData,useCapture,callbackfunc,11,"scroll",targetThread)}Module["_emscripten_set_scroll_callback_on_thread"]=_emscripten_set_scroll_callback_on_thread;_emscripten_set_scroll_callback_on_thread.sig="ippipp";var registerFocusEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.focusEvent)JSEvents.focusEvent=_malloc(256);var focusEventHandlerFunc=(e=event)=>{var nodeName=JSEvents.getNodeNameForTarget(e.target);var id=e.target.id?e.target.id:"";var focusEvent=JSEvents.focusEvent;stringToUTF8(nodeName,focusEvent+0,128);stringToUTF8(id,focusEvent+128,128);if(getWasmTableEntry(callbackfunc)(eventTypeId,focusEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:focusEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerFocusEventCallback"]=registerFocusEventCallback;function _emscripten_set_blur_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerFocusEventCallback(target,userData,useCapture,callbackfunc,12,"blur",targetThread)}Module["_emscripten_set_blur_callback_on_thread"]=_emscripten_set_blur_callback_on_thread;_emscripten_set_blur_callback_on_thread.sig="ippipp";function _emscripten_set_focus_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerFocusEventCallback(target,userData,useCapture,callbackfunc,13,"focus",targetThread)}Module["_emscripten_set_focus_callback_on_thread"]=_emscripten_set_focus_callback_on_thread;_emscripten_set_focus_callback_on_thread.sig="ippipp";function _emscripten_set_focusin_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerFocusEventCallback(target,userData,useCapture,callbackfunc,14,"focusin",targetThread)}Module["_emscripten_set_focusin_callback_on_thread"]=_emscripten_set_focusin_callback_on_thread;_emscripten_set_focusin_callback_on_thread.sig="ippipp";function _emscripten_set_focusout_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerFocusEventCallback(target,userData,useCapture,callbackfunc,15,"focusout",targetThread)}Module["_emscripten_set_focusout_callback_on_thread"]=_emscripten_set_focusout_callback_on_thread;_emscripten_set_focusout_callback_on_thread.sig="ippipp";var fillDeviceOrientationEventData=(eventStruct,e,target)=>{HEAPF64[eventStruct>>>3>>>0]=e.alpha;HEAPF64[eventStruct+8>>>3>>>0]=e.beta;HEAPF64[eventStruct+16>>>3>>>0]=e.gamma;HEAP32[eventStruct+24>>>2>>>0]=e.absolute};Module["fillDeviceOrientationEventData"]=fillDeviceOrientationEventData;var registerDeviceOrientationEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.deviceOrientationEvent)JSEvents.deviceOrientationEvent=_malloc(32);var deviceOrientationEventHandlerFunc=(e=event)=>{fillDeviceOrientationEventData(JSEvents.deviceOrientationEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.deviceOrientationEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:deviceOrientationEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerDeviceOrientationEventCallback"]=registerDeviceOrientationEventCallback;function _emscripten_set_deviceorientation_callback_on_thread(userData,useCapture,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerDeviceOrientationEventCallback(2,userData,useCapture,callbackfunc,16,"deviceorientation",targetThread)}Module["_emscripten_set_deviceorientation_callback_on_thread"]=_emscripten_set_deviceorientation_callback_on_thread;_emscripten_set_deviceorientation_callback_on_thread.sig="ipipp";function _emscripten_get_deviceorientation_status(orientationState){orientationState>>>=0;if(!JSEvents.deviceOrientationEvent)return-7;HEAP32.set(HEAP32.subarray(JSEvents.deviceOrientationEvent>>>0,32>>>0),orientationState>>>0);return 0}Module["_emscripten_get_deviceorientation_status"]=_emscripten_get_deviceorientation_status;_emscripten_get_deviceorientation_status.sig="ip";var fillDeviceMotionEventData=(eventStruct,e,target)=>{var supportedFields=0;var a=e["acceleration"];supportedFields|=a&&1;var ag=e["accelerationIncludingGravity"];supportedFields|=ag&&2;var rr=e["rotationRate"];supportedFields|=rr&&4;a=a||{};ag=ag||{};rr=rr||{};HEAPF64[eventStruct>>>3>>>0]=a["x"];HEAPF64[eventStruct+8>>>3>>>0]=a["y"];HEAPF64[eventStruct+16>>>3>>>0]=a["z"];HEAPF64[eventStruct+24>>>3>>>0]=ag["x"];HEAPF64[eventStruct+32>>>3>>>0]=ag["y"];HEAPF64[eventStruct+40>>>3>>>0]=ag["z"];HEAPF64[eventStruct+48>>>3>>>0]=rr["alpha"];HEAPF64[eventStruct+56>>>3>>>0]=rr["beta"];HEAPF64[eventStruct+64>>>3>>>0]=rr["gamma"]};Module["fillDeviceMotionEventData"]=fillDeviceMotionEventData;var registerDeviceMotionEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.deviceMotionEvent)JSEvents.deviceMotionEvent=_malloc(80);var deviceMotionEventHandlerFunc=(e=event)=>{fillDeviceMotionEventData(JSEvents.deviceMotionEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.deviceMotionEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:deviceMotionEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerDeviceMotionEventCallback"]=registerDeviceMotionEventCallback;function _emscripten_set_devicemotion_callback_on_thread(userData,useCapture,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerDeviceMotionEventCallback(2,userData,useCapture,callbackfunc,17,"devicemotion",targetThread)}Module["_emscripten_set_devicemotion_callback_on_thread"]=_emscripten_set_devicemotion_callback_on_thread;_emscripten_set_devicemotion_callback_on_thread.sig="ipipp";function _emscripten_get_devicemotion_status(motionState){motionState>>>=0;if(!JSEvents.deviceMotionEvent)return-7;HEAP32.set(HEAP32.subarray(JSEvents.deviceMotionEvent>>>0,80>>>0),motionState>>>0);return 0}Module["_emscripten_get_devicemotion_status"]=_emscripten_get_devicemotion_status;_emscripten_get_devicemotion_status.sig="ip";var screenOrientation=()=>{if(!window.screen)return undefined;return screen.orientation||screen["mozOrientation"]||screen["webkitOrientation"]};Module["screenOrientation"]=screenOrientation;var fillOrientationChangeEventData=eventStruct=>{var orientationsType1=["portrait-primary","portrait-secondary","landscape-primary","landscape-secondary"];var orientationsType2=["portrait","portrait","landscape","landscape"];var orientationIndex=0;var orientationAngle=0;var screenOrientObj=screenOrientation();if(typeof screenOrientObj==="object"){orientationIndex=orientationsType1.indexOf(screenOrientObj.type);if(orientationIndex<0){orientationIndex=orientationsType2.indexOf(screenOrientObj.type)}if(orientationIndex>=0){orientationIndex=1<>>2>>>0]=orientationIndex;HEAP32[eventStruct+4>>>2>>>0]=orientationAngle};Module["fillOrientationChangeEventData"]=fillOrientationChangeEventData;var registerOrientationChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.orientationChangeEvent)JSEvents.orientationChangeEvent=_malloc(8);var orientationChangeEventHandlerFunc=(e=event)=>{var orientationChangeEvent=JSEvents.orientationChangeEvent;fillOrientationChangeEventData(orientationChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,orientationChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:orientationChangeEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerOrientationChangeEventCallback"]=registerOrientationChangeEventCallback;function _emscripten_set_orientationchange_callback_on_thread(userData,useCapture,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(!window.screen||!screen.orientation)return-1;return registerOrientationChangeEventCallback(screen.orientation,userData,useCapture,callbackfunc,18,"change",targetThread)}Module["_emscripten_set_orientationchange_callback_on_thread"]=_emscripten_set_orientationchange_callback_on_thread;_emscripten_set_orientationchange_callback_on_thread.sig="ipipp";function _emscripten_get_orientation_status(orientationChangeEvent){orientationChangeEvent>>>=0;if(!screenOrientation()&&typeof orientation=="undefined")return-1;fillOrientationChangeEventData(orientationChangeEvent);return 0}Module["_emscripten_get_orientation_status"]=_emscripten_get_orientation_status;_emscripten_get_orientation_status.sig="ip";var _emscripten_lock_orientation=allowedOrientations=>{var orientations=[];if(allowedOrientations&1)orientations.push("portrait-primary");if(allowedOrientations&2)orientations.push("portrait-secondary");if(allowedOrientations&4)orientations.push("landscape-primary");if(allowedOrientations&8)orientations.push("landscape-secondary");var succeeded;if(screen.lockOrientation){succeeded=screen.lockOrientation(orientations)}else if(screen.mozLockOrientation){succeeded=screen.mozLockOrientation(orientations)}else if(screen.webkitLockOrientation){succeeded=screen.webkitLockOrientation(orientations)}else{return-1}if(succeeded){return 0}return-6};Module["_emscripten_lock_orientation"]=_emscripten_lock_orientation;_emscripten_lock_orientation.sig="ii";var _emscripten_unlock_orientation=()=>{if(screen.unlockOrientation){screen.unlockOrientation()}else if(screen.mozUnlockOrientation){screen.mozUnlockOrientation()}else if(screen.webkitUnlockOrientation){screen.webkitUnlockOrientation()}else{return-1}return 0};Module["_emscripten_unlock_orientation"]=_emscripten_unlock_orientation;_emscripten_unlock_orientation.sig="i";var fillFullscreenChangeEventData=eventStruct=>{var fullscreenElement=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;var isFullscreen=!!fullscreenElement;HEAP32[eventStruct>>>2>>>0]=isFullscreen;HEAP32[eventStruct+4>>>2>>>0]=JSEvents.fullscreenEnabled();var reportedElement=isFullscreen?fullscreenElement:JSEvents.previousFullscreenElement;var nodeName=JSEvents.getNodeNameForTarget(reportedElement);var id=reportedElement?.id||"";stringToUTF8(nodeName,eventStruct+8,128);stringToUTF8(id,eventStruct+136,128);HEAP32[eventStruct+264>>>2>>>0]=reportedElement?reportedElement.clientWidth:0;HEAP32[eventStruct+268>>>2>>>0]=reportedElement?reportedElement.clientHeight:0;HEAP32[eventStruct+272>>>2>>>0]=screen.width;HEAP32[eventStruct+276>>>2>>>0]=screen.height;if(isFullscreen){JSEvents.previousFullscreenElement=fullscreenElement}};Module["fillFullscreenChangeEventData"]=fillFullscreenChangeEventData;var registerFullscreenChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.fullscreenChangeEvent)JSEvents.fullscreenChangeEvent=_malloc(280);var fullscreenChangeEventhandlerFunc=(e=event)=>{var fullscreenChangeEvent=JSEvents.fullscreenChangeEvent;fillFullscreenChangeEventData(fullscreenChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,fullscreenChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:fullscreenChangeEventhandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerFullscreenChangeEventCallback"]=registerFullscreenChangeEventCallback;function _emscripten_set_fullscreenchange_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"webkitfullscreenchange",targetThread);return registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"fullscreenchange",targetThread)}Module["_emscripten_set_fullscreenchange_callback_on_thread"]=_emscripten_set_fullscreenchange_callback_on_thread;_emscripten_set_fullscreenchange_callback_on_thread.sig="ippipp";function _emscripten_get_fullscreen_status(fullscreenStatus){fullscreenStatus>>>=0;if(!JSEvents.fullscreenEnabled())return-1;fillFullscreenChangeEventData(fullscreenStatus);return 0}Module["_emscripten_get_fullscreen_status"]=_emscripten_get_fullscreen_status;_emscripten_get_fullscreen_status.sig="ip";function _emscripten_get_canvas_element_size(target,width,height){target>>>=0;width>>>=0;height>>>=0;var canvas=findCanvasEventTarget(target);if(!canvas)return-4;HEAP32[width>>>2>>>0]=canvas.width;HEAP32[height>>>2>>>0]=canvas.height}Module["_emscripten_get_canvas_element_size"]=_emscripten_get_canvas_element_size;_emscripten_get_canvas_element_size.sig="ippp";var getCanvasElementSize=target=>{var sp=stackSave();var w=stackAlloc(8);var h=w+4;var targetInt=stringToUTF8OnStack(target.id);var ret=_emscripten_get_canvas_element_size(targetInt,w,h);var size=[HEAP32[w>>>2>>>0],HEAP32[h>>>2>>>0]];stackRestore(sp);return size};Module["getCanvasElementSize"]=getCanvasElementSize;function _emscripten_set_canvas_element_size(target,width,height){target>>>=0;var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0}Module["_emscripten_set_canvas_element_size"]=_emscripten_set_canvas_element_size;_emscripten_set_canvas_element_size.sig="ipii";var setCanvasElementSize=(target,width,height)=>{if(!target.controlTransferredOffscreen){target.width=width;target.height=height}else{var sp=stackSave();var targetInt=stringToUTF8OnStack(target.id);_emscripten_set_canvas_element_size(targetInt,width,height);stackRestore(sp)}};Module["setCanvasElementSize"]=setCanvasElementSize;var registerRestoreOldStyle=canvas=>{var canvasSize=getCanvasElementSize(canvas);var oldWidth=canvasSize[0];var oldHeight=canvasSize[1];var oldCssWidth=canvas.style.width;var oldCssHeight=canvas.style.height;var oldBackgroundColor=canvas.style.backgroundColor;var oldDocumentBackgroundColor=document.body.style.backgroundColor;var oldPaddingLeft=canvas.style.paddingLeft;var oldPaddingRight=canvas.style.paddingRight;var oldPaddingTop=canvas.style.paddingTop;var oldPaddingBottom=canvas.style.paddingBottom;var oldMarginLeft=canvas.style.marginLeft;var oldMarginRight=canvas.style.marginRight;var oldMarginTop=canvas.style.marginTop;var oldMarginBottom=canvas.style.marginBottom;var oldDocumentBodyMargin=document.body.style.margin;var oldDocumentOverflow=document.documentElement.style.overflow;var oldDocumentScroll=document.body.scroll;var oldImageRendering=canvas.style.imageRendering;function restoreOldStyle(){var fullscreenElement=document.fullscreenElement||document.webkitFullscreenElement;if(!fullscreenElement){document.removeEventListener("fullscreenchange",restoreOldStyle);document.removeEventListener("webkitfullscreenchange",restoreOldStyle);setCanvasElementSize(canvas,oldWidth,oldHeight);canvas.style.width=oldCssWidth;canvas.style.height=oldCssHeight;canvas.style.backgroundColor=oldBackgroundColor;if(!oldDocumentBackgroundColor)document.body.style.backgroundColor="white";document.body.style.backgroundColor=oldDocumentBackgroundColor;canvas.style.paddingLeft=oldPaddingLeft;canvas.style.paddingRight=oldPaddingRight;canvas.style.paddingTop=oldPaddingTop;canvas.style.paddingBottom=oldPaddingBottom;canvas.style.marginLeft=oldMarginLeft;canvas.style.marginRight=oldMarginRight;canvas.style.marginTop=oldMarginTop;canvas.style.marginBottom=oldMarginBottom;document.body.style.margin=oldDocumentBodyMargin;document.documentElement.style.overflow=oldDocumentOverflow;document.body.scroll=oldDocumentScroll;canvas.style.imageRendering=oldImageRendering;if(canvas.GLctxObject)canvas.GLctxObject.GLctx.viewport(0,0,oldWidth,oldHeight);if(currentFullscreenStrategy.canvasResizedCallback){getWasmTableEntry(currentFullscreenStrategy.canvasResizedCallback)(37,0,currentFullscreenStrategy.canvasResizedCallbackUserData)}}}document.addEventListener("fullscreenchange",restoreOldStyle);document.addEventListener("webkitfullscreenchange",restoreOldStyle);return restoreOldStyle};Module["registerRestoreOldStyle"]=registerRestoreOldStyle;var setLetterbox=(element,topBottom,leftRight)=>{element.style.paddingLeft=element.style.paddingRight=leftRight+"px";element.style.paddingTop=element.style.paddingBottom=topBottom+"px"};Module["setLetterbox"]=setLetterbox;var JSEvents_resizeCanvasForFullscreen=(target,strategy)=>{var restoreOldStyle=registerRestoreOldStyle(target);var cssWidth=strategy.softFullscreen?innerWidth:screen.width;var cssHeight=strategy.softFullscreen?innerHeight:screen.height;var rect=getBoundingClientRect(target);var windowedCssWidth=rect.width;var windowedCssHeight=rect.height;var canvasSize=getCanvasElementSize(target);var windowedRttWidth=canvasSize[0];var windowedRttHeight=canvasSize[1];if(strategy.scaleMode==3){setLetterbox(target,(cssHeight-windowedCssHeight)/2,(cssWidth-windowedCssWidth)/2);cssWidth=windowedCssWidth;cssHeight=windowedCssHeight}else if(strategy.scaleMode==2){if(cssWidth*windowedRttHeight{if(strategy.scaleMode!=0||strategy.canvasResolutionScaleMode!=0){JSEvents_resizeCanvasForFullscreen(target,strategy)}if(target.requestFullscreen){target.requestFullscreen()}else if(target.webkitRequestFullscreen){target.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}else{return JSEvents.fullscreenEnabled()?-3:-1}currentFullscreenStrategy=strategy;if(strategy.canvasResizedCallback){getWasmTableEntry(strategy.canvasResizedCallback)(37,0,strategy.canvasResizedCallbackUserData)}return 0};Module["JSEvents_requestFullscreen"]=JSEvents_requestFullscreen;var hideEverythingExceptGivenElement=onlyVisibleElement=>{var child=onlyVisibleElement;var parent=child.parentNode;var hiddenElements=[];while(child!=document.body){var children=parent.children;for(var i=0;i{for(var i=0;i{var dpr=devicePixelRatio;var inHiDPIFullscreenMode=currentFullscreenStrategy.canvasResolutionScaleMode==2;var inAspectRatioFixedFullscreenMode=currentFullscreenStrategy.scaleMode==2;var inPixelPerfectFullscreenMode=currentFullscreenStrategy.canvasResolutionScaleMode!=0;var inCenteredWithoutScalingFullscreenMode=currentFullscreenStrategy.scaleMode==3;var screenWidth=inHiDPIFullscreenMode?Math.round(innerWidth*dpr):innerWidth;var screenHeight=inHiDPIFullscreenMode?Math.round(innerHeight*dpr):innerHeight;var w=screenWidth;var h=screenHeight;var canvas=currentFullscreenStrategy.target;var canvasSize=getCanvasElementSize(canvas);var x=canvasSize[0];var y=canvasSize[1];var topMargin;if(inAspectRatioFixedFullscreenMode){if(w*yx*h)w=h*x/y|0;topMargin=(screenHeight-h)/2|0}if(inPixelPerfectFullscreenMode){setCanvasElementSize(canvas,w,h);if(canvas.GLctxObject)canvas.GLctxObject.GLctx.viewport(0,0,w,h)}if(inHiDPIFullscreenMode){topMargin/=dpr;w/=dpr;h/=dpr;w=Math.round(w*1e4)/1e4;h=Math.round(h*1e4)/1e4;topMargin=Math.round(topMargin*1e4)/1e4}if(inCenteredWithoutScalingFullscreenMode){var t=(innerHeight-jstoi_q(canvas.style.height))/2;var b=(innerWidth-jstoi_q(canvas.style.width))/2;setLetterbox(canvas,t,b)}else{canvas.style.width=w+"px";canvas.style.height=h+"px";var b=(innerWidth-w)/2;setLetterbox(canvas,topMargin,b)}if(!inCenteredWithoutScalingFullscreenMode&¤tFullscreenStrategy.canvasResizedCallback){getWasmTableEntry(currentFullscreenStrategy.canvasResizedCallback)(37,0,currentFullscreenStrategy.canvasResizedCallbackUserData)}};Module["softFullscreenResizeWebGLRenderTarget"]=softFullscreenResizeWebGLRenderTarget;var doRequestFullscreen=(target,strategy)=>{if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;if(!target.requestFullscreen&&!target.webkitRequestFullscreen){return-3}var canPerformRequests=JSEvents.canPerformEventHandlerRequests();if(!canPerformRequests){if(strategy.deferUntilInEventHandler){JSEvents.deferCall(JSEvents_requestFullscreen,1,[target,strategy]);return 1}return-2}return JSEvents_requestFullscreen(target,strategy)};Module["doRequestFullscreen"]=doRequestFullscreen;function _emscripten_request_fullscreen(target,deferUntilInEventHandler){target>>>=0;var strategy={scaleMode:0,canvasResolutionScaleMode:0,filteringMode:0,deferUntilInEventHandler:deferUntilInEventHandler,canvasResizedCallbackTargetThread:2};return doRequestFullscreen(target,strategy)}Module["_emscripten_request_fullscreen"]=_emscripten_request_fullscreen;_emscripten_request_fullscreen.sig="ipi";function _emscripten_request_fullscreen_strategy(target,deferUntilInEventHandler,fullscreenStrategy){target>>>=0;fullscreenStrategy>>>=0;var strategy={scaleMode:HEAP32[fullscreenStrategy>>>2>>>0],canvasResolutionScaleMode:HEAP32[fullscreenStrategy+4>>>2>>>0],filteringMode:HEAP32[fullscreenStrategy+8>>>2>>>0],deferUntilInEventHandler:deferUntilInEventHandler,canvasResizedCallback:HEAP32[fullscreenStrategy+12>>>2>>>0],canvasResizedCallbackUserData:HEAP32[fullscreenStrategy+16>>>2>>>0]};return doRequestFullscreen(target,strategy)}Module["_emscripten_request_fullscreen_strategy"]=_emscripten_request_fullscreen_strategy;_emscripten_request_fullscreen_strategy.sig="ipip";function _emscripten_enter_soft_fullscreen(target,fullscreenStrategy){target>>>=0;fullscreenStrategy>>>=0;target=findEventTarget(target);if(!target)return-4;var strategy={scaleMode:HEAP32[fullscreenStrategy>>>2>>>0],canvasResolutionScaleMode:HEAP32[fullscreenStrategy+4>>>2>>>0],filteringMode:HEAP32[fullscreenStrategy+8>>>2>>>0],canvasResizedCallback:HEAP32[fullscreenStrategy+12>>>2>>>0],canvasResizedCallbackUserData:HEAP32[fullscreenStrategy+16>>>2>>>0],target:target,softFullscreen:true};var restoreOldStyle=JSEvents_resizeCanvasForFullscreen(target,strategy);document.documentElement.style.overflow="hidden";document.body.scroll="no";document.body.style.margin="0px";var hiddenElements=hideEverythingExceptGivenElement(target);function restoreWindowedState(){restoreOldStyle();restoreHiddenElements(hiddenElements);removeEventListener("resize",softFullscreenResizeWebGLRenderTarget);if(strategy.canvasResizedCallback){getWasmTableEntry(strategy.canvasResizedCallback)(37,0,strategy.canvasResizedCallbackUserData)}currentFullscreenStrategy=0}restoreOldWindowedStyle=restoreWindowedState;currentFullscreenStrategy=strategy;addEventListener("resize",softFullscreenResizeWebGLRenderTarget);if(strategy.canvasResizedCallback){getWasmTableEntry(strategy.canvasResizedCallback)(37,0,strategy.canvasResizedCallbackUserData)}return 0}Module["_emscripten_enter_soft_fullscreen"]=_emscripten_enter_soft_fullscreen;_emscripten_enter_soft_fullscreen.sig="ipp";var _emscripten_exit_soft_fullscreen=()=>{restoreOldWindowedStyle?.();restoreOldWindowedStyle=null;return 0};Module["_emscripten_exit_soft_fullscreen"]=_emscripten_exit_soft_fullscreen;_emscripten_exit_soft_fullscreen.sig="i";var _emscripten_exit_fullscreen=()=>{if(!JSEvents.fullscreenEnabled())return-1;JSEvents.removeDeferredCalls(JSEvents_requestFullscreen);var d=specialHTMLTargets[1];if(d.exitFullscreen){d.fullscreenElement&&d.exitFullscreen()}else if(d.webkitExitFullscreen){d.webkitFullscreenElement&&d.webkitExitFullscreen()}else{return-1}return 0};Module["_emscripten_exit_fullscreen"]=_emscripten_exit_fullscreen;_emscripten_exit_fullscreen.sig="i";var fillPointerlockChangeEventData=eventStruct=>{var pointerLockElement=document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement||document.msPointerLockElement;var isPointerlocked=!!pointerLockElement;HEAP32[eventStruct>>>2>>>0]=isPointerlocked;var nodeName=JSEvents.getNodeNameForTarget(pointerLockElement);var id=pointerLockElement?.id||"";stringToUTF8(nodeName,eventStruct+4,128);stringToUTF8(id,eventStruct+132,128)};Module["fillPointerlockChangeEventData"]=fillPointerlockChangeEventData;var registerPointerlockChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.pointerlockChangeEvent)JSEvents.pointerlockChangeEvent=_malloc(260);var pointerlockChangeEventHandlerFunc=(e=event)=>{var pointerlockChangeEvent=JSEvents.pointerlockChangeEvent;fillPointerlockChangeEventData(pointerlockChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,pointerlockChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockChangeEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerPointerlockChangeEventCallback"]=registerPointerlockChangeEventCallback;function _emscripten_set_pointerlockchange_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(!document||!document.body||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mozpointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"webkitpointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mspointerlockchange",targetThread);return registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"pointerlockchange",targetThread)}Module["_emscripten_set_pointerlockchange_callback_on_thread"]=_emscripten_set_pointerlockchange_callback_on_thread;_emscripten_set_pointerlockchange_callback_on_thread.sig="ippipp";var registerPointerlockErrorEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var pointerlockErrorEventHandlerFunc=(e=event)=>{if(getWasmTableEntry(callbackfunc)(eventTypeId,0,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockErrorEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerPointerlockErrorEventCallback"]=registerPointerlockErrorEventCallback;function _emscripten_set_pointerlockerror_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(!document||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"mozpointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"webkitpointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"mspointerlockerror",targetThread);return registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"pointerlockerror",targetThread)}Module["_emscripten_set_pointerlockerror_callback_on_thread"]=_emscripten_set_pointerlockerror_callback_on_thread;_emscripten_set_pointerlockerror_callback_on_thread.sig="ippipp";function _emscripten_get_pointerlock_status(pointerlockStatus){pointerlockStatus>>>=0;if(pointerlockStatus)fillPointerlockChangeEventData(pointerlockStatus);if(!document.body||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}return 0}Module["_emscripten_get_pointerlock_status"]=_emscripten_get_pointerlock_status;_emscripten_get_pointerlock_status.sig="ip";var requestPointerLock=target=>{if(target.requestPointerLock){target.requestPointerLock()}else{if(document.body.requestPointerLock){return-3}return-1}return 0};Module["requestPointerLock"]=requestPointerLock;function _emscripten_request_pointerlock(target,deferUntilInEventHandler){target>>>=0;target=findEventTarget(target);if(!target)return-4;if(!target.requestPointerLock){return-1}var canPerformRequests=JSEvents.canPerformEventHandlerRequests();if(!canPerformRequests){if(deferUntilInEventHandler){JSEvents.deferCall(requestPointerLock,2,[target]);return 1}return-2}return requestPointerLock(target)}Module["_emscripten_request_pointerlock"]=_emscripten_request_pointerlock;_emscripten_request_pointerlock.sig="ipi";var _emscripten_exit_pointerlock=()=>{JSEvents.removeDeferredCalls(requestPointerLock);if(document.exitPointerLock){document.exitPointerLock()}else{return-1}return 0};Module["_emscripten_exit_pointerlock"]=_emscripten_exit_pointerlock;_emscripten_exit_pointerlock.sig="i";var _emscripten_vibrate=msecs=>{if(!navigator.vibrate)return-1;navigator.vibrate(msecs);return 0};Module["_emscripten_vibrate"]=_emscripten_vibrate;_emscripten_vibrate.sig="ii";function _emscripten_vibrate_pattern(msecsArray,numEntries){msecsArray>>>=0;if(!navigator.vibrate)return-1;var vibrateList=[];for(var i=0;i>>2>>>0];vibrateList.push(msecs)}navigator.vibrate(vibrateList);return 0}Module["_emscripten_vibrate_pattern"]=_emscripten_vibrate_pattern;_emscripten_vibrate_pattern.sig="ipi";var fillVisibilityChangeEventData=eventStruct=>{var visibilityStates=["hidden","visible","prerender","unloaded"];var visibilityState=visibilityStates.indexOf(document.visibilityState);HEAP32[eventStruct>>>2>>>0]=document.hidden;HEAP32[eventStruct+4>>>2>>>0]=visibilityState};Module["fillVisibilityChangeEventData"]=fillVisibilityChangeEventData;var registerVisibilityChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.visibilityChangeEvent)JSEvents.visibilityChangeEvent=_malloc(8);var visibilityChangeEventHandlerFunc=(e=event)=>{var visibilityChangeEvent=JSEvents.visibilityChangeEvent;fillVisibilityChangeEventData(visibilityChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,visibilityChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:visibilityChangeEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerVisibilityChangeEventCallback"]=registerVisibilityChangeEventCallback;function _emscripten_set_visibilitychange_callback_on_thread(userData,useCapture,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(!specialHTMLTargets[1]){return-4}return registerVisibilityChangeEventCallback(specialHTMLTargets[1],userData,useCapture,callbackfunc,21,"visibilitychange",targetThread)}Module["_emscripten_set_visibilitychange_callback_on_thread"]=_emscripten_set_visibilitychange_callback_on_thread;_emscripten_set_visibilitychange_callback_on_thread.sig="ipipp";function _emscripten_get_visibility_status(visibilityStatus){visibilityStatus>>>=0;if(typeof document.visibilityState=="undefined"&&typeof document.hidden=="undefined"){return-1}fillVisibilityChangeEventData(visibilityStatus);return 0}Module["_emscripten_get_visibility_status"]=_emscripten_get_visibility_status;_emscripten_get_visibility_status.sig="ip";var registerTouchEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.touchEvent)JSEvents.touchEvent=_malloc(1696);target=findEventTarget(target);var touchEventHandlerFunc=e=>{var t,touches={},et=e.touches;for(var i=0;i>>3>>>0]=e.timeStamp;var idx=touchEvent>>>2;HEAP32[idx+3>>>0]=e.ctrlKey;HEAP32[idx+4>>>0]=e.shiftKey;HEAP32[idx+5>>>0]=e.altKey;HEAP32[idx+6>>>0]=e.metaKey;idx+=7;var targetRect=getBoundingClientRect(target);var numTouches=0;for(var i in touches){t=touches[i];HEAP32[idx+0>>>0]=t.identifier;HEAP32[idx+1>>>0]=t.screenX;HEAP32[idx+2>>>0]=t.screenY;HEAP32[idx+3>>>0]=t.clientX;HEAP32[idx+4>>>0]=t.clientY;HEAP32[idx+5>>>0]=t.pageX;HEAP32[idx+6>>>0]=t.pageY;HEAP32[idx+7>>>0]=t.isChanged;HEAP32[idx+8>>>0]=t.onTarget;HEAP32[idx+9>>>0]=t.clientX-(targetRect.left|0);HEAP32[idx+10>>>0]=t.clientY-(targetRect.top|0);idx+=13;if(++numTouches>31){break}}HEAP32[touchEvent+8>>>2>>>0]=numTouches;if(getWasmTableEntry(callbackfunc)(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerTouchEventCallback"]=registerTouchEventCallback;function _emscripten_set_touchstart_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread)}Module["_emscripten_set_touchstart_callback_on_thread"]=_emscripten_set_touchstart_callback_on_thread;_emscripten_set_touchstart_callback_on_thread.sig="ippipp";function _emscripten_set_touchend_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread)}Module["_emscripten_set_touchend_callback_on_thread"]=_emscripten_set_touchend_callback_on_thread;_emscripten_set_touchend_callback_on_thread.sig="ippipp";function _emscripten_set_touchmove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread)}Module["_emscripten_set_touchmove_callback_on_thread"]=_emscripten_set_touchmove_callback_on_thread;_emscripten_set_touchmove_callback_on_thread.sig="ippipp";function _emscripten_set_touchcancel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;return registerTouchEventCallback(target,userData,useCapture,callbackfunc,25,"touchcancel",targetThread)}Module["_emscripten_set_touchcancel_callback_on_thread"]=_emscripten_set_touchcancel_callback_on_thread;_emscripten_set_touchcancel_callback_on_thread.sig="ippipp";var fillGamepadEventData=(eventStruct,e)=>{HEAPF64[eventStruct>>>3>>>0]=e.timestamp;for(var i=0;i>>3>>>0]=e.axes[i]}for(var i=0;i>>3>>>0]=e.buttons[i].value}else{HEAPF64[eventStruct+i*8+528>>>3>>>0]=e.buttons[i]}}for(var i=0;i>>2>>>0]=e.buttons[i].pressed}else{HEAP32[eventStruct+i*4+1040>>>2>>>0]=e.buttons[i]==1}}HEAP32[eventStruct+1296>>>2>>>0]=e.connected;HEAP32[eventStruct+1300>>>2>>>0]=e.index;HEAP32[eventStruct+8>>>2>>>0]=e.axes.length;HEAP32[eventStruct+12>>>2>>>0]=e.buttons.length;stringToUTF8(e.id,eventStruct+1304,64);stringToUTF8(e.mapping,eventStruct+1368,64)};Module["fillGamepadEventData"]=fillGamepadEventData;var registerGamepadEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.gamepadEvent)JSEvents.gamepadEvent=_malloc(1432);var gamepadEventHandlerFunc=(e=event)=>{var gamepadEvent=JSEvents.gamepadEvent;fillGamepadEventData(gamepadEvent,e["gamepad"]);if(getWasmTableEntry(callbackfunc)(eventTypeId,gamepadEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:gamepadEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerGamepadEventCallback"]=registerGamepadEventCallback;var _emscripten_sample_gamepad_data=()=>{try{if(navigator.getGamepads)return(JSEvents.lastGamepadState=navigator.getGamepads())?0:-1}catch(e){navigator.getGamepads=null}return-1};Module["_emscripten_sample_gamepad_data"]=_emscripten_sample_gamepad_data;_emscripten_sample_gamepad_data.sig="i";function _emscripten_set_gamepadconnected_callback_on_thread(userData,useCapture,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(_emscripten_sample_gamepad_data())return-1;return registerGamepadEventCallback(2,userData,useCapture,callbackfunc,26,"gamepadconnected",targetThread)}Module["_emscripten_set_gamepadconnected_callback_on_thread"]=_emscripten_set_gamepadconnected_callback_on_thread;_emscripten_set_gamepadconnected_callback_on_thread.sig="ipipp";function _emscripten_set_gamepaddisconnected_callback_on_thread(userData,useCapture,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(_emscripten_sample_gamepad_data())return-1;return registerGamepadEventCallback(2,userData,useCapture,callbackfunc,27,"gamepaddisconnected",targetThread)}Module["_emscripten_set_gamepaddisconnected_callback_on_thread"]=_emscripten_set_gamepaddisconnected_callback_on_thread;_emscripten_set_gamepaddisconnected_callback_on_thread.sig="ipipp";var _emscripten_get_num_gamepads=()=>JSEvents.lastGamepadState.length;Module["_emscripten_get_num_gamepads"]=_emscripten_get_num_gamepads;_emscripten_get_num_gamepads.sig="i";function _emscripten_get_gamepad_status(index,gamepadState){gamepadState>>>=0;if(index<0||index>=JSEvents.lastGamepadState.length)return-5;if(!JSEvents.lastGamepadState[index])return-7;fillGamepadEventData(gamepadState,JSEvents.lastGamepadState[index]);return 0}Module["_emscripten_get_gamepad_status"]=_emscripten_get_gamepad_status;_emscripten_get_gamepad_status.sig="iip";var registerBeforeUnloadEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString)=>{var beforeUnloadEventHandlerFunc=(e=event)=>{var confirmationMessage=getWasmTableEntry(callbackfunc)(eventTypeId,0,userData);if(confirmationMessage){confirmationMessage=UTF8ToString(confirmationMessage)}if(confirmationMessage){e.preventDefault();e.returnValue=confirmationMessage;return confirmationMessage}};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:beforeUnloadEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerBeforeUnloadEventCallback"]=registerBeforeUnloadEventCallback;function _emscripten_set_beforeunload_callback_on_thread(userData,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(typeof onbeforeunload=="undefined")return-1;if(targetThread!==1)return-5;return registerBeforeUnloadEventCallback(2,userData,true,callbackfunc,28,"beforeunload")}Module["_emscripten_set_beforeunload_callback_on_thread"]=_emscripten_set_beforeunload_callback_on_thread;_emscripten_set_beforeunload_callback_on_thread.sig="ippp";var fillBatteryEventData=(eventStruct,e)=>{HEAPF64[eventStruct>>>3>>>0]=e.chargingTime;HEAPF64[eventStruct+8>>>3>>>0]=e.dischargingTime;HEAPF64[eventStruct+16>>>3>>>0]=e.level;HEAP32[eventStruct+24>>>2>>>0]=e.charging};Module["fillBatteryEventData"]=fillBatteryEventData;var battery=()=>navigator.battery||navigator.mozBattery||navigator.webkitBattery;Module["battery"]=battery;var registerBatteryEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.batteryEvent)JSEvents.batteryEvent=_malloc(32);var batteryEventHandlerFunc=(e=event)=>{var batteryEvent=JSEvents.batteryEvent;fillBatteryEventData(batteryEvent,battery());if(getWasmTableEntry(callbackfunc)(eventTypeId,batteryEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:batteryEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerBatteryEventCallback"]=registerBatteryEventCallback;function _emscripten_set_batterychargingchange_callback_on_thread(userData,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(!battery())return-1;return registerBatteryEventCallback(battery(),userData,true,callbackfunc,29,"chargingchange",targetThread)}Module["_emscripten_set_batterychargingchange_callback_on_thread"]=_emscripten_set_batterychargingchange_callback_on_thread;_emscripten_set_batterychargingchange_callback_on_thread.sig="ippp";function _emscripten_set_batterylevelchange_callback_on_thread(userData,callbackfunc,targetThread){userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;if(!battery())return-1;return registerBatteryEventCallback(battery(),userData,true,callbackfunc,30,"levelchange",targetThread)}Module["_emscripten_set_batterylevelchange_callback_on_thread"]=_emscripten_set_batterylevelchange_callback_on_thread;_emscripten_set_batterylevelchange_callback_on_thread.sig="ippp";function _emscripten_get_battery_status(batteryState){batteryState>>>=0;if(!battery())return-1;fillBatteryEventData(batteryState,battery());return 0}Module["_emscripten_get_battery_status"]=_emscripten_get_battery_status;_emscripten_get_battery_status.sig="ip";function __emscripten_set_offscreencanvas_size(target,width,height){target>>>=0;return-1}Module["__emscripten_set_offscreencanvas_size"]=__emscripten_set_offscreencanvas_size;__emscripten_set_offscreencanvas_size.sig="ipii";function _emscripten_set_element_css_size(target,width,height){target>>>=0;target=findEventTarget(target);if(!target)return-4;target.style.width=width+"px";target.style.height=height+"px";return 0}Module["_emscripten_set_element_css_size"]=_emscripten_set_element_css_size;_emscripten_set_element_css_size.sig="ipdd";function _emscripten_get_element_css_size(target,width,height){target>>>=0;width>>>=0;height>>>=0;target=findEventTarget(target);if(!target)return-4;var rect=getBoundingClientRect(target);HEAPF64[width>>>3>>>0]=rect.width;HEAPF64[height>>>3>>>0]=rect.height;return 0}Module["_emscripten_get_element_css_size"]=_emscripten_get_element_css_size;_emscripten_get_element_css_size.sig="ippp";var _emscripten_html5_remove_all_event_listeners=()=>JSEvents.removeAllEventListeners();Module["_emscripten_html5_remove_all_event_listeners"]=_emscripten_html5_remove_all_event_listeners;_emscripten_html5_remove_all_event_listeners.sig="v";var _emscripten_request_animation_frame=function(cb,userData){cb>>>=0;userData>>>=0;return requestAnimationFrame(timeStamp=>getWasmTableEntry(cb)(timeStamp,userData))};Module["_emscripten_request_animation_frame"]=_emscripten_request_animation_frame;_emscripten_request_animation_frame.sig="ipp";var _emscripten_cancel_animation_frame=id=>cancelAnimationFrame(id);Module["_emscripten_cancel_animation_frame"]=_emscripten_cancel_animation_frame;_emscripten_cancel_animation_frame.sig="vi";function _emscripten_request_animation_frame_loop(cb,userData){cb>>>=0;userData>>>=0;function tick(timeStamp){if(getWasmTableEntry(cb)(timeStamp,userData)){requestAnimationFrame(tick)}}return requestAnimationFrame(tick)}Module["_emscripten_request_animation_frame_loop"]=_emscripten_request_animation_frame_loop;_emscripten_request_animation_frame_loop.sig="vpp";var _emscripten_performance_now=()=>performance.now();Module["_emscripten_performance_now"]=_emscripten_performance_now;_emscripten_performance_now.sig="d";var _emscripten_get_device_pixel_ratio=()=>typeof devicePixelRatio=="number"&&devicePixelRatio||1;Module["_emscripten_get_device_pixel_ratio"]=_emscripten_get_device_pixel_ratio;_emscripten_get_device_pixel_ratio.sig="d";function _emscripten_get_callstack(flags,str,maxbytes){str>>>=0;var callstack=getCallstack(flags);if(!str||maxbytes<=0){return lengthBytesUTF8(callstack)+1}var bytesWrittenExcludingNull=stringToUTF8(callstack,str,maxbytes);return bytesWrittenExcludingNull+1}Module["_emscripten_get_callstack"]=_emscripten_get_callstack;_emscripten_get_callstack.sig="iipi";var convertFrameToPC=frame=>{abort("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER");return 0};Module["convertFrameToPC"]=convertFrameToPC;function _emscripten_return_address(level){var callstack=jsStackTrace().split("\n");if(callstack[0]=="Error"){callstack.shift()}var caller=callstack[level+3];return convertFrameToPC(caller)}Module["_emscripten_return_address"]=_emscripten_return_address;_emscripten_return_address.sig="pi";var UNWIND_CACHE={};Module["UNWIND_CACHE"]=UNWIND_CACHE;var saveInUnwindCache=callstack=>{callstack.forEach(frame=>{var pc=convertFrameToPC(frame);if(pc){UNWIND_CACHE[pc]=frame}})};Module["saveInUnwindCache"]=saveInUnwindCache;function _emscripten_stack_snapshot(){var callstack=jsStackTrace().split("\n");if(callstack[0]=="Error"){callstack.shift()}saveInUnwindCache(callstack);UNWIND_CACHE.last_addr=convertFrameToPC(callstack[3]);UNWIND_CACHE.last_stack=callstack;return UNWIND_CACHE.last_addr}Module["_emscripten_stack_snapshot"]=_emscripten_stack_snapshot;_emscripten_stack_snapshot.sig="p";function _emscripten_stack_unwind_buffer(addr,buffer,count){addr>>>=0;buffer>>>=0;var stack;if(UNWIND_CACHE.last_addr==addr){stack=UNWIND_CACHE.last_stack}else{stack=jsStackTrace().split("\n");if(stack[0]=="Error"){stack.shift()}saveInUnwindCache(stack)}var offset=3;while(stack[offset]&&convertFrameToPC(stack[offset])!=addr){++offset}for(var i=0;i>>2>>>0]=convertFrameToPC(stack[i+offset])}return i}Module["_emscripten_stack_unwind_buffer"]=_emscripten_stack_unwind_buffer;_emscripten_stack_unwind_buffer.sig="ippi";function _emscripten_pc_get_function(pc){pc>>>=0;abort("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER");return 0}Module["_emscripten_pc_get_function"]=_emscripten_pc_get_function;_emscripten_pc_get_function.sig="pp";var convertPCtoSourceLocation=pc=>{if(UNWIND_CACHE.last_get_source_pc==pc)return UNWIND_CACHE.last_source;var match;var source;if(!source){var frame=UNWIND_CACHE[pc];if(!frame)return null;if(match=/\((.*):(\d+):(\d+)\)$/.exec(frame)){source={file:match[1],line:match[2],column:match[3]}}else if(match=/@(.*):(\d+):(\d+)/.exec(frame)){source={file:match[1],line:match[2],column:match[3]}}}UNWIND_CACHE.last_get_source_pc=pc;UNWIND_CACHE.last_source=source;return source};Module["convertPCtoSourceLocation"]=convertPCtoSourceLocation;function _emscripten_pc_get_file(pc){pc>>>=0;var result=convertPCtoSourceLocation(pc);if(!result)return 0;if(_emscripten_pc_get_file.ret)_free(_emscripten_pc_get_file.ret);_emscripten_pc_get_file.ret=stringToNewUTF8(result.file);return _emscripten_pc_get_file.ret}Module["_emscripten_pc_get_file"]=_emscripten_pc_get_file;_emscripten_pc_get_file.sig="pp";function _emscripten_pc_get_line(pc){pc>>>=0;var result=convertPCtoSourceLocation(pc);return result?result.line:0}Module["_emscripten_pc_get_line"]=_emscripten_pc_get_line;_emscripten_pc_get_line.sig="ip";function _emscripten_pc_get_column(pc){pc>>>=0;var result=convertPCtoSourceLocation(pc);return result?result.column||0:0}Module["_emscripten_pc_get_column"]=_emscripten_pc_get_column;_emscripten_pc_get_column.sig="ip";function _random_get(buf,buf_len){buf>>>=0;buf_len>>>=0;try{_getentropy(buf,buf_len);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}Module["_random_get"]=_random_get;_random_get.sig="ipp";var checkWasiClock=clock_id=>clock_id==0||clock_id==1||clock_id==2||clock_id==3;Module["checkWasiClock"]=checkWasiClock;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);ptime>>>=0;if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=Date.now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP32[ptime>>>2>>>0]=nsec>>>0;HEAP32[ptime+4>>>2>>>0]=nsec/Math.pow(2,32)>>>0;return 0}Module["_clock_time_get"]=_clock_time_get;_clock_time_get.sig="iijp";function _clock_res_get(clk_id,pres){pres>>>=0;if(!checkWasiClock(clk_id)){return 28}var nsec;if(clk_id===0){nsec=1e3*1e3}else if(nowIsMonotonic){nsec=_emscripten_get_now_res()}else{return 52}HEAP32[pres>>>2>>>0]=nsec>>>0;HEAP32[pres+4>>>2>>>0]=nsec/Math.pow(2,32)>>>0;return 0}Module["_clock_res_get"]=_clock_res_get;_clock_res_get.sig="iip";var wasiRightsToMuslOFlags=rights=>{if(rights&2&&rights&64){return 2}if(rights&2){return 0}if(rights&64){return 1}throw new FS.ErrnoError(28)};Module["wasiRightsToMuslOFlags"]=wasiRightsToMuslOFlags;var wasiOFlagsToMuslOFlags=oflags=>{var musl_oflags=0;if(oflags&1){musl_oflags|=64}if(oflags&8){musl_oflags|=512}if(oflags&2){musl_oflags|=65536}if(oflags&4){musl_oflags|=128}return musl_oflags};Module["wasiOFlagsToMuslOFlags"]=wasiOFlagsToMuslOFlags;var createDyncallWrapper=sig=>{var sections=[];var prelude=[0,97,115,109,1,0,0,0];sections.push(prelude);var wrappersig=[sig[0].replace("j","i"),"i",sig.slice(1).replace(/j/g,"ii")].join("");var typeSectionBody=[3];generateFuncType(wrappersig,typeSectionBody);generateFuncType(sig,typeSectionBody);generateFuncType("vi",typeSectionBody);var typeSection=[1];uleb128Encode(typeSectionBody.length,typeSection);typeSection.push(...typeSectionBody);sections.push(typeSection);var importSection=[2,15,2,1,101,1,116,1,112,0,0,1,101,1,114,0,2];sections.push(importSection);var functionSection=[3,2,1,0];sections.push(functionSection);var exportSection=[7,5,1,1,102,0,1];sections.push(exportSection);var convert_code=[];if(sig[0]==="j"){convert_code=[1,1,126]}else{convert_code.push(0)}function localGet(j){convert_code.push(32);uleb128Encode(j,convert_code)}var j=1;for(var i=1;i{throw"unwind"};Module["_emscripten_unwind_to_js_event_loop"]=_emscripten_unwind_to_js_event_loop;_emscripten_unwind_to_js_event_loop.sig="v";var safeSetTimeout=(func,timeout)=>setTimeout(()=>{callUserCallback(func)},timeout);Module["safeSetTimeout"]=safeSetTimeout;var setImmediateWrapped=func=>{setImmediateWrapped.mapping||=[];var id=setImmediateWrapped.mapping.length;setImmediateWrapped.mapping[id]=setImmediate(()=>{setImmediateWrapped.mapping[id]=undefined;func()});return id};Module["setImmediateWrapped"]=setImmediateWrapped;var clearImmediateWrapped=id=>{clearImmediate(setImmediateWrapped.mapping[id]);setImmediateWrapped.mapping[id]=undefined};Module["clearImmediateWrapped"]=clearImmediateWrapped;var polyfillSetImmediate=()=>{};Module["polyfillSetImmediate"]=polyfillSetImmediate;var _emscripten_set_immediate=function(cb,userData){cb>>>=0;userData>>>=0;return emSetImmediate(()=>{callUserCallback(()=>getWasmTableEntry(cb)(userData))})};Module["_emscripten_set_immediate"]=_emscripten_set_immediate;_emscripten_set_immediate.sig="ipp";var _emscripten_clear_immediate=id=>{emClearImmediate(id)};Module["_emscripten_clear_immediate"]=_emscripten_clear_immediate;_emscripten_clear_immediate.sig="vi";var _emscripten_set_immediate_loop=function(cb,userData){cb>>>=0;userData>>>=0;function tick(){callUserCallback(()=>{if(getWasmTableEntry(cb)(userData)){emSetImmediate(tick)}else{}})}emSetImmediate(tick)};Module["_emscripten_set_immediate_loop"]=_emscripten_set_immediate_loop;_emscripten_set_immediate_loop.sig="vpp";var _emscripten_set_timeout=function(cb,msecs,userData){cb>>>=0;userData>>>=0;return safeSetTimeout(()=>getWasmTableEntry(cb)(userData),msecs)};Module["_emscripten_set_timeout"]=_emscripten_set_timeout;_emscripten_set_timeout.sig="ipdp";var _emscripten_clear_timeout=clearTimeout;Module["_emscripten_clear_timeout"]=_emscripten_clear_timeout;_emscripten_clear_timeout.sig="vi";var _emscripten_set_timeout_loop=function(cb,msecs,userData){cb>>>=0;userData>>>=0;function tick(){var t=_emscripten_get_now();var n=t+msecs;callUserCallback(()=>{if(getWasmTableEntry(cb)(t,userData)){setTimeout(tick,n-_emscripten_get_now())}})}return setTimeout(tick,0)};Module["_emscripten_set_timeout_loop"]=_emscripten_set_timeout_loop;_emscripten_set_timeout_loop.sig="vpdp";var _emscripten_set_interval=function(cb,msecs,userData){cb>>>=0;userData>>>=0;return setInterval(()=>{callUserCallback(()=>getWasmTableEntry(cb)(userData))},msecs)};Module["_emscripten_set_interval"]=_emscripten_set_interval;_emscripten_set_interval.sig="ipdp";var _emscripten_clear_interval=id=>{clearInterval(id)};Module["_emscripten_clear_interval"]=_emscripten_clear_interval;_emscripten_clear_interval.sig="vi";var idsToPromises=(idBuf,size)=>{var promises=[];for(var i=0;i>>2>>>0];promises[i]=getPromise(id)}return promises};Module["idsToPromises"]=idsToPromises;var makePromiseCallback=(callback,userData)=>value=>{var stack=stackSave();var resultPtr=stackAlloc(POINTER_SIZE);HEAPU32[resultPtr>>>2>>>0]=0;try{var result=getWasmTableEntry(callback)(resultPtr,userData,value);var resultVal=HEAPU32[resultPtr>>>2>>>0]}catch(e){if(typeof e!="number"){throw 0}throw e}finally{stackRestore(stack)}switch(result){case 0:return resultVal;case 1:return getPromise(resultVal);case 2:var ret=getPromise(resultVal);_emscripten_promise_destroy(resultVal);return ret;case 3:throw resultVal}};Module["makePromiseCallback"]=makePromiseCallback;function _emscripten_promise_then(id,onFulfilled,onRejected,userData){id>>>=0;onFulfilled>>>=0;onRejected>>>=0;userData>>>=0;var promise=getPromise(id);var newId=promiseMap.allocate({promise:promise.then(makePromiseCallback(onFulfilled,userData),makePromiseCallback(onRejected,userData))});return newId}Module["_emscripten_promise_then"]=_emscripten_promise_then;_emscripten_promise_then.sig="ppppp";var _emscripten_promise_all=function(idBuf,resultBuf,size){idBuf>>>=0;resultBuf>>>=0;size>>>=0;var promises=idsToPromises(idBuf,size);var id=promiseMap.allocate({promise:Promise.all(promises).then(results=>{if(resultBuf){for(var i=0;i>>2>>>0]=result}}return resultBuf})});return id};Module["_emscripten_promise_all"]=_emscripten_promise_all;_emscripten_promise_all.sig="pppp";var setPromiseResult=(ptr,fulfill,value)=>{var result=fulfill?0:3;HEAP32[ptr>>>2>>>0]=result;HEAPU32[ptr+4>>>2>>>0]=value};Module["setPromiseResult"]=setPromiseResult;var _emscripten_promise_all_settled=function(idBuf,resultBuf,size){idBuf>>>=0;resultBuf>>>=0;size>>>=0;var promises=idsToPromises(idBuf,size);var id=promiseMap.allocate({promise:Promise.allSettled(promises).then(results=>{if(resultBuf){var offset=resultBuf;for(var i=0;i>>=0;errorBuf>>>=0;size>>>=0;var promises=idsToPromises(idBuf,size);var id=promiseMap.allocate({promise:Promise.any(promises).catch(err=>{if(errorBuf){for(var i=0;i>>2>>>0]=err.errors[i]}}throw errorBuf})});return id};Module["_emscripten_promise_any"]=_emscripten_promise_any;_emscripten_promise_any.sig="pppp";function _emscripten_promise_race(idBuf,size){idBuf>>>=0;size>>>=0;var promises=idsToPromises(idBuf,size);var id=promiseMap.allocate({promise:Promise.race(promises)});return id}Module["_emscripten_promise_race"]=_emscripten_promise_race;_emscripten_promise_race.sig="ppp";function _emscripten_promise_await(returnValuePtr,id){returnValuePtr>>>=0;id>>>=0;abort("emscripten_promise_await is only available with ASYNCIFY")}Module["_emscripten_promise_await"]=_emscripten_promise_await;_emscripten_promise_await.sig="vpp";function ___cxa_find_matching_catch_4(arg0,arg1){arg0>>>=0;arg1>>>=0;return findMatchingCatch([arg0,arg1])}Module["___cxa_find_matching_catch_4"]=___cxa_find_matching_catch_4;___cxa_find_matching_catch_4.sig="ppp";function _llvm_eh_typeid_for(type){type>>>=0;return type}Module["_llvm_eh_typeid_for"]=_llvm_eh_typeid_for;_llvm_eh_typeid_for.sig="vp";function ___cxa_get_exception_ptr(ptr){ptr>>>=0;var rtn=new ExceptionInfo(ptr).get_exception_ptr();return rtn}Module["___cxa_get_exception_ptr"]=___cxa_get_exception_ptr;___cxa_get_exception_ptr.sig="pp";function ___cxa_call_unexpected(exception){exception>>>=0;return abort("Unexpected exception thrown, this is not properly supported - aborting")}Module["___cxa_call_unexpected"]=___cxa_call_unexpected;___cxa_call_unexpected.sig="vp";var _emscripten_set_main_loop_timing=(mode,value)=>{Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof Browser.setImmediate=="undefined"){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);Browser.setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}else{Browser.setImmediate=setImmediate}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){Browser.setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0};Module["_emscripten_set_main_loop_timing"]=_emscripten_set_main_loop_timing;_emscripten_set_main_loop_timing.sig="iii";var setMainLoop=(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming)=>{Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object")SDL.audio?.queueNewAudioData?.();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0){_emscripten_set_main_loop_timing(0,1e3/fps)}else{_emscripten_set_main_loop_timing(1,1)}Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}};Module["setMainLoop"]=setMainLoop;var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;URL.revokeObjectURL(url);onload?.(byteArray)};img.onerror=event=>{err(`Image ${url} could not be decoded`);onerror?.()};img.src=url};preloadPlugins.push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;onload?.(byteArray)}function fail(){if(done)return;done=true;preloadedAudios[name]=new Audio;onerror?.()}var b=new Blob([byteArray],{type:Browser.getMimetype(name)});var url=URL.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",()=>finish(audio),false);audio.onerror=function audio_onerror(event){if(done)return;err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`);function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(()=>{finish(audio)},1e4)};preloadPlugins.push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(()=>{});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(()=>{});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",ev=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},createContext(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(callback=>callback());Browser.init()}return ctx},destroyContext(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}Module["onFullScreen"]?.(Browser.isFullscreen);Module["onFullscreen"]?.(Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},exitFullscreen(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(()=>{});CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout(func,timeout){return safeSetTimeout(func,timeout)},safeRequestAnimationFrame(func){return Browser.requestAnimationFrame(()=>{callUserCallback(func)})},getMimetype(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia(func){window.getUserMedia||=navigator["getUserMedia"]||navigator["mozGetUserMedia"];window.getUserMedia(func)},getMovementX(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseCoords(pageX,pageY){var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;var adjustedX=pageX-(scrollX+rect.left);var adjustedY=pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);return{x:adjustedX,y:adjustedY}},setMouseCoords(pageX,pageY){const{x:x,y:y}=Browser.calculateMouseCoords(pageX,pageY);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y},calculateMouseEvent(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}else{if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var coords=Browser.calculateMouseCoords(touch.pageX,touch.pageY);if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];last||=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}Browser.setMouseCoords(event.pageX,event.pageY)}},resizeListeners:[],updateResizeListeners(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(listener=>listener(canvas.width,canvas.height))},setCanvasSize(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>>2>>>0];flags=flags|8388608;HEAP32[SDL.screen>>>2>>>0]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>>2>>>0];flags=flags&~8388608;HEAP32[SDL.screen>>>2>>>0]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>>=0;onload>>>=0;onerror>>>=0;var _file=UTF8ToString(file);var data=FS.analyzePath(_file);if(!data.exists)return-1;FS.createPreloadedFile(PATH.dirname(_file),PATH.basename(_file),new Uint8Array(data.object.contents),true,true,()=>{if(onload)getWasmTableEntry(onload)(file)},()=>{if(onerror)getWasmTableEntry(onerror)(file)},true);return 0};Module["_emscripten_run_preload_plugins"]=_emscripten_run_preload_plugins;_emscripten_run_preload_plugins.sig="ippp";var Browser_asyncPrepareDataCounter=0;Module["Browser_asyncPrepareDataCounter"]=Browser_asyncPrepareDataCounter;var _emscripten_run_preload_plugins_data=function(data,size,suffix,arg,onload,onerror){data>>>=0;suffix>>>=0;arg>>>=0;onload>>>=0;onerror>>>=0;var _suffix=UTF8ToString(suffix);var name="prepare_data_"+Browser_asyncPrepareDataCounter+++"."+_suffix;var cname=stringToNewUTF8(name);FS.createPreloadedFile("/",name,HEAPU8.subarray(data>>>0,data+size>>>0),true,true,()=>{if(onload)getWasmTableEntry(onload)(arg,cname)},()=>{if(onerror)getWasmTableEntry(onerror)(arg)},true)};Module["_emscripten_run_preload_plugins_data"]=_emscripten_run_preload_plugins_data;_emscripten_run_preload_plugins_data.sig="vpipppp";var _emscripten_async_run_script=function(script,millis){script>>>=0;safeSetTimeout(()=>_emscripten_run_script(script),millis)};Module["_emscripten_async_run_script"]=_emscripten_async_run_script;_emscripten_async_run_script.sig="vpi";var _emscripten_async_load_script=function(url,onload,onerror){url>>>=0;onload>>>=0;onerror>>>=0;url=UTF8ToString(url);onload=getWasmTableEntry(onload);onerror=getWasmTableEntry(onerror);var loadDone=()=>{if(onload){if(runDependencies>0){dependenciesFulfilled=onload}else{onload()}}};var loadError=()=>{onerror?.()};if(ENVIRONMENT_IS_NODE){readAsync(url,data=>{eval(data);loadDone()},loadError,false);return}var script=document.createElement("script");script.onload=loadDone;script.onerror=loadError;script.src=url;document.body.appendChild(script)};Module["_emscripten_async_load_script"]=_emscripten_async_load_script;_emscripten_async_load_script.sig="vppp";function _emscripten_get_main_loop_timing(mode,value){mode>>>=0;value>>>=0;if(mode)HEAP32[mode>>>2>>>0]=Browser.mainLoop.timingMode;if(value)HEAP32[value>>>2>>>0]=Browser.mainLoop.timingValue}Module["_emscripten_get_main_loop_timing"]=_emscripten_get_main_loop_timing;_emscripten_get_main_loop_timing.sig="vpp";function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop){func>>>=0;var browserIterationFunc=getWasmTableEntry(func);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop)}Module["_emscripten_set_main_loop"]=_emscripten_set_main_loop;_emscripten_set_main_loop.sig="vpii";var _emscripten_set_main_loop_arg=function(func,arg,fps,simulateInfiniteLoop){func>>>=0;arg>>>=0;var browserIterationFunc=()=>getWasmTableEntry(func)(arg);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg)};Module["_emscripten_set_main_loop_arg"]=_emscripten_set_main_loop_arg;_emscripten_set_main_loop_arg.sig="vppii";var _emscripten_cancel_main_loop=()=>{Browser.mainLoop.pause();Browser.mainLoop.func=null};Module["_emscripten_cancel_main_loop"]=_emscripten_cancel_main_loop;_emscripten_cancel_main_loop.sig="v";var _emscripten_pause_main_loop=()=>{Browser.mainLoop.pause()};Module["_emscripten_pause_main_loop"]=_emscripten_pause_main_loop;_emscripten_pause_main_loop.sig="v";var _emscripten_resume_main_loop=()=>{Browser.mainLoop.resume()};Module["_emscripten_resume_main_loop"]=_emscripten_resume_main_loop;_emscripten_resume_main_loop.sig="v";var __emscripten_push_main_loop_blocker=function(func,arg,name){func>>>=0;arg>>>=0;name>>>=0;Browser.mainLoop.queue.push({func:()=>{getWasmTableEntry(func)(arg)},name:UTF8ToString(name),counted:true});Browser.mainLoop.updateStatus()};Module["__emscripten_push_main_loop_blocker"]=__emscripten_push_main_loop_blocker;__emscripten_push_main_loop_blocker.sig="vppp";var __emscripten_push_uncounted_main_loop_blocker=function(func,arg,name){func>>>=0;arg>>>=0;name>>>=0;Browser.mainLoop.queue.push({func:()=>{getWasmTableEntry(func)(arg)},name:UTF8ToString(name),counted:false});Browser.mainLoop.updateStatus()};Module["__emscripten_push_uncounted_main_loop_blocker"]=__emscripten_push_uncounted_main_loop_blocker;__emscripten_push_uncounted_main_loop_blocker.sig="vppp";var _emscripten_set_main_loop_expected_blockers=num=>{Browser.mainLoop.expectedBlockers=num;Browser.mainLoop.remainingBlockers=num;Browser.mainLoop.updateStatus()};Module["_emscripten_set_main_loop_expected_blockers"]=_emscripten_set_main_loop_expected_blockers;_emscripten_set_main_loop_expected_blockers.sig="vi";function _emscripten_async_call(func,arg,millis){func>>>=0;arg>>>=0;function wrapper(){getWasmTableEntry(func)(arg)}if(millis>=0||ENVIRONMENT_IS_NODE){safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}Module["_emscripten_async_call"]=_emscripten_async_call;_emscripten_async_call.sig="vppi";function _emscripten_get_window_title(){var buflen=256;if(!_emscripten_get_window_title.buffer){_emscripten_get_window_title.buffer=_malloc(buflen)}stringToUTF8(document.title,_emscripten_get_window_title.buffer,buflen);return _emscripten_get_window_title.buffer}Module["_emscripten_get_window_title"]=_emscripten_get_window_title;_emscripten_get_window_title.sig="p";function _emscripten_set_window_title(title){title>>>=0;return document.title=UTF8ToString(title)}Module["_emscripten_set_window_title"]=_emscripten_set_window_title;_emscripten_set_window_title.sig="vp";function _emscripten_get_screen_size(width,height){width>>>=0;height>>>=0;HEAP32[width>>>2>>>0]=screen.width;HEAP32[height>>>2>>>0]=screen.height}Module["_emscripten_get_screen_size"]=_emscripten_get_screen_size;_emscripten_get_screen_size.sig="vpp";var _emscripten_hide_mouse=()=>{var styleSheet=document.styleSheets[0];var rules=styleSheet.cssRules;for(var i=0;i{Browser.setCanvasSize(width,height)};Module["_emscripten_set_canvas_size"]=_emscripten_set_canvas_size;_emscripten_set_canvas_size.sig="vii";function _emscripten_get_canvas_size(width,height,isFullscreen){width>>>=0;height>>>=0;isFullscreen>>>=0;var canvas=Module["canvas"];HEAP32[width>>>2>>>0]=canvas.width;HEAP32[height>>>2>>>0]=canvas.height;HEAP32[isFullscreen>>>2>>>0]=Browser.isFullscreen?1:0}Module["_emscripten_get_canvas_size"]=_emscripten_get_canvas_size;_emscripten_get_canvas_size.sig="vppp";function _emscripten_create_worker(url){url>>>=0;url=UTF8ToString(url);var id=Browser.workers.length;var info={worker:new Worker(url),callbacks:[],awaited:0,buffer:0,bufferSize:0};info.worker.onmessage=function info_worker_onmessage(msg){if(ABORT)return;var info=Browser.workers[id];if(!info)return;var callbackId=msg.data["callbackId"];var callbackInfo=info.callbacks[callbackId];if(!callbackInfo)return;if(msg.data["finalResponse"]){info.awaited--;info.callbacks[callbackId]=null}var data=msg.data["data"];if(data){if(!data.byteLength)data=new Uint8Array(data);if(!info.buffer||info.bufferSize>>0);callbackInfo.func(info.buffer,data.length,callbackInfo.arg)}else{callbackInfo.func(0,0,callbackInfo.arg)}};Browser.workers.push(info);return id}Module["_emscripten_create_worker"]=_emscripten_create_worker;_emscripten_create_worker.sig="ip";var _emscripten_destroy_worker=id=>{var info=Browser.workers[id];info.worker.terminate();if(info.buffer)_free(info.buffer);Browser.workers[id]=null};Module["_emscripten_destroy_worker"]=_emscripten_destroy_worker;_emscripten_destroy_worker.sig="vi";function _emscripten_call_worker(id,funcName,data,size,callback,arg){funcName>>>=0;data>>>=0;callback>>>=0;arg>>>=0;funcName=UTF8ToString(funcName);var info=Browser.workers[id];var callbackId=-1;if(callback){callbackId=info.callbacks.length;info.callbacks.push({func:getWasmTableEntry(callback),arg:arg});info.awaited++}var transferObject={"funcName":funcName,"callbackId":callbackId,"data":data?new Uint8Array(HEAPU8.subarray(data>>>0,data+size>>>0)):0};if(data){info.worker.postMessage(transferObject,[transferObject.data.buffer])}else{info.worker.postMessage(transferObject)}}Module["_emscripten_call_worker"]=_emscripten_call_worker;_emscripten_call_worker.sig="vippipp";var _emscripten_get_worker_queue_size=id=>{var info=Browser.workers[id];if(!info)return-1;return info.awaited};Module["_emscripten_get_worker_queue_size"]=_emscripten_get_worker_queue_size;_emscripten_get_worker_queue_size.sig="ii";var getPreloadedImageData=(path,w,h)=>{path=PATH_FS.resolve(path);var canvas=preloadedImages[path];if(!canvas)return 0;var ctx=canvas.getContext("2d");var image=ctx.getImageData(0,0,canvas.width,canvas.height);var buf=_malloc(canvas.width*canvas.height*4);HEAPU8.set(image.data,buf>>>0);HEAP32[w>>>2>>>0]=canvas.width;HEAP32[h>>>2>>>0]=canvas.height;return buf};Module["getPreloadedImageData"]=getPreloadedImageData;function _emscripten_get_preloaded_image_data(path,w,h){path>>>=0;w>>>=0;h>>>=0;return getPreloadedImageData(UTF8ToString(path),w,h)}Module["_emscripten_get_preloaded_image_data"]=_emscripten_get_preloaded_image_data;_emscripten_get_preloaded_image_data.sig="pppp";var getPreloadedImageData__data=["$PATH_FS","malloc"];Module["getPreloadedImageData__data"]=getPreloadedImageData__data;function _emscripten_get_preloaded_image_data_from_FILE(file,w,h){file>>>=0;w>>>=0;h>>>=0;var fd=_fileno(file);var stream=FS.getStream(fd);if(stream){return getPreloadedImageData(stream.path,w,h)}return 0}Module["_emscripten_get_preloaded_image_data_from_FILE"]=_emscripten_get_preloaded_image_data_from_FILE;_emscripten_get_preloaded_image_data_from_FILE.sig="pppp";var wget={wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle(){var handle=wget.nextWgetRequestHandle;wget.nextWgetRequestHandle++;return handle}};Module["wget"]=wget;var FS_mkdirTree=(path,mode)=>FS.mkdirTree(path,mode);Module["FS_mkdirTree"]=FS_mkdirTree;var _emscripten_async_wget=function(url,file,onload,onerror){url>>>=0;file>>>=0;onload>>>=0;onerror>>>=0;var _url=UTF8ToString(url);var _file=UTF8ToString(file);_file=PATH_FS.resolve(_file);function doCallback(callback){if(callback){callUserCallback(()=>{var sp=stackSave();getWasmTableEntry(callback)(stringToUTF8OnStack(_file));stackRestore(sp)})}}var destinationDirectory=PATH.dirname(_file);FS_createPreloadedFile(destinationDirectory,PATH.basename(_file),_url,true,true,()=>doCallback(onload),()=>doCallback(onerror),false,false,()=>{try{FS_unlink(_file)}catch(e){}FS_mkdirTree(destinationDirectory)})};Module["_emscripten_async_wget"]=_emscripten_async_wget;_emscripten_async_wget.sig="vpppp";var _emscripten_async_wget_data=function(url,userdata,onload,onerror){url>>>=0;userdata>>>=0;onload>>>=0;onerror>>>=0;asyncLoad(UTF8ToString(url),byteArray=>{callUserCallback(()=>{var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer>>>0);getWasmTableEntry(onload)(userdata,buffer,byteArray.length);_free(buffer)})},()=>{if(onerror){callUserCallback(()=>{getWasmTableEntry(onerror)(userdata)})}},true)};Module["_emscripten_async_wget_data"]=_emscripten_async_wget_data;_emscripten_async_wget_data.sig="vpppp";var _emscripten_async_wget2=function(url,file,request,param,userdata,onload,onerror,onprogress){url>>>=0;file>>>=0;request>>>=0;param>>>=0;userdata>>>=0;onload>>>=0;onerror>>>=0;onprogress>>>=0;var _url=UTF8ToString(url);var _file=UTF8ToString(file);_file=PATH_FS.resolve(_file);var _request=UTF8ToString(request);var _param=UTF8ToString(param);var index=_file.lastIndexOf("/");var http=new XMLHttpRequest;http.open(_request,_url,true);http.responseType="arraybuffer";var handle=wget.getNextWgetRequestHandle();var destinationDirectory=PATH.dirname(_file);http.onload=e=>{if(http.status>=200&&http.status<300){try{FS.unlink(_file)}catch(e){}FS.mkdirTree(destinationDirectory);FS.createDataFile(_file.substr(0,index),_file.substr(index+1),new Uint8Array(http.response),true,true,false);if(onload){var sp=stackSave();getWasmTableEntry(onload)(handle,userdata,stringToUTF8OnStack(_file));stackRestore(sp)}}else{if(onerror)getWasmTableEntry(onerror)(handle,userdata,http.status)}delete wget.wgetRequests[handle]};http.onerror=e=>{if(onerror)getWasmTableEntry(onerror)(handle,userdata,http.status);delete wget.wgetRequests[handle]};http.onprogress=e=>{if(e.lengthComputable||e.lengthComputable===undefined&&e.total!=0){var percentComplete=e.loaded/e.total*100;if(onprogress)getWasmTableEntry(onprogress)(handle,userdata,percentComplete)}};http.onabort=e=>{delete wget.wgetRequests[handle]};if(_request=="POST"){http.setRequestHeader("Content-type","application/x-www-form-urlencoded");http.send(_param)}else{http.send(null)}wget.wgetRequests[handle]=http;return handle};Module["_emscripten_async_wget2"]=_emscripten_async_wget2;_emscripten_async_wget2.sig="ipppppppp";function _emscripten_async_wget2_data(url,request,param,userdata,free,onload,onerror,onprogress){url>>>=0;request>>>=0;param>>>=0;userdata>>>=0;onload>>>=0;onerror>>>=0;onprogress>>>=0;var _url=UTF8ToString(url);var _request=UTF8ToString(request);var _param=UTF8ToString(param);var http=new XMLHttpRequest;http.open(_request,_url,true);http.responseType="arraybuffer";var handle=wget.getNextWgetRequestHandle();function onerrorjs(){if(onerror){var sp=stackSave();var statusText=0;if(http.statusText){statusText=stringToUTF8OnStack(http.statusText)}getWasmTableEntry(onerror)(handle,userdata,http.status,statusText);stackRestore(sp)}}http.onload=e=>{if(http.status>=200&&http.status<300||http.status===0&&_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer>>>0);if(onload)getWasmTableEntry(onload)(handle,userdata,buffer,byteArray.length);if(free)_free(buffer)}else{onerrorjs()}delete wget.wgetRequests[handle]};http.onerror=e=>{onerrorjs();delete wget.wgetRequests[handle]};http.onprogress=e=>{if(onprogress)getWasmTableEntry(onprogress)(handle,userdata,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0)};http.onabort=e=>{delete wget.wgetRequests[handle]};if(_request=="POST"){http.setRequestHeader("Content-type","application/x-www-form-urlencoded");http.send(_param)}else{http.send(null)}wget.wgetRequests[handle]=http;return handle}Module["_emscripten_async_wget2_data"]=_emscripten_async_wget2_data;_emscripten_async_wget2_data.sig="ippppippp";var _emscripten_async_wget2_abort=handle=>{var http=wget.wgetRequests[handle];http?.abort()};Module["_emscripten_async_wget2_abort"]=_emscripten_async_wget2_abort;_emscripten_async_wget2_abort.sig="vi";function __dlsym_catchup_js(handle,symbolIndex){handle>>>=0;var lib=LDSO.loadedLibsByHandle[handle];var symDict=lib.exports;var symName=Object.keys(symDict)[symbolIndex];var sym=symDict[symName];var result=addFunction(sym,sym.sig);return result}Module["__dlsym_catchup_js"]=__dlsym_catchup_js;__dlsym_catchup_js.sig="ppi";var _setNetworkCallback=(event,userData,callback)=>{function _callback(data){try{if(event==="error"){var sp=stackSave();var msg=stringToUTF8OnStack(data[2]);getWasmTableEntry(callback)(data[0],data[1],msg,userData);stackRestore(sp)}else{getWasmTableEntry(callback)(data,userData)}}catch(e){if(!(e instanceof ExitStatus)){if(e&&typeof e=="object"&&e.stack)err("exception thrown: "+[e,e.stack]);throw e}}}Module["websocket"]["on"](event,callback?_callback:null)};Module["_setNetworkCallback"]=_setNetworkCallback;function _emscripten_set_socket_error_callback(userData,callback){userData>>>=0;callback>>>=0;_setNetworkCallback("error",userData,callback)}Module["_emscripten_set_socket_error_callback"]=_emscripten_set_socket_error_callback;_emscripten_set_socket_error_callback.sig="vpp";function _emscripten_set_socket_open_callback(userData,callback){userData>>>=0;callback>>>=0;_setNetworkCallback("open",userData,callback)}Module["_emscripten_set_socket_open_callback"]=_emscripten_set_socket_open_callback;_emscripten_set_socket_open_callback.sig="vpp";function _emscripten_set_socket_listen_callback(userData,callback){userData>>>=0;callback>>>=0;_setNetworkCallback("listen",userData,callback)}Module["_emscripten_set_socket_listen_callback"]=_emscripten_set_socket_listen_callback;_emscripten_set_socket_listen_callback.sig="vpp";function _emscripten_set_socket_connection_callback(userData,callback){userData>>>=0;callback>>>=0;_setNetworkCallback("connection",userData,callback)}Module["_emscripten_set_socket_connection_callback"]=_emscripten_set_socket_connection_callback;_emscripten_set_socket_connection_callback.sig="vpp";function _emscripten_set_socket_message_callback(userData,callback){userData>>>=0;callback>>>=0;_setNetworkCallback("message",userData,callback)}Module["_emscripten_set_socket_message_callback"]=_emscripten_set_socket_message_callback;_emscripten_set_socket_message_callback.sig="vpp";function _emscripten_set_socket_close_callback(userData,callback){userData>>>=0;callback>>>=0;_setNetworkCallback("close",userData,callback)}Module["_emscripten_set_socket_close_callback"]=_emscripten_set_socket_close_callback;_emscripten_set_socket_close_callback.sig="vpp";var ALLOC_NORMAL=0;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;var ALLOC_STACK=1;Module["ALLOC_STACK"]=ALLOC_STACK;var allocate=(slab,allocator)=>{var ret;if(allocator==ALLOC_STACK){ret=stackAlloc(slab.length)}else{ret=_malloc(slab.length)}if(!slab.subarray&&!slab.slice){slab=new Uint8Array(slab)}HEAPU8.set(slab,ret>>>0);return ret};Module["allocate"]=allocate;var writeStringToMemory=(string,buffer,dontAddNull)=>{warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end>>>0]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end>>>0]=lastChar};Module["writeStringToMemory"]=writeStringToMemory;var writeAsciiToMemory=(str,buffer,dontAddNull)=>{for(var i=0;i>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>>0]=0};Module["writeAsciiToMemory"]=writeAsciiToMemory;var allocateUTF8=stringToNewUTF8;Module["allocateUTF8"]=allocateUTF8;var allocateUTF8OnStack=stringToUTF8OnStack;Module["allocateUTF8OnStack"]=allocateUTF8OnStack;var setErrNo=value=>{HEAP32[___errno_location()>>>2>>>0]=value;return value};Module["setErrNo"]=setErrNo;var demangle=func=>{demangle.recursionGuard=(demangle.recursionGuard|0)+1;if(demangle.recursionGuard>1)return func;return withStackSave(()=>{try{var s=func;if(s.startsWith("__Z"))s=s.substr(1);var buf=stringToUTF8OnStack(s);var status=stackAlloc(4);var ret=___cxa_demangle(buf,0,0,status);if(HEAP32[status>>>2>>>0]===0&&ret){return UTF8ToString(ret)}}catch(e){}finally{_free(ret);if(demangle.recursionGuard<2)--demangle.recursionGuard}return func})};Module["demangle"]=demangle;function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return js}Module["stackTrace"]=stackTrace;var _emscripten_is_main_browser_thread=()=>!ENVIRONMENT_IS_WORKER;Module["_emscripten_is_main_browser_thread"]=_emscripten_is_main_browser_thread;var webSockets=new HandleAllocator;Module["webSockets"]=webSockets;var WS={socketEvent:null,getSocket(socketId){if(!webSockets.has(socketId)){return 0}return webSockets.get(socketId)},getSocketEvent(socketId){this.socketEvent||=_malloc(524);HEAPU32[this.socketEvent>>>2>>>0]=socketId;return this.socketEvent}};Module["WS"]=WS;function _emscripten_websocket_get_ready_state(socketId,readyState){readyState>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}HEAP16[readyState>>>1>>>0]=socket.readyState;return 0}Module["_emscripten_websocket_get_ready_state"]=_emscripten_websocket_get_ready_state;_emscripten_websocket_get_ready_state.sig="iip";function _emscripten_websocket_get_buffered_amount(socketId,bufferedAmount){bufferedAmount>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}HEAPU32[bufferedAmount>>>2>>>0]=socket.bufferedAmount;return 0}Module["_emscripten_websocket_get_buffered_amount"]=_emscripten_websocket_get_buffered_amount;_emscripten_websocket_get_buffered_amount.sig="iip";function _emscripten_websocket_get_extensions(socketId,extensions,extensionsLength){extensions>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}if(!extensions)return-5;stringToUTF8(socket.extensions,extensions,extensionsLength);return 0}Module["_emscripten_websocket_get_extensions"]=_emscripten_websocket_get_extensions;_emscripten_websocket_get_extensions.sig="iipi";function _emscripten_websocket_get_extensions_length(socketId,extensionsLength){extensionsLength>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}if(!extensionsLength)return-5;HEAP32[extensionsLength>>>2>>>0]=lengthBytesUTF8(socket.extensions)+1;return 0}Module["_emscripten_websocket_get_extensions_length"]=_emscripten_websocket_get_extensions_length;_emscripten_websocket_get_extensions_length.sig="iip";function _emscripten_websocket_get_protocol(socketId,protocol,protocolLength){protocol>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}if(!protocol)return-5;stringToUTF8(socket.protocol,protocol,protocolLength);return 0}Module["_emscripten_websocket_get_protocol"]=_emscripten_websocket_get_protocol;_emscripten_websocket_get_protocol.sig="iipi";function _emscripten_websocket_get_protocol_length(socketId,protocolLength){protocolLength>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}if(!protocolLength)return-5;HEAP32[protocolLength>>>2>>>0]=lengthBytesUTF8(socket.protocol)+1;return 0}Module["_emscripten_websocket_get_protocol_length"]=_emscripten_websocket_get_protocol_length;_emscripten_websocket_get_protocol_length.sig="iip";function _emscripten_websocket_get_url(socketId,url,urlLength){url>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}if(!url)return-5;stringToUTF8(socket.url,url,urlLength);return 0}Module["_emscripten_websocket_get_url"]=_emscripten_websocket_get_url;_emscripten_websocket_get_url.sig="iipi";function _emscripten_websocket_get_url_length(socketId,urlLength){urlLength>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}if(!urlLength)return-5;HEAP32[urlLength>>>2>>>0]=lengthBytesUTF8(socket.url)+1;return 0}Module["_emscripten_websocket_get_url_length"]=_emscripten_websocket_get_url_length;_emscripten_websocket_get_url_length.sig="iip";function _emscripten_websocket_set_onopen_callback_on_thread(socketId,userData,callbackFunc,thread){userData>>>=0;callbackFunc>>>=0;thread>>>=0;var eventPtr=WS.getSocketEvent(socketId);var socket=WS.getSocket(socketId);if(!socket){return-3}socket.onopen=function(e){getWasmTableEntry(callbackFunc)(0,eventPtr,userData)};return 0}Module["_emscripten_websocket_set_onopen_callback_on_thread"]=_emscripten_websocket_set_onopen_callback_on_thread;_emscripten_websocket_set_onopen_callback_on_thread.sig="iippp";function _emscripten_websocket_set_onerror_callback_on_thread(socketId,userData,callbackFunc,thread){userData>>>=0;callbackFunc>>>=0;thread>>>=0;var eventPtr=WS.getSocketEvent(socketId);var socket=WS.getSocket(socketId);if(!socket){return-3}socket.onerror=function(e){getWasmTableEntry(callbackFunc)(0,eventPtr,userData)};return 0}Module["_emscripten_websocket_set_onerror_callback_on_thread"]=_emscripten_websocket_set_onerror_callback_on_thread;_emscripten_websocket_set_onerror_callback_on_thread.sig="iippp";function _emscripten_websocket_set_onclose_callback_on_thread(socketId,userData,callbackFunc,thread){userData>>>=0;callbackFunc>>>=0;thread>>>=0;var eventPtr=WS.getSocketEvent(socketId);var socket=WS.getSocket(socketId);if(!socket){return-3}socket.onclose=function(e){HEAP32[eventPtr+4>>>2>>>0]=e.wasClean,HEAP16[eventPtr+4>>>1>>>0]=e.code,stringToUTF8(e.reason,eventPtr+10,512);getWasmTableEntry(callbackFunc)(0,eventPtr,userData)};return 0}Module["_emscripten_websocket_set_onclose_callback_on_thread"]=_emscripten_websocket_set_onclose_callback_on_thread;_emscripten_websocket_set_onclose_callback_on_thread.sig="iippp";function _emscripten_websocket_set_onmessage_callback_on_thread(socketId,userData,callbackFunc,thread){userData>>>=0;callbackFunc>>>=0;thread>>>=0;var eventPtr=WS.getSocketEvent(socketId);var socket=WS.getSocket(socketId);if(!socket){return-3}socket.onmessage=function(e){var isText=typeof e.data=="string";if(isText){var buf=stringToNewUTF8(e.data);var len=lengthBytesUTF8(e.data)+1}else{var len=e.data.byteLength;var buf=_malloc(len);HEAP8.set(new Uint8Array(e.data),buf>>>0)}HEAPU32[eventPtr+4>>>2>>>0]=buf,HEAP32[eventPtr+8>>>2>>>0]=len,HEAP32[eventPtr+12>>>2>>>0]=isText,getWasmTableEntry(callbackFunc)(0,eventPtr,userData);_free(buf)};return 0}Module["_emscripten_websocket_set_onmessage_callback_on_thread"]=_emscripten_websocket_set_onmessage_callback_on_thread;_emscripten_websocket_set_onmessage_callback_on_thread.sig="iippp";function _emscripten_websocket_new(createAttributes){createAttributes>>>=0;if(typeof WebSocket=="undefined"){return-1}if(!createAttributes){return-5}var url=UTF8ToString(HEAPU32[createAttributes>>>2>>>0]);var protocols=HEAPU32[createAttributes+4>>>2>>>0];var socket=protocols?new WebSocket(url,UTF8ToString(protocols).split(",")):new WebSocket(url);socket.binaryType="arraybuffer";var socketId=webSockets.allocate(socket);return socketId}Module["_emscripten_websocket_new"]=_emscripten_websocket_new;_emscripten_websocket_new.sig="ip";function _emscripten_websocket_send_utf8_text(socketId,textData){textData>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}var str=UTF8ToString(textData);socket.send(str);return 0}Module["_emscripten_websocket_send_utf8_text"]=_emscripten_websocket_send_utf8_text;_emscripten_websocket_send_utf8_text.sig="iip";function _emscripten_websocket_send_binary(socketId,binaryData,dataLength){binaryData>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}socket.send(HEAPU8.subarray(binaryData>>>0,binaryData+dataLength>>>0));return 0}Module["_emscripten_websocket_send_binary"]=_emscripten_websocket_send_binary;_emscripten_websocket_send_binary.sig="iipi";function _emscripten_websocket_close(socketId,code,reason){reason>>>=0;var socket=WS.getSocket(socketId);if(!socket){return-3}var reasonStr=reason?UTF8ToString(reason):undefined;if(reason)socket.close(code||undefined,UTF8ToString(reason));else if(code)socket.close(code);else socket.close();return 0}Module["_emscripten_websocket_close"]=_emscripten_websocket_close;_emscripten_websocket_close.sig="iiip";var _emscripten_websocket_delete=socketId=>{var socket=WS.getSocket(socketId);if(!socket){return-3}socket.onopen=socket.onerror=socket.onclose=socket.onmessage=null;webSockets.free(socketId);return 0};Module["_emscripten_websocket_delete"]=_emscripten_websocket_delete;_emscripten_websocket_delete.sig="ii";var _emscripten_websocket_is_supported=()=>typeof WebSocket!="undefined";Module["_emscripten_websocket_is_supported"]=_emscripten_websocket_is_supported;_emscripten_websocket_is_supported.sig="i";var _emscripten_websocket_deinitialize=()=>{for(var i in WS.sockets){var socket=WS.sockets[i];if(socket){socket.close();_emscripten_websocket_delete(i)}}WS.sockets=[]};Module["_emscripten_websocket_deinitialize"]=_emscripten_websocket_deinitialize;_emscripten_websocket_deinitialize.sig="v";function _emscripten_webgl_enable_ANGLE_instanced_arrays(ctx){ctx>>>=0;return webgl_enable_ANGLE_instanced_arrays(GL.contexts[ctx].GLctx)}Module["_emscripten_webgl_enable_ANGLE_instanced_arrays"]=_emscripten_webgl_enable_ANGLE_instanced_arrays;_emscripten_webgl_enable_ANGLE_instanced_arrays.sig="ip";function _emscripten_webgl_enable_OES_vertex_array_object(ctx){ctx>>>=0;return webgl_enable_OES_vertex_array_object(GL.contexts[ctx].GLctx)}Module["_emscripten_webgl_enable_OES_vertex_array_object"]=_emscripten_webgl_enable_OES_vertex_array_object;_emscripten_webgl_enable_OES_vertex_array_object.sig="ip";function _emscripten_webgl_enable_WEBGL_draw_buffers(ctx){ctx>>>=0;return webgl_enable_WEBGL_draw_buffers(GL.contexts[ctx].GLctx)}Module["_emscripten_webgl_enable_WEBGL_draw_buffers"]=_emscripten_webgl_enable_WEBGL_draw_buffers;_emscripten_webgl_enable_WEBGL_draw_buffers.sig="ip";function _emscripten_webgl_enable_WEBGL_multi_draw(ctx){ctx>>>=0;return webgl_enable_WEBGL_multi_draw(GL.contexts[ctx].GLctx)}Module["_emscripten_webgl_enable_WEBGL_multi_draw"]=_emscripten_webgl_enable_WEBGL_multi_draw;_emscripten_webgl_enable_WEBGL_multi_draw.sig="ip";function _glVertexPointer(size,type,stride,ptr){ptr>>>=0;throw"Legacy GL function (glVertexPointer) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."}Module["_glVertexPointer"]=_glVertexPointer;_glVertexPointer.sig="viiip";var _glMatrixMode=()=>{throw"Legacy GL function (glMatrixMode) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."};Module["_glMatrixMode"]=_glMatrixMode;_glMatrixMode.sig="vi";var _glBegin=()=>{throw"Legacy GL function (glBegin) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."};Module["_glBegin"]=_glBegin;_glBegin.sig="vi";var _glLoadIdentity=()=>{throw"Legacy GL function (glLoadIdentity) called. If you want legacy GL emulation, you need to compile with -sLEGACY_GL_EMULATION to enable legacy GL emulation."};Module["_glLoadIdentity"]=_glLoadIdentity;_glLoadIdentity.sig="v";var _glVertexAttribDivisorNV=_glVertexAttribDivisor;Module["_glVertexAttribDivisorNV"]=_glVertexAttribDivisorNV;var _glDrawArraysInstancedNV=_glDrawArraysInstanced;Module["_glDrawArraysInstancedNV"]=_glDrawArraysInstancedNV;var _glDrawElementsInstancedNV=_glDrawElementsInstanced;Module["_glDrawElementsInstancedNV"]=_glDrawElementsInstancedNV;var _glVertexAttribDivisorEXT=_glVertexAttribDivisor;Module["_glVertexAttribDivisorEXT"]=_glVertexAttribDivisorEXT;var _glDrawArraysInstancedEXT=_glDrawArraysInstanced;Module["_glDrawArraysInstancedEXT"]=_glDrawArraysInstancedEXT;var _glDrawElementsInstancedEXT=_glDrawElementsInstanced;Module["_glDrawElementsInstancedEXT"]=_glDrawElementsInstancedEXT;var _glVertexAttribDivisorARB=_glVertexAttribDivisor;Module["_glVertexAttribDivisorARB"]=_glVertexAttribDivisorARB;var _glDrawArraysInstancedARB=_glDrawArraysInstanced;Module["_glDrawArraysInstancedARB"]=_glDrawArraysInstancedARB;var _glDrawElementsInstancedARB=_glDrawElementsInstanced;Module["_glDrawElementsInstancedARB"]=_glDrawElementsInstancedARB;var _glDrawBuffersEXT=_glDrawBuffers;Module["_glDrawBuffersEXT"]=_glDrawBuffersEXT;function _glMultiDrawArraysWEBGL(mode,firsts,counts,drawcount){firsts>>>=0;counts>>>=0;GLctx.multiDrawWebgl["multiDrawArraysWEBGL"](mode,HEAP32,firsts>>>2,HEAP32,counts>>>2,drawcount)}Module["_glMultiDrawArraysWEBGL"]=_glMultiDrawArraysWEBGL;_glMultiDrawArraysWEBGL.sig="vippi";var _glMultiDrawArrays=_glMultiDrawArraysWEBGL;Module["_glMultiDrawArrays"]=_glMultiDrawArrays;_glMultiDrawArrays.sig="vippi";var _glMultiDrawArraysANGLE=_glMultiDrawArraysWEBGL;Module["_glMultiDrawArraysANGLE"]=_glMultiDrawArraysANGLE;function _glMultiDrawArraysInstancedWEBGL(mode,firsts,counts,instanceCounts,drawcount){firsts>>>=0;counts>>>=0;instanceCounts>>>=0;GLctx.multiDrawWebgl["multiDrawArraysInstancedWEBGL"](mode,HEAP32,firsts>>>2,HEAP32,counts>>>2,HEAP32,instanceCounts>>>2,drawcount)}Module["_glMultiDrawArraysInstancedWEBGL"]=_glMultiDrawArraysInstancedWEBGL;_glMultiDrawArraysInstancedWEBGL.sig="vipppi";var _glMultiDrawArraysInstancedANGLE=_glMultiDrawArraysInstancedWEBGL;Module["_glMultiDrawArraysInstancedANGLE"]=_glMultiDrawArraysInstancedANGLE;function _glMultiDrawElementsWEBGL(mode,counts,type,offsets,drawcount){counts>>>=0;offsets>>>=0;GLctx.multiDrawWebgl["multiDrawElementsWEBGL"](mode,HEAP32,counts>>>2,type,HEAP32,offsets>>>2,drawcount)}Module["_glMultiDrawElementsWEBGL"]=_glMultiDrawElementsWEBGL;_glMultiDrawElementsWEBGL.sig="vipipi";var _glMultiDrawElements=_glMultiDrawElementsWEBGL;Module["_glMultiDrawElements"]=_glMultiDrawElements;_glMultiDrawElements.sig="vipipi";var _glMultiDrawElementsANGLE=_glMultiDrawElementsWEBGL;Module["_glMultiDrawElementsANGLE"]=_glMultiDrawElementsANGLE;function _glMultiDrawElementsInstancedWEBGL(mode,counts,type,offsets,instanceCounts,drawcount){counts>>>=0;offsets>>>=0;instanceCounts>>>=0;GLctx.multiDrawWebgl["multiDrawElementsInstancedWEBGL"](mode,HEAP32,counts>>>2,type,HEAP32,offsets>>>2,HEAP32,instanceCounts>>>2,drawcount)}Module["_glMultiDrawElementsInstancedWEBGL"]=_glMultiDrawElementsInstancedWEBGL;_glMultiDrawElementsInstancedWEBGL.sig="vipippi";var _glMultiDrawElementsInstancedANGLE=_glMultiDrawElementsInstancedWEBGL;Module["_glMultiDrawElementsInstancedANGLE"]=_glMultiDrawElementsInstancedANGLE;var _glClearDepth=x0=>GLctx.clearDepth(x0);Module["_glClearDepth"]=_glClearDepth;_glClearDepth.sig="vd";var _glDepthRange=(x0,x1)=>GLctx.depthRange(x0,x1);Module["_glDepthRange"]=_glDepthRange;_glDepthRange.sig="vdd";var _emscripten_glGenVertexArrays=_glGenVertexArrays;Module["_emscripten_glGenVertexArrays"]=_emscripten_glGenVertexArrays;_emscripten_glGenVertexArrays.sig="vip";var _emscripten_glDeleteVertexArrays=_glDeleteVertexArrays;Module["_emscripten_glDeleteVertexArrays"]=_emscripten_glDeleteVertexArrays;_emscripten_glDeleteVertexArrays.sig="vip";var _emscripten_glBindVertexArray=_glBindVertexArray;Module["_emscripten_glBindVertexArray"]=_emscripten_glBindVertexArray;_emscripten_glBindVertexArray.sig="vi";var _emscripten_glIsVertexArray=_glIsVertexArray;Module["_emscripten_glIsVertexArray"]=_emscripten_glIsVertexArray;_emscripten_glIsVertexArray.sig="ii";var _emscripten_glVertexPointer=_glVertexPointer;Module["_emscripten_glVertexPointer"]=_emscripten_glVertexPointer;_emscripten_glVertexPointer.sig="viiip";var _emscripten_glMatrixMode=_glMatrixMode;Module["_emscripten_glMatrixMode"]=_emscripten_glMatrixMode;_emscripten_glMatrixMode.sig="vi";var _emscripten_glBegin=_glBegin;Module["_emscripten_glBegin"]=_emscripten_glBegin;_emscripten_glBegin.sig="vi";var _emscripten_glLoadIdentity=_glLoadIdentity;Module["_emscripten_glLoadIdentity"]=_emscripten_glLoadIdentity;_emscripten_glLoadIdentity.sig="v";var _emscripten_glVertexAttribDivisor=_glVertexAttribDivisor;Module["_emscripten_glVertexAttribDivisor"]=_emscripten_glVertexAttribDivisor;_emscripten_glVertexAttribDivisor.sig="vii";var _emscripten_glDrawArraysInstanced=_glDrawArraysInstanced;Module["_emscripten_glDrawArraysInstanced"]=_emscripten_glDrawArraysInstanced;_emscripten_glDrawArraysInstanced.sig="viiii";var _emscripten_glDrawElementsInstanced=_glDrawElementsInstanced;Module["_emscripten_glDrawElementsInstanced"]=_emscripten_glDrawElementsInstanced;_emscripten_glDrawElementsInstanced.sig="viiipi";var _emscripten_glVertexAttribDivisorNV=_glVertexAttribDivisorNV;Module["_emscripten_glVertexAttribDivisorNV"]=_emscripten_glVertexAttribDivisorNV;var _emscripten_glDrawArraysInstancedNV=_glDrawArraysInstancedNV;Module["_emscripten_glDrawArraysInstancedNV"]=_emscripten_glDrawArraysInstancedNV;var _emscripten_glDrawElementsInstancedNV=_glDrawElementsInstancedNV;Module["_emscripten_glDrawElementsInstancedNV"]=_emscripten_glDrawElementsInstancedNV;var _emscripten_glVertexAttribDivisorEXT=_glVertexAttribDivisorEXT;Module["_emscripten_glVertexAttribDivisorEXT"]=_emscripten_glVertexAttribDivisorEXT;var _emscripten_glDrawArraysInstancedEXT=_glDrawArraysInstancedEXT;Module["_emscripten_glDrawArraysInstancedEXT"]=_emscripten_glDrawArraysInstancedEXT;var _emscripten_glDrawElementsInstancedEXT=_glDrawElementsInstancedEXT;Module["_emscripten_glDrawElementsInstancedEXT"]=_emscripten_glDrawElementsInstancedEXT;var _emscripten_glVertexAttribDivisorARB=_glVertexAttribDivisorARB;Module["_emscripten_glVertexAttribDivisorARB"]=_emscripten_glVertexAttribDivisorARB;var _emscripten_glDrawArraysInstancedARB=_glDrawArraysInstancedARB;Module["_emscripten_glDrawArraysInstancedARB"]=_emscripten_glDrawArraysInstancedARB;var _emscripten_glDrawElementsInstancedARB=_glDrawElementsInstancedARB;Module["_emscripten_glDrawElementsInstancedARB"]=_emscripten_glDrawElementsInstancedARB;var _emscripten_glDrawBuffers=_glDrawBuffers;Module["_emscripten_glDrawBuffers"]=_emscripten_glDrawBuffers;_emscripten_glDrawBuffers.sig="vip";var _emscripten_glDrawBuffersEXT=_glDrawBuffersEXT;Module["_emscripten_glDrawBuffersEXT"]=_emscripten_glDrawBuffersEXT;var _emscripten_glMultiDrawArrays=_glMultiDrawArrays;Module["_emscripten_glMultiDrawArrays"]=_emscripten_glMultiDrawArrays;_emscripten_glMultiDrawArrays.sig="vippi";var _emscripten_glMultiDrawArraysANGLE=_glMultiDrawArraysANGLE;Module["_emscripten_glMultiDrawArraysANGLE"]=_emscripten_glMultiDrawArraysANGLE;var _emscripten_glMultiDrawArraysWEBGL=_glMultiDrawArraysWEBGL;Module["_emscripten_glMultiDrawArraysWEBGL"]=_emscripten_glMultiDrawArraysWEBGL;var _emscripten_glMultiDrawArraysInstancedANGLE=_glMultiDrawArraysInstancedANGLE;Module["_emscripten_glMultiDrawArraysInstancedANGLE"]=_emscripten_glMultiDrawArraysInstancedANGLE;var _emscripten_glMultiDrawArraysInstancedWEBGL=_glMultiDrawArraysInstancedWEBGL;Module["_emscripten_glMultiDrawArraysInstancedWEBGL"]=_emscripten_glMultiDrawArraysInstancedWEBGL;var _emscripten_glMultiDrawElements=_glMultiDrawElements;Module["_emscripten_glMultiDrawElements"]=_emscripten_glMultiDrawElements;_emscripten_glMultiDrawElements.sig="vipipi";var _emscripten_glMultiDrawElementsANGLE=_glMultiDrawElementsANGLE;Module["_emscripten_glMultiDrawElementsANGLE"]=_emscripten_glMultiDrawElementsANGLE;var _emscripten_glMultiDrawElementsWEBGL=_glMultiDrawElementsWEBGL;Module["_emscripten_glMultiDrawElementsWEBGL"]=_emscripten_glMultiDrawElementsWEBGL;var _emscripten_glMultiDrawElementsInstancedANGLE=_glMultiDrawElementsInstancedANGLE;Module["_emscripten_glMultiDrawElementsInstancedANGLE"]=_emscripten_glMultiDrawElementsInstancedANGLE;var _emscripten_glMultiDrawElementsInstancedWEBGL=_glMultiDrawElementsInstancedWEBGL;Module["_emscripten_glMultiDrawElementsInstancedWEBGL"]=_emscripten_glMultiDrawElementsInstancedWEBGL;var _emscripten_glClearDepth=_glClearDepth;Module["_emscripten_glClearDepth"]=_emscripten_glClearDepth;_emscripten_glClearDepth.sig="vd";var _emscripten_glDepthRange=_glDepthRange;Module["_emscripten_glDepthRange"]=_emscripten_glDepthRange;_emscripten_glDepthRange.sig="vdd";var writeGLArray=(arr,dst,dstLength,heapType)=>{var len=arr.length;var writeLength=dstLength>>2;for(var i=0;i>>0]=arr[i]}return len};Module["writeGLArray"]=writeGLArray;var webglPowerPreferences=["default","low-power","high-performance"];Module["webglPowerPreferences"]=webglPowerPreferences;function _emscripten_webgl_do_create_context(target,attributes){target>>>=0;attributes>>>=0;var a=attributes>>>2;var powerPreference=HEAP32[a+(24>>2)>>>0];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)>>>0],"depth":!!HEAP32[a+(4>>2)>>>0],"stencil":!!HEAP32[a+(8>>2)>>>0],"antialias":!!HEAP32[a+(12>>2)>>>0],"premultipliedAlpha":!!HEAP32[a+(16>>2)>>>0],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)>>>0],"powerPreference":webglPowerPreferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)>>>0],majorVersion:HEAP32[a+(32>>2)>>>0],minorVersion:HEAP32[a+(36>>2)>>>0],enableExtensionsByDefault:HEAP32[a+(40>>2)>>>0],explicitSwapControl:HEAP32[a+(44>>2)>>>0],proxyContextToMainThread:HEAP32[a+(48>>2)>>>0],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)>>>0]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}Module["_emscripten_webgl_do_create_context"]=_emscripten_webgl_do_create_context;_emscripten_webgl_do_create_context.sig="ppp";var _emscripten_webgl_create_context=_emscripten_webgl_do_create_context;Module["_emscripten_webgl_create_context"]=_emscripten_webgl_create_context;_emscripten_webgl_create_context.sig="ppp";function _emscripten_webgl_do_get_current_context(){return GL.currentContext?GL.currentContext.handle:0}Module["_emscripten_webgl_do_get_current_context"]=_emscripten_webgl_do_get_current_context;_emscripten_webgl_do_get_current_context.sig="p";var _emscripten_webgl_get_current_context=_emscripten_webgl_do_get_current_context;Module["_emscripten_webgl_get_current_context"]=_emscripten_webgl_get_current_context;_emscripten_webgl_get_current_context.sig="p";var _emscripten_webgl_do_commit_frame=()=>{if(!GL.currentContext||!GL.currentContext.GLctx){return-3}if(!GL.currentContext.attributes.explicitSwapControl){return-3}return 0};Module["_emscripten_webgl_do_commit_frame"]=_emscripten_webgl_do_commit_frame;_emscripten_webgl_do_commit_frame.sig="i";var _emscripten_webgl_commit_frame=_emscripten_webgl_do_commit_frame;Module["_emscripten_webgl_commit_frame"]=_emscripten_webgl_commit_frame;_emscripten_webgl_commit_frame.sig="i";function _emscripten_webgl_make_context_current(contextHandle){contextHandle>>>=0;var success=GL.makeContextCurrent(contextHandle);return success?0:-5}Module["_emscripten_webgl_make_context_current"]=_emscripten_webgl_make_context_current;_emscripten_webgl_make_context_current.sig="ip";function _emscripten_webgl_get_drawing_buffer_size(contextHandle,width,height){contextHandle>>>=0;width>>>=0;height>>>=0;var GLContext=GL.getContext(contextHandle);if(!GLContext||!GLContext.GLctx||!width||!height){return-5}HEAP32[width>>>2>>>0]=GLContext.GLctx.drawingBufferWidth;HEAP32[height>>>2>>>0]=GLContext.GLctx.drawingBufferHeight;return 0}Module["_emscripten_webgl_get_drawing_buffer_size"]=_emscripten_webgl_get_drawing_buffer_size;_emscripten_webgl_get_drawing_buffer_size.sig="ippp";function _emscripten_webgl_get_context_attributes(c,a){c>>>=0;a>>>=0;if(!a)return-5;c=GL.contexts[c];if(!c)return-3;var t=c.GLctx;if(!t)return-3;t=t.getContextAttributes();HEAP32[a>>>2>>>0]=t.alpha;HEAP32[a+4>>>2>>>0]=t.depth;HEAP32[a+8>>>2>>>0]=t.stencil;HEAP32[a+12>>>2>>>0]=t.antialias;HEAP32[a+16>>>2>>>0]=t.premultipliedAlpha;HEAP32[a+20>>>2>>>0]=t.preserveDrawingBuffer;var power=t["powerPreference"]&&webglPowerPreferences.indexOf(t["powerPreference"]);HEAP32[a+24>>>2>>>0]=power;HEAP32[a+28>>>2>>>0]=t.failIfMajorPerformanceCaveat;HEAP32[a+32>>>2>>>0]=c.version;HEAP32[a+36>>>2>>>0]=0;HEAP32[a+40>>>2>>>0]=c.attributes.enableExtensionsByDefault;return 0}Module["_emscripten_webgl_get_context_attributes"]=_emscripten_webgl_get_context_attributes;_emscripten_webgl_get_context_attributes.sig="ipp";function _emscripten_webgl_destroy_context(contextHandle){contextHandle>>>=0;if(GL.currentContext==contextHandle)GL.currentContext=0;GL.deleteContext(contextHandle)}Module["_emscripten_webgl_destroy_context"]=_emscripten_webgl_destroy_context;_emscripten_webgl_destroy_context.sig="ip";function _emscripten_webgl_enable_extension(contextHandle,extension){contextHandle>>>=0;extension>>>=0;var context=GL.getContext(contextHandle);var extString=UTF8ToString(extension);if(extString.startsWith("GL_"))extString=extString.substr(3);if(extString=="ANGLE_instanced_arrays")webgl_enable_ANGLE_instanced_arrays(GLctx);if(extString=="OES_vertex_array_object")webgl_enable_OES_vertex_array_object(GLctx);if(extString=="WEBGL_draw_buffers")webgl_enable_WEBGL_draw_buffers(GLctx);if(extString=="WEBGL_multi_draw")webgl_enable_WEBGL_multi_draw(GLctx);var ext=context.GLctx.getExtension(extString);return!!ext}Module["_emscripten_webgl_enable_extension"]=_emscripten_webgl_enable_extension;_emscripten_webgl_enable_extension.sig="ipp";var _emscripten_supports_offscreencanvas=()=>0;Module["_emscripten_supports_offscreencanvas"]=_emscripten_supports_offscreencanvas;_emscripten_supports_offscreencanvas.sig="i";var registerWebGlEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var webGlEventHandlerFunc=(e=event)=>{if(getWasmTableEntry(callbackfunc)(eventTypeId,0,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:webGlEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)};Module["registerWebGlEventCallback"]=registerWebGlEventCallback;function _emscripten_set_webglcontextlost_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;registerWebGlEventCallback(target,userData,useCapture,callbackfunc,31,"webglcontextlost",targetThread);return 0}Module["_emscripten_set_webglcontextlost_callback_on_thread"]=_emscripten_set_webglcontextlost_callback_on_thread;_emscripten_set_webglcontextlost_callback_on_thread.sig="ippipp";function _emscripten_set_webglcontextrestored_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target>>>=0;userData>>>=0;callbackfunc>>>=0;targetThread>>>=0;registerWebGlEventCallback(target,userData,useCapture,callbackfunc,32,"webglcontextrestored",targetThread);return 0}Module["_emscripten_set_webglcontextrestored_callback_on_thread"]=_emscripten_set_webglcontextrestored_callback_on_thread;_emscripten_set_webglcontextrestored_callback_on_thread.sig="ippipp";function _emscripten_is_webgl_context_lost(contextHandle){contextHandle>>>=0;return!GL.contexts[contextHandle]||GL.contexts[contextHandle].GLctx.isContextLost()}Module["_emscripten_is_webgl_context_lost"]=_emscripten_is_webgl_context_lost;_emscripten_is_webgl_context_lost.sig="ip";function _emscripten_webgl_get_supported_extensions(){return stringToNewUTF8(GLctx.getSupportedExtensions().join(" "))}Module["_emscripten_webgl_get_supported_extensions"]=_emscripten_webgl_get_supported_extensions;_emscripten_webgl_get_supported_extensions.sig="p";var _emscripten_webgl_get_program_parameter_d=(program,param)=>GLctx.getProgramParameter(GL.programs[program],param);Module["_emscripten_webgl_get_program_parameter_d"]=_emscripten_webgl_get_program_parameter_d;_emscripten_webgl_get_program_parameter_d.sig="dii";function _emscripten_webgl_get_program_info_log_utf8(program){return stringToNewUTF8(GLctx.getProgramInfoLog(GL.programs[program]))}Module["_emscripten_webgl_get_program_info_log_utf8"]=_emscripten_webgl_get_program_info_log_utf8;_emscripten_webgl_get_program_info_log_utf8.sig="pi";var _emscripten_webgl_get_shader_parameter_d=(shader,param)=>GLctx.getShaderParameter(GL.shaders[shader],param);Module["_emscripten_webgl_get_shader_parameter_d"]=_emscripten_webgl_get_shader_parameter_d;_emscripten_webgl_get_shader_parameter_d.sig="dii";function _emscripten_webgl_get_shader_info_log_utf8(shader){return stringToNewUTF8(GLctx.getShaderInfoLog(GL.shaders[shader]))}Module["_emscripten_webgl_get_shader_info_log_utf8"]=_emscripten_webgl_get_shader_info_log_utf8;_emscripten_webgl_get_shader_info_log_utf8.sig="pi";function _emscripten_webgl_get_shader_source_utf8(shader){return stringToNewUTF8(GLctx.getShaderSource(GL.shaders[shader]))}Module["_emscripten_webgl_get_shader_source_utf8"]=_emscripten_webgl_get_shader_source_utf8;_emscripten_webgl_get_shader_source_utf8.sig="pi";var _emscripten_webgl_get_vertex_attrib_d=(index,param)=>GLctx.getVertexAttrib(index,param);Module["_emscripten_webgl_get_vertex_attrib_d"]=_emscripten_webgl_get_vertex_attrib_d;_emscripten_webgl_get_vertex_attrib_d.sig="dii";var _emscripten_webgl_get_vertex_attrib_o=(index,param)=>{var obj=GLctx.getVertexAttrib(index,param);return obj?.name};Module["_emscripten_webgl_get_vertex_attrib_o"]=_emscripten_webgl_get_vertex_attrib_o;_emscripten_webgl_get_vertex_attrib_o.sig="iii";function _emscripten_webgl_get_vertex_attrib_v(index,param,dst,dstLength,dstType){dst>>>=0;return writeGLArray(GLctx.getVertexAttrib(index,param),dst,dstLength,dstType)}Module["_emscripten_webgl_get_vertex_attrib_v"]=_emscripten_webgl_get_vertex_attrib_v;_emscripten_webgl_get_vertex_attrib_v.sig="iiipii";var _emscripten_webgl_get_uniform_d=(program,location)=>GLctx.getUniform(GL.programs[program],webglGetUniformLocation(location));Module["_emscripten_webgl_get_uniform_d"]=_emscripten_webgl_get_uniform_d;_emscripten_webgl_get_uniform_d.sig="dii";function _emscripten_webgl_get_uniform_v(program,location,dst,dstLength,dstType){dst>>>=0;return writeGLArray(GLctx.getUniform(GL.programs[program],webglGetUniformLocation(location)),dst,dstLength,dstType)}Module["_emscripten_webgl_get_uniform_v"]=_emscripten_webgl_get_uniform_v;_emscripten_webgl_get_uniform_v.sig="iiipii";function _emscripten_webgl_get_parameter_v(param,dst,dstLength,dstType){dst>>>=0;return writeGLArray(GLctx.getParameter(param),dst,dstLength,dstType)}Module["_emscripten_webgl_get_parameter_v"]=_emscripten_webgl_get_parameter_v;_emscripten_webgl_get_parameter_v.sig="iipii";var _emscripten_webgl_get_parameter_d=param=>GLctx.getParameter(param);Module["_emscripten_webgl_get_parameter_d"]=_emscripten_webgl_get_parameter_d;_emscripten_webgl_get_parameter_d.sig="di";var _emscripten_webgl_get_parameter_o=param=>{var obj=GLctx.getParameter(param);return obj?.name};Module["_emscripten_webgl_get_parameter_o"]=_emscripten_webgl_get_parameter_o;_emscripten_webgl_get_parameter_o.sig="ii";function _emscripten_webgl_get_parameter_utf8(param){return stringToNewUTF8(GLctx.getParameter(param))}Module["_emscripten_webgl_get_parameter_utf8"]=_emscripten_webgl_get_parameter_utf8;_emscripten_webgl_get_parameter_utf8.sig="pi";function _emscripten_webgl_get_parameter_i64v(param,dst){dst>>>=0;return writeI53ToI64(dst,GLctx.getParameter(param))}Module["_emscripten_webgl_get_parameter_i64v"]=_emscripten_webgl_get_parameter_i64v;_emscripten_webgl_get_parameter_i64v.sig="vip";var EGL={errorCode:12288,defaultDisplayInitialized:false,currentContext:0,currentReadSurface:0,currentDrawSurface:0,contextAttributes:{alpha:false,depth:false,stencil:false,antialias:false},stringCache:{},setErrorCode(code){EGL.errorCode=code},chooseConfig(display,attribList,config,config_size,numConfigs){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(attribList){for(;;){var param=HEAP32[attribList>>>2>>>0];if(param==12321){var alphaSize=HEAP32[attribList+4>>>2>>>0];EGL.contextAttributes.alpha=alphaSize>0}else if(param==12325){var depthSize=HEAP32[attribList+4>>>2>>>0];EGL.contextAttributes.depth=depthSize>0}else if(param==12326){var stencilSize=HEAP32[attribList+4>>>2>>>0];EGL.contextAttributes.stencil=stencilSize>0}else if(param==12337){var samples=HEAP32[attribList+4>>>2>>>0];EGL.contextAttributes.antialias=samples>0}else if(param==12338){var samples=HEAP32[attribList+4>>>2>>>0];EGL.contextAttributes.antialias=samples==1}else if(param==12544){var requestedPriority=HEAP32[attribList+4>>>2>>>0];EGL.contextAttributes.lowLatency=requestedPriority!=12547}else if(param==12344){break}attribList+=8}}if((!config||!config_size)&&!numConfigs){EGL.setErrorCode(12300);return 0}if(numConfigs){HEAP32[numConfigs>>>2>>>0]=1}if(config&&config_size>0){HEAPU32[config>>>2>>>0]=62002}EGL.setErrorCode(12288);return 1}};Module["EGL"]=EGL;function _eglGetDisplay(nativeDisplayType){nativeDisplayType>>>=0;EGL.setErrorCode(12288);if(nativeDisplayType!=0&&nativeDisplayType!=1){return 0}return 62e3}Module["_eglGetDisplay"]=_eglGetDisplay;_eglGetDisplay.sig="pp";function _eglInitialize(display,majorVersion,minorVersion){display>>>=0;majorVersion>>>=0;minorVersion>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(majorVersion){HEAP32[majorVersion>>>2>>>0]=1}if(minorVersion){HEAP32[minorVersion>>>2>>>0]=4}EGL.defaultDisplayInitialized=true;EGL.setErrorCode(12288);return 1}Module["_eglInitialize"]=_eglInitialize;_eglInitialize.sig="ippp";function _eglTerminate(display){display>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}EGL.currentContext=0;EGL.currentReadSurface=0;EGL.currentDrawSurface=0;EGL.defaultDisplayInitialized=false;EGL.setErrorCode(12288);return 1}Module["_eglTerminate"]=_eglTerminate;_eglTerminate.sig="ip";function _eglGetConfigs(display,configs,config_size,numConfigs){display>>>=0;configs>>>=0;numConfigs>>>=0;return EGL.chooseConfig(display,0,configs,config_size,numConfigs)}Module["_eglGetConfigs"]=_eglGetConfigs;_eglGetConfigs.sig="ippip";function _eglChooseConfig(display,attrib_list,configs,config_size,numConfigs){display>>>=0;attrib_list>>>=0;configs>>>=0;numConfigs>>>=0;return EGL.chooseConfig(display,attrib_list,configs,config_size,numConfigs)}Module["_eglChooseConfig"]=_eglChooseConfig;_eglChooseConfig.sig="ipppip";function _eglGetConfigAttrib(display,config,attribute,value){display>>>=0;config>>>=0;value>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(config!=62002){EGL.setErrorCode(12293);return 0}if(!value){EGL.setErrorCode(12300);return 0}EGL.setErrorCode(12288);switch(attribute){case 12320:HEAP32[value>>>2>>>0]=EGL.contextAttributes.alpha?32:24;return 1;case 12321:HEAP32[value>>>2>>>0]=EGL.contextAttributes.alpha?8:0;return 1;case 12322:HEAP32[value>>>2>>>0]=8;return 1;case 12323:HEAP32[value>>>2>>>0]=8;return 1;case 12324:HEAP32[value>>>2>>>0]=8;return 1;case 12325:HEAP32[value>>>2>>>0]=EGL.contextAttributes.depth?24:0;return 1;case 12326:HEAP32[value>>>2>>>0]=EGL.contextAttributes.stencil?8:0;return 1;case 12327:HEAP32[value>>>2>>>0]=12344;return 1;case 12328:HEAP32[value>>>2>>>0]=62002;return 1;case 12329:HEAP32[value>>>2>>>0]=0;return 1;case 12330:HEAP32[value>>>2>>>0]=4096;return 1;case 12331:HEAP32[value>>>2>>>0]=16777216;return 1;case 12332:HEAP32[value>>>2>>>0]=4096;return 1;case 12333:HEAP32[value>>>2>>>0]=0;return 1;case 12334:HEAP32[value>>>2>>>0]=0;return 1;case 12335:HEAP32[value>>>2>>>0]=12344;return 1;case 12337:HEAP32[value>>>2>>>0]=EGL.contextAttributes.antialias?4:0;return 1;case 12338:HEAP32[value>>>2>>>0]=EGL.contextAttributes.antialias?1:0;return 1;case 12339:HEAP32[value>>>2>>>0]=4;return 1;case 12340:HEAP32[value>>>2>>>0]=12344;return 1;case 12341:case 12342:case 12343:HEAP32[value>>>2>>>0]=-1;return 1;case 12345:case 12346:HEAP32[value>>>2>>>0]=0;return 1;case 12347:HEAP32[value>>>2>>>0]=0;return 1;case 12348:HEAP32[value>>>2>>>0]=1;return 1;case 12349:case 12350:HEAP32[value>>>2>>>0]=0;return 1;case 12351:HEAP32[value>>>2>>>0]=12430;return 1;case 12352:HEAP32[value>>>2>>>0]=4;return 1;case 12354:HEAP32[value>>>2>>>0]=0;return 1;default:EGL.setErrorCode(12292);return 0}}Module["_eglGetConfigAttrib"]=_eglGetConfigAttrib;_eglGetConfigAttrib.sig="ippip";function _eglCreateWindowSurface(display,config,win,attrib_list){display>>>=0;config>>>=0;attrib_list>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(config!=62002){EGL.setErrorCode(12293);return 0}EGL.setErrorCode(12288);return 62006}Module["_eglCreateWindowSurface"]=_eglCreateWindowSurface;_eglCreateWindowSurface.sig="pppip";function _eglDestroySurface(display,surface){display>>>=0;surface>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(surface!=62006){EGL.setErrorCode(12301);return 1}if(EGL.currentReadSurface==surface){EGL.currentReadSurface=0}if(EGL.currentDrawSurface==surface){EGL.currentDrawSurface=0}EGL.setErrorCode(12288);return 1}Module["_eglDestroySurface"]=_eglDestroySurface;_eglDestroySurface.sig="ipp";function _eglCreateContext(display,config,hmm,contextAttribs){display>>>=0;config>>>=0;hmm>>>=0;contextAttribs>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}var glesContextVersion=1;for(;;){var param=HEAP32[contextAttribs>>>2>>>0];if(param==12440){glesContextVersion=HEAP32[contextAttribs+4>>>2>>>0]}else if(param==12344){break}else{EGL.setErrorCode(12292);return 0}contextAttribs+=8}if(glesContextVersion!=2){EGL.setErrorCode(12293);return 0}EGL.contextAttributes.majorVersion=glesContextVersion-1;EGL.contextAttributes.minorVersion=0;EGL.context=GL.createContext(Module["canvas"],EGL.contextAttributes);if(EGL.context!=0){EGL.setErrorCode(12288);GL.makeContextCurrent(EGL.context);Module.useWebGL=true;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});GL.makeContextCurrent(null);return 62004}else{EGL.setErrorCode(12297);return 0}}Module["_eglCreateContext"]=_eglCreateContext;_eglCreateContext.sig="ppppp";function _eglDestroyContext(display,context){display>>>=0;context>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=62004){EGL.setErrorCode(12294);return 0}GL.deleteContext(EGL.context);EGL.setErrorCode(12288);if(EGL.currentContext==context){EGL.currentContext=0}return 1}Module["_eglDestroyContext"]=_eglDestroyContext;_eglDestroyContext.sig="ipp";function _eglQuerySurface(display,surface,attribute,value){display>>>=0;surface>>>=0;value>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(surface!=62006){EGL.setErrorCode(12301);return 0}if(!value){EGL.setErrorCode(12300);return 0}EGL.setErrorCode(12288);switch(attribute){case 12328:HEAP32[value>>>2>>>0]=62002;return 1;case 12376:return 1;case 12375:HEAP32[value>>>2>>>0]=Module["canvas"].width;return 1;case 12374:HEAP32[value>>>2>>>0]=Module["canvas"].height;return 1;case 12432:HEAP32[value>>>2>>>0]=-1;return 1;case 12433:HEAP32[value>>>2>>>0]=-1;return 1;case 12434:HEAP32[value>>>2>>>0]=-1;return 1;case 12422:HEAP32[value>>>2>>>0]=12420;return 1;case 12441:HEAP32[value>>>2>>>0]=12442;return 1;case 12435:HEAP32[value>>>2>>>0]=12437;return 1;case 12416:case 12417:case 12418:case 12419:return 1;default:EGL.setErrorCode(12292);return 0}}Module["_eglQuerySurface"]=_eglQuerySurface;_eglQuerySurface.sig="ippip";function _eglQueryContext(display,context,attribute,value){display>>>=0;context>>>=0;value>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=62004){EGL.setErrorCode(12294);return 0}if(!value){EGL.setErrorCode(12300);return 0}EGL.setErrorCode(12288);switch(attribute){case 12328:HEAP32[value>>>2>>>0]=62002;return 1;case 12439:HEAP32[value>>>2>>>0]=12448;return 1;case 12440:HEAP32[value>>>2>>>0]=EGL.contextAttributes.majorVersion+1;return 1;case 12422:HEAP32[value>>>2>>>0]=12420;return 1;default:EGL.setErrorCode(12292);return 0}}Module["_eglQueryContext"]=_eglQueryContext;_eglQueryContext.sig="ippip";var _eglGetError=()=>EGL.errorCode;Module["_eglGetError"]=_eglGetError;_eglGetError.sig="i";function _eglQueryString(display,name){display>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}EGL.setErrorCode(12288);if(EGL.stringCache[name])return EGL.stringCache[name];var ret;switch(name){case 12371:ret=stringToNewUTF8("Emscripten");break;case 12372:ret=stringToNewUTF8("1.4 Emscripten EGL");break;case 12373:ret=stringToNewUTF8("");break;case 12429:ret=stringToNewUTF8("OpenGL_ES");break;default:EGL.setErrorCode(12300);return 0}EGL.stringCache[name]=ret;return ret}Module["_eglQueryString"]=_eglQueryString;_eglQueryString.sig="ppi";var _eglBindAPI=api=>{if(api==12448){EGL.setErrorCode(12288);return 1}EGL.setErrorCode(12300);return 0};Module["_eglBindAPI"]=_eglBindAPI;_eglBindAPI.sig="ii";var _eglQueryAPI=()=>{EGL.setErrorCode(12288);return 12448};Module["_eglQueryAPI"]=_eglQueryAPI;_eglQueryAPI.sig="i";var _eglWaitClient=()=>{EGL.setErrorCode(12288);return 1};Module["_eglWaitClient"]=_eglWaitClient;_eglWaitClient.sig="i";var _eglWaitNative=nativeEngineId=>{EGL.setErrorCode(12288);return 1};Module["_eglWaitNative"]=_eglWaitNative;_eglWaitNative.sig="ii";var _eglWaitGL=_eglWaitClient;Module["_eglWaitGL"]=_eglWaitGL;_eglWaitGL.sig="i";function _eglSwapInterval(display,interval){display>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(interval==0)_emscripten_set_main_loop_timing(0,0);else _emscripten_set_main_loop_timing(1,interval);EGL.setErrorCode(12288);return 1}Module["_eglSwapInterval"]=_eglSwapInterval;_eglSwapInterval.sig="ipi";function _eglMakeCurrent(display,draw,read,context){display>>>=0;draw>>>=0;read>>>=0;context>>>=0;if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=0&&context!=62004){EGL.setErrorCode(12294);return 0}if(read!=0&&read!=62006||draw!=0&&draw!=62006){EGL.setErrorCode(12301);return 0}GL.makeContextCurrent(context?EGL.context:null);EGL.currentContext=context;EGL.currentDrawSurface=draw;EGL.currentReadSurface=read;EGL.setErrorCode(12288);return 1}Module["_eglMakeCurrent"]=_eglMakeCurrent;_eglMakeCurrent.sig="ipppp";function _eglGetCurrentContext(){return EGL.currentContext}Module["_eglGetCurrentContext"]=_eglGetCurrentContext;_eglGetCurrentContext.sig="p";function _eglGetCurrentSurface(readdraw){if(readdraw==12378){return EGL.currentReadSurface}else if(readdraw==12377){return EGL.currentDrawSurface}else{EGL.setErrorCode(12300);return 0}}Module["_eglGetCurrentSurface"]=_eglGetCurrentSurface;_eglGetCurrentSurface.sig="pi";function _eglGetCurrentDisplay(){return EGL.currentContext?62e3:0}Module["_eglGetCurrentDisplay"]=_eglGetCurrentDisplay;_eglGetCurrentDisplay.sig="p";function _eglSwapBuffers(dpy,surface){dpy>>>=0;surface>>>=0;if(!EGL.defaultDisplayInitialized){EGL.setErrorCode(12289)}else if(!Module.ctx){EGL.setErrorCode(12290)}else if(Module.ctx.isContextLost()){EGL.setErrorCode(12302)}else{EGL.setErrorCode(12288);return 1}return 0}Module["_eglSwapBuffers"]=_eglSwapBuffers;_eglSwapBuffers.sig="ipp";var _eglReleaseThread=()=>{EGL.currentContext=0;EGL.currentReadSurface=0;EGL.currentDrawSurface=0;EGL.setErrorCode(12288);return 1};Module["_eglReleaseThread"]=_eglReleaseThread;_eglReleaseThread.sig="i";var _SDL_GetTicks=()=>Date.now()-SDL.startTime|0;Module["_SDL_GetTicks"]=_SDL_GetTicks;_SDL_GetTicks.sig="i";function _SDL_LockSurface(surf){surf>>>=0;var surfData=SDL.surfaces[surf];surfData.locked++;if(surfData.locked>1)return 0;if(!surfData.buffer){surfData.buffer=_malloc(surfData.width*surfData.height*4);HEAPU32[surf+20>>>2>>>0]=surfData.buffer}HEAPU32[surf+20>>>2>>>0]=surfData.buffer;if(surf==SDL.screen&&Module.screenIsReadOnly&&surfData.image)return 0;if(SDL.defaults.discardOnLock){if(!surfData.image){surfData.image=surfData.ctx.createImageData(surfData.width,surfData.height)}if(!SDL.defaults.opaqueFrontBuffer)return}else{surfData.image=surfData.ctx.getImageData(0,0,surfData.width,surfData.height)}if(surf==SDL.screen&&SDL.defaults.opaqueFrontBuffer){var data=surfData.image.data;var num=data.length;for(var i=0;i>>0)}}return 0}Module["_SDL_LockSurface"]=_SDL_LockSurface;_SDL_LockSurface.sig="ip";var SDL={defaults:{width:320,height:200,copyOnLock:true,discardOnLock:false,opaqueFrontBuffer:true},version:null,surfaces:{},canvasPool:[],events:[],fonts:[null],audios:[null],rwops:[null],music:{audio:null,volume:1},mixerFrequency:22050,mixerFormat:32784,mixerNumChannels:2,mixerChunkSize:1024,channelMinimumNumber:0,GL:false,glAttributes:{0:3,1:3,2:2,3:0,4:0,5:1,6:16,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0,15:1,16:0,17:0,18:0},keyboardState:null,keyboardMap:{},canRequestFullscreen:false,isRequestingFullscreen:false,textInput:false,unicode:false,ttfContext:null,audio:null,startTime:null,initFlags:0,buttonState:0,modState:0,DOMButtons:[0,0,0],DOMEventToSDLEvent:{},TOUCH_DEFAULT_ID:0,eventHandler:null,eventHandlerContext:null,eventHandlerTemp:0,keyCodes:{16:1249,17:1248,18:1250,20:1081,33:1099,34:1102,35:1101,36:1098,37:1104,38:1106,39:1103,40:1105,44:316,45:1097,46:127,91:1251,93:1125,96:1122,97:1113,98:1114,99:1115,100:1116,101:1117,102:1118,103:1119,104:1120,105:1121,106:1109,107:1111,109:1110,110:1123,111:1108,112:1082,113:1083,114:1084,115:1085,116:1086,117:1087,118:1088,119:1089,120:1090,121:1091,122:1092,123:1093,124:1128,125:1129,126:1130,127:1131,128:1132,129:1133,130:1134,131:1135,132:1136,133:1137,134:1138,135:1139,144:1107,160:94,161:33,162:34,163:35,164:36,165:37,166:38,167:95,168:40,169:41,170:42,171:43,172:124,173:45,174:123,175:125,176:126,181:127,182:129,183:128,188:44,190:46,191:47,192:96,219:91,220:92,221:93,222:39,224:1251},scanCodes:{8:42,9:43,13:40,27:41,32:44,35:204,39:53,44:54,46:55,47:56,48:39,49:30,50:31,51:32,52:33,53:34,54:35,55:36,56:37,57:38,58:203,59:51,61:46,91:47,92:49,93:48,96:52,97:4,98:5,99:6,100:7,101:8,102:9,103:10,104:11,105:12,106:13,107:14,108:15,109:16,110:17,111:18,112:19,113:20,114:21,115:22,116:23,117:24,118:25,119:26,120:27,121:28,122:29,127:76,305:224,308:226,316:70},loadRect(rect){return{x:HEAP32[rect+0>>>2>>>0],y:HEAP32[rect+4>>>2>>>0],w:HEAP32[rect+8>>>2>>>0],h:HEAP32[rect+12>>>2>>>0]}},updateRect(rect,r){HEAP32[rect>>>2>>>0]=r.x;HEAP32[rect+4>>>2>>>0]=r.y;HEAP32[rect+8>>>2>>>0]=r.w;HEAP32[rect+12>>>2>>>0]=r.h},intersectionOfRects(first,second){var leftX=Math.max(first.x,second.x);var leftY=Math.max(first.y,second.y);var rightX=Math.min(first.x+first.w,second.x+second.w);var rightY=Math.min(first.y+first.h,second.y+second.h);return{x:leftX,y:leftY,w:Math.max(leftX,rightX)-leftX,h:Math.max(leftY,rightY)-leftY}},checkPixelFormat(fmt){},loadColorToCSSRGB(color){var rgba=HEAP32[color>>>2>>>0];return"rgb("+(rgba&255)+","+(rgba>>8&255)+","+(rgba>>16&255)+")"},loadColorToCSSRGBA(color){var rgba=HEAP32[color>>>2>>>0];return"rgba("+(rgba&255)+","+(rgba>>8&255)+","+(rgba>>16&255)+","+(rgba>>24&255)/255+")"},translateColorToCSSRGBA:rgba=>"rgba("+(rgba&255)+","+(rgba>>8&255)+","+(rgba>>16&255)+","+(rgba>>>24)/255+")",translateRGBAToCSSRGBA:(r,g,b,a)=>"rgba("+(r&255)+","+(g&255)+","+(b&255)+","+(a&255)/255+")",translateRGBAToColor:(r,g,b,a)=>r|g<<8|b<<16|a<<24,makeSurface(width,height,flags,usePageCanvas,source,rmask,gmask,bmask,amask){var is_SDL_HWSURFACE=flags&1;var is_SDL_HWPALETTE=flags&2097152;var is_SDL_OPENGL=flags&67108864;var surf=_malloc(60);var pixelFormat=_malloc(44);var bpp=is_SDL_HWPALETTE?1:4;var buffer=0;if(!is_SDL_HWSURFACE&&!is_SDL_OPENGL){buffer=_malloc(width*height*4)}HEAP32[surf>>>2>>>0]=flags;HEAPU32[surf+4>>>2>>>0]=pixelFormat;HEAP32[surf+8>>>2>>>0]=width;HEAP32[surf+12>>>2>>>0]=height;HEAP32[surf+16>>>2>>>0]=width*bpp;HEAPU32[surf+20>>>2>>>0]=buffer;HEAP32[surf+36>>>2>>>0]=0;HEAP32[surf+40>>>2>>>0]=0;HEAP32[surf+44>>>2>>>0]=Module["canvas"].width;HEAP32[surf+48>>>2>>>0]=Module["canvas"].height;HEAP32[surf+56>>>2>>>0]=1;HEAP32[pixelFormat>>>2>>>0]=-2042224636;HEAP32[pixelFormat+4>>>2>>>0]=0;HEAP8[pixelFormat+8>>>0]=bpp*8;HEAP8[pixelFormat+9>>>0]=bpp;HEAP32[pixelFormat+12>>>2>>>0]=rmask||255;HEAP32[pixelFormat+16>>>2>>>0]=gmask||65280;HEAP32[pixelFormat+20>>>2>>>0]=bmask||16711680;HEAP32[pixelFormat+24>>>2>>>0]=amask||4278190080;SDL.GL=SDL.GL||is_SDL_OPENGL;var canvas;if(!usePageCanvas){if(SDL.canvasPool.length>0){canvas=SDL.canvasPool.pop()}else{canvas=document.createElement("canvas")}canvas.width=width;canvas.height=height}else{canvas=Module["canvas"]}var webGLContextAttributes={antialias:SDL.glAttributes[13]!=0&&SDL.glAttributes[14]>1,depth:SDL.glAttributes[6]>0,stencil:SDL.glAttributes[7]>0,alpha:SDL.glAttributes[3]>0};var ctx=Browser.createContext(canvas,is_SDL_OPENGL,usePageCanvas,webGLContextAttributes);SDL.surfaces[surf]={width:width,height:height,canvas:canvas,ctx:ctx,surf:surf,buffer:buffer,pixelFormat:pixelFormat,alpha:255,flags:flags,locked:0,usePageCanvas:usePageCanvas,source:source,isFlagSet:flag=>flags&flag};return surf},copyIndexedColorData(surfData,rX,rY,rW,rH){if(!surfData.colors){return}var fullWidth=Module["canvas"].width;var fullHeight=Module["canvas"].height;var startX=rX||0;var startY=rY||0;var endX=(rW||fullWidth-startX)+startX;var endY=(rH||fullHeight-startY)+startY;var buffer=surfData.buffer;if(!surfData.image.data32){surfData.image.data32=new Uint32Array(surfData.image.data.buffer)}var data32=surfData.image.data32;var colors32=surfData.colors32;for(var y=startY;y>>0]]}}},freeSurface(surf){var refcountPointer=surf+56;var refcount=HEAP32[refcountPointer>>>2>>>0];if(refcount>1){HEAP32[refcountPointer>>>2>>>0]=refcount-1;return}var info=SDL.surfaces[surf];if(!info.usePageCanvas&&info.canvas)SDL.canvasPool.push(info.canvas);if(info.buffer)_free(info.buffer);_free(info.pixelFormat);_free(surf);SDL.surfaces[surf]=null;if(surf===SDL.screen){SDL.screen=null}},blitSurface(src,srcrect,dst,dstrect,scale){var srcData=SDL.surfaces[src];var dstData=SDL.surfaces[dst];var sr,dr;if(srcrect){sr=SDL.loadRect(srcrect)}else{sr={x:0,y:0,w:srcData.width,h:srcData.height}}if(dstrect){dr=SDL.loadRect(dstrect)}else{dr={x:0,y:0,w:srcData.width,h:srcData.height}}if(dstData.clipRect){var widthScale=!scale||sr.w===0?1:sr.w/dr.w;var heightScale=!scale||sr.h===0?1:sr.h/dr.h;dr=SDL.intersectionOfRects(dstData.clipRect,dr);sr.w=dr.w*widthScale;sr.h=dr.h*heightScale;if(dstrect){SDL.updateRect(dstrect,dr)}}var blitw,blith;if(scale){blitw=dr.w;blith=dr.h}else{blitw=sr.w;blith=sr.h}if(sr.w===0||sr.h===0||blitw===0||blith===0){return 0}var oldAlpha=dstData.ctx.globalAlpha;dstData.ctx.globalAlpha=srcData.alpha/255;dstData.ctx.drawImage(srcData.canvas,sr.x,sr.y,sr.w,sr.h,dr.x,dr.y,blitw,blith);dstData.ctx.globalAlpha=oldAlpha;if(dst!=SDL.screen){warnOnce("WARNING: copying canvas data to memory for compatibility");_SDL_LockSurface(dst);dstData.locked--}return 0},downFingers:{},savedKeydown:null,receiveEvent(event){function unpressAllPressedKeys(){for(var code in SDL.keyboardMap){SDL.events.push({type:"keyup",keyCode:SDL.keyboardMap[code]})}}switch(event.type){case"touchstart":case"touchmove":{event.preventDefault();var touches=[];if(event.type==="touchstart"){for(var i=0;i0?Math.max(delta,1):Math.min(delta,-1);var button=delta>0?3:4;SDL.events.push({type:"mousedown",button:button,pageX:event.pageX,pageY:event.pageY});SDL.events.push({type:"mouseup",button:button,pageX:event.pageX,pageY:event.pageY});SDL.events.push({type:"wheel",deltaX:0,deltaY:delta});event.preventDefault();break;case"mousemove":if(SDL.DOMButtons[0]===1){SDL.events.push({type:"touchmove",touch:{identifier:0,deviceID:-1,pageX:event.pageX,pageY:event.pageY}})}if(Browser.pointerLock){if("mozMovementX"in event){event["movementX"]=event["mozMovementX"];event["movementY"]=event["mozMovementY"]}if(event["movementX"]==0&&event["movementY"]==0){event.preventDefault();return}}case"keydown":case"keyup":case"keypress":case"mousedown":case"mouseup":if(event.type!=="keydown"||!SDL.unicode&&!SDL.textInput||(event.keyCode===8||event.keyCode===9)){event.preventDefault()}if(event.type=="mousedown"){SDL.DOMButtons[event.button]=1;SDL.events.push({type:"touchstart",touch:{identifier:0,deviceID:-1,pageX:event.pageX,pageY:event.pageY}})}else if(event.type=="mouseup"){if(!SDL.DOMButtons[event.button]){return}SDL.events.push({type:"touchend",touch:{identifier:0,deviceID:-1,pageX:event.pageX,pageY:event.pageY}});SDL.DOMButtons[event.button]=0}if(event.type==="keydown"||event.type==="mousedown"){SDL.canRequestFullscreen=true}else if(event.type==="keyup"||event.type==="mouseup"){if(SDL.isRequestingFullscreen){Module["requestFullscreen"](true,true);SDL.isRequestingFullscreen=false}SDL.canRequestFullscreen=false}if(event.type==="keypress"&&SDL.savedKeydown){SDL.savedKeydown.keypressCharCode=event.charCode;SDL.savedKeydown=null}else if(event.type==="keydown"){SDL.savedKeydown=event}if(event.type!=="keypress"||SDL.textInput){SDL.events.push(event)}break;case"mouseout":for(var i=0;i<3;i++){if(SDL.DOMButtons[i]){SDL.events.push({type:"mouseup",button:i,pageX:event.pageX,pageY:event.pageY});SDL.DOMButtons[i]=0}}event.preventDefault();break;case"focus":SDL.events.push(event);event.preventDefault();break;case"blur":SDL.events.push(event);unpressAllPressedKeys();event.preventDefault();break;case"visibilitychange":SDL.events.push({type:"visibilitychange",visible:!document.hidden});unpressAllPressedKeys();event.preventDefault();break;case"unload":if(Browser.mainLoop.runner){SDL.events.push(event);Browser.mainLoop.runner()}return;case"resize":SDL.events.push(event);if(event.preventDefault){event.preventDefault()}break}if(SDL.events.length>=1e4){err("SDL event queue full, dropping events");SDL.events=SDL.events.slice(0,1e4)}SDL.flushEventsToHandler();return},lookupKeyCodeForEvent(event){var code=event.keyCode;if(code>=65&&code<=90){code+=32}else{code=SDL.keyCodes[event.keyCode]||event.keyCode;if(event.location===2&&code>=(224|1<<10)&&code<=(227|1<<10)){code+=4}}return code},handleEvent(event){if(event.handled)return;event.handled=true;switch(event.type){case"touchstart":case"touchend":case"touchmove":{Browser.calculateMouseEvent(event);break}case"keydown":case"keyup":{var down=event.type==="keydown";var code=SDL.lookupKeyCodeForEvent(event);HEAP8[SDL.keyboardState+code>>>0]=down;SDL.modState=(HEAP8[SDL.keyboardState+1248>>>0]?64:0)|(HEAP8[SDL.keyboardState+1249>>>0]?1:0)|(HEAP8[SDL.keyboardState+1250>>>0]?256:0)|(HEAP8[SDL.keyboardState+1252>>>0]?128:0)|(HEAP8[SDL.keyboardState+1253>>>0]?2:0)|(HEAP8[SDL.keyboardState+1254>>>0]?512:0);if(down){SDL.keyboardMap[code]=event.keyCode}else{delete SDL.keyboardMap[code]}break}case"mousedown":case"mouseup":if(event.type=="mousedown"){SDL.buttonState|=1<0){if(SDL.makeCEvent(SDL.events.shift(),ptr)!==false)return 1}return 0}return SDL.events.length>0},makeCEvent(event,ptr){if(typeof event=="number"){_memcpy(ptr,event,28);_free(event);return}SDL.handleEvent(event);switch(event.type){case"keydown":case"keyup":{var down=event.type==="keydown";var key=SDL.lookupKeyCodeForEvent(event);var scan;if(key>=1024){scan=key-1024}else{scan=SDL.scanCodes[key]||key}HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP8[ptr+8>>>0]=down?1:0;HEAP8[ptr+9>>>0]=0;HEAP32[ptr+12>>>2>>>0]=scan;HEAP32[ptr+16>>>2>>>0]=key;HEAP16[ptr+20>>>1>>>0]=SDL.modState;HEAP32[ptr+24>>>2>>>0]=event.keypressCharCode||key;break}case"keypress":{HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];var cStr=intArrayFromString(String.fromCharCode(event.charCode));for(var i=0;i>>0]=cStr[i]}break}case"mousedown":case"mouseup":case"mousemove":{if(event.type!="mousemove"){var down=event.type==="mousedown";HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP32[ptr+4>>>2>>>0]=0;HEAP32[ptr+8>>>2>>>0]=0;HEAP32[ptr+12>>>2>>>0]=0;HEAP8[ptr+16>>>0]=event.button+1;HEAP8[ptr+17>>>0]=down?1:0;HEAP32[ptr+20>>>2>>>0]=Browser.mouseX;HEAP32[ptr+24>>>2>>>0]=Browser.mouseY}else{HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP32[ptr+4>>>2>>>0]=0;HEAP32[ptr+8>>>2>>>0]=0;HEAP32[ptr+12>>>2>>>0]=0;HEAP32[ptr+16>>>2>>>0]=SDL.buttonState;HEAP32[ptr+20>>>2>>>0]=Browser.mouseX;HEAP32[ptr+24>>>2>>>0]=Browser.mouseY;HEAP32[ptr+28>>>2>>>0]=Browser.mouseMovementX;HEAP32[ptr+32>>>2>>>0]=Browser.mouseMovementY}break}case"wheel":{HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP32[ptr+16>>>2>>>0]=event.deltaX;HEAP32[ptr+20>>>2>>>0]=event.deltaY;break}case"touchstart":case"touchend":case"touchmove":{var touch=event.touch;if(!Browser.touches[touch.identifier])break;var w=Module["canvas"].width;var h=Module["canvas"].height;var x=Browser.touches[touch.identifier].x/w;var y=Browser.touches[touch.identifier].y/h;var lx=Browser.lastTouches[touch.identifier].x/w;var ly=Browser.lastTouches[touch.identifier].y/h;var dx=x-lx;var dy=y-ly;if(touch["deviceID"]===undefined)touch.deviceID=SDL.TOUCH_DEFAULT_ID;if(dx===0&&dy===0&&event.type==="touchmove")return false;HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP32[ptr+4>>>2>>>0]=_SDL_GetTicks();HEAP64[ptr+8>>>3]=BigInt(touch.deviceID);HEAP64[ptr+16>>>3]=BigInt(touch.identifier);HEAPF32[ptr+24>>>2>>>0]=x;HEAPF32[ptr+28>>>2>>>0]=y;HEAPF32[ptr+32>>>2>>>0]=dx;HEAPF32[ptr+36>>>2>>>0]=dy;if(touch.force!==undefined){HEAPF32[ptr+40>>>2>>>0]=touch.force}else{HEAPF32[ptr+40>>>2>>>0]=event.type=="touchend"?0:1}break}case"unload":{HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];break}case"resize":{HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP32[ptr+4>>>2>>>0]=event.w;HEAP32[ptr+8>>>2>>>0]=event.h;break}case"joystick_button_up":case"joystick_button_down":{var state=event.type==="joystick_button_up"?0:1;HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP8[ptr+4>>>0]=event.index;HEAP8[ptr+5>>>0]=event.button;HEAP8[ptr+6>>>0]=state;break}case"joystick_axis_motion":{HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP8[ptr+4>>>0]=event.index;HEAP8[ptr+5>>>0]=event.axis;HEAP32[ptr+8>>>2>>>0]=SDL.joystickAxisValueConversion(event.value);break}case"focus":{var SDL_WINDOWEVENT_FOCUS_GAINED=12;HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP32[ptr+4>>>2>>>0]=0;HEAP8[ptr+8>>>0]=SDL_WINDOWEVENT_FOCUS_GAINED;break}case"blur":{var SDL_WINDOWEVENT_FOCUS_LOST=13;HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP32[ptr+4>>>2>>>0]=0;HEAP8[ptr+8>>>0]=SDL_WINDOWEVENT_FOCUS_LOST;break}case"visibilitychange":{var SDL_WINDOWEVENT_SHOWN=1;var SDL_WINDOWEVENT_HIDDEN=2;var visibilityEventID=event.visible?SDL_WINDOWEVENT_SHOWN:SDL_WINDOWEVENT_HIDDEN;HEAP32[ptr>>>2>>>0]=SDL.DOMEventToSDLEvent[event.type];HEAP32[ptr+4>>>2>>>0]=0;HEAP8[ptr+8>>>0]=visibilityEventID;break}default:throw"Unhandled SDL event: "+event.type}},makeFontString(height,fontName){if(fontName.charAt(0)!="'"&&fontName.charAt(0)!='"'){fontName='"'+fontName+'"'}return height+"px "+fontName+", serif"},estimateTextWidth(fontData,text){var h=fontData.size;var fontString=SDL.makeFontString(h,fontData.name);var tempCtx=SDL.ttfContext;tempCtx.font=fontString;var ret=tempCtx.measureText(text).width|0;return ret},allocateChannels(num){if(SDL.numChannels&&SDL.numChannels>=num&&num!=0)return;SDL.numChannels=num;SDL.channels=[];for(var i=0;i{if(!audio.paused)SDL.playWebAudio(audio)});return}audio.webAudioNode=SDL.audioContext["createBufferSource"]();audio.webAudioNode["buffer"]=webAudio.decodedBuffer;audio.webAudioNode["loop"]=audio.loop;audio.webAudioNode["onended"]=audio["onended"];audio.webAudioPannerNode=SDL.audioContext["createPanner"]();audio.webAudioPannerNode["setPosition"](0,0,-.5);audio.webAudioPannerNode["panningModel"]="equalpower";audio.webAudioGainNode=SDL.audioContext["createGain"]();audio.webAudioGainNode["gain"]["value"]=audio.volume;audio.webAudioNode["connect"](audio.webAudioPannerNode);audio.webAudioPannerNode["connect"](audio.webAudioGainNode);audio.webAudioGainNode["connect"](SDL.audioContext["destination"]);audio.webAudioNode["start"](0,audio.currentPosition);audio.startTime=SDL.audioContext["currentTime"]-audio.currentPosition}catch(e){err(`playWebAudio failed: ${e}`)}},pauseWebAudio(audio){if(!audio)return;if(audio.webAudioNode){try{audio.currentPosition=(SDL.audioContext["currentTime"]-audio.startTime)%audio.resource.webAudio.decodedBuffer.duration;audio.webAudioNode["onended"]=undefined;audio.webAudioNode.stop(0);audio.webAudioNode=undefined}catch(e){err(`pauseWebAudio failed: ${e}`)}}audio.paused=true},openAudioContext(){if(!SDL.audioContext){if(typeof AudioContext!="undefined")SDL.audioContext=new AudioContext;else if(typeof webkitAudioContext!="undefined")SDL.audioContext=new webkitAudioContext}},webAudioAvailable:()=>!!SDL.audioContext,fillWebAudioBufferFromHeap(heapPtr,sizeSamplesPerChannel,dstAudioBuffer){var audio=SDL.audio;var numChannels=audio.channels;for(var c=0;c>>1>>>0]/32768}}else if(audio.format==8){for(var j=0;j>>0];channelData[j]=(v>=0?v-128:v+128)/128}}else if(audio.format==33056){for(var j=0;j>>2>>>0]}}else{throw"Invalid SDL audio format "+audio.format+"!"}}},joystickEventState:1,lastJoystickState:{},joystickNamePool:{},recordJoystickState(joystick,state){var buttons=new Array(state.buttons.length);for(var i=0;i0},queryJoysticks(){for(var joystick in SDL.lastJoystickState){var state=SDL.getGamepad(joystick-1);var prevState=SDL.lastJoystickState[joystick];if(typeof state=="undefined")return;if(state===null)return;if(typeof state.timestamp!="number"||state.timestamp!=prevState.timestamp||!state.timestamp){var i;for(i=0;ideviceIndex&&deviceIndex>=0){return gamepads[deviceIndex]}return null}};Module["SDL"]=SDL;function _SDL_Linked_Version(){if(SDL.version===null){SDL.version=_malloc(3);HEAP8[SDL.version+0>>>0]=1;HEAP8[SDL.version+1>>>0]=3;HEAP8[SDL.version+2>>>0]=0}return SDL.version}Module["_SDL_Linked_Version"]=_SDL_Linked_Version;_SDL_Linked_Version.sig="p";var _SDL_Init=initFlags=>{SDL.startTime=Date.now();SDL.initFlags=initFlags;if(!Module["doNotCaptureKeyboard"]){var keyboardListeningElement=Module["keyboardListeningElement"]||document;keyboardListeningElement.addEventListener("keydown",SDL.receiveEvent);keyboardListeningElement.addEventListener("keyup",SDL.receiveEvent);keyboardListeningElement.addEventListener("keypress",SDL.receiveEvent);window.addEventListener("focus",SDL.receiveEvent);window.addEventListener("blur",SDL.receiveEvent);document.addEventListener("visibilitychange",SDL.receiveEvent)}window.addEventListener("unload",SDL.receiveEvent);SDL.keyboardState=_malloc(65536);zeroMemory(SDL.keyboardState,65536);SDL.DOMEventToSDLEvent["keydown"]=768;SDL.DOMEventToSDLEvent["keyup"]=769;SDL.DOMEventToSDLEvent["keypress"]=771;SDL.DOMEventToSDLEvent["mousedown"]=1025;SDL.DOMEventToSDLEvent["mouseup"]=1026;SDL.DOMEventToSDLEvent["mousemove"]=1024;SDL.DOMEventToSDLEvent["wheel"]=1027;SDL.DOMEventToSDLEvent["touchstart"]=1792;SDL.DOMEventToSDLEvent["touchend"]=1793;SDL.DOMEventToSDLEvent["touchmove"]=1794;SDL.DOMEventToSDLEvent["unload"]=256;SDL.DOMEventToSDLEvent["resize"]=28673;SDL.DOMEventToSDLEvent["visibilitychange"]=512;SDL.DOMEventToSDLEvent["focus"]=512;SDL.DOMEventToSDLEvent["blur"]=512;SDL.DOMEventToSDLEvent["joystick_axis_motion"]=1536;SDL.DOMEventToSDLEvent["joystick_button_down"]=1539;SDL.DOMEventToSDLEvent["joystick_button_up"]=1540;return 0};Module["_SDL_Init"]=_SDL_Init;_SDL_Init.sig="ii";var _SDL_WasInit=flags=>{if(SDL.startTime===null){_SDL_Init(0)}return 1};Module["_SDL_WasInit"]=_SDL_WasInit;_SDL_WasInit.sig="ii";function _SDL_GetVideoInfo(){var ret=_malloc(20);zeroMemory(ret,3);HEAP32[ret+12>>>2>>>0]=Module["canvas"].width;HEAP32[ret+16>>>2>>>0]=Module["canvas"].height;return ret}Module["_SDL_GetVideoInfo"]=_SDL_GetVideoInfo;_SDL_GetVideoInfo.sig="p";function _SDL_ListModes(format,flags){format>>>=0;return-1}Module["_SDL_ListModes"]=_SDL_ListModes;_SDL_ListModes.sig="ppi";var _SDL_VideoModeOK=(width,height,depth,flags)=>depth;Module["_SDL_VideoModeOK"]=_SDL_VideoModeOK;_SDL_VideoModeOK.sig="iiiii";function _SDL_VideoDriverName(buf,max_size){buf>>>=0;if(SDL.startTime===null){return 0}var driverName=[101,109,115,99,114,105,112,116,101,110,95,115,100,108,95,100,114,105,118,101,114];var index=0;var size=driverName.length;if(max_size<=size){size=max_size-1}while(index>>0]=value;index++}HEAP8[buf+index>>>0]=0;return buf}Module["_SDL_VideoDriverName"]=_SDL_VideoDriverName;_SDL_VideoDriverName.sig="ppi";var _SDL_AudioDriverName=_SDL_VideoDriverName;Module["_SDL_AudioDriverName"]=_SDL_AudioDriverName;_SDL_AudioDriverName.sig="ppi";var _SDL_SetVideoMode=function(width,height,depth,flags){["touchstart","touchend","touchmove","mousedown","mouseup","mousemove","mousewheel","wheel","mouseout","DOMMouseScroll"].forEach(e=>Module["canvas"].addEventListener(e,SDL.receiveEvent,true));var canvas=Module["canvas"];if(width==0&&height==0){width=canvas.width;height=canvas.height}if(!SDL.addedResizeListener){SDL.addedResizeListener=true;Browser.resizeListeners.push((w,h)=>{if(!SDL.settingVideoMode){SDL.receiveEvent({type:"resize",w:w,h:h})}})}SDL.settingVideoMode=true;Browser.setCanvasSize(width,height);SDL.settingVideoMode=false;if(SDL.screen){SDL.freeSurface(SDL.screen);assert(!SDL.screen)}if(SDL.GL)flags=flags|67108864;SDL.screen=SDL.makeSurface(width,height,flags,true,"screen");return SDL.screen};Module["_SDL_SetVideoMode"]=_SDL_SetVideoMode;_SDL_SetVideoMode.sig="piiii";function _SDL_GetVideoSurface(){return SDL.screen}Module["_SDL_GetVideoSurface"]=_SDL_GetVideoSurface;_SDL_GetVideoSurface.sig="p";var _SDL_AudioQuit=()=>{for(var i=0;iout("SDL_VideoQuit called (and ignored)");Module["_SDL_VideoQuit"]=_SDL_VideoQuit;_SDL_VideoQuit.sig="v";var _SDL_QuitSubSystem=flags=>out("SDL_QuitSubSystem called (and ignored)");Module["_SDL_QuitSubSystem"]=_SDL_QuitSubSystem;_SDL_QuitSubSystem.sig="vi";var _SDL_Quit=()=>{_SDL_AudioQuit();out("SDL_Quit called (and ignored)")};Module["_SDL_Quit"]=_SDL_Quit;_SDL_Quit.sig="v";function _SDL_UnlockSurface(surf){surf>>>=0;assert(!SDL.GL);var surfData=SDL.surfaces[surf];if(!surfData.locked||--surfData.locked>0){return}if(surfData.isFlagSet(2097152)){SDL.copyIndexedColorData(surfData)}else if(!surfData.colors){var data=surfData.image.data;var buffer=surfData.buffer;assert(buffer%4==0,"Invalid buffer offset: "+buffer);var src=buffer>>>2;var dst=0;var isScreen=surf==SDL.screen;var num;if(typeof CanvasPixelArray!="undefined"&&data instanceof CanvasPixelArray){num=data.length;while(dst>>0];data[dst]=val&255;data[dst+1]=val>>8&255;data[dst+2]=val>>16&255;data[dst+3]=isScreen?255:val>>24&255;src++;dst+=4}}else{var data32=new Uint32Array(data.buffer);if(isScreen&&SDL.defaults.opaqueFrontBuffer){num=data32.length;data32.set(HEAP32.subarray(src>>>0,src+num>>>0));var data8=new Uint8Array(data.buffer);var i=3;var j=i+4*num;if(num%8==0){while(i>>0,src+data32.length>>>0))}}}else{var width=Module["canvas"].width;var height=Module["canvas"].height;var s=surfData.buffer;var data=surfData.image.data;var colors=surfData.colors;for(var y=0;y>>0]*4;var start=base+x*4;data[start]=colors[val];data[start+1]=colors[val+1];data[start+2]=colors[val+2]}s+=width*3}}surfData.ctx.putImageData(surfData.image,0,0)}Module["_SDL_UnlockSurface"]=_SDL_UnlockSurface;_SDL_UnlockSurface.sig="vp";function _SDL_Flip(surf){surf>>>=0}Module["_SDL_Flip"]=_SDL_Flip;_SDL_Flip.sig="ip";function _SDL_UpdateRect(surf,x,y,w,h){surf>>>=0}Module["_SDL_UpdateRect"]=_SDL_UpdateRect;_SDL_UpdateRect.sig="vpiiii";function _SDL_UpdateRects(surf,numrects,rects){surf>>>=0;rects>>>=0}Module["_SDL_UpdateRects"]=_SDL_UpdateRects;_SDL_UpdateRects.sig="vpip";var _SDL_Delay=delay=>{if(!ENVIRONMENT_IS_WORKER)abort("SDL_Delay called on the main thread! Potential infinite loop, quitting. (consider building with async support like ASYNCIFY)");var now=Date.now();while(Date.now()-now>>=0;icon>>>=0;if(title){_emscripten_set_window_title(title)}icon&&=UTF8ToString(icon)}Module["_SDL_WM_SetCaption"]=_SDL_WM_SetCaption;_SDL_WM_SetCaption.sig="vpp";var _SDL_EnableKeyRepeat=(delay,interval)=>{};Module["_SDL_EnableKeyRepeat"]=_SDL_EnableKeyRepeat;_SDL_EnableKeyRepeat.sig="iii";function _SDL_GetKeyboardState(numKeys){numKeys>>>=0;if(numKeys){HEAP32[numKeys>>>2>>>0]=65536}return SDL.keyboardState}Module["_SDL_GetKeyboardState"]=_SDL_GetKeyboardState;_SDL_GetKeyboardState.sig="pp";var _SDL_GetKeyState=()=>_SDL_GetKeyboardState(0);Module["_SDL_GetKeyState"]=_SDL_GetKeyState;function _SDL_GetKeyName(key){SDL.keyName||=stringToNewUTF8("unknown key");return SDL.keyName}Module["_SDL_GetKeyName"]=_SDL_GetKeyName;_SDL_GetKeyName.sig="pi";var _SDL_GetModState=()=>SDL.modState;Module["_SDL_GetModState"]=_SDL_GetModState;_SDL_GetModState.sig="i";function _SDL_GetMouseState(x,y){x>>>=0;y>>>=0;if(x)HEAP32[x>>>2>>>0]=Browser.mouseX;if(y)HEAP32[y>>>2>>>0]=Browser.mouseY;return SDL.buttonState}Module["_SDL_GetMouseState"]=_SDL_GetMouseState;_SDL_GetMouseState.sig="ipp";var _SDL_WarpMouse=(x,y)=>{};Module["_SDL_WarpMouse"]=_SDL_WarpMouse;_SDL_WarpMouse.sig="vii";var _SDL_ShowCursor=toggle=>{switch(toggle){case 0:if(Browser.isFullscreen){Module["canvas"].requestPointerLock();return 0}return 1;case 1:Module["canvas"].exitPointerLock();return 1;case-1:return!Browser.pointerLock;default:err(`SDL_ShowCursor called with unknown toggle parameter value: ${toggle}`);break}};Module["_SDL_ShowCursor"]=_SDL_ShowCursor;_SDL_ShowCursor.sig="ii";function _SDL_GetError(){SDL.errorMessage||=stringToNewUTF8("unknown SDL-emscripten error");return SDL.errorMessage}Module["_SDL_GetError"]=_SDL_GetError;_SDL_GetError.sig="p";function _SDL_SetError(fmt,varargs){fmt>>>=0;varargs>>>=0}Module["_SDL_SetError"]=_SDL_SetError;_SDL_SetError.sig="vpp";function _SDL_CreateRGBSurface(flags,width,height,depth,rmask,gmask,bmask,amask){return SDL.makeSurface(width,height,flags,false,"CreateRGBSurface",rmask,gmask,bmask,amask)}Module["_SDL_CreateRGBSurface"]=_SDL_CreateRGBSurface;_SDL_CreateRGBSurface.sig="piiiiiiii";function _SDL_CreateRGBSurfaceFrom(pixels,width,height,depth,pitch,rmask,gmask,bmask,amask){pixels>>>=0;var surf=SDL.makeSurface(width,height,0,false,"CreateRGBSurfaceFrom",rmask,gmask,bmask,amask);if(depth!==32){err("TODO: Partially unimplemented SDL_CreateRGBSurfaceFrom called!");return surf}var data=SDL.surfaces[surf];var image=data.ctx.createImageData(width,height);var pitchOfDst=width*4;for(var row=0;row>>0]}}data.ctx.putImageData(image,0,0);return surf}Module["_SDL_CreateRGBSurfaceFrom"]=_SDL_CreateRGBSurfaceFrom;_SDL_CreateRGBSurfaceFrom.sig="ppiiiiiiii";function _SDL_ConvertSurface(surf,format,flags){surf>>>=0;format>>>=0;if(format){SDL.checkPixelFormat(format)}var oldData=SDL.surfaces[surf];var ret=SDL.makeSurface(oldData.width,oldData.height,oldData.flags,false,"copy:"+oldData.source);var newData=SDL.surfaces[ret];newData.ctx.globalCompositeOperation="copy";newData.ctx.drawImage(oldData.canvas,0,0);newData.ctx.globalCompositeOperation=oldData.ctx.globalCompositeOperation;return ret}Module["_SDL_ConvertSurface"]=_SDL_ConvertSurface;_SDL_ConvertSurface.sig="pppi";function _SDL_DisplayFormatAlpha(surf){surf>>>=0;return _SDL_ConvertSurface(surf,0,0)}Module["_SDL_DisplayFormatAlpha"]=_SDL_DisplayFormatAlpha;_SDL_DisplayFormatAlpha.sig="pp";function _SDL_FreeSurface(surf){surf>>>=0;if(surf)SDL.freeSurface(surf)}Module["_SDL_FreeSurface"]=_SDL_FreeSurface;_SDL_FreeSurface.sig="vp";function _SDL_UpperBlit(src,srcrect,dst,dstrect){src>>>=0;srcrect>>>=0;dst>>>=0;dstrect>>>=0;return SDL.blitSurface(src,srcrect,dst,dstrect,false)}Module["_SDL_UpperBlit"]=_SDL_UpperBlit;_SDL_UpperBlit.sig="ipppp";function _SDL_UpperBlitScaled(src,srcrect,dst,dstrect){src>>>=0;srcrect>>>=0;dst>>>=0;dstrect>>>=0;return SDL.blitSurface(src,srcrect,dst,dstrect,true)}Module["_SDL_UpperBlitScaled"]=_SDL_UpperBlitScaled;_SDL_UpperBlitScaled.sig="ipppp";var _SDL_LowerBlit=_SDL_UpperBlit;Module["_SDL_LowerBlit"]=_SDL_LowerBlit;_SDL_LowerBlit.sig="ipppp";var _SDL_LowerBlitScaled=_SDL_UpperBlitScaled;Module["_SDL_LowerBlitScaled"]=_SDL_LowerBlitScaled;_SDL_LowerBlitScaled.sig="ipppp";function _SDL_GetClipRect(surf,rect){surf>>>=0;rect>>>=0;assert(rect);var surfData=SDL.surfaces[surf];var r=surfData.clipRect||{x:0,y:0,w:surfData.width,h:surfData.height};SDL.updateRect(rect,r)}Module["_SDL_GetClipRect"]=_SDL_GetClipRect;_SDL_GetClipRect.sig="vpp";function _SDL_SetClipRect(surf,rect){surf>>>=0;rect>>>=0;var surfData=SDL.surfaces[surf];if(rect){surfData.clipRect=SDL.intersectionOfRects({x:0,y:0,w:surfData.width,h:surfData.height},SDL.loadRect(rect))}else{delete surfData.clipRect}}Module["_SDL_SetClipRect"]=_SDL_SetClipRect;_SDL_SetClipRect.sig="ipp";function _SDL_FillRect(surf,rect,color){surf>>>=0;rect>>>=0;var surfData=SDL.surfaces[surf];assert(!surfData.locked);if(surfData.isFlagSet(2097152)){color=surfData.colors32[color]}var r=rect?SDL.loadRect(rect):{x:0,y:0,w:surfData.width,h:surfData.height};if(surfData.clipRect){r=SDL.intersectionOfRects(surfData.clipRect,r);if(rect){SDL.updateRect(rect,r)}}surfData.ctx.save();surfData.ctx.fillStyle=SDL.translateColorToCSSRGBA(color);surfData.ctx.fillRect(r.x,r.y,r.w,r.h);surfData.ctx.restore();return 0}Module["_SDL_FillRect"]=_SDL_FillRect;_SDL_FillRect.sig="ippi";function _zoomSurface(src,x,y,smooth){src>>>=0;var srcData=SDL.surfaces[src];var w=srcData.width*x;var h=srcData.height*y;var ret=SDL.makeSurface(Math.abs(w),Math.abs(h),srcData.flags,false,"zoomSurface");var dstData=SDL.surfaces[ret];if(x>=0&&y>=0)dstData.ctx.drawImage(srcData.canvas,0,0,w,h);else{dstData.ctx.save();dstData.ctx.scale(x<0?-1:1,y<0?-1:1);dstData.ctx.drawImage(srcData.canvas,w<0?w:0,h<0?h:0,Math.abs(w),Math.abs(h));dstData.ctx.restore()}return ret}Module["_zoomSurface"]=_zoomSurface;_zoomSurface.sig="ppddi";function _rotozoomSurface(src,angle,zoom,smooth){src>>>=0;if(angle%360===0){return _zoomSurface(src,zoom,zoom,smooth)}var srcData=SDL.surfaces[src];var w=srcData.width*zoom;var h=srcData.height*zoom;var diagonal=Math.ceil(Math.sqrt(Math.pow(w,2)+Math.pow(h,2)));var ret=SDL.makeSurface(diagonal,diagonal,srcData.flags,false,"rotozoomSurface");var dstData=SDL.surfaces[ret];dstData.ctx.translate(diagonal/2,diagonal/2);dstData.ctx.rotate(-angle*Math.PI/180);dstData.ctx.drawImage(srcData.canvas,-w/2,-h/2,w,h);return ret}Module["_rotozoomSurface"]=_rotozoomSurface;_rotozoomSurface.sig="ppddi";function _SDL_SetAlpha(surf,flag,alpha){surf>>>=0;var surfData=SDL.surfaces[surf];surfData.alpha=alpha;if(!(flag&65536)){surfData.alpha=255}}Module["_SDL_SetAlpha"]=_SDL_SetAlpha;_SDL_SetAlpha.sig="ipii";function _SDL_SetColorKey(surf,flag,key){surf>>>=0;warnOnce("SDL_SetColorKey is a no-op for performance reasons");return 0}Module["_SDL_SetColorKey"]=_SDL_SetColorKey;_SDL_SetColorKey.sig="ipii";function _SDL_PollEvent(ptr){ptr>>>=0;return SDL.pollEvent(ptr)}Module["_SDL_PollEvent"]=_SDL_PollEvent;_SDL_PollEvent.sig="ip";function _SDL_PushEvent(ptr){ptr>>>=0;var copy=_malloc(28);_memcpy(copy,ptr,28);SDL.events.push(copy);return 0}Module["_SDL_PushEvent"]=_SDL_PushEvent;_SDL_PushEvent.sig="ip";function _SDL_PeepEvents(events,requestedEventCount,action,from,to){events>>>=0;switch(action){case 2:{assert(requestedEventCount==1);var index=0;var retrievedEventCount=0;while(indexSDL.events.forEach(SDL.handleEvent);Module["_SDL_PumpEvents"]=_SDL_PumpEvents;_SDL_PumpEvents.sig="v";function _emscripten_SDL_SetEventHandler(handler,userdata){handler>>>=0;userdata>>>=0;SDL.eventHandler=handler;SDL.eventHandlerContext=userdata;if(!SDL.eventHandlerTemp)SDL.eventHandlerTemp=_malloc(28)}Module["_emscripten_SDL_SetEventHandler"]=_emscripten_SDL_SetEventHandler;_emscripten_SDL_SetEventHandler.sig="vpp";function _SDL_SetColors(surf,colors,firstColor,nColors){surf>>>=0;colors>>>=0;var surfData=SDL.surfaces[surf];if(!surfData.colors){var buffer=new ArrayBuffer(256*4);surfData.colors=new Uint8Array(buffer);surfData.colors32=new Uint32Array(buffer)}for(var i=0;i>>0];surfData.colors[index+1]=HEAPU8[colors+(i*4+1)>>>0];surfData.colors[index+2]=HEAPU8[colors+(i*4+2)>>>0];surfData.colors[index+3]=255}return 1}Module["_SDL_SetColors"]=_SDL_SetColors;_SDL_SetColors.sig="ippii";function _SDL_SetPalette(surf,flags,colors,firstColor,nColors){surf>>>=0;colors>>>=0;return _SDL_SetColors(surf,colors,firstColor,nColors)}Module["_SDL_SetPalette"]=_SDL_SetPalette;_SDL_SetPalette.sig="ipipii";function _SDL_MapRGB(fmt,r,g,b){fmt>>>=0;SDL.checkPixelFormat(fmt);return r&255|(g&255)<<8|(b&255)<<16|4278190080}Module["_SDL_MapRGB"]=_SDL_MapRGB;_SDL_MapRGB.sig="ipiii";function _SDL_MapRGBA(fmt,r,g,b,a){fmt>>>=0;SDL.checkPixelFormat(fmt);return r&255|(g&255)<<8|(b&255)<<16|(a&255)<<24}Module["_SDL_MapRGBA"]=_SDL_MapRGBA;_SDL_MapRGBA.sig="ipiiii";function _SDL_GetRGB(pixel,fmt,r,g,b){fmt>>>=0;r>>>=0;g>>>=0;b>>>=0;SDL.checkPixelFormat(fmt);if(r){HEAP8[r>>>0]=pixel&255}if(g){HEAP8[g>>>0]=pixel>>8&255}if(b){HEAP8[b>>>0]=pixel>>16&255}}Module["_SDL_GetRGB"]=_SDL_GetRGB;_SDL_GetRGB.sig="vipppp";function _SDL_GetRGBA(pixel,fmt,r,g,b,a){fmt>>>=0;r>>>=0;g>>>=0;b>>>=0;a>>>=0;SDL.checkPixelFormat(fmt);if(r){HEAP8[r>>>0]=pixel&255}if(g){HEAP8[g>>>0]=pixel>>8&255}if(b){HEAP8[b>>>0]=pixel>>16&255}if(a){HEAP8[a>>>0]=pixel>>24&255}}Module["_SDL_GetRGBA"]=_SDL_GetRGBA;_SDL_GetRGBA.sig="vippppp";var _SDL_GetAppState=()=>{var state=0;if(Browser.pointerLock){state|=1}if(document.hasFocus()){state|=2}state|=4;return state};Module["_SDL_GetAppState"]=_SDL_GetAppState;_SDL_GetAppState.sig="i";var _SDL_WM_GrabInput=()=>{};Module["_SDL_WM_GrabInput"]=_SDL_WM_GrabInput;_SDL_WM_GrabInput.sig="ii";function _SDL_WM_ToggleFullScreen(surf){surf>>>=0;if(Browser.exitFullscreen()){return 1}if(!SDL.canRequestFullscreen){return 0}SDL.isRequestingFullscreen=true;return 1}Module["_SDL_WM_ToggleFullScreen"]=_SDL_WM_ToggleFullScreen;_SDL_WM_ToggleFullScreen.sig="ip";var _IMG_Init=flags=>flags;Module["_IMG_Init"]=_IMG_Init;_IMG_Init.sig="ii";function _SDL_FreeRW(rwopsID){rwopsID>>>=0;SDL.rwops[rwopsID]=null;while(SDL.rwops.length>0&&SDL.rwops[SDL.rwops.length-1]===null){SDL.rwops.pop()}}Module["_SDL_FreeRW"]=_SDL_FreeRW;_SDL_FreeRW.sig="vp";var _IMG_Load_RW=function(rwopsID,freeSrc){rwopsID>>>=0;var sp=stackSave();try{var cleanup=()=>{stackRestore(sp);if(rwops&&freeSrc)_SDL_FreeRW(rwopsID)};var addCleanup=func=>{var old=cleanup;cleanup=()=>{old();func()}};var callStbImage=(func,params)=>{var x=stackAlloc(4);var y=stackAlloc(4);var comp=stackAlloc(4);var data=Module["_"+func](...params,x,y,comp,0);if(!data)return null;addCleanup(()=>Module["_stbi_image_free"](data));return{rawData:true,data:data,width:HEAP32[x>>>2>>>0],height:HEAP32[y>>>2>>>0],size:HEAP32[x>>>2>>>0]*HEAP32[y>>>2>>>0]*HEAP32[comp>>>2>>>0],bpp:HEAP32[comp>>>2>>>0]}};var rwops=SDL.rwops[rwopsID];if(rwops===undefined){return 0}var raw;var filename=rwops.filename;if(filename===undefined){warnOnce("Only file names that have been preloaded are supported for IMG_Load_RW. Consider using STB_IMAGE=1 if you want synchronous image decoding (see settings.js), or package files with --use-preload-plugins");return 0}if(!raw){filename=PATH_FS.resolve(filename);raw=preloadedImages[filename];if(!raw){if(raw===null)err("Trying to reuse preloaded image, but freePreloadedMediaOnUse is set!");warnOnce("Cannot find preloaded image "+filename);warnOnce("Cannot find preloaded image "+filename+". Consider using STB_IMAGE=1 if you want synchronous image decoding (see settings.js), or package files with --use-preload-plugins");return 0}else if(Module["freePreloadedMediaOnUse"]){preloadedImages[filename]=null}}var surf=SDL.makeSurface(raw.width,raw.height,0,false,"load:"+filename);var surfData=SDL.surfaces[surf];surfData.ctx.globalCompositeOperation="copy";if(!raw.rawData){surfData.ctx.drawImage(raw,0,0,raw.width,raw.height,0,0,raw.width,raw.height)}else{var imageData=surfData.ctx.getImageData(0,0,surfData.width,surfData.height);if(raw.bpp==4){imageData.data.set(HEAPU8.subarray(raw.data>>>0,raw.data+raw.size>>>0))}else if(raw.bpp==3){var pixels=raw.size/3;var data=imageData.data;var sourcePtr=raw.data;var destPtr=0;for(var i=0;i>>0];data[destPtr++]=HEAPU8[sourcePtr++>>>0];data[destPtr++]=HEAPU8[sourcePtr++>>>0];data[destPtr++]=255}}else if(raw.bpp==2){var pixels=raw.size;var data=imageData.data;var sourcePtr=raw.data;var destPtr=0;for(var i=0;i>>0];var alpha=HEAPU8[sourcePtr++>>>0];data[destPtr++]=gray;data[destPtr++]=gray;data[destPtr++]=gray;data[destPtr++]=alpha}}else if(raw.bpp==1){var pixels=raw.size;var data=imageData.data;var sourcePtr=raw.data;var destPtr=0;for(var i=0;i>>0];data[destPtr++]=value;data[destPtr++]=value;data[destPtr++]=value;data[destPtr++]=255}}else{err(`cannot handle bpp ${raw.bpp}`);return 0}surfData.ctx.putImageData(imageData,0,0)}surfData.ctx.globalCompositeOperation="source-over";_SDL_LockSurface(surf);surfData.locked--;if(SDL.GL){surfData.canvas=surfData.ctx=null}return surf}finally{cleanup()}};Module["_IMG_Load_RW"]=_IMG_Load_RW;_IMG_Load_RW.sig="ppi";var _SDL_LoadBMP_RW=_IMG_Load_RW;Module["_SDL_LoadBMP_RW"]=_SDL_LoadBMP_RW;_SDL_LoadBMP_RW.sig="ppi";function _SDL_RWFromFile(_name,mode){_name>>>=0;mode>>>=0;var id=SDL.rwops.length;var filename=UTF8ToString(_name);SDL.rwops.push({filename:filename,mimetype:Browser.getMimetype(filename)});return id}Module["_SDL_RWFromFile"]=_SDL_RWFromFile;_SDL_RWFromFile.sig="ppp";function _IMG_Load(filename){filename>>>=0;var rwops=_SDL_RWFromFile(filename,0);var result=_IMG_Load_RW(rwops,1);return result}Module["_IMG_Load"]=_IMG_Load;_IMG_Load.sig="pp";var _IMG_Quit=()=>out("IMG_Quit called (and ignored)");Module["_IMG_Quit"]=_IMG_Quit;_IMG_Quit.sig="v";function _SDL_OpenAudio(desired,obtained){desired>>>=0;obtained>>>=0;try{SDL.audio={freq:HEAPU32[desired>>>2>>>0],format:HEAPU16[desired+4>>>1>>>0],channels:HEAPU8[desired+6>>>0],samples:HEAPU16[desired+8>>>1>>>0],callback:HEAPU32[desired+16>>>2>>>0],userdata:HEAPU32[desired+20>>>2>>>0],paused:true,timer:null};if(SDL.audio.format==8){SDL.audio.silence=128}else if(SDL.audio.format==32784){SDL.audio.silence=0}else if(SDL.audio.format==33056){SDL.audio.silence=0}else{throw"Invalid SDL audio format "+SDL.audio.format+"!"}if(SDL.audio.freq<=0){throw"Unsupported sound frequency "+SDL.audio.freq+"!"}else if(SDL.audio.freq<=22050){SDL.audio.freq=22050}else if(SDL.audio.freq<=32e3){SDL.audio.freq=32e3}else if(SDL.audio.freq<=44100){SDL.audio.freq=44100}else if(SDL.audio.freq<=48e3){SDL.audio.freq=48e3}else if(SDL.audio.freq<=96e3){SDL.audio.freq=96e3}else{throw`Unsupported sound frequency ${SDL.audio.freq}!`}if(SDL.audio.channels==0){SDL.audio.channels=1}else if(SDL.audio.channels<0||SDL.audio.channels>32){throw`Unsupported number of audio channels for SDL audio: ${SDL.audio.channels}!`}else if(SDL.audio.channels!=1&&SDL.audio.channels!=2){out(`Warning: Using untested number of audio channels ${SDL.audio.channels}`)}if(SDL.audio.samples<128||SDL.audio.samples>524288){throw`Unsupported audio callback buffer size ${SDL.audio.samples}!`}else if((SDL.audio.samples&SDL.audio.samples-1)!=0){throw`Audio callback buffer size ${SDL.audio.samples} must be a power-of-two!`}var totalSamples=SDL.audio.samples*SDL.audio.channels;if(SDL.audio.format==8){SDL.audio.bytesPerSample=1}else if(SDL.audio.format==32784){SDL.audio.bytesPerSample=2}else if(SDL.audio.format==33056){SDL.audio.bytesPerSample=4}else{throw`Invalid SDL audio format ${SDL.audio.format}!`}SDL.audio.bufferSize=totalSamples*SDL.audio.bytesPerSample;SDL.audio.bufferDurationSecs=SDL.audio.bufferSize/SDL.audio.bytesPerSample/SDL.audio.channels/SDL.audio.freq;SDL.audio.bufferingDelay=50/1e3;SDL.audio.buffer=_malloc(SDL.audio.bufferSize);SDL.audio.numSimultaneouslyQueuedBuffers=Module["SDL_numSimultaneouslyQueuedBuffers"]||5;SDL.audio.queueNewAudioData=()=>{if(!SDL.audio)return;for(var i=0;i=SDL.audio.bufferingDelay+SDL.audio.bufferDurationSecs*SDL.audio.numSimultaneouslyQueuedBuffers)return;getWasmTableEntry(SDL.audio.callback)(SDL.audio.userdata,SDL.audio.buffer,SDL.audio.bufferSize);SDL.audio.pushAudio(SDL.audio.buffer,SDL.audio.bufferSize)}};SDL.audio.caller=()=>{if(!SDL.audio)return;--SDL.audio.numAudioTimersPending;SDL.audio.queueNewAudioData();var secsUntilNextPlayStart=SDL.audio.nextPlayTime-SDL.audioContext["currentTime"];var preemptBufferFeedSecs=SDL.audio.bufferDurationSecs/2;if(SDL.audio.numAudioTimersPending{try{if(SDL.audio.paused)return;var sizeSamples=sizeBytes/SDL.audio.bytesPerSample;var sizeSamplesPerChannel=sizeSamples/SDL.audio.channels;if(sizeSamplesPerChannel!=SDL.audio.samples){throw"Received mismatching audio buffer size!"}var source=SDL.audioContext["createBufferSource"]();var soundBuffer=SDL.audioContext["createBuffer"](SDL.audio.channels,sizeSamplesPerChannel,SDL.audio.freq);source["connect"](SDL.audioContext["destination"]);SDL.fillWebAudioBufferFromHeap(ptr,sizeSamplesPerChannel,soundBuffer);source["buffer"]=soundBuffer;var curtime=SDL.audioContext["currentTime"];var playtime=Math.max(curtime+SDL.audio.bufferingDelay,SDL.audio.nextPlayTime);if(typeof source["start"]!="undefined"){source["start"](playtime)}else if(typeof source["noteOn"]!="undefined"){source["noteOn"](playtime)}SDL.audio.nextPlayTime=playtime+SDL.audio.bufferDurationSecs}catch(e){err(`Web Audio API error playing back audio: ${e.toString()}`)}};if(obtained){HEAP32[obtained>>>2>>>0]=SDL.audio.freq;HEAP16[obtained+4>>>1>>>0]=SDL.audio.format;HEAP8[obtained+6>>>0]=SDL.audio.channels;HEAP8[obtained+7>>>0]=SDL.audio.silence;HEAP16[obtained+8>>>1>>>0]=SDL.audio.samples;HEAPU32[obtained+16>>>2>>>0]=SDL.audio.callback;HEAPU32[obtained+20>>>2>>>0]=SDL.audio.userdata}SDL.allocateChannels(32)}catch(e){err(`Initializing SDL audio threw an exception: "${e.toString()}"! Continuing without audio`);SDL.audio=null;SDL.allocateChannels(0);if(obtained){HEAP32[obtained>>>2>>>0]=0;HEAP16[obtained+4>>>1>>>0]=0;HEAP8[obtained+6>>>0]=0;HEAP8[obtained+7>>>0]=0;HEAP16[obtained+8>>>1>>>0]=0;HEAPU32[obtained+16>>>2>>>0]=0;HEAPU32[obtained+20>>>2>>>0]=0}}if(!SDL.audio){return-1}return 0}Module["_SDL_OpenAudio"]=_SDL_OpenAudio;_SDL_OpenAudio.sig="ipp";var _SDL_PauseAudio=pauseOn=>{if(!SDL.audio){return}if(pauseOn){if(SDL.audio.timer!==undefined){clearTimeout(SDL.audio.timer);SDL.audio.numAudioTimersPending=0;SDL.audio.timer=undefined}}else if(!SDL.audio.timer){SDL.audio.numAudioTimersPending=1;SDL.audio.timer=safeSetTimeout(SDL.audio.caller,1)}SDL.audio.paused=pauseOn};Module["_SDL_PauseAudio"]=_SDL_PauseAudio;_SDL_PauseAudio.sig="vi";var _SDL_CloseAudio=()=>{if(SDL.audio){if(SDL.audio.callbackRemover){SDL.audio.callbackRemover();SDL.audio.callbackRemover=null}_SDL_PauseAudio(1);_free(SDL.audio.buffer);SDL.audio=null;SDL.allocateChannels(0)}};Module["_SDL_CloseAudio"]=_SDL_CloseAudio;_SDL_CloseAudio.sig="v";var _SDL_LockAudio=()=>{};Module["_SDL_LockAudio"]=_SDL_LockAudio;_SDL_LockAudio.sig="v";var _SDL_UnlockAudio=()=>{};Module["_SDL_UnlockAudio"]=_SDL_UnlockAudio;_SDL_UnlockAudio.sig="v";function _SDL_CreateMutex(){return 0}Module["_SDL_CreateMutex"]=_SDL_CreateMutex;_SDL_CreateMutex.sig="p";function _SDL_mutexP(mutex){mutex>>>=0;return 0}Module["_SDL_mutexP"]=_SDL_mutexP;_SDL_mutexP.sig="ip";function _SDL_mutexV(mutex){mutex>>>=0;return 0}Module["_SDL_mutexV"]=_SDL_mutexV;_SDL_mutexV.sig="ip";function _SDL_DestroyMutex(mutex){mutex>>>=0}Module["_SDL_DestroyMutex"]=_SDL_DestroyMutex;_SDL_DestroyMutex.sig="vp";function _SDL_CreateCond(){return 0}Module["_SDL_CreateCond"]=_SDL_CreateCond;_SDL_CreateCond.sig="p";function _SDL_CondSignal(cond){cond>>>=0}Module["_SDL_CondSignal"]=_SDL_CondSignal;_SDL_CondSignal.sig="ip";function _SDL_CondWait(cond,mutex){cond>>>=0;mutex>>>=0}Module["_SDL_CondWait"]=_SDL_CondWait;_SDL_CondWait.sig="ipp";function _SDL_DestroyCond(cond){cond>>>=0}Module["_SDL_DestroyCond"]=_SDL_DestroyCond;_SDL_DestroyCond.sig="vp";var _SDL_StartTextInput=()=>{SDL.textInput=true};Module["_SDL_StartTextInput"]=_SDL_StartTextInput;_SDL_StartTextInput.sig="v";var _SDL_StopTextInput=()=>{SDL.textInput=false};Module["_SDL_StopTextInput"]=_SDL_StopTextInput;_SDL_StopTextInput.sig="v";var _Mix_Init=flags=>{if(!flags)return 0;return 8};Module["_Mix_Init"]=_Mix_Init;_Mix_Init.sig="ii";var _Mix_Quit=()=>{};Module["_Mix_Quit"]=_Mix_Quit;_Mix_Quit.sig="v";var _Mix_OpenAudio=(frequency,format,channels,chunksize)=>{SDL.openAudioContext();autoResumeAudioContext(SDL.audioContext);SDL.allocateChannels(32);SDL.mixerFrequency=frequency;SDL.mixerFormat=format;SDL.mixerNumChannels=channels;SDL.mixerChunkSize=chunksize;return 0};Module["_Mix_OpenAudio"]=_Mix_OpenAudio;_Mix_OpenAudio.sig="iiiii";var _Mix_CloseAudio=_SDL_CloseAudio;Module["_Mix_CloseAudio"]=_Mix_CloseAudio;_Mix_CloseAudio.sig="v";var _Mix_AllocateChannels=num=>{SDL.allocateChannels(num);return num};Module["_Mix_AllocateChannels"]=_Mix_AllocateChannels;_Mix_AllocateChannels.sig="ii";function _Mix_ChannelFinished(func){func>>>=0;SDL.channelFinished=func}Module["_Mix_ChannelFinished"]=_Mix_ChannelFinished;_Mix_ChannelFinished.sig="vp";var _Mix_Volume=(channel,volume)=>{if(channel==-1){for(var i=0;i{left/=255;right/=255;SDL.setPannerPosition(SDL.channels[channel],right-left,0,.1);return 1};Module["_Mix_SetPanning"]=_Mix_SetPanning;_Mix_SetPanning.sig="iiii";function _Mix_LoadWAV_RW(rwopsID,freesrc){rwopsID>>>=0;var rwops=SDL.rwops[rwopsID];if(rwops===undefined)return 0;var filename="";var audio;var webAudio;var bytes;if(rwops.filename!==undefined){filename=PATH_FS.resolve(rwops.filename);var raw=preloadedAudios[filename];if(!raw){if(raw===null)err("Trying to reuse preloaded audio, but freePreloadedMediaOnUse is set!");if(!Module.noAudioDecoding)warnOnce("Cannot find preloaded audio "+filename);try{bytes=FS.readFile(filename)}catch(e){err(`Couldn't find file for: ${filename}`);return 0}}if(Module["freePreloadedMediaOnUse"]){preloadedAudios[filename]=null}audio=raw}else if(rwops.bytes!==undefined){if(SDL.webAudioAvailable())bytes=HEAPU8.buffer.slice(rwops.bytes,rwops.bytes+rwops.count);else bytes=HEAPU8.subarray(rwops.bytes>>>0,rwops.bytes+rwops.count>>>0)}else{return 0}var arrayBuffer=bytes?bytes.buffer||bytes:bytes;var canPlayWithWebAudio=Module["SDL_canPlayWithWebAudio"]===undefined||Module["SDL_canPlayWithWebAudio"](filename,arrayBuffer);if(bytes!==undefined&&SDL.webAudioAvailable()&&canPlayWithWebAudio){audio=undefined;webAudio={};webAudio.onDecodeComplete=[];var onDecodeComplete=data=>{webAudio.decodedBuffer=data;webAudio.onDecodeComplete.forEach(e=>e());webAudio.onDecodeComplete=undefined};SDL.audioContext["decodeAudioData"](arrayBuffer,onDecodeComplete)}else if(audio===undefined&&bytes){var blob=new Blob([bytes],{type:rwops.mimetype});var url=URL.createObjectURL(blob);audio=new Audio;audio.src=url;audio.mozAudioChannelType="content"}var id=SDL.audios.length;SDL.audios.push({source:filename,audio:audio,webAudio:webAudio});return id}Module["_Mix_LoadWAV_RW"]=_Mix_LoadWAV_RW;_Mix_LoadWAV_RW.sig="ppi";function _Mix_LoadWAV(filename){filename>>>=0;var rwops=_SDL_RWFromFile(filename,0);var result=_Mix_LoadWAV_RW(rwops,0);_SDL_FreeRW(rwops);return result}Module["_Mix_LoadWAV"]=_Mix_LoadWAV;_Mix_LoadWAV.sig="pp";function _Mix_QuickLoad_RAW(mem,len){mem>>>=0;var audio;var webAudio;var numSamples=len>>1;var buffer=new Float32Array(numSamples);for(var i=0;i>>1>>>0]/32768}if(SDL.webAudioAvailable()){webAudio={};webAudio.decodedBuffer=buffer}else{audio=new Audio;audio.mozAudioChannelType="content";audio.numChannels=SDL.mixerNumChannels;audio.frequency=SDL.mixerFrequency}var id=SDL.audios.length;SDL.audios.push({source:"",audio:audio,webAudio:webAudio,buffer:buffer});return id}Module["_Mix_QuickLoad_RAW"]=_Mix_QuickLoad_RAW;_Mix_QuickLoad_RAW.sig="ppi";function _Mix_FreeChunk(id){id>>>=0;SDL.audios[id]=null}Module["_Mix_FreeChunk"]=_Mix_FreeChunk;_Mix_FreeChunk.sig="vp";var _Mix_ReserveChannels=num=>{SDL.channelMinimumNumber=num};Module["_Mix_ReserveChannels"]=_Mix_ReserveChannels;_Mix_ReserveChannels.sig="ii";function _Mix_PlayChannelTimed(channel,id,loops,ticks){id>>>=0;assert(ticks==-1);var info=SDL.audios[id];if(!info)return-1;if(!info.audio&&!info.webAudio)return-1;if(channel==-1){for(var i=SDL.channelMinimumNumber;i0;Module["_Mix_FadingChannel"]=_Mix_FadingChannel;_Mix_FadingChannel.sig="ii";var _Mix_HaltChannel=channel=>{function halt(channel){var info=SDL.channels[channel];if(info.audio){info.audio.pause();info.audio=null}if(SDL.channelFinished){getWasmTableEntry(SDL.channelFinished)(channel)}}if(channel!=-1){halt(channel)}else{for(var i=0;i{var audio=SDL.music.audio;if(audio){audio.src=audio.src;audio.currentPosition=0;audio.pause()}SDL.music.audio=null;if(SDL.hookMusicFinished){getWasmTableEntry(SDL.hookMusicFinished)()}return 0};Module["_Mix_HaltMusic"]=_Mix_HaltMusic;_Mix_HaltMusic.sig="i";function _Mix_HookMusicFinished(func){func>>>=0;SDL.hookMusicFinished=func;if(SDL.music.audio){SDL.music.audio["onended"]=_Mix_HaltMusic}}Module["_Mix_HookMusicFinished"]=_Mix_HookMusicFinished;_Mix_HookMusicFinished.sig="vp";var _Mix_VolumeMusic=volume=>SDL.setGetVolume(SDL.music,volume);Module["_Mix_VolumeMusic"]=_Mix_VolumeMusic;_Mix_VolumeMusic.sig="ii";function _Mix_LoadMUS_RW(filename){filename>>>=0;return _Mix_LoadWAV_RW(filename,0)}Module["_Mix_LoadMUS_RW"]=_Mix_LoadMUS_RW;_Mix_LoadMUS_RW.sig="pp";function _Mix_LoadMUS(filename){filename>>>=0;var rwops=_SDL_RWFromFile(filename,0);var result=_Mix_LoadMUS_RW(rwops);_SDL_FreeRW(rwops);return result}Module["_Mix_LoadMUS"]=_Mix_LoadMUS;_Mix_LoadMUS.sig="pp";var _Mix_FreeMusic=_Mix_FreeChunk;Module["_Mix_FreeMusic"]=_Mix_FreeMusic;_Mix_FreeMusic.sig="vp";function _Mix_PlayMusic(id,loops){id>>>=0;if(SDL.music.audio){if(!SDL.music.audio.paused)err(`Music is already playing. ${SDL.music.source}`);SDL.music.audio.pause()}var info=SDL.audios[id];var audio;if(info.webAudio){audio={};audio.resource=info;audio.paused=false;audio.currentPosition=0;audio.play=function(){SDL.playWebAudio(this)};audio.pause=function(){SDL.pauseWebAudio(this)}}else if(info.audio){audio=info.audio}audio["onended"]=function(){if(SDL.music.audio==this)_Mix_HaltMusic()};audio.loop=loops!=0&&loops!=1;audio.volume=SDL.music.volume;SDL.music.audio=audio;audio.play();return 0}Module["_Mix_PlayMusic"]=_Mix_PlayMusic;_Mix_PlayMusic.sig="ipi";var _Mix_PauseMusic=()=>{var audio=SDL.music.audio;audio?.pause()};Module["_Mix_PauseMusic"]=_Mix_PauseMusic;_Mix_PauseMusic.sig="v";var _Mix_ResumeMusic=()=>{var audio=SDL.music.audio;audio?.play()};Module["_Mix_ResumeMusic"]=_Mix_ResumeMusic;_Mix_ResumeMusic.sig="v";var _Mix_FadeInMusicPos=_Mix_PlayMusic;Module["_Mix_FadeInMusicPos"]=_Mix_FadeInMusicPos;_Mix_FadeInMusicPos.sig="ipiid";var _Mix_FadeOutMusic=_Mix_HaltMusic;Module["_Mix_FadeOutMusic"]=_Mix_FadeOutMusic;_Mix_FadeOutMusic.sig="ii";var _Mix_PlayingMusic=()=>SDL.music.audio&&!SDL.music.audio.paused?1:0;Module["_Mix_PlayingMusic"]=_Mix_PlayingMusic;_Mix_PlayingMusic.sig="i";var _Mix_Playing=channel=>{if(channel===-1){var count=0;for(var i=0;i{if(channel===-1){for(var i=0;i{if(channel===-1){var pausedCount=0;for(var i=0;iSDL.music.audio?.paused?1:0;Module["_Mix_PausedMusic"]=_Mix_PausedMusic;_Mix_PausedMusic.sig="i";var _Mix_Resume=channel=>{if(channel===-1){for(var i=0;i{try{var offscreenCanvas=new OffscreenCanvas(0,0);SDL.ttfContext=offscreenCanvas.getContext("2d");if(typeof SDL.ttfContext.measureText!="function"){throw"bad context"}}catch(ex){var canvas=document.createElement("canvas");SDL.ttfContext=canvas.getContext("2d")}return 0};Module["_TTF_Init"]=_TTF_Init;_TTF_Init.sig="i";function _TTF_OpenFont(name,size){name>>>=0;name=PATH.normalize(UTF8ToString(name));var id=SDL.fonts.length;SDL.fonts.push({name:name,size:size});return id}Module["_TTF_OpenFont"]=_TTF_OpenFont;_TTF_OpenFont.sig="ppi";function _TTF_CloseFont(font){font>>>=0;SDL.fonts[font]=null}Module["_TTF_CloseFont"]=_TTF_CloseFont;_TTF_CloseFont.sig="vp";function _TTF_RenderText_Solid(font,text,color){font>>>=0;text>>>=0;color>>>=0;text=UTF8ToString(text)||" ";var fontData=SDL.fonts[font];var w=SDL.estimateTextWidth(fontData,text);var h=fontData.size;color=SDL.loadColorToCSSRGB(color);var fontString=SDL.makeFontString(h,fontData.name);var surf=SDL.makeSurface(w,h,0,false,"text:"+text);var surfData=SDL.surfaces[surf];surfData.ctx.save();surfData.ctx.fillStyle=color;surfData.ctx.font=fontString;surfData.ctx.textBaseline="bottom";surfData.ctx.fillText(text,0,h|0);surfData.ctx.restore();return surf}Module["_TTF_RenderText_Solid"]=_TTF_RenderText_Solid;_TTF_RenderText_Solid.sig="pppp";var _TTF_RenderText_Blended=_TTF_RenderText_Solid;Module["_TTF_RenderText_Blended"]=_TTF_RenderText_Blended;_TTF_RenderText_Blended.sig="pppp";var _TTF_RenderText_Shaded=_TTF_RenderText_Solid;Module["_TTF_RenderText_Shaded"]=_TTF_RenderText_Shaded;_TTF_RenderText_Shaded.sig="ppppp";var _TTF_RenderUTF8_Solid=_TTF_RenderText_Solid;Module["_TTF_RenderUTF8_Solid"]=_TTF_RenderUTF8_Solid;_TTF_RenderUTF8_Solid.sig="pppp";function _TTF_SizeText(font,text,w,h){font>>>=0;text>>>=0;w>>>=0;h>>>=0;var fontData=SDL.fonts[font];if(w){HEAP32[w>>>2>>>0]=SDL.estimateTextWidth(fontData,UTF8ToString(text))}if(h){HEAP32[h>>>2>>>0]=fontData.size}return 0}Module["_TTF_SizeText"]=_TTF_SizeText;_TTF_SizeText.sig="ipppp";var _TTF_SizeUTF8=_TTF_SizeText;Module["_TTF_SizeUTF8"]=_TTF_SizeUTF8;_TTF_SizeUTF8.sig="ipppp";function _TTF_GlyphMetrics(font,ch,minx,maxx,miny,maxy,advance){font>>>=0;minx>>>=0;maxx>>>=0;miny>>>=0;maxy>>>=0;advance>>>=0;var fontData=SDL.fonts[font];var width=SDL.estimateTextWidth(fontData,String.fromCharCode(ch));if(advance){HEAP32[advance>>>2>>>0]=width}if(minx){HEAP32[minx>>>2>>>0]=0}if(maxx){HEAP32[maxx>>>2>>>0]=width}if(miny){HEAP32[miny>>>2>>>0]=0}if(maxy){HEAP32[maxy>>>2>>>0]=fontData.size}}Module["_TTF_GlyphMetrics"]=_TTF_GlyphMetrics;_TTF_GlyphMetrics.sig="ipippppp";function _TTF_FontAscent(font){font>>>=0;var fontData=SDL.fonts[font];return fontData.size*.98|0}Module["_TTF_FontAscent"]=_TTF_FontAscent;_TTF_FontAscent.sig="ip";function _TTF_FontDescent(font){font>>>=0;var fontData=SDL.fonts[font];return fontData.size*.02|0}Module["_TTF_FontDescent"]=_TTF_FontDescent;_TTF_FontDescent.sig="ip";function _TTF_FontHeight(font){font>>>=0;var fontData=SDL.fonts[font];return fontData.size}Module["_TTF_FontHeight"]=_TTF_FontHeight;_TTF_FontHeight.sig="ip";var _TTF_FontLineSkip=_TTF_FontHeight;Module["_TTF_FontLineSkip"]=_TTF_FontLineSkip;_TTF_FontLineSkip.sig="ip";var _TTF_Quit=()=>out("TTF_Quit called (and ignored)");Module["_TTF_Quit"]=_TTF_Quit;_TTF_Quit.sig="v";var SDL_gfx={drawRectangle:(surf,x1,y1,x2,y2,action,cssColor)=>{x1=x1<<16>>16;y1=y1<<16>>16;x2=x2<<16>>16;y2=y2<<16>>16;var surfData=SDL.surfaces[surf];assert(!surfData.locked);var x=x1{x1=x1<<16>>16;y1=y1<<16>>16;x2=x2<<16>>16;y2=y2<<16>>16;var surfData=SDL.surfaces[surf];assert(!surfData.locked);surfData.ctx.save();surfData.ctx.strokeStyle=cssColor;surfData.ctx.beginPath();surfData.ctx.moveTo(x1,y1);surfData.ctx.lineTo(x2,y2);surfData.ctx.stroke();surfData.ctx.restore()},drawEllipse:(surf,x,y,rx,ry,action,cssColor)=>{x=x<<16>>16;y=y<<16>>16;rx=rx<<16>>16;ry=ry<<16>>16;var surfData=SDL.surfaces[surf];assert(!surfData.locked);surfData.ctx.save();surfData.ctx.beginPath();surfData.ctx.translate(x,y);surfData.ctx.scale(rx,ry);surfData.ctx.arc(0,0,1,0,2*Math.PI);surfData.ctx.restore();surfData.ctx.save();surfData.ctx[action+"Style"]=cssColor;surfData.ctx[action]();surfData.ctx.restore()},translateColorToCSSRGBA:rgba=>`rgba(${rgba>>>24},${rgba>>16&255},${rgba>>8&255},${rgba&255})`};Module["SDL_gfx"]=SDL_gfx;function _boxColor(surf,x1,y1,x2,y2,color){surf>>>=0;return SDL_gfx.drawRectangle(surf,x1,y1,x2,y2,"fill",SDL_gfx.translateColorToCSSRGBA(color))}Module["_boxColor"]=_boxColor;_boxColor.sig="ipiiiii";function _boxRGBA(surf,x1,y1,x2,y2,r,g,b,a){surf>>>=0;return SDL_gfx.drawRectangle(surf,x1,y1,x2,y2,"fill",SDL.translateRGBAToCSSRGBA(r,g,b,a))}Module["_boxRGBA"]=_boxRGBA;_boxRGBA.sig="ipiiiiiiii";function _rectangleColor(surf,x1,y1,x2,y2,color){surf>>>=0;return SDL_gfx.drawRectangle(surf,x1,y1,x2,y2,"stroke",SDL_gfx.translateColorToCSSRGBA(color))}Module["_rectangleColor"]=_rectangleColor;_rectangleColor.sig="ipiiiii";function _rectangleRGBA(surf,x1,y1,x2,y2,r,g,b,a){surf>>>=0;return SDL_gfx.drawRectangle(surf,x1,y1,x2,y2,"stroke",SDL.translateRGBAToCSSRGBA(r,g,b,a))}Module["_rectangleRGBA"]=_rectangleRGBA;_rectangleRGBA.sig="ipiiiiiiii";function _ellipseColor(surf,x,y,rx,ry,color){surf>>>=0;return SDL_gfx.drawEllipse(surf,x,y,rx,ry,"stroke",SDL_gfx.translateColorToCSSRGBA(color))}Module["_ellipseColor"]=_ellipseColor;_ellipseColor.sig="ipiiiii";function _ellipseRGBA(surf,x,y,rx,ry,r,g,b,a){surf>>>=0;return SDL_gfx.drawEllipse(surf,x,y,rx,ry,"stroke",SDL.translateRGBAToCSSRGBA(r,g,b,a))}Module["_ellipseRGBA"]=_ellipseRGBA;_ellipseRGBA.sig="ipiiiiiiii";function _filledEllipseColor(surf,x,y,rx,ry,color){surf>>>=0;return SDL_gfx.drawEllipse(surf,x,y,rx,ry,"fill",SDL_gfx.translateColorToCSSRGBA(color))}Module["_filledEllipseColor"]=_filledEllipseColor;_filledEllipseColor.sig="ipiiiii";function _filledEllipseRGBA(surf,x,y,rx,ry,r,g,b,a){surf>>>=0;return SDL_gfx.drawEllipse(surf,x,y,rx,ry,"fill",SDL.translateRGBAToCSSRGBA(r,g,b,a))}Module["_filledEllipseRGBA"]=_filledEllipseRGBA;_filledEllipseRGBA.sig="ipiiiiiiii";function _lineColor(surf,x1,y1,x2,y2,color){surf>>>=0;return SDL_gfx.drawLine(surf,x1,y1,x2,y2,SDL_gfx.translateColorToCSSRGBA(color))}Module["_lineColor"]=_lineColor;_lineColor.sig="ipiiiii";function _lineRGBA(surf,x1,y1,x2,y2,r,g,b,a){surf>>>=0;return SDL_gfx.drawLine(surf,x1,y1,x2,y2,SDL.translateRGBAToCSSRGBA(r,g,b,a))}Module["_lineRGBA"]=_lineRGBA;_lineRGBA.sig="ipiiiiiiii";function _pixelRGBA(surf,x1,y1,r,g,b,a){surf>>>=0;return _boxRGBA(surf,x1,y1,x1,y1,r,g,b,a)}Module["_pixelRGBA"]=_pixelRGBA;_pixelRGBA.sig="ipiiiiii";var _SDL_GL_SetAttribute=(attr,value)=>{if(!(attr in SDL.glAttributes)){abort("Unknown SDL GL attribute ("+attr+"). Please check if your SDL version is supported.")}SDL.glAttributes[attr]=value};Module["_SDL_GL_SetAttribute"]=_SDL_GL_SetAttribute;_SDL_GL_SetAttribute.sig="iii";function _SDL_GL_GetAttribute(attr,value){value>>>=0;if(!(attr in SDL.glAttributes)){abort("Unknown SDL GL attribute ("+attr+"). Please check if your SDL version is supported.")}if(value)HEAP32[value>>>2>>>0]=SDL.glAttributes[attr];return 0}Module["_SDL_GL_GetAttribute"]=_SDL_GL_GetAttribute;_SDL_GL_GetAttribute.sig="iip";var _SDL_GL_SwapBuffers=()=>{Browser.doSwapBuffers?.()};Module["_SDL_GL_SwapBuffers"]=_SDL_GL_SwapBuffers;_SDL_GL_SwapBuffers.sig="v";function _SDL_GL_ExtensionSupported(extension){extension>>>=0;return Module.ctx.getExtension(extension)|0}Module["_SDL_GL_ExtensionSupported"]=_SDL_GL_ExtensionSupported;_SDL_GL_ExtensionSupported.sig="ip";function _SDL_DestroyWindow(window){window>>>=0}Module["_SDL_DestroyWindow"]=_SDL_DestroyWindow;_SDL_DestroyWindow.sig="vp";function _SDL_DestroyRenderer(renderer){renderer>>>=0}Module["_SDL_DestroyRenderer"]=_SDL_DestroyRenderer;_SDL_DestroyRenderer.sig="vp";function _SDL_GetWindowFlags(window){window>>>=0;if(Browser.isFullscreen){return 1}return 0}Module["_SDL_GetWindowFlags"]=_SDL_GetWindowFlags;_SDL_GetWindowFlags.sig="ip";function _SDL_GL_SwapWindow(window){window>>>=0}Module["_SDL_GL_SwapWindow"]=_SDL_GL_SwapWindow;_SDL_GL_SwapWindow.sig="vp";function _SDL_GL_MakeCurrent(window,context){window>>>=0;context>>>=0}Module["_SDL_GL_MakeCurrent"]=_SDL_GL_MakeCurrent;_SDL_GL_MakeCurrent.sig="ipp";function _SDL_GL_DeleteContext(context){context>>>=0}Module["_SDL_GL_DeleteContext"]=_SDL_GL_DeleteContext;_SDL_GL_DeleteContext.sig="vp";var _SDL_GL_GetSwapInterval=()=>{if(Browser.mainLoop.timingMode==1)return Browser.mainLoop.timingValue;else return 0};Module["_SDL_GL_GetSwapInterval"]=_SDL_GL_GetSwapInterval;_SDL_GL_GetSwapInterval.sig="i";var _SDL_GL_SetSwapInterval=state=>{_emscripten_set_main_loop_timing(1,state)};Module["_SDL_GL_SetSwapInterval"]=_SDL_GL_SetSwapInterval;_SDL_GL_SetSwapInterval.sig="ii";function _SDL_SetWindowTitle(window,title){window>>>=0;title>>>=0;if(title)document.title=UTF8ToString(title)}Module["_SDL_SetWindowTitle"]=_SDL_SetWindowTitle;_SDL_SetWindowTitle.sig="vpp";function _SDL_GetWindowSize(window,width,height){window>>>=0;width>>>=0;height>>>=0;var w=Module["canvas"].width;var h=Module["canvas"].height;if(width)HEAP32[width>>>2>>>0]=w;if(height)HEAP32[height>>>2>>>0]=h}Module["_SDL_GetWindowSize"]=_SDL_GetWindowSize;_SDL_GetWindowSize.sig="vppp";function _SDL_LogSetOutputFunction(callback,userdata){callback>>>=0;userdata>>>=0}Module["_SDL_LogSetOutputFunction"]=_SDL_LogSetOutputFunction;_SDL_LogSetOutputFunction.sig="vpp";function _SDL_SetWindowFullscreen(window,fullscreen){window>>>=0;if(Browser.isFullscreen){Module["canvas"].exitFullscreen();return 1}return 0}Module["_SDL_SetWindowFullscreen"]=_SDL_SetWindowFullscreen;_SDL_SetWindowFullscreen.sig="ipi";var _SDL_ClearError=()=>{};Module["_SDL_ClearError"]=_SDL_ClearError;_SDL_ClearError.sig="v";var _SDL_SetGamma=(r,g,b)=>-1;Module["_SDL_SetGamma"]=_SDL_SetGamma;_SDL_SetGamma.sig="ifff";function _SDL_SetGammaRamp(redTable,greenTable,blueTable){redTable>>>=0;greenTable>>>=0;blueTable>>>=0;return-1}Module["_SDL_SetGammaRamp"]=_SDL_SetGammaRamp;_SDL_SetGammaRamp.sig="ippp";var _SDL_NumJoysticks=()=>{var count=0;var gamepads=SDL.getGamepads();for(var i=0;iSDL.lastJoystickState.hasOwnProperty(deviceIndex+1)?1:0;Module["_SDL_JoystickOpened"]=_SDL_JoystickOpened;_SDL_JoystickOpened.sig="ii";function _SDL_JoystickIndex(joystick){joystick>>>=0;return joystick-1}Module["_SDL_JoystickIndex"]=_SDL_JoystickIndex;_SDL_JoystickIndex.sig="ip";function _SDL_JoystickNumAxes(joystick){joystick>>>=0;var gamepad=SDL.getGamepad(joystick-1);if(gamepad){return gamepad.axes.length}return 0}Module["_SDL_JoystickNumAxes"]=_SDL_JoystickNumAxes;_SDL_JoystickNumAxes.sig="ip";function _SDL_JoystickNumBalls(joystick){joystick>>>=0;return 0}Module["_SDL_JoystickNumBalls"]=_SDL_JoystickNumBalls;_SDL_JoystickNumBalls.sig="ip";function _SDL_JoystickNumHats(joystick){joystick>>>=0;return 0}Module["_SDL_JoystickNumHats"]=_SDL_JoystickNumHats;_SDL_JoystickNumHats.sig="ip";function _SDL_JoystickNumButtons(joystick){joystick>>>=0;var gamepad=SDL.getGamepad(joystick-1);if(gamepad){return gamepad.buttons.length}return 0}Module["_SDL_JoystickNumButtons"]=_SDL_JoystickNumButtons;_SDL_JoystickNumButtons.sig="ip";var _SDL_JoystickUpdate=()=>SDL.queryJoysticks();Module["_SDL_JoystickUpdate"]=_SDL_JoystickUpdate;_SDL_JoystickUpdate.sig="v";var _SDL_JoystickEventState=state=>{if(state<0){return SDL.joystickEventState}return SDL.joystickEventState=state};Module["_SDL_JoystickEventState"]=_SDL_JoystickEventState;_SDL_JoystickEventState.sig="ii";function _SDL_JoystickGetAxis(joystick,axis){joystick>>>=0;var gamepad=SDL.getGamepad(joystick-1);if(gamepad&&gamepad.axes.length>axis){return SDL.joystickAxisValueConversion(gamepad.axes[axis])}return 0}Module["_SDL_JoystickGetAxis"]=_SDL_JoystickGetAxis;_SDL_JoystickGetAxis.sig="ipi";function _SDL_JoystickGetHat(joystick,hat){joystick>>>=0;return 0}Module["_SDL_JoystickGetHat"]=_SDL_JoystickGetHat;_SDL_JoystickGetHat.sig="ipi";function _SDL_JoystickGetBall(joystick,ball,dxptr,dyptr){joystick>>>=0;dxptr>>>=0;dyptr>>>=0;return-1}Module["_SDL_JoystickGetBall"]=_SDL_JoystickGetBall;_SDL_JoystickGetBall.sig="ipipp";function _SDL_JoystickGetButton(joystick,button){joystick>>>=0;var gamepad=SDL.getGamepad(joystick-1);if(gamepad&&gamepad.buttons.length>button){return SDL.getJoystickButtonState(gamepad.buttons[button])?1:0}return 0}Module["_SDL_JoystickGetButton"]=_SDL_JoystickGetButton;_SDL_JoystickGetButton.sig="ipi";function _SDL_JoystickClose(joystick){joystick>>>=0;delete SDL.lastJoystickState[joystick]}Module["_SDL_JoystickClose"]=_SDL_JoystickClose;_SDL_JoystickClose.sig="vp";var _SDL_InitSubSystem=flags=>0;Module["_SDL_InitSubSystem"]=_SDL_InitSubSystem;_SDL_InitSubSystem.sig="ii";function _SDL_RWFromConstMem(mem,size){mem>>>=0;var id=SDL.rwops.length;SDL.rwops.push({bytes:mem,count:size});return id}Module["_SDL_RWFromConstMem"]=_SDL_RWFromConstMem;_SDL_RWFromConstMem.sig="ppi";var _SDL_RWFromMem=_SDL_RWFromConstMem;Module["_SDL_RWFromMem"]=_SDL_RWFromMem;_SDL_RWFromMem.sig="ppi";var _SDL_GetNumAudioDrivers=()=>1;Module["_SDL_GetNumAudioDrivers"]=_SDL_GetNumAudioDrivers;_SDL_GetNumAudioDrivers.sig="i";function _SDL_GetCurrentAudioDriver(){return stringToNewUTF8("Emscripten Audio")}Module["_SDL_GetCurrentAudioDriver"]=_SDL_GetCurrentAudioDriver;_SDL_GetCurrentAudioDriver.sig="p";var _SDL_GetScancodeFromKey=key=>SDL.scanCodes[key];Module["_SDL_GetScancodeFromKey"]=_SDL_GetScancodeFromKey;_SDL_GetScancodeFromKey.sig="ii";function _SDL_GetAudioDriver(index){return _SDL_GetCurrentAudioDriver()}Module["_SDL_GetAudioDriver"]=_SDL_GetAudioDriver;_SDL_GetAudioDriver.sig="pi";var _SDL_EnableUNICODE=on=>{var ret=SDL.unicode||0;SDL.unicode=on;return ret};Module["_SDL_EnableUNICODE"]=_SDL_EnableUNICODE;_SDL_EnableUNICODE.sig="ii";var _SDL_AddTimer=function(interval,callback,param){callback>>>=0;param>>>=0;return safeSetTimeout(()=>getWasmTableEntry(callback)(interval,param),interval)};Module["_SDL_AddTimer"]=_SDL_AddTimer;_SDL_AddTimer.sig="iipp";var _SDL_RemoveTimer=id=>{clearTimeout(id);return true};Module["_SDL_RemoveTimer"]=_SDL_RemoveTimer;_SDL_RemoveTimer.sig="ii";function _SDL_CreateThread(fs,data,pfnBeginThread,pfnEndThread){fs>>>=0;data>>>=0;throw"SDL threads cannot be supported in the web platform because they assume shared state. See emscripten_create_worker etc. for a message-passing concurrency model that does let you run code in another thread."}Module["_SDL_CreateThread"]=_SDL_CreateThread;_SDL_CreateThread.sig="ppp";function _SDL_WaitThread(thread,status){thread>>>=0;status>>>=0;throw"SDL_WaitThread"}Module["_SDL_WaitThread"]=_SDL_WaitThread;_SDL_WaitThread.sig="vpp";function _SDL_GetThreadID(thread){thread>>>=0;throw"SDL_GetThreadID"}Module["_SDL_GetThreadID"]=_SDL_GetThreadID;_SDL_GetThreadID.sig="pp";function _SDL_ThreadID(){return 0}Module["_SDL_ThreadID"]=_SDL_ThreadID;_SDL_ThreadID.sig="p";function _SDL_AllocRW(){throw"SDL_AllocRW: TODO"}Module["_SDL_AllocRW"]=_SDL_AllocRW;_SDL_AllocRW.sig="p";function _SDL_CondBroadcast(cond){cond>>>=0;throw"SDL_CondBroadcast: TODO"}Module["_SDL_CondBroadcast"]=_SDL_CondBroadcast;_SDL_CondBroadcast.sig="ip";function _SDL_CondWaitTimeout(cond,mutex,ms){cond>>>=0;mutex>>>=0;throw"SDL_CondWaitTimeout: TODO"}Module["_SDL_CondWaitTimeout"]=_SDL_CondWaitTimeout;_SDL_CondWaitTimeout.sig="ippi";var _SDL_WM_IconifyWindow=()=>{throw"SDL_WM_IconifyWindow TODO"};Module["_SDL_WM_IconifyWindow"]=_SDL_WM_IconifyWindow;_SDL_WM_IconifyWindow.sig="i";function _Mix_SetPostMix(func,arg){func>>>=0;arg>>>=0;return warnOnce("Mix_SetPostMix: TODO")}Module["_Mix_SetPostMix"]=_Mix_SetPostMix;_Mix_SetPostMix.sig="vpp";function _Mix_VolumeChunk(chunk,volume){chunk>>>=0;throw"Mix_VolumeChunk: TODO"}Module["_Mix_VolumeChunk"]=_Mix_VolumeChunk;_Mix_VolumeChunk.sig="ipi";var _Mix_SetPosition=(channel,angle,distance)=>{throw"Mix_SetPosition: TODO"};Module["_Mix_SetPosition"]=_Mix_SetPosition;_Mix_SetPosition.sig="iiii";function _Mix_QuerySpec(frequency,format,channels){frequency>>>=0;format>>>=0;channels>>>=0;throw"Mix_QuerySpec: TODO"}Module["_Mix_QuerySpec"]=_Mix_QuerySpec;_Mix_QuerySpec.sig="ippp";function _Mix_FadeInChannelTimed(channel,chunk,loop,ms,ticks){chunk>>>=0;throw"Mix_FadeInChannelTimed"}Module["_Mix_FadeInChannelTimed"]=_Mix_FadeInChannelTimed;_Mix_FadeInChannelTimed.sig="iipiii";var _Mix_FadeOutChannel=()=>{throw"Mix_FadeOutChannel"};Module["_Mix_FadeOutChannel"]=_Mix_FadeOutChannel;_Mix_FadeOutChannel.sig="iii";function _Mix_Linked_Version(){throw"Mix_Linked_Version: TODO"}Module["_Mix_Linked_Version"]=_Mix_Linked_Version;_Mix_Linked_Version.sig="p";function _SDL_SaveBMP_RW(surface,dst,freedst){surface>>>=0;dst>>>=0;throw"SDL_SaveBMP_RW: TODO"}Module["_SDL_SaveBMP_RW"]=_SDL_SaveBMP_RW;_SDL_SaveBMP_RW.sig="ippi";function _SDL_WM_SetIcon(icon,mask){icon>>>=0;mask>>>=0}Module["_SDL_WM_SetIcon"]=_SDL_WM_SetIcon;_SDL_WM_SetIcon.sig="vpp";var _SDL_HasRDTSC=()=>0;Module["_SDL_HasRDTSC"]=_SDL_HasRDTSC;_SDL_HasRDTSC.sig="i";var _SDL_HasMMX=()=>0;Module["_SDL_HasMMX"]=_SDL_HasMMX;_SDL_HasMMX.sig="i";var _SDL_HasMMXExt=()=>0;Module["_SDL_HasMMXExt"]=_SDL_HasMMXExt;_SDL_HasMMXExt.sig="i";var _SDL_Has3DNow=()=>0;Module["_SDL_Has3DNow"]=_SDL_Has3DNow;_SDL_Has3DNow.sig="i";var _SDL_Has3DNowExt=()=>0;Module["_SDL_Has3DNowExt"]=_SDL_Has3DNowExt;_SDL_Has3DNowExt.sig="i";var _SDL_HasSSE=()=>0;Module["_SDL_HasSSE"]=_SDL_HasSSE;_SDL_HasSSE.sig="i";var _SDL_HasSSE2=()=>0;Module["_SDL_HasSSE2"]=_SDL_HasSSE2;_SDL_HasSSE2.sig="i";var _SDL_HasAltiVec=()=>0;Module["_SDL_HasAltiVec"]=_SDL_HasAltiVec;_SDL_HasAltiVec.sig="i";if(!Module.createInvoke){Module.createInvoke=Module.createInvokeFunction}registerWasmPlugin();FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;if(ENVIRONMENT_IS_NODE){NODEFS.staticInit()}var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i)}var miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){miniTempWebGLIntBuffers[i]=miniTempWebGLIntBuffersStorage.subarray(0,i)}var emSetImmediate;var emClearImmediate;if(typeof setImmediate!="undefined"){emSetImmediate=setImmediateWrapped;emClearImmediate=clearImmediateWrapped}else if(typeof addEventListener=="function"){var __setImmediate_id_counter=0;var __setImmediate_queue=[];var __setImmediate_message_id="_si";var __setImmediate_cb=e=>{if(e.data===__setImmediate_message_id){e.stopPropagation();__setImmediate_queue.shift()();++__setImmediate_id_counter}};addEventListener("message",__setImmediate_cb,true);emSetImmediate=func=>{postMessage(__setImmediate_message_id,"*");return __setImmediate_id_counter+__setImmediate_queue.push(func)-1};emClearImmediate=id=>{var index=id-__setImmediate_id_counter;if(index>=0&&index<__setImmediate_queue.length)__setImmediate_queue[index]=()=>{}}}Module["requestFullscreen"]=Browser.requestFullscreen;Module["requestAnimationFrame"]=Browser.requestAnimationFrame;Module["setCanvasSize"]=Browser.setCanvasSize;Module["pauseMainLoop"]=Browser.mainLoop.pause;Module["resumeMainLoop"]=Browser.mainLoop.resume;Module["getUserMedia"]=Browser.getUserMedia;Module["createContext"]=Browser.createContext;var preloadedImages={};var preloadedAudios={};var wasmImports={IMG_Init:_IMG_Init,IMG_Load:_IMG_Load,IMG_Load_RW:_IMG_Load_RW,IMG_Quit:_IMG_Quit,JsArray_count_js:JsArray_count_js,JsArray_index_js:JsArray_index_js,JsArray_inplace_repeat_js:JsArray_inplace_repeat_js,JsArray_repeat_js:JsArray_repeat_js,JsArray_reverse_js:JsArray_reverse_js,JsArray_reversed_iterator:JsArray_reversed_iterator,JsBuffer_DecodeString_js:JsBuffer_DecodeString_js,JsBuffer_get_info:JsBuffer_get_info,JsDoubleProxy_unwrap_helper:JsDoubleProxy_unwrap_helper,JsException_new_helper:JsException_new_helper,JsMap_GetIter_js:JsMap_GetIter_js,JsMap_clear_js:JsMap_clear_js,JsObjMap_GetIter_js:JsObjMap_GetIter_js,JsObjMap_ass_subscript_js:JsObjMap_ass_subscript_js,JsObjMap_contains_js:JsObjMap_contains_js,JsObjMap_length_js:JsObjMap_length_js,JsObjMap_subscript_js:JsObjMap_subscript_js,JsProxy_Bool_js:JsProxy_Bool_js,JsProxy_DelAttr_js:JsProxy_DelAttr_js,JsProxy_Dir_js:JsProxy_Dir_js,JsProxy_GetAsyncIter_js:JsProxy_GetAsyncIter_js,JsProxy_GetAttr_js:JsProxy_GetAttr_js,JsProxy_GetIter_js:JsProxy_GetIter_js,JsProxy_SetAttr_js:JsProxy_SetAttr_js,JsProxy_compute_typeflags:JsProxy_compute_typeflags,JsProxy_subscript_js:JsProxy_subscript_js,JsvArray_Check:JsvArray_Check,JsvArray_Delete:JsvArray_Delete,JsvArray_Extend:JsvArray_Extend,JsvArray_Get:JsvArray_Get,JsvArray_Insert:JsvArray_Insert,JsvArray_New:JsvArray_New,JsvArray_Push:JsvArray_Push,JsvArray_Set:JsvArray_Set,JsvArray_ShallowCopy:JsvArray_ShallowCopy,JsvArray_slice:JsvArray_slice,JsvArray_slice_assign:JsvArray_slice_assign,JsvAsyncGenerator_Check:JsvAsyncGenerator_Check,JsvBuffer_assignFromPtr:JsvBuffer_assignFromPtr,JsvBuffer_assignToPtr:JsvBuffer_assignToPtr,JsvBuffer_intoFile:JsvBuffer_intoFile,JsvBuffer_readFromFile:JsvBuffer_readFromFile,JsvBuffer_writeToFile:JsvBuffer_writeToFile,JsvError_Throw:JsvError_Throw,JsvFunction_CallBound:JsvFunction_CallBound,JsvFunction_Call_OneArg:JsvFunction_Call_OneArg,JsvFunction_Check:JsvFunction_Check,JsvFunction_Construct:JsvFunction_Construct,JsvGenerator_Check:JsvGenerator_Check,JsvLiteralMap_New:JsvLiteralMap_New,JsvMap_New:JsvMap_New,JsvMap_Set:JsvMap_Set,JsvNoValue_Check:JsvNoValue_Check,JsvNum_fromDigits:JsvNum_fromDigits,JsvNum_fromDouble:JsvNum_fromDouble,JsvNum_fromInt:JsvNum_fromInt,JsvObject_CallMethod:JsvObject_CallMethod,JsvObject_CallMethod_NoArgs:JsvObject_CallMethod_NoArgs,JsvObject_CallMethod_OneArg:JsvObject_CallMethod_OneArg,JsvObject_CallMethod_TwoArgs:JsvObject_CallMethod_TwoArgs,JsvObject_Entries:JsvObject_Entries,JsvObject_Keys:JsvObject_Keys,JsvObject_New:JsvObject_New,JsvObject_SetAttr:JsvObject_SetAttr,JsvObject_Values:JsvObject_Values,JsvObject_toString:JsvObject_toString,JsvPromise_Check:JsvPromise_Check,JsvPromise_Resolve:JsvPromise_Resolve,JsvPromise_Syncify_handleError:JsvPromise_Syncify_handleError,JsvSet_Add:JsvSet_Add,JsvSet_New:JsvSet_New,JsvUTF8ToString:JsvUTF8ToString,Jsv_constructorName:Jsv_constructorName,Jsv_equal:Jsv_equal,Jsv_greater_than:Jsv_greater_than,Jsv_greater_than_equal:Jsv_greater_than_equal,Jsv_less_than:Jsv_less_than,Jsv_less_than_equal:Jsv_less_than_equal,Jsv_not_equal:Jsv_not_equal,Jsv_to_bool:Jsv_to_bool,Jsv_typeof:Jsv_typeof,Mix_AllocateChannels:_Mix_AllocateChannels,Mix_ChannelFinished:_Mix_ChannelFinished,Mix_CloseAudio:_Mix_CloseAudio,Mix_FadeInChannelTimed:_Mix_FadeInChannelTimed,Mix_FadeInMusicPos:_Mix_FadeInMusicPos,Mix_FadeOutChannel:_Mix_FadeOutChannel,Mix_FadeOutMusic:_Mix_FadeOutMusic,Mix_FadingChannel:_Mix_FadingChannel,Mix_FreeChunk:_Mix_FreeChunk,Mix_FreeMusic:_Mix_FreeMusic,Mix_HaltChannel:_Mix_HaltChannel,Mix_HaltMusic:_Mix_HaltMusic,Mix_HookMusicFinished:_Mix_HookMusicFinished,Mix_Init:_Mix_Init,Mix_Linked_Version:_Mix_Linked_Version,Mix_LoadMUS:_Mix_LoadMUS,Mix_LoadMUS_RW:_Mix_LoadMUS_RW,Mix_LoadWAV:_Mix_LoadWAV,Mix_LoadWAV_RW:_Mix_LoadWAV_RW,Mix_OpenAudio:_Mix_OpenAudio,Mix_Pause:_Mix_Pause,Mix_PauseMusic:_Mix_PauseMusic,Mix_Paused:_Mix_Paused,Mix_PausedMusic:_Mix_PausedMusic,Mix_PlayChannelTimed:_Mix_PlayChannelTimed,Mix_PlayMusic:_Mix_PlayMusic,Mix_Playing:_Mix_Playing,Mix_PlayingMusic:_Mix_PlayingMusic,Mix_QuerySpec:_Mix_QuerySpec,Mix_QuickLoad_RAW:_Mix_QuickLoad_RAW,Mix_Quit:_Mix_Quit,Mix_ReserveChannels:_Mix_ReserveChannels,Mix_Resume:_Mix_Resume,Mix_ResumeMusic:_Mix_ResumeMusic,Mix_SetPanning:_Mix_SetPanning,Mix_SetPosition:_Mix_SetPosition,Mix_SetPostMix:_Mix_SetPostMix,Mix_Volume:_Mix_Volume,Mix_VolumeChunk:_Mix_VolumeChunk,Mix_VolumeMusic:_Mix_VolumeMusic,SDL_AddTimer:_SDL_AddTimer,SDL_AllocRW:_SDL_AllocRW,SDL_AudioDriverName:_SDL_AudioDriverName,SDL_AudioQuit:_SDL_AudioQuit,SDL_ClearError:_SDL_ClearError,SDL_CloseAudio:_SDL_CloseAudio,SDL_CondBroadcast:_SDL_CondBroadcast,SDL_CondSignal:_SDL_CondSignal,SDL_CondWait:_SDL_CondWait,SDL_CondWaitTimeout:_SDL_CondWaitTimeout,SDL_ConvertSurface:_SDL_ConvertSurface,SDL_CreateCond:_SDL_CreateCond,SDL_CreateMutex:_SDL_CreateMutex,SDL_CreateRGBSurface:_SDL_CreateRGBSurface,SDL_CreateRGBSurfaceFrom:_SDL_CreateRGBSurfaceFrom,SDL_CreateThread:_SDL_CreateThread,SDL_Delay:_SDL_Delay,SDL_DestroyCond:_SDL_DestroyCond,SDL_DestroyMutex:_SDL_DestroyMutex,SDL_DestroyRenderer:_SDL_DestroyRenderer,SDL_DestroyWindow:_SDL_DestroyWindow,SDL_DisplayFormatAlpha:_SDL_DisplayFormatAlpha,SDL_EnableKeyRepeat:_SDL_EnableKeyRepeat,SDL_EnableUNICODE:_SDL_EnableUNICODE,SDL_FillRect:_SDL_FillRect,SDL_Flip:_SDL_Flip,SDL_FreeRW:_SDL_FreeRW,SDL_FreeSurface:_SDL_FreeSurface,SDL_GL_DeleteContext:_SDL_GL_DeleteContext,SDL_GL_ExtensionSupported:_SDL_GL_ExtensionSupported,SDL_GL_GetAttribute:_SDL_GL_GetAttribute,SDL_GL_GetSwapInterval:_SDL_GL_GetSwapInterval,SDL_GL_MakeCurrent:_SDL_GL_MakeCurrent,SDL_GL_SetAttribute:_SDL_GL_SetAttribute,SDL_GL_SetSwapInterval:_SDL_GL_SetSwapInterval,SDL_GL_SwapBuffers:_SDL_GL_SwapBuffers,SDL_GL_SwapWindow:_SDL_GL_SwapWindow,SDL_GetAppState:_SDL_GetAppState,SDL_GetAudioDriver:_SDL_GetAudioDriver,SDL_GetClipRect:_SDL_GetClipRect,SDL_GetCurrentAudioDriver:_SDL_GetCurrentAudioDriver,SDL_GetError:_SDL_GetError,SDL_GetKeyName:_SDL_GetKeyName,SDL_GetKeyState:_SDL_GetKeyState,SDL_GetKeyboardState:_SDL_GetKeyboardState,SDL_GetModState:_SDL_GetModState,SDL_GetMouseState:_SDL_GetMouseState,SDL_GetNumAudioDrivers:_SDL_GetNumAudioDrivers,SDL_GetRGB:_SDL_GetRGB,SDL_GetRGBA:_SDL_GetRGBA,SDL_GetScancodeFromKey:_SDL_GetScancodeFromKey,SDL_GetThreadID:_SDL_GetThreadID,SDL_GetTicks:_SDL_GetTicks,SDL_GetVideoInfo:_SDL_GetVideoInfo,SDL_GetVideoSurface:_SDL_GetVideoSurface,SDL_GetWindowFlags:_SDL_GetWindowFlags,SDL_GetWindowSize:_SDL_GetWindowSize,SDL_Has3DNow:_SDL_Has3DNow,SDL_Has3DNowExt:_SDL_Has3DNowExt,SDL_HasAltiVec:_SDL_HasAltiVec,SDL_HasMMX:_SDL_HasMMX,SDL_HasMMXExt:_SDL_HasMMXExt,SDL_HasRDTSC:_SDL_HasRDTSC,SDL_HasSSE:_SDL_HasSSE,SDL_HasSSE2:_SDL_HasSSE2,SDL_Init:_SDL_Init,SDL_InitSubSystem:_SDL_InitSubSystem,SDL_JoystickClose:_SDL_JoystickClose,SDL_JoystickEventState:_SDL_JoystickEventState,SDL_JoystickGetAxis:_SDL_JoystickGetAxis,SDL_JoystickGetBall:_SDL_JoystickGetBall,SDL_JoystickGetButton:_SDL_JoystickGetButton,SDL_JoystickGetHat:_SDL_JoystickGetHat,SDL_JoystickIndex:_SDL_JoystickIndex,SDL_JoystickName:_SDL_JoystickName,SDL_JoystickNumAxes:_SDL_JoystickNumAxes,SDL_JoystickNumBalls:_SDL_JoystickNumBalls,SDL_JoystickNumButtons:_SDL_JoystickNumButtons,SDL_JoystickNumHats:_SDL_JoystickNumHats,SDL_JoystickOpen:_SDL_JoystickOpen,SDL_JoystickOpened:_SDL_JoystickOpened,SDL_JoystickUpdate:_SDL_JoystickUpdate,SDL_Linked_Version:_SDL_Linked_Version,SDL_ListModes:_SDL_ListModes,SDL_LoadBMP_RW:_SDL_LoadBMP_RW,SDL_LockAudio:_SDL_LockAudio,SDL_LockSurface:_SDL_LockSurface,SDL_LogSetOutputFunction:_SDL_LogSetOutputFunction,SDL_LowerBlit:_SDL_LowerBlit,SDL_LowerBlitScaled:_SDL_LowerBlitScaled,SDL_MapRGB:_SDL_MapRGB,SDL_MapRGBA:_SDL_MapRGBA,SDL_NumJoysticks:_SDL_NumJoysticks,SDL_OpenAudio:_SDL_OpenAudio,SDL_PauseAudio:_SDL_PauseAudio,SDL_PeepEvents:_SDL_PeepEvents,SDL_PollEvent:_SDL_PollEvent,SDL_PumpEvents:_SDL_PumpEvents,SDL_PushEvent:_SDL_PushEvent,SDL_Quit:_SDL_Quit,SDL_QuitSubSystem:_SDL_QuitSubSystem,SDL_RWFromConstMem:_SDL_RWFromConstMem,SDL_RWFromFile:_SDL_RWFromFile,SDL_RWFromMem:_SDL_RWFromMem,SDL_RemoveTimer:_SDL_RemoveTimer,SDL_SaveBMP_RW:_SDL_SaveBMP_RW,SDL_SetAlpha:_SDL_SetAlpha,SDL_SetClipRect:_SDL_SetClipRect,SDL_SetColorKey:_SDL_SetColorKey,SDL_SetColors:_SDL_SetColors,SDL_SetError:_SDL_SetError,SDL_SetGamma:_SDL_SetGamma,SDL_SetGammaRamp:_SDL_SetGammaRamp,SDL_SetPalette:_SDL_SetPalette,SDL_SetVideoMode:_SDL_SetVideoMode,SDL_SetWindowFullscreen:_SDL_SetWindowFullscreen,SDL_SetWindowTitle:_SDL_SetWindowTitle,SDL_ShowCursor:_SDL_ShowCursor,SDL_StartTextInput:_SDL_StartTextInput,SDL_StopTextInput:_SDL_StopTextInput,SDL_ThreadID:_SDL_ThreadID,SDL_UnlockAudio:_SDL_UnlockAudio,SDL_UnlockSurface:_SDL_UnlockSurface,SDL_UpdateRect:_SDL_UpdateRect,SDL_UpdateRects:_SDL_UpdateRects,SDL_UpperBlit:_SDL_UpperBlit,SDL_UpperBlitScaled:_SDL_UpperBlitScaled,SDL_VideoDriverName:_SDL_VideoDriverName,SDL_VideoModeOK:_SDL_VideoModeOK,SDL_VideoQuit:_SDL_VideoQuit,SDL_WM_GrabInput:_SDL_WM_GrabInput,SDL_WM_IconifyWindow:_SDL_WM_IconifyWindow,SDL_WM_SetCaption:_SDL_WM_SetCaption,SDL_WM_SetIcon:_SDL_WM_SetIcon,SDL_WM_ToggleFullScreen:_SDL_WM_ToggleFullScreen,SDL_WaitThread:_SDL_WaitThread,SDL_WarpMouse:_SDL_WarpMouse,SDL_WasInit:_SDL_WasInit,SDL_mutexP:_SDL_mutexP,SDL_mutexV:_SDL_mutexV,TTF_CloseFont:_TTF_CloseFont,TTF_FontAscent:_TTF_FontAscent,TTF_FontDescent:_TTF_FontDescent,TTF_FontHeight:_TTF_FontHeight,TTF_FontLineSkip:_TTF_FontLineSkip,TTF_GlyphMetrics:_TTF_GlyphMetrics,TTF_Init:_TTF_Init,TTF_OpenFont:_TTF_OpenFont,TTF_Quit:_TTF_Quit,TTF_RenderText_Blended:_TTF_RenderText_Blended,TTF_RenderText_Shaded:_TTF_RenderText_Shaded,TTF_RenderText_Solid:_TTF_RenderText_Solid,TTF_RenderUTF8_Solid:_TTF_RenderUTF8_Solid,TTF_SizeText:_TTF_SizeText,TTF_SizeUTF8:_TTF_SizeUTF8,_JsArray_PostProcess_helper:_JsArray_PostProcess_helper,_JsArray_PushEntry_helper:_JsArray_PushEntry_helper,_PyEM_GetCountArgsPtr:_PyEM_GetCountArgsPtr,_PyEM_TrampolineCall_JS:_PyEM_TrampolineCall_JS,_PyImport_InitFunc_TrampolineCall:_PyImport_InitFunc_TrampolineCall,_Py_CheckEmscriptenSignals_Helper:_Py_CheckEmscriptenSignals_Helper,_Py_emscripten_runtime:_Py_emscripten_runtime,_Unwind_Backtrace:__Unwind_Backtrace,_Unwind_DeleteException:__Unwind_DeleteException,_Unwind_FindEnclosingFunction:__Unwind_FindEnclosingFunction,_Unwind_GetIPInfo:__Unwind_GetIPInfo,_Unwind_RaiseException:__Unwind_RaiseException,__asctime_r:___asctime_r,__assert_fail:___assert_fail,__call_sighandler:___call_sighandler,__cxa_begin_catch:___cxa_begin_catch,__cxa_call_unexpected:___cxa_call_unexpected,__cxa_current_primary_exception:___cxa_current_primary_exception,__cxa_end_catch:___cxa_end_catch,__cxa_find_matching_catch_2:___cxa_find_matching_catch_2,__cxa_find_matching_catch_3:___cxa_find_matching_catch_3,__cxa_find_matching_catch_4:___cxa_find_matching_catch_4,__cxa_get_exception_ptr:___cxa_get_exception_ptr,__cxa_rethrow:___cxa_rethrow,__cxa_rethrow_primary_exception:___cxa_rethrow_primary_exception,__cxa_throw:___cxa_throw,__cxa_uncaught_exceptions:___cxa_uncaught_exceptions,__global_base:___global_base,__heap_base:___heap_base,__hiwire_deduplicate_delete:__hiwire_deduplicate_delete,__hiwire_deduplicate_get:__hiwire_deduplicate_get,__hiwire_deduplicate_new:__hiwire_deduplicate_new,__hiwire_deduplicate_set:__hiwire_deduplicate_set,__indirect_function_table:wasmTable,__memory_base:___memory_base,__resumeException:___resumeException,__stack_high:___stack_high,__stack_low:___stack_low,__stack_pointer:___stack_pointer,__syscall__newselect:___syscall__newselect,__syscall_accept4:___syscall_accept4,__syscall_bind:___syscall_bind,__syscall_chdir:___syscall_chdir,__syscall_chmod:___syscall_chmod,__syscall_connect:___syscall_connect,__syscall_dup:___syscall_dup,__syscall_dup3:___syscall_dup3,__syscall_faccessat:___syscall_faccessat,__syscall_fadvise64:___syscall_fadvise64,__syscall_fallocate:___syscall_fallocate,__syscall_fchdir:___syscall_fchdir,__syscall_fchmod:___syscall_fchmod,__syscall_fchmodat2:___syscall_fchmodat2,__syscall_fchown32:___syscall_fchown32,__syscall_fchownat:___syscall_fchownat,__syscall_fcntl64:___syscall_fcntl64,__syscall_fdatasync:___syscall_fdatasync,__syscall_fstat64:___syscall_fstat64,__syscall_fstatfs64:___syscall_fstatfs64,__syscall_ftruncate64:___syscall_ftruncate64,__syscall_getcwd:___syscall_getcwd,__syscall_getdents64:___syscall_getdents64,__syscall_getpeername:___syscall_getpeername,__syscall_getsockname:___syscall_getsockname,__syscall_getsockopt:___syscall_getsockopt,__syscall_ioctl:___syscall_ioctl,__syscall_listen:___syscall_listen,__syscall_lstat64:___syscall_lstat64,__syscall_mkdirat:___syscall_mkdirat,__syscall_mknodat:___syscall_mknodat,__syscall_newfstatat:___syscall_newfstatat,__syscall_openat:___syscall_openat,__syscall_pipe:___syscall_pipe,__syscall_poll:___syscall_poll,__syscall_readlinkat:___syscall_readlinkat,__syscall_recvfrom:___syscall_recvfrom,__syscall_recvmsg:___syscall_recvmsg,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_sendmsg:___syscall_sendmsg,__syscall_sendto:___syscall_sendto,__syscall_socket:___syscall_socket,__syscall_stat64:___syscall_stat64,__syscall_statfs64:___syscall_statfs64,__syscall_symlink:___syscall_symlink,__syscall_symlinkat:___syscall_symlinkat,__syscall_truncate64:___syscall_truncate64,__syscall_unlinkat:___syscall_unlinkat,__syscall_utimensat:___syscall_utimensat,__table_base:___table_base,_agen_handle_result_js:_agen_handle_result_js,_dlopen_js:__dlopen_js,_dlsym_catchup_js:__dlsym_catchup_js,_dlsym_js:__dlsym_js,_emscripten_dlopen_js:__emscripten_dlopen_js,_emscripten_fs_load_embedded_files:__emscripten_fs_load_embedded_files,_emscripten_get_now_is_monotonic:__emscripten_get_now_is_monotonic,_emscripten_get_progname:__emscripten_get_progname,_emscripten_lookup_name:__emscripten_lookup_name,_emscripten_push_main_loop_blocker:__emscripten_push_main_loop_blocker,_emscripten_push_uncounted_main_loop_blocker:__emscripten_push_uncounted_main_loop_blocker,_emscripten_runtime_keepalive_clear:__emscripten_runtime_keepalive_clear,_emscripten_set_offscreencanvas_size:__emscripten_set_offscreencanvas_size,_emscripten_system:__emscripten_system,_emscripten_throw_longjmp:__emscripten_throw_longjmp,_glGetActiveAttribOrUniform:__glGetActiveAttribOrUniform,_gmtime_js:__gmtime_js,_localtime_js:__localtime_js,_mktime_js:__mktime_js,_mmap_js:__mmap_js,_msync_js:__msync_js,_munmap_js:__munmap_js,_pyproxyGen_make_result:_pyproxyGen_make_result,_pyproxy_get_buffer_result:_pyproxy_get_buffer_result,_python2js_add_to_cache:_python2js_add_to_cache,_python2js_addto_postprocess_list:_python2js_addto_postprocess_list,_python2js_buffer_inner:_python2js_buffer_inner,_python2js_cache_lookup:_python2js_cache_lookup,_python2js_handle_postprocess_list:_python2js_handle_postprocess_list,_python2js_ucs1:_python2js_ucs1,_python2js_ucs2:_python2js_ucs2,_python2js_ucs4:_python2js_ucs4,_setitimer_js:__setitimer_js,_timegm_js:__timegm_js,_tzset_js:__tzset_js,abort:_abort,array_to_js:array_to_js,boxColor:_boxColor,boxRGBA:_boxRGBA,can_run_sync_js:can_run_sync_js,capture_stderr:capture_stderr,clock_res_get:_clock_res_get,clock_time_get:_clock_time_get,create_once_callable:create_once_callable,create_promise_handles:create_promise_handles,destroy_jsarray_entries:destroy_jsarray_entries,destroy_proxies:destroy_proxies,destroy_proxies_js:destroy_proxies_js,destroy_proxy:destroy_proxy,eglBindAPI:_eglBindAPI,eglChooseConfig:_eglChooseConfig,eglCreateContext:_eglCreateContext,eglCreateWindowSurface:_eglCreateWindowSurface,eglDestroyContext:_eglDestroyContext,eglDestroySurface:_eglDestroySurface,eglGetConfigAttrib:_eglGetConfigAttrib,eglGetConfigs:_eglGetConfigs,eglGetCurrentContext:_eglGetCurrentContext,eglGetCurrentDisplay:_eglGetCurrentDisplay,eglGetCurrentSurface:_eglGetCurrentSurface,eglGetDisplay:_eglGetDisplay,eglGetError:_eglGetError,eglInitialize:_eglInitialize,eglMakeCurrent:_eglMakeCurrent,eglQueryAPI:_eglQueryAPI,eglQueryContext:_eglQueryContext,eglQueryString:_eglQueryString,eglQuerySurface:_eglQuerySurface,eglReleaseThread:_eglReleaseThread,eglSwapBuffers:_eglSwapBuffers,eglSwapInterval:_eglSwapInterval,eglTerminate:_eglTerminate,eglWaitClient:_eglWaitClient,eglWaitGL:_eglWaitGL,eglWaitNative:_eglWaitNative,ellipseColor:_ellipseColor,ellipseRGBA:_ellipseRGBA,emscripten_SDL_SetEventHandler:_emscripten_SDL_SetEventHandler,emscripten_asm_const_async_on_main_thread:_emscripten_asm_const_async_on_main_thread,emscripten_asm_const_double:_emscripten_asm_const_double,emscripten_asm_const_double_sync_on_main_thread:_emscripten_asm_const_double_sync_on_main_thread,emscripten_asm_const_int:_emscripten_asm_const_int,emscripten_asm_const_int_sync_on_main_thread:_emscripten_asm_const_int_sync_on_main_thread,emscripten_asm_const_ptr:_emscripten_asm_const_ptr,emscripten_asm_const_ptr_sync_on_main_thread:_emscripten_asm_const_ptr_sync_on_main_thread,emscripten_async_call:_emscripten_async_call,emscripten_async_load_script:_emscripten_async_load_script,emscripten_async_run_script:_emscripten_async_run_script,emscripten_async_wget:_emscripten_async_wget,emscripten_async_wget2:_emscripten_async_wget2,emscripten_async_wget2_abort:_emscripten_async_wget2_abort,emscripten_async_wget2_data:_emscripten_async_wget2_data,emscripten_async_wget_data:_emscripten_async_wget_data,emscripten_call_worker:_emscripten_call_worker,emscripten_cancel_animation_frame:_emscripten_cancel_animation_frame,emscripten_cancel_main_loop:_emscripten_cancel_main_loop,emscripten_clear_immediate:_emscripten_clear_immediate,emscripten_clear_interval:_emscripten_clear_interval,emscripten_clear_timeout:_emscripten_clear_timeout,emscripten_console_error:_emscripten_console_error,emscripten_console_log:_emscripten_console_log,emscripten_console_warn:_emscripten_console_warn,emscripten_create_worker:_emscripten_create_worker,emscripten_date_now:_emscripten_date_now,emscripten_debugger:_emscripten_debugger,emscripten_destroy_worker:_emscripten_destroy_worker,emscripten_enter_soft_fullscreen:_emscripten_enter_soft_fullscreen,emscripten_err:_emscripten_err,emscripten_errn:_emscripten_errn,emscripten_exit_fullscreen:_emscripten_exit_fullscreen,emscripten_exit_pointerlock:_emscripten_exit_pointerlock,emscripten_exit_soft_fullscreen:_emscripten_exit_soft_fullscreen,emscripten_exit_with_live_runtime:_emscripten_exit_with_live_runtime,emscripten_force_exit:_emscripten_force_exit,emscripten_get_battery_status:_emscripten_get_battery_status,emscripten_get_callstack:_emscripten_get_callstack,emscripten_get_canvas_element_size:_emscripten_get_canvas_element_size,emscripten_get_canvas_size:_emscripten_get_canvas_size,emscripten_get_compiler_setting:_emscripten_get_compiler_setting,emscripten_get_device_pixel_ratio:_emscripten_get_device_pixel_ratio,emscripten_get_devicemotion_status:_emscripten_get_devicemotion_status,emscripten_get_deviceorientation_status:_emscripten_get_deviceorientation_status,emscripten_get_element_css_size:_emscripten_get_element_css_size,emscripten_get_fullscreen_status:_emscripten_get_fullscreen_status,emscripten_get_gamepad_status:_emscripten_get_gamepad_status,emscripten_get_heap_max:_emscripten_get_heap_max,emscripten_get_main_loop_timing:_emscripten_get_main_loop_timing,emscripten_get_module_name:_emscripten_get_module_name,emscripten_get_mouse_status:_emscripten_get_mouse_status,emscripten_get_now:_emscripten_get_now,emscripten_get_now_res:_emscripten_get_now_res,emscripten_get_num_gamepads:_emscripten_get_num_gamepads,emscripten_get_orientation_status:_emscripten_get_orientation_status,emscripten_get_pointerlock_status:_emscripten_get_pointerlock_status,emscripten_get_preloaded_image_data:_emscripten_get_preloaded_image_data,emscripten_get_preloaded_image_data_from_FILE:_emscripten_get_preloaded_image_data_from_FILE,emscripten_get_screen_size:_emscripten_get_screen_size,emscripten_get_visibility_status:_emscripten_get_visibility_status,emscripten_get_window_title:_emscripten_get_window_title,emscripten_get_worker_queue_size:_emscripten_get_worker_queue_size,emscripten_glActiveTexture:_emscripten_glActiveTexture,emscripten_glAttachShader:_emscripten_glAttachShader,emscripten_glBegin:_emscripten_glBegin,emscripten_glBeginQueryEXT:_emscripten_glBeginQueryEXT,emscripten_glBindAttribLocation:_emscripten_glBindAttribLocation,emscripten_glBindBuffer:_emscripten_glBindBuffer,emscripten_glBindFramebuffer:_emscripten_glBindFramebuffer,emscripten_glBindRenderbuffer:_emscripten_glBindRenderbuffer,emscripten_glBindTexture:_emscripten_glBindTexture,emscripten_glBindVertexArray:_emscripten_glBindVertexArray,emscripten_glBindVertexArrayOES:_emscripten_glBindVertexArrayOES,emscripten_glBlendColor:_emscripten_glBlendColor,emscripten_glBlendEquation:_emscripten_glBlendEquation,emscripten_glBlendEquationSeparate:_emscripten_glBlendEquationSeparate,emscripten_glBlendFunc:_emscripten_glBlendFunc,emscripten_glBlendFuncSeparate:_emscripten_glBlendFuncSeparate,emscripten_glBufferData:_emscripten_glBufferData,emscripten_glBufferSubData:_emscripten_glBufferSubData,emscripten_glCheckFramebufferStatus:_emscripten_glCheckFramebufferStatus,emscripten_glClear:_emscripten_glClear,emscripten_glClearColor:_emscripten_glClearColor,emscripten_glClearDepth:_emscripten_glClearDepth,emscripten_glClearDepthf:_emscripten_glClearDepthf,emscripten_glClearStencil:_emscripten_glClearStencil,emscripten_glColorMask:_emscripten_glColorMask,emscripten_glCompileShader:_emscripten_glCompileShader,emscripten_glCompressedTexImage2D:_emscripten_glCompressedTexImage2D,emscripten_glCompressedTexSubImage2D:_emscripten_glCompressedTexSubImage2D,emscripten_glCopyTexImage2D:_emscripten_glCopyTexImage2D,emscripten_glCopyTexSubImage2D:_emscripten_glCopyTexSubImage2D,emscripten_glCreateProgram:_emscripten_glCreateProgram,emscripten_glCreateShader:_emscripten_glCreateShader,emscripten_glCullFace:_emscripten_glCullFace,emscripten_glDeleteBuffers:_emscripten_glDeleteBuffers,emscripten_glDeleteFramebuffers:_emscripten_glDeleteFramebuffers,emscripten_glDeleteProgram:_emscripten_glDeleteProgram,emscripten_glDeleteQueriesEXT:_emscripten_glDeleteQueriesEXT,emscripten_glDeleteRenderbuffers:_emscripten_glDeleteRenderbuffers,emscripten_glDeleteShader:_emscripten_glDeleteShader,emscripten_glDeleteTextures:_emscripten_glDeleteTextures,emscripten_glDeleteVertexArrays:_emscripten_glDeleteVertexArrays,emscripten_glDeleteVertexArraysOES:_emscripten_glDeleteVertexArraysOES,emscripten_glDepthFunc:_emscripten_glDepthFunc,emscripten_glDepthMask:_emscripten_glDepthMask,emscripten_glDepthRange:_emscripten_glDepthRange,emscripten_glDepthRangef:_emscripten_glDepthRangef,emscripten_glDetachShader:_emscripten_glDetachShader,emscripten_glDisable:_emscripten_glDisable,emscripten_glDisableVertexAttribArray:_emscripten_glDisableVertexAttribArray,emscripten_glDrawArrays:_emscripten_glDrawArrays,emscripten_glDrawArraysInstanced:_emscripten_glDrawArraysInstanced,emscripten_glDrawArraysInstancedANGLE:_emscripten_glDrawArraysInstancedANGLE,emscripten_glDrawArraysInstancedARB:_emscripten_glDrawArraysInstancedARB,emscripten_glDrawArraysInstancedEXT:_emscripten_glDrawArraysInstancedEXT,emscripten_glDrawArraysInstancedNV:_emscripten_glDrawArraysInstancedNV,emscripten_glDrawBuffers:_emscripten_glDrawBuffers,emscripten_glDrawBuffersEXT:_emscripten_glDrawBuffersEXT,emscripten_glDrawBuffersWEBGL:_emscripten_glDrawBuffersWEBGL,emscripten_glDrawElements:_emscripten_glDrawElements,emscripten_glDrawElementsInstanced:_emscripten_glDrawElementsInstanced,emscripten_glDrawElementsInstancedANGLE:_emscripten_glDrawElementsInstancedANGLE,emscripten_glDrawElementsInstancedARB:_emscripten_glDrawElementsInstancedARB,emscripten_glDrawElementsInstancedEXT:_emscripten_glDrawElementsInstancedEXT,emscripten_glDrawElementsInstancedNV:_emscripten_glDrawElementsInstancedNV,emscripten_glEnable:_emscripten_glEnable,emscripten_glEnableVertexAttribArray:_emscripten_glEnableVertexAttribArray,emscripten_glEndQueryEXT:_emscripten_glEndQueryEXT,emscripten_glFinish:_emscripten_glFinish,emscripten_glFlush:_emscripten_glFlush,emscripten_glFramebufferRenderbuffer:_emscripten_glFramebufferRenderbuffer,emscripten_glFramebufferTexture2D:_emscripten_glFramebufferTexture2D,emscripten_glFrontFace:_emscripten_glFrontFace,emscripten_glGenBuffers:_emscripten_glGenBuffers,emscripten_glGenFramebuffers:_emscripten_glGenFramebuffers,emscripten_glGenQueriesEXT:_emscripten_glGenQueriesEXT,emscripten_glGenRenderbuffers:_emscripten_glGenRenderbuffers,emscripten_glGenTextures:_emscripten_glGenTextures,emscripten_glGenVertexArrays:_emscripten_glGenVertexArrays,emscripten_glGenVertexArraysOES:_emscripten_glGenVertexArraysOES,emscripten_glGenerateMipmap:_emscripten_glGenerateMipmap,emscripten_glGetActiveAttrib:_emscripten_glGetActiveAttrib,emscripten_glGetActiveUniform:_emscripten_glGetActiveUniform,emscripten_glGetAttachedShaders:_emscripten_glGetAttachedShaders,emscripten_glGetAttribLocation:_emscripten_glGetAttribLocation,emscripten_glGetBooleanv:_emscripten_glGetBooleanv,emscripten_glGetBufferParameteriv:_emscripten_glGetBufferParameteriv,emscripten_glGetError:_emscripten_glGetError,emscripten_glGetFloatv:_emscripten_glGetFloatv,emscripten_glGetFramebufferAttachmentParameteriv:_emscripten_glGetFramebufferAttachmentParameteriv,emscripten_glGetIntegerv:_emscripten_glGetIntegerv,emscripten_glGetProgramInfoLog:_emscripten_glGetProgramInfoLog,emscripten_glGetProgramiv:_emscripten_glGetProgramiv,emscripten_glGetQueryObjecti64vEXT:_emscripten_glGetQueryObjecti64vEXT,emscripten_glGetQueryObjectivEXT:_emscripten_glGetQueryObjectivEXT,emscripten_glGetQueryObjectui64vEXT:_emscripten_glGetQueryObjectui64vEXT,emscripten_glGetQueryObjectuivEXT:_emscripten_glGetQueryObjectuivEXT,emscripten_glGetQueryivEXT:_emscripten_glGetQueryivEXT,emscripten_glGetRenderbufferParameteriv:_emscripten_glGetRenderbufferParameteriv,emscripten_glGetShaderInfoLog:_emscripten_glGetShaderInfoLog,emscripten_glGetShaderPrecisionFormat:_emscripten_glGetShaderPrecisionFormat,emscripten_glGetShaderSource:_emscripten_glGetShaderSource,emscripten_glGetShaderiv:_emscripten_glGetShaderiv,emscripten_glGetString:_emscripten_glGetString,emscripten_glGetTexParameterfv:_emscripten_glGetTexParameterfv,emscripten_glGetTexParameteriv:_emscripten_glGetTexParameteriv,emscripten_glGetUniformLocation:_emscripten_glGetUniformLocation,emscripten_glGetUniformfv:_emscripten_glGetUniformfv,emscripten_glGetUniformiv:_emscripten_glGetUniformiv,emscripten_glGetVertexAttribPointerv:_emscripten_glGetVertexAttribPointerv,emscripten_glGetVertexAttribfv:_emscripten_glGetVertexAttribfv,emscripten_glGetVertexAttribiv:_emscripten_glGetVertexAttribiv,emscripten_glHint:_emscripten_glHint,emscripten_glIsBuffer:_emscripten_glIsBuffer,emscripten_glIsEnabled:_emscripten_glIsEnabled,emscripten_glIsFramebuffer:_emscripten_glIsFramebuffer,emscripten_glIsProgram:_emscripten_glIsProgram,emscripten_glIsQueryEXT:_emscripten_glIsQueryEXT,emscripten_glIsRenderbuffer:_emscripten_glIsRenderbuffer,emscripten_glIsShader:_emscripten_glIsShader,emscripten_glIsTexture:_emscripten_glIsTexture,emscripten_glIsVertexArray:_emscripten_glIsVertexArray,emscripten_glIsVertexArrayOES:_emscripten_glIsVertexArrayOES,emscripten_glLineWidth:_emscripten_glLineWidth,emscripten_glLinkProgram:_emscripten_glLinkProgram,emscripten_glLoadIdentity:_emscripten_glLoadIdentity,emscripten_glMatrixMode:_emscripten_glMatrixMode,emscripten_glMultiDrawArrays:_emscripten_glMultiDrawArrays,emscripten_glMultiDrawArraysANGLE:_emscripten_glMultiDrawArraysANGLE,emscripten_glMultiDrawArraysInstancedANGLE:_emscripten_glMultiDrawArraysInstancedANGLE,emscripten_glMultiDrawArraysInstancedWEBGL:_emscripten_glMultiDrawArraysInstancedWEBGL,emscripten_glMultiDrawArraysWEBGL:_emscripten_glMultiDrawArraysWEBGL,emscripten_glMultiDrawElements:_emscripten_glMultiDrawElements,emscripten_glMultiDrawElementsANGLE:_emscripten_glMultiDrawElementsANGLE,emscripten_glMultiDrawElementsInstancedANGLE:_emscripten_glMultiDrawElementsInstancedANGLE,emscripten_glMultiDrawElementsInstancedWEBGL:_emscripten_glMultiDrawElementsInstancedWEBGL,emscripten_glMultiDrawElementsWEBGL:_emscripten_glMultiDrawElementsWEBGL,emscripten_glPixelStorei:_emscripten_glPixelStorei,emscripten_glPolygonOffset:_emscripten_glPolygonOffset,emscripten_glQueryCounterEXT:_emscripten_glQueryCounterEXT,emscripten_glReadPixels:_emscripten_glReadPixels,emscripten_glReleaseShaderCompiler:_emscripten_glReleaseShaderCompiler,emscripten_glRenderbufferStorage:_emscripten_glRenderbufferStorage,emscripten_glSampleCoverage:_emscripten_glSampleCoverage,emscripten_glScissor:_emscripten_glScissor,emscripten_glShaderBinary:_emscripten_glShaderBinary,emscripten_glShaderSource:_emscripten_glShaderSource,emscripten_glStencilFunc:_emscripten_glStencilFunc,emscripten_glStencilFuncSeparate:_emscripten_glStencilFuncSeparate,emscripten_glStencilMask:_emscripten_glStencilMask,emscripten_glStencilMaskSeparate:_emscripten_glStencilMaskSeparate,emscripten_glStencilOp:_emscripten_glStencilOp,emscripten_glStencilOpSeparate:_emscripten_glStencilOpSeparate,emscripten_glTexImage2D:_emscripten_glTexImage2D,emscripten_glTexParameterf:_emscripten_glTexParameterf,emscripten_glTexParameterfv:_emscripten_glTexParameterfv,emscripten_glTexParameteri:_emscripten_glTexParameteri,emscripten_glTexParameteriv:_emscripten_glTexParameteriv,emscripten_glTexSubImage2D:_emscripten_glTexSubImage2D,emscripten_glUniform1f:_emscripten_glUniform1f,emscripten_glUniform1fv:_emscripten_glUniform1fv,emscripten_glUniform1i:_emscripten_glUniform1i,emscripten_glUniform1iv:_emscripten_glUniform1iv,emscripten_glUniform2f:_emscripten_glUniform2f,emscripten_glUniform2fv:_emscripten_glUniform2fv,emscripten_glUniform2i:_emscripten_glUniform2i,emscripten_glUniform2iv:_emscripten_glUniform2iv,emscripten_glUniform3f:_emscripten_glUniform3f,emscripten_glUniform3fv:_emscripten_glUniform3fv,emscripten_glUniform3i:_emscripten_glUniform3i,emscripten_glUniform3iv:_emscripten_glUniform3iv,emscripten_glUniform4f:_emscripten_glUniform4f,emscripten_glUniform4fv:_emscripten_glUniform4fv,emscripten_glUniform4i:_emscripten_glUniform4i,emscripten_glUniform4iv:_emscripten_glUniform4iv,emscripten_glUniformMatrix2fv:_emscripten_glUniformMatrix2fv,emscripten_glUniformMatrix3fv:_emscripten_glUniformMatrix3fv,emscripten_glUniformMatrix4fv:_emscripten_glUniformMatrix4fv,emscripten_glUseProgram:_emscripten_glUseProgram,emscripten_glValidateProgram:_emscripten_glValidateProgram,emscripten_glVertexAttrib1f:_emscripten_glVertexAttrib1f,emscripten_glVertexAttrib1fv:_emscripten_glVertexAttrib1fv,emscripten_glVertexAttrib2f:_emscripten_glVertexAttrib2f,emscripten_glVertexAttrib2fv:_emscripten_glVertexAttrib2fv,emscripten_glVertexAttrib3f:_emscripten_glVertexAttrib3f,emscripten_glVertexAttrib3fv:_emscripten_glVertexAttrib3fv,emscripten_glVertexAttrib4f:_emscripten_glVertexAttrib4f,emscripten_glVertexAttrib4fv:_emscripten_glVertexAttrib4fv,emscripten_glVertexAttribDivisor:_emscripten_glVertexAttribDivisor,emscripten_glVertexAttribDivisorANGLE:_emscripten_glVertexAttribDivisorANGLE,emscripten_glVertexAttribDivisorARB:_emscripten_glVertexAttribDivisorARB,emscripten_glVertexAttribDivisorEXT:_emscripten_glVertexAttribDivisorEXT,emscripten_glVertexAttribDivisorNV:_emscripten_glVertexAttribDivisorNV,emscripten_glVertexAttribPointer:_emscripten_glVertexAttribPointer,emscripten_glVertexPointer:_emscripten_glVertexPointer,emscripten_glViewport:_emscripten_glViewport,emscripten_has_asyncify:_emscripten_has_asyncify,emscripten_hide_mouse:_emscripten_hide_mouse,emscripten_html5_remove_all_event_listeners:_emscripten_html5_remove_all_event_listeners,emscripten_is_main_browser_thread:_emscripten_is_main_browser_thread,emscripten_is_webgl_context_lost:_emscripten_is_webgl_context_lost,emscripten_lock_orientation:_emscripten_lock_orientation,emscripten_log:_emscripten_log,emscripten_math_acos:_emscripten_math_acos,emscripten_math_acosh:_emscripten_math_acosh,emscripten_math_asin:_emscripten_math_asin,emscripten_math_asinh:_emscripten_math_asinh,emscripten_math_atan:_emscripten_math_atan,emscripten_math_atan2:_emscripten_math_atan2,emscripten_math_atanh:_emscripten_math_atanh,emscripten_math_cbrt:_emscripten_math_cbrt,emscripten_math_cos:_emscripten_math_cos,emscripten_math_cosh:_emscripten_math_cosh,emscripten_math_exp:_emscripten_math_exp,emscripten_math_expm1:_emscripten_math_expm1,emscripten_math_fmod:_emscripten_math_fmod,emscripten_math_hypot:_emscripten_math_hypot,emscripten_math_log:_emscripten_math_log,emscripten_math_log10:_emscripten_math_log10,emscripten_math_log1p:_emscripten_math_log1p,emscripten_math_log2:_emscripten_math_log2,emscripten_math_pow:_emscripten_math_pow,emscripten_math_random:_emscripten_math_random,emscripten_math_round:_emscripten_math_round,emscripten_math_sign:_emscripten_math_sign,emscripten_math_sin:_emscripten_math_sin,emscripten_math_sinh:_emscripten_math_sinh,emscripten_math_sqrt:_emscripten_math_sqrt,emscripten_math_tan:_emscripten_math_tan,emscripten_math_tanh:_emscripten_math_tanh,emscripten_notify_memory_growth:_emscripten_notify_memory_growth,emscripten_out:_emscripten_out,emscripten_outn:_emscripten_outn,emscripten_pause_main_loop:_emscripten_pause_main_loop,emscripten_pc_get_column:_emscripten_pc_get_column,emscripten_pc_get_file:_emscripten_pc_get_file,emscripten_pc_get_function:_emscripten_pc_get_function,emscripten_pc_get_line:_emscripten_pc_get_line,emscripten_performance_now:_emscripten_performance_now,emscripten_print_double:_emscripten_print_double,emscripten_promise_all:_emscripten_promise_all,emscripten_promise_all_settled:_emscripten_promise_all_settled,emscripten_promise_any:_emscripten_promise_any,emscripten_promise_await:_emscripten_promise_await,emscripten_promise_create:_emscripten_promise_create,emscripten_promise_destroy:_emscripten_promise_destroy,emscripten_promise_race:_emscripten_promise_race,emscripten_promise_resolve:_emscripten_promise_resolve,emscripten_promise_then:_emscripten_promise_then,emscripten_random:_emscripten_random,emscripten_request_animation_frame:_emscripten_request_animation_frame,emscripten_request_animation_frame_loop:_emscripten_request_animation_frame_loop,emscripten_request_fullscreen:_emscripten_request_fullscreen,emscripten_request_fullscreen_strategy:_emscripten_request_fullscreen_strategy,emscripten_request_pointerlock:_emscripten_request_pointerlock,emscripten_resize_heap:_emscripten_resize_heap,emscripten_resume_main_loop:_emscripten_resume_main_loop,emscripten_return_address:_emscripten_return_address,emscripten_run_preload_plugins:_emscripten_run_preload_plugins,emscripten_run_preload_plugins_data:_emscripten_run_preload_plugins_data,emscripten_run_script:_emscripten_run_script,emscripten_run_script_int:_emscripten_run_script_int,emscripten_run_script_string:_emscripten_run_script_string,emscripten_runtime_keepalive_check:_emscripten_runtime_keepalive_check,emscripten_runtime_keepalive_pop:_emscripten_runtime_keepalive_pop,emscripten_runtime_keepalive_push:_emscripten_runtime_keepalive_push,emscripten_sample_gamepad_data:_emscripten_sample_gamepad_data,emscripten_set_batterychargingchange_callback_on_thread:_emscripten_set_batterychargingchange_callback_on_thread,emscripten_set_batterylevelchange_callback_on_thread:_emscripten_set_batterylevelchange_callback_on_thread,emscripten_set_beforeunload_callback_on_thread:_emscripten_set_beforeunload_callback_on_thread,emscripten_set_blur_callback_on_thread:_emscripten_set_blur_callback_on_thread,emscripten_set_canvas_element_size:_emscripten_set_canvas_element_size,emscripten_set_canvas_size:_emscripten_set_canvas_size,emscripten_set_click_callback_on_thread:_emscripten_set_click_callback_on_thread,emscripten_set_dblclick_callback_on_thread:_emscripten_set_dblclick_callback_on_thread,emscripten_set_devicemotion_callback_on_thread:_emscripten_set_devicemotion_callback_on_thread,emscripten_set_deviceorientation_callback_on_thread:_emscripten_set_deviceorientation_callback_on_thread,emscripten_set_element_css_size:_emscripten_set_element_css_size,emscripten_set_focus_callback_on_thread:_emscripten_set_focus_callback_on_thread,emscripten_set_focusin_callback_on_thread:_emscripten_set_focusin_callback_on_thread,emscripten_set_focusout_callback_on_thread:_emscripten_set_focusout_callback_on_thread,emscripten_set_fullscreenchange_callback_on_thread:_emscripten_set_fullscreenchange_callback_on_thread,emscripten_set_gamepadconnected_callback_on_thread:_emscripten_set_gamepadconnected_callback_on_thread,emscripten_set_gamepaddisconnected_callback_on_thread:_emscripten_set_gamepaddisconnected_callback_on_thread,emscripten_set_immediate:_emscripten_set_immediate,emscripten_set_immediate_loop:_emscripten_set_immediate_loop,emscripten_set_interval:_emscripten_set_interval,emscripten_set_keydown_callback_on_thread:_emscripten_set_keydown_callback_on_thread,emscripten_set_keypress_callback_on_thread:_emscripten_set_keypress_callback_on_thread,emscripten_set_keyup_callback_on_thread:_emscripten_set_keyup_callback_on_thread,emscripten_set_main_loop:_emscripten_set_main_loop,emscripten_set_main_loop_arg:_emscripten_set_main_loop_arg,emscripten_set_main_loop_expected_blockers:_emscripten_set_main_loop_expected_blockers,emscripten_set_main_loop_timing:_emscripten_set_main_loop_timing,emscripten_set_mousedown_callback_on_thread:_emscripten_set_mousedown_callback_on_thread,emscripten_set_mouseenter_callback_on_thread:_emscripten_set_mouseenter_callback_on_thread,emscripten_set_mouseleave_callback_on_thread:_emscripten_set_mouseleave_callback_on_thread,emscripten_set_mousemove_callback_on_thread:_emscripten_set_mousemove_callback_on_thread,emscripten_set_mouseout_callback_on_thread:_emscripten_set_mouseout_callback_on_thread,emscripten_set_mouseover_callback_on_thread:_emscripten_set_mouseover_callback_on_thread,emscripten_set_mouseup_callback_on_thread:_emscripten_set_mouseup_callback_on_thread,emscripten_set_orientationchange_callback_on_thread:_emscripten_set_orientationchange_callback_on_thread,emscripten_set_pointerlockchange_callback_on_thread:_emscripten_set_pointerlockchange_callback_on_thread,emscripten_set_pointerlockerror_callback_on_thread:_emscripten_set_pointerlockerror_callback_on_thread,emscripten_set_resize_callback_on_thread:_emscripten_set_resize_callback_on_thread,emscripten_set_scroll_callback_on_thread:_emscripten_set_scroll_callback_on_thread,emscripten_set_socket_close_callback:_emscripten_set_socket_close_callback,emscripten_set_socket_connection_callback:_emscripten_set_socket_connection_callback,emscripten_set_socket_error_callback:_emscripten_set_socket_error_callback,emscripten_set_socket_listen_callback:_emscripten_set_socket_listen_callback,emscripten_set_socket_message_callback:_emscripten_set_socket_message_callback,emscripten_set_socket_open_callback:_emscripten_set_socket_open_callback,emscripten_set_timeout:_emscripten_set_timeout,emscripten_set_timeout_loop:_emscripten_set_timeout_loop,emscripten_set_touchcancel_callback_on_thread:_emscripten_set_touchcancel_callback_on_thread,emscripten_set_touchend_callback_on_thread:_emscripten_set_touchend_callback_on_thread,emscripten_set_touchmove_callback_on_thread:_emscripten_set_touchmove_callback_on_thread,emscripten_set_touchstart_callback_on_thread:_emscripten_set_touchstart_callback_on_thread,emscripten_set_visibilitychange_callback_on_thread:_emscripten_set_visibilitychange_callback_on_thread,emscripten_set_webglcontextlost_callback_on_thread:_emscripten_set_webglcontextlost_callback_on_thread,emscripten_set_webglcontextrestored_callback_on_thread:_emscripten_set_webglcontextrestored_callback_on_thread,emscripten_set_wheel_callback_on_thread:_emscripten_set_wheel_callback_on_thread,emscripten_set_window_title:_emscripten_set_window_title,emscripten_stack_snapshot:_emscripten_stack_snapshot,emscripten_stack_unwind_buffer:_emscripten_stack_unwind_buffer,emscripten_supports_offscreencanvas:_emscripten_supports_offscreencanvas,emscripten_throw_number:_emscripten_throw_number,emscripten_throw_string:_emscripten_throw_string,emscripten_unlock_orientation:_emscripten_unlock_orientation,emscripten_unwind_to_js_event_loop:_emscripten_unwind_to_js_event_loop,emscripten_vibrate:_emscripten_vibrate,emscripten_vibrate_pattern:_emscripten_vibrate_pattern,emscripten_webgl_commit_frame:_emscripten_webgl_commit_frame,emscripten_webgl_create_context:_emscripten_webgl_create_context,emscripten_webgl_destroy_context:_emscripten_webgl_destroy_context,emscripten_webgl_do_commit_frame:_emscripten_webgl_do_commit_frame,emscripten_webgl_do_create_context:_emscripten_webgl_do_create_context,emscripten_webgl_do_get_current_context:_emscripten_webgl_do_get_current_context,emscripten_webgl_enable_ANGLE_instanced_arrays:_emscripten_webgl_enable_ANGLE_instanced_arrays,emscripten_webgl_enable_OES_vertex_array_object:_emscripten_webgl_enable_OES_vertex_array_object,emscripten_webgl_enable_WEBGL_draw_buffers:_emscripten_webgl_enable_WEBGL_draw_buffers,emscripten_webgl_enable_WEBGL_multi_draw:_emscripten_webgl_enable_WEBGL_multi_draw,emscripten_webgl_enable_extension:_emscripten_webgl_enable_extension,emscripten_webgl_get_context_attributes:_emscripten_webgl_get_context_attributes,emscripten_webgl_get_current_context:_emscripten_webgl_get_current_context,emscripten_webgl_get_drawing_buffer_size:_emscripten_webgl_get_drawing_buffer_size,emscripten_webgl_get_parameter_d:_emscripten_webgl_get_parameter_d,emscripten_webgl_get_parameter_i64v:_emscripten_webgl_get_parameter_i64v,emscripten_webgl_get_parameter_o:_emscripten_webgl_get_parameter_o,emscripten_webgl_get_parameter_utf8:_emscripten_webgl_get_parameter_utf8,emscripten_webgl_get_parameter_v:_emscripten_webgl_get_parameter_v,emscripten_webgl_get_program_info_log_utf8:_emscripten_webgl_get_program_info_log_utf8,emscripten_webgl_get_program_parameter_d:_emscripten_webgl_get_program_parameter_d,emscripten_webgl_get_shader_info_log_utf8:_emscripten_webgl_get_shader_info_log_utf8,emscripten_webgl_get_shader_parameter_d:_emscripten_webgl_get_shader_parameter_d,emscripten_webgl_get_shader_source_utf8:_emscripten_webgl_get_shader_source_utf8,emscripten_webgl_get_supported_extensions:_emscripten_webgl_get_supported_extensions,emscripten_webgl_get_uniform_d:_emscripten_webgl_get_uniform_d,emscripten_webgl_get_uniform_v:_emscripten_webgl_get_uniform_v,emscripten_webgl_get_vertex_attrib_d:_emscripten_webgl_get_vertex_attrib_d,emscripten_webgl_get_vertex_attrib_o:_emscripten_webgl_get_vertex_attrib_o,emscripten_webgl_get_vertex_attrib_v:_emscripten_webgl_get_vertex_attrib_v,emscripten_webgl_make_context_current:_emscripten_webgl_make_context_current,emscripten_websocket_close:_emscripten_websocket_close,emscripten_websocket_deinitialize:_emscripten_websocket_deinitialize,emscripten_websocket_delete:_emscripten_websocket_delete,emscripten_websocket_get_buffered_amount:_emscripten_websocket_get_buffered_amount,emscripten_websocket_get_extensions:_emscripten_websocket_get_extensions,emscripten_websocket_get_extensions_length:_emscripten_websocket_get_extensions_length,emscripten_websocket_get_protocol:_emscripten_websocket_get_protocol,emscripten_websocket_get_protocol_length:_emscripten_websocket_get_protocol_length,emscripten_websocket_get_ready_state:_emscripten_websocket_get_ready_state,emscripten_websocket_get_url:_emscripten_websocket_get_url,emscripten_websocket_get_url_length:_emscripten_websocket_get_url_length,emscripten_websocket_is_supported:_emscripten_websocket_is_supported,emscripten_websocket_new:_emscripten_websocket_new,emscripten_websocket_send_binary:_emscripten_websocket_send_binary,emscripten_websocket_send_utf8_text:_emscripten_websocket_send_utf8_text,emscripten_websocket_set_onclose_callback_on_thread:_emscripten_websocket_set_onclose_callback_on_thread,emscripten_websocket_set_onerror_callback_on_thread:_emscripten_websocket_set_onerror_callback_on_thread,emscripten_websocket_set_onmessage_callback_on_thread:_emscripten_websocket_set_onmessage_callback_on_thread,emscripten_websocket_set_onopen_callback_on_thread:_emscripten_websocket_set_onopen_callback_on_thread,endprotoent:_endprotoent,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fail_test:fail_test,fd_close:_fd_close,fd_fdstat_get:_fd_fdstat_get,fd_pread:_fd_pread,fd_pwrite:_fd_pwrite,fd_read:_fd_read,fd_seek:_fd_seek,fd_sync:_fd_sync,fd_write:_fd_write,ffi_call_js:ffi_call_js,ffi_closure_alloc_js:ffi_closure_alloc_js,ffi_closure_free_js:ffi_closure_free_js,ffi_prep_closure_loc_js:ffi_prep_closure_loc_js,filledEllipseColor:_filledEllipseColor,filledEllipseRGBA:_filledEllipseRGBA,gc_register_proxies:gc_register_proxies,get_async_js_call_done_callback:get_async_js_call_done_callback,get_length_helper:get_length_helper,get_length_string:get_length_string,get_suspender:get_suspender,getaddrinfo:_getaddrinfo,getentropy:_getentropy,getnameinfo:_getnameinfo,getprotobyname:_getprotobyname,getprotobynumber:_getprotobynumber,getprotoent:_getprotoent,glActiveTexture:_glActiveTexture,glAttachShader:_glAttachShader,glBegin:_glBegin,glBeginQueryEXT:_glBeginQueryEXT,glBindAttribLocation:_glBindAttribLocation,glBindBuffer:_glBindBuffer,glBindFramebuffer:_glBindFramebuffer,glBindRenderbuffer:_glBindRenderbuffer,glBindTexture:_glBindTexture,glBindVertexArray:_glBindVertexArray,glBindVertexArrayOES:_glBindVertexArrayOES,glBlendColor:_glBlendColor,glBlendEquation:_glBlendEquation,glBlendEquationSeparate:_glBlendEquationSeparate,glBlendFunc:_glBlendFunc,glBlendFuncSeparate:_glBlendFuncSeparate,glBufferData:_glBufferData,glBufferSubData:_glBufferSubData,glCheckFramebufferStatus:_glCheckFramebufferStatus,glClear:_glClear,glClearColor:_glClearColor,glClearDepth:_glClearDepth,glClearDepthf:_glClearDepthf,glClearStencil:_glClearStencil,glColorMask:_glColorMask,glCompileShader:_glCompileShader,glCompressedTexImage2D:_glCompressedTexImage2D,glCompressedTexSubImage2D:_glCompressedTexSubImage2D,glCopyTexImage2D:_glCopyTexImage2D,glCopyTexSubImage2D:_glCopyTexSubImage2D,glCreateProgram:_glCreateProgram,glCreateShader:_glCreateShader,glCullFace:_glCullFace,glDeleteBuffers:_glDeleteBuffers,glDeleteFramebuffers:_glDeleteFramebuffers,glDeleteProgram:_glDeleteProgram,glDeleteQueriesEXT:_glDeleteQueriesEXT,glDeleteRenderbuffers:_glDeleteRenderbuffers,glDeleteShader:_glDeleteShader,glDeleteTextures:_glDeleteTextures,glDeleteVertexArrays:_glDeleteVertexArrays,glDeleteVertexArraysOES:_glDeleteVertexArraysOES,glDepthFunc:_glDepthFunc,glDepthMask:_glDepthMask,glDepthRange:_glDepthRange,glDepthRangef:_glDepthRangef,glDetachShader:_glDetachShader,glDisable:_glDisable,glDisableVertexAttribArray:_glDisableVertexAttribArray,glDrawArrays:_glDrawArrays,glDrawArraysInstanced:_glDrawArraysInstanced,glDrawArraysInstancedANGLE:_glDrawArraysInstancedANGLE,glDrawArraysInstancedARB:_glDrawArraysInstancedARB,glDrawArraysInstancedEXT:_glDrawArraysInstancedEXT,glDrawArraysInstancedNV:_glDrawArraysInstancedNV,glDrawBuffers:_glDrawBuffers,glDrawBuffersEXT:_glDrawBuffersEXT,glDrawBuffersWEBGL:_glDrawBuffersWEBGL,glDrawElements:_glDrawElements,glDrawElementsInstanced:_glDrawElementsInstanced,glDrawElementsInstancedANGLE:_glDrawElementsInstancedANGLE,glDrawElementsInstancedARB:_glDrawElementsInstancedARB,glDrawElementsInstancedEXT:_glDrawElementsInstancedEXT,glDrawElementsInstancedNV:_glDrawElementsInstancedNV,glEnable:_glEnable,glEnableVertexAttribArray:_glEnableVertexAttribArray,glEndQueryEXT:_glEndQueryEXT,glFinish:_glFinish,glFlush:_glFlush,glFramebufferRenderbuffer:_glFramebufferRenderbuffer,glFramebufferTexture2D:_glFramebufferTexture2D,glFrontFace:_glFrontFace,glGenBuffers:_glGenBuffers,glGenFramebuffers:_glGenFramebuffers,glGenQueriesEXT:_glGenQueriesEXT,glGenRenderbuffers:_glGenRenderbuffers,glGenTextures:_glGenTextures,glGenVertexArrays:_glGenVertexArrays,glGenVertexArraysOES:_glGenVertexArraysOES,glGenerateMipmap:_glGenerateMipmap,glGetActiveAttrib:_glGetActiveAttrib,glGetActiveUniform:_glGetActiveUniform,glGetAttachedShaders:_glGetAttachedShaders,glGetAttribLocation:_glGetAttribLocation,glGetBooleanv:_glGetBooleanv,glGetBufferParameteriv:_glGetBufferParameteriv,glGetError:_glGetError,glGetFloatv:_glGetFloatv,glGetFramebufferAttachmentParameteriv:_glGetFramebufferAttachmentParameteriv,glGetIntegerv:_glGetIntegerv,glGetProgramInfoLog:_glGetProgramInfoLog,glGetProgramiv:_glGetProgramiv,glGetQueryObjecti64vEXT:_glGetQueryObjecti64vEXT,glGetQueryObjectivEXT:_glGetQueryObjectivEXT,glGetQueryObjectui64vEXT:_glGetQueryObjectui64vEXT,glGetQueryObjectuivEXT:_glGetQueryObjectuivEXT,glGetQueryivEXT:_glGetQueryivEXT,glGetRenderbufferParameteriv:_glGetRenderbufferParameteriv,glGetShaderInfoLog:_glGetShaderInfoLog,glGetShaderPrecisionFormat:_glGetShaderPrecisionFormat,glGetShaderSource:_glGetShaderSource,glGetShaderiv:_glGetShaderiv,glGetString:_glGetString,glGetTexParameterfv:_glGetTexParameterfv,glGetTexParameteriv:_glGetTexParameteriv,glGetUniformLocation:_glGetUniformLocation,glGetUniformfv:_glGetUniformfv,glGetUniformiv:_glGetUniformiv,glGetVertexAttribPointerv:_glGetVertexAttribPointerv,glGetVertexAttribfv:_glGetVertexAttribfv,glGetVertexAttribiv:_glGetVertexAttribiv,glHint:_glHint,glIsBuffer:_glIsBuffer,glIsEnabled:_glIsEnabled,glIsFramebuffer:_glIsFramebuffer,glIsProgram:_glIsProgram,glIsQueryEXT:_glIsQueryEXT,glIsRenderbuffer:_glIsRenderbuffer,glIsShader:_glIsShader,glIsTexture:_glIsTexture,glIsVertexArray:_glIsVertexArray,glIsVertexArrayOES:_glIsVertexArrayOES,glLineWidth:_glLineWidth,glLinkProgram:_glLinkProgram,glLoadIdentity:_glLoadIdentity,glMatrixMode:_glMatrixMode,glMultiDrawArrays:_glMultiDrawArrays,glMultiDrawArraysANGLE:_glMultiDrawArraysANGLE,glMultiDrawArraysInstancedANGLE:_glMultiDrawArraysInstancedANGLE,glMultiDrawArraysInstancedWEBGL:_glMultiDrawArraysInstancedWEBGL,glMultiDrawArraysWEBGL:_glMultiDrawArraysWEBGL,glMultiDrawElements:_glMultiDrawElements,glMultiDrawElementsANGLE:_glMultiDrawElementsANGLE,glMultiDrawElementsInstancedANGLE:_glMultiDrawElementsInstancedANGLE,glMultiDrawElementsInstancedWEBGL:_glMultiDrawElementsInstancedWEBGL,glMultiDrawElementsWEBGL:_glMultiDrawElementsWEBGL,glPixelStorei:_glPixelStorei,glPolygonOffset:_glPolygonOffset,glQueryCounterEXT:_glQueryCounterEXT,glReadPixels:_glReadPixels,glReleaseShaderCompiler:_glReleaseShaderCompiler,glRenderbufferStorage:_glRenderbufferStorage,glSampleCoverage:_glSampleCoverage,glScissor:_glScissor,glShaderBinary:_glShaderBinary,glShaderSource:_glShaderSource,glStencilFunc:_glStencilFunc,glStencilFuncSeparate:_glStencilFuncSeparate,glStencilMask:_glStencilMask,glStencilMaskSeparate:_glStencilMaskSeparate,glStencilOp:_glStencilOp,glStencilOpSeparate:_glStencilOpSeparate,glTexImage2D:_glTexImage2D,glTexParameterf:_glTexParameterf,glTexParameterfv:_glTexParameterfv,glTexParameteri:_glTexParameteri,glTexParameteriv:_glTexParameteriv,glTexSubImage2D:_glTexSubImage2D,glUniform1f:_glUniform1f,glUniform1fv:_glUniform1fv,glUniform1i:_glUniform1i,glUniform1iv:_glUniform1iv,glUniform2f:_glUniform2f,glUniform2fv:_glUniform2fv,glUniform2i:_glUniform2i,glUniform2iv:_glUniform2iv,glUniform3f:_glUniform3f,glUniform3fv:_glUniform3fv,glUniform3i:_glUniform3i,glUniform3iv:_glUniform3iv,glUniform4f:_glUniform4f,glUniform4fv:_glUniform4fv,glUniform4i:_glUniform4i,glUniform4iv:_glUniform4iv,glUniformMatrix2fv:_glUniformMatrix2fv,glUniformMatrix3fv:_glUniformMatrix3fv,glUniformMatrix4fv:_glUniformMatrix4fv,glUseProgram:_glUseProgram,glValidateProgram:_glValidateProgram,glVertexAttrib1f:_glVertexAttrib1f,glVertexAttrib1fv:_glVertexAttrib1fv,glVertexAttrib2f:_glVertexAttrib2f,glVertexAttrib2fv:_glVertexAttrib2fv,glVertexAttrib3f:_glVertexAttrib3f,glVertexAttrib3fv:_glVertexAttrib3fv,glVertexAttrib4f:_glVertexAttrib4f,glVertexAttrib4fv:_glVertexAttrib4fv,glVertexAttribDivisor:_glVertexAttribDivisor,glVertexAttribDivisorANGLE:_glVertexAttribDivisorANGLE,glVertexAttribDivisorARB:_glVertexAttribDivisorARB,glVertexAttribDivisorEXT:_glVertexAttribDivisorEXT,glVertexAttribDivisorNV:_glVertexAttribDivisorNV,glVertexAttribPointer:_glVertexAttribPointer,glVertexPointer:_glVertexPointer,glViewport:_glViewport,handle_next_result_js:handle_next_result_js,hiwire_invalid_ref:hiwire_invalid_ref,invoke_diii:invoke_diii,invoke_fiii:invoke_fiii,invoke_i:invoke_i,invoke_ii:invoke_ii,invoke_iii:invoke_iii,invoke_iiii:invoke_iiii,invoke_iiiii:invoke_iiiii,invoke_iiiiid:invoke_iiiiid,invoke_iiiiii:invoke_iiiiii,invoke_iiiiiii:invoke_iiiiiii,invoke_iiiiiiii:invoke_iiiiiiii,invoke_iiiiiiiiiii:invoke_iiiiiiiiiii,invoke_iiiiiiiiiiii:invoke_iiiiiiiiiiii,invoke_iiiiiiiiiiiii:invoke_iiiiiiiiiiiii,invoke_iiiiij:invoke_iiiiij,invoke_iiiiijj:invoke_iiiiijj,invoke_iiji:invoke_iiji,invoke_j:invoke_j,invoke_ji:invoke_ji,invoke_jii:invoke_jii,invoke_jiii:invoke_jiii,invoke_jiiii:invoke_jiiii,invoke_v:invoke_v,invoke_vi:invoke_vi,invoke_vii:invoke_vii,invoke_viid:invoke_viid,invoke_viif:invoke_viif,invoke_viii:invoke_viii,invoke_viiidi:invoke_viiidi,invoke_viiifi:invoke_viiifi,invoke_viiii:invoke_viiii,invoke_viiiii:invoke_viiiii,invoke_viiiiii:invoke_viiiiii,invoke_viiiiiii:invoke_viiiiiii,invoke_viiiiiiiiii:invoke_viiiiiiiiii,invoke_viiiiiiiiiiiiiii:invoke_viiiiiiiiiiiiiii,invoke_viijii:invoke_viijii,invoke_viijj:invoke_viijj,is_comlink_proxy:is_comlink_proxy,js2python_convert:js2python_convert,js2python_immutable_js:js2python_immutable_js,js2python_js:js2python_js,jslib_init_buffers_js:jslib_init_buffers_js,jslib_init_js:jslib_init_js,lineColor:_lineColor,lineRGBA:_lineRGBA,llvm_eh_typeid_for:_llvm_eh_typeid_for,memory:wasmMemory,my_dict_converter:my_dict_converter,new_error:new_error,pixelRGBA:_pixelRGBA,proc_exit:_proc_exit,proxy_cache_get:proxy_cache_get,proxy_cache_set:proxy_cache_set,pyodide_js_init:pyodide_js_init,pyproxy_AsPyObject:pyproxy_AsPyObject,pyproxy_Check:pyproxy_Check,pyproxy_new:pyproxy_new,pyproxy_new_ex:pyproxy_new_ex,python2js__default_converter_js:python2js__default_converter_js,python2js_custom__create_jscontext:python2js_custom__create_jscontext,random_get:_random_get,raw_call_js:raw_call_js,rectangleColor:_rectangleColor,rectangleRGBA:_rectangleRGBA,restoreState:restoreState,restore_stderr:restore_stderr,rotozoomSurface:_rotozoomSurface,saveState:saveState,setNetworkCallback:_setNetworkCallback,set_pyodide_module:set_pyodide_module,set_suspender:set_suspender,setprotoent:_setprotoent,stackAlloc:_stackAlloc,stackRestore:_stackRestore,stackSave:_stackSave,strftime:_strftime,strftime_l:_strftime_l,strptime:_strptime,strptime_l:_strptime_l,syncifyHandler:syncifyHandler,throw_no_gil:throw_no_gil,wrap_async_generator:wrap_async_generator,wrap_generator:wrap_generator,zoomSurface:_zoomSurface};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["__wasm_call_ctors"])();var ___wasm_apply_data_relocs=()=>(___wasm_apply_data_relocs=wasmExports["__wasm_apply_data_relocs"])();var _set_method_docstring=Module["_set_method_docstring"]=(a0,a1)=>(_set_method_docstring=Module["_set_method_docstring"]=wasmExports["set_method_docstring"])(a0,a1);var _PyObject_GetAttrString=Module["_PyObject_GetAttrString"]=(a0,a1)=>(_PyObject_GetAttrString=Module["_PyObject_GetAttrString"]=wasmExports["PyObject_GetAttrString"])(a0,a1);var __PyUnicode_FromId=Module["__PyUnicode_FromId"]=a0=>(__PyUnicode_FromId=Module["__PyUnicode_FromId"]=wasmExports["_PyUnicode_FromId"])(a0);var _PyObject_VectorcallMethod=Module["_PyObject_VectorcallMethod"]=(a0,a1,a2,a3)=>(_PyObject_VectorcallMethod=Module["_PyObject_VectorcallMethod"]=wasmExports["PyObject_VectorcallMethod"])(a0,a1,a2,a3);var _PyUnicode_AsUTF8AndSize=Module["_PyUnicode_AsUTF8AndSize"]=(a0,a1)=>(_PyUnicode_AsUTF8AndSize=Module["_PyUnicode_AsUTF8AndSize"]=wasmExports["PyUnicode_AsUTF8AndSize"])(a0,a1);var _malloc=a0=>(_malloc=wasmExports["malloc"])(a0);var _memcpy=(a0,a1,a2)=>(_memcpy=wasmExports["memcpy"])(a0,a1,a2);var __Py_Dealloc=Module["__Py_Dealloc"]=a0=>(__Py_Dealloc=Module["__Py_Dealloc"]=wasmExports["_Py_Dealloc"])(a0);var _PyErr_Format=Module["_PyErr_Format"]=(a0,a1,a2)=>(_PyErr_Format=Module["_PyErr_Format"]=wasmExports["PyErr_Format"])(a0,a1,a2);var _add_methods_and_set_docstrings=Module["_add_methods_and_set_docstrings"]=(a0,a1,a2)=>(_add_methods_and_set_docstrings=Module["_add_methods_and_set_docstrings"]=wasmExports["add_methods_and_set_docstrings"])(a0,a1,a2);var _PyModule_AddFunctions=Module["_PyModule_AddFunctions"]=(a0,a1)=>(_PyModule_AddFunctions=Module["_PyModule_AddFunctions"]=wasmExports["PyModule_AddFunctions"])(a0,a1);var _docstring_init=Module["_docstring_init"]=()=>(_docstring_init=Module["_docstring_init"]=wasmExports["docstring_init"])();var _PyImport_ImportModule=Module["_PyImport_ImportModule"]=a0=>(_PyImport_ImportModule=Module["_PyImport_ImportModule"]=wasmExports["PyImport_ImportModule"])(a0);var _dump_traceback=Module["_dump_traceback"]=()=>(_dump_traceback=Module["_dump_traceback"]=wasmExports["dump_traceback"])();var _fileno=a0=>(_fileno=wasmExports["fileno"])(a0);var _PyGILState_GetThisThreadState=Module["_PyGILState_GetThisThreadState"]=()=>(_PyGILState_GetThisThreadState=Module["_PyGILState_GetThisThreadState"]=wasmExports["PyGILState_GetThisThreadState"])();var __Py_DumpTraceback=Module["__Py_DumpTraceback"]=(a0,a1)=>(__Py_DumpTraceback=Module["__Py_DumpTraceback"]=wasmExports["_Py_DumpTraceback"])(a0,a1);var _set_error=Module["_set_error"]=a0=>(_set_error=Module["_set_error"]=wasmExports["set_error"])(a0);var _PyErr_SetObject=Module["_PyErr_SetObject"]=(a0,a1)=>(_PyErr_SetObject=Module["_PyErr_SetObject"]=wasmExports["PyErr_SetObject"])(a0,a1);var _restore_sys_last_exception=Module["_restore_sys_last_exception"]=a0=>(_restore_sys_last_exception=Module["_restore_sys_last_exception"]=wasmExports["restore_sys_last_exception"])(a0);var _PySys_GetObject=Module["_PySys_GetObject"]=a0=>(_PySys_GetObject=Module["_PySys_GetObject"]=wasmExports["PySys_GetObject"])(a0);var _PyErr_SetRaisedException=Module["_PyErr_SetRaisedException"]=a0=>(_PyErr_SetRaisedException=Module["_PyErr_SetRaisedException"]=wasmExports["PyErr_SetRaisedException"])(a0);var _wrap_exception=Module["_wrap_exception"]=()=>(_wrap_exception=Module["_wrap_exception"]=wasmExports["wrap_exception"])();var _PyErr_GetRaisedException=Module["_PyErr_GetRaisedException"]=()=>(_PyErr_GetRaisedException=Module["_PyErr_GetRaisedException"]=wasmExports["PyErr_GetRaisedException"])();var _PyErr_GivenExceptionMatches=Module["_PyErr_GivenExceptionMatches"]=(a0,a1)=>(_PyErr_GivenExceptionMatches=Module["_PyErr_GivenExceptionMatches"]=wasmExports["PyErr_GivenExceptionMatches"])(a0,a1);var _PyErr_Print=Module["_PyErr_Print"]=()=>(_PyErr_Print=Module["_PyErr_Print"]=wasmExports["PyErr_Print"])();var __PyObject_GetAttrId=Module["__PyObject_GetAttrId"]=(a0,a1)=>(__PyObject_GetAttrId=Module["__PyObject_GetAttrId"]=wasmExports["_PyObject_GetAttrId"])(a0,a1);var _PyUnicode_AsUTF8=Module["_PyUnicode_AsUTF8"]=a0=>(_PyUnicode_AsUTF8=Module["_PyUnicode_AsUTF8"]=wasmExports["PyUnicode_AsUTF8"])(a0);var _JsvNull_Check=Module["_JsvNull_Check"]=a0=>(_JsvNull_Check=Module["_JsvNull_Check"]=wasmExports["JsvNull_Check"])(a0);var _PySys_WriteStderr=Module["_PySys_WriteStderr"]=(a0,a1)=>(_PySys_WriteStderr=Module["_PySys_WriteStderr"]=wasmExports["PySys_WriteStderr"])(a0,a1);var _PyErr_DisplayException=Module["_PyErr_DisplayException"]=a0=>(_PyErr_DisplayException=Module["_PyErr_DisplayException"]=wasmExports["PyErr_DisplayException"])(a0);var _JsvString_FromId=Module["_JsvString_FromId"]=a0=>(_JsvString_FromId=Module["_JsvString_FromId"]=wasmExports["JsvString_FromId"])(a0);var _pythonexc2js=Module["_pythonexc2js"]=()=>(_pythonexc2js=Module["_pythonexc2js"]=wasmExports["pythonexc2js"])();var _trigger_fatal_error=Module["_trigger_fatal_error"]=(a0,a1)=>(_trigger_fatal_error=Module["_trigger_fatal_error"]=wasmExports["trigger_fatal_error"])(a0,a1);var _raw_call=Module["_raw_call"]=(a0,a1)=>(_raw_call=Module["_raw_call"]=wasmExports["raw_call"])(a0,a1);var _JsProxy_Val=Module["_JsProxy_Val"]=a0=>(_JsProxy_Val=Module["_JsProxy_Val"]=wasmExports["JsProxy_Val"])(a0);var _error_handling_init=Module["_error_handling_init"]=a0=>(_error_handling_init=Module["_error_handling_init"]=wasmExports["error_handling_init"])(a0);var _hiwire_new_deduplicate=Module["_hiwire_new_deduplicate"]=a0=>(_hiwire_new_deduplicate=Module["_hiwire_new_deduplicate"]=wasmExports["hiwire_new_deduplicate"])(a0);var _hiwire_new=Module["_hiwire_new"]=a0=>(_hiwire_new=Module["_hiwire_new"]=wasmExports["hiwire_new"])(a0);var _hiwire_incref_deduplicate=Module["_hiwire_incref_deduplicate"]=a0=>(_hiwire_incref_deduplicate=Module["_hiwire_incref_deduplicate"]=wasmExports["hiwire_incref_deduplicate"])(a0);var _hiwire_decref=Module["_hiwire_decref"]=a0=>(_hiwire_decref=Module["_hiwire_decref"]=wasmExports["hiwire_decref"])(a0);var _init_pyodide_proxy=Module["_init_pyodide_proxy"]=()=>(_init_pyodide_proxy=Module["_init_pyodide_proxy"]=wasmExports["init_pyodide_proxy"])();var _python2js=Module["_python2js"]=a0=>(_python2js=Module["_python2js"]=wasmExports["python2js"])(a0);var _PyInit__pyodide_core=Module["_PyInit__pyodide_core"]=()=>(_PyInit__pyodide_core=Module["_PyInit__pyodide_core"]=wasmExports["PyInit__pyodide_core"])();var _PyErr_Occurred=Module["_PyErr_Occurred"]=()=>(_PyErr_Occurred=Module["_PyErr_Occurred"]=wasmExports["PyErr_Occurred"])();var __PyErr_FormatFromCause=Module["__PyErr_FormatFromCause"]=(a0,a1,a2)=>(__PyErr_FormatFromCause=Module["__PyErr_FormatFromCause"]=wasmExports["_PyErr_FormatFromCause"])(a0,a1,a2);var _PyModule_Create2=Module["_PyModule_Create2"]=(a0,a1)=>(_PyModule_Create2=Module["_PyModule_Create2"]=wasmExports["PyModule_Create2"])(a0,a1);var _PyImport_GetModuleDict=Module["_PyImport_GetModuleDict"]=()=>(_PyImport_GetModuleDict=Module["_PyImport_GetModuleDict"]=wasmExports["PyImport_GetModuleDict"])();var _PyDict_SetItemString=Module["_PyDict_SetItemString"]=(a0,a1,a2)=>(_PyDict_SetItemString=Module["_PyDict_SetItemString"]=wasmExports["PyDict_SetItemString"])(a0,a1,a2);var _jslib_init=Module["_jslib_init"]=()=>(_jslib_init=Module["_jslib_init"]=wasmExports["jslib_init"])();var _python2js_init=Module["_python2js_init"]=a0=>(_python2js_init=Module["_python2js_init"]=wasmExports["python2js_init"])(a0);var _jsproxy_init=Module["_jsproxy_init"]=a0=>(_jsproxy_init=Module["_jsproxy_init"]=wasmExports["jsproxy_init"])(a0);var _jsproxy_call_init=Module["_jsproxy_call_init"]=a0=>(_jsproxy_call_init=Module["_jsproxy_call_init"]=wasmExports["jsproxy_call_init"])(a0);var _pyproxy_init=Module["_pyproxy_init"]=a0=>(_pyproxy_init=Module["_pyproxy_init"]=wasmExports["pyproxy_init"])(a0);var _jsbind_init=Module["_jsbind_init"]=a0=>(_jsbind_init=Module["_jsbind_init"]=wasmExports["jsbind_init"])(a0);var _pyodide_export=Module["_pyodide_export"]=()=>(_pyodide_export=Module["_pyodide_export"]=wasmExports["pyodide_export"])();var _py_version_major=Module["_py_version_major"]=()=>(_py_version_major=Module["_py_version_major"]=wasmExports["py_version_major"])();var _set_new_cframe=Module["_set_new_cframe"]=a0=>(_set_new_cframe=Module["_set_new_cframe"]=wasmExports["set_new_cframe"])(a0);var _PyUnicode_Data=Module["_PyUnicode_Data"]=a0=>(_PyUnicode_Data=Module["_PyUnicode_Data"]=wasmExports["PyUnicode_Data"])(a0);var __js2python_none=Module["__js2python_none"]=()=>(__js2python_none=Module["__js2python_none"]=wasmExports["_js2python_none"])();var __js2python_true=Module["__js2python_true"]=()=>(__js2python_true=Module["__js2python_true"]=wasmExports["_js2python_true"])();var __js2python_false=Module["__js2python_false"]=()=>(__js2python_false=Module["__js2python_false"]=wasmExports["_js2python_false"])();var __js2python_pyproxy=Module["__js2python_pyproxy"]=a0=>(__js2python_pyproxy=Module["__js2python_pyproxy"]=wasmExports["_js2python_pyproxy"])(a0);var _js2python_immutable=Module["_js2python_immutable"]=a0=>(_js2python_immutable=Module["_js2python_immutable"]=wasmExports["js2python_immutable"])(a0);var _js2python=Module["_js2python"]=a0=>(_js2python=Module["_js2python"]=wasmExports["js2python"])(a0);var _JsProxy_getflags=Module["_JsProxy_getflags"]=a0=>(_JsProxy_getflags=Module["_JsProxy_getflags"]=wasmExports["JsProxy_getflags"])(a0);var _PyLong_AsLong=Module["_PyLong_AsLong"]=a0=>(_PyLong_AsLong=Module["_PyLong_AsLong"]=wasmExports["PyLong_AsLong"])(a0);var _JsProxy_is_py_json=Module["_JsProxy_is_py_json"]=a0=>(_JsProxy_is_py_json=Module["_JsProxy_is_py_json"]=wasmExports["JsProxy_is_py_json"])(a0);var _js2python_as_py_json=Module["_js2python_as_py_json"]=a0=>(_js2python_as_py_json=Module["_js2python_as_py_json"]=wasmExports["js2python_as_py_json"])(a0);var _JsProxy_create_with_type=Module["_JsProxy_create_with_type"]=(a0,a1,a2,a3)=>(_JsProxy_create_with_type=Module["_JsProxy_create_with_type"]=wasmExports["JsProxy_create_with_type"])(a0,a1,a2,a3);var _JsProxy_bind_sig=Module["_JsProxy_bind_sig"]=(a0,a1)=>(_JsProxy_bind_sig=Module["_JsProxy_bind_sig"]=wasmExports["JsProxy_bind_sig"])(a0,a1);var _hiwire_get=Module["_hiwire_get"]=a0=>(_hiwire_get=Module["_hiwire_get"]=wasmExports["hiwire_get"])(a0);var _JsRef_toVal=Module["_JsRef_toVal"]=a0=>(_JsRef_toVal=Module["_JsRef_toVal"]=wasmExports["JsRef_toVal"])(a0);var _PyErr_SetString=Module["_PyErr_SetString"]=(a0,a1)=>(_PyErr_SetString=Module["_PyErr_SetString"]=wasmExports["PyErr_SetString"])(a0,a1);var _JsProxy_create_with_this=Module["_JsProxy_create_with_this"]=(a0,a1,a2,a3)=>(_JsProxy_create_with_this=Module["_JsProxy_create_with_this"]=wasmExports["JsProxy_create_with_this"])(a0,a1,a2,a3);var _clear_method_call_singleton=Module["_clear_method_call_singleton"]=()=>(_clear_method_call_singleton=Module["_clear_method_call_singleton"]=wasmExports["clear_method_call_singleton"])();var _JsProxy_GetMethod=Module["_JsProxy_GetMethod"]=(a0,a1)=>(_JsProxy_GetMethod=Module["_JsProxy_GetMethod"]=wasmExports["JsProxy_GetMethod"])(a0,a1);var __PyObject_GenericGetAttrWithDict=Module["__PyObject_GenericGetAttrWithDict"]=(a0,a1,a2,a3)=>(__PyObject_GenericGetAttrWithDict=Module["__PyObject_GenericGetAttrWithDict"]=wasmExports["_PyObject_GenericGetAttrWithDict"])(a0,a1,a2,a3);var _strcmp=Module["_strcmp"]=(a0,a1)=>(_strcmp=Module["_strcmp"]=wasmExports["strcmp"])(a0,a1);var __PyObject_CallMethodIdObjArgs=Module["__PyObject_CallMethodIdObjArgs"]=(a0,a1,a2)=>(__PyObject_CallMethodIdObjArgs=Module["__PyObject_CallMethodIdObjArgs"]=wasmExports["_PyObject_CallMethodIdObjArgs"])(a0,a1,a2);var __PyArg_ParseTuple_SizeT=Module["__PyArg_ParseTuple_SizeT"]=(a0,a1,a2)=>(__PyArg_ParseTuple_SizeT=Module["__PyArg_ParseTuple_SizeT"]=wasmExports["_PyArg_ParseTuple_SizeT"])(a0,a1,a2);var _Js2PyConverter_convert=Module["_Js2PyConverter_convert"]=(a0,a1,a2)=>(_Js2PyConverter_convert=Module["_Js2PyConverter_convert"]=wasmExports["Js2PyConverter_convert"])(a0,a1,a2);var _hiwire_incref=Module["_hiwire_incref"]=a0=>(_hiwire_incref=Module["_hiwire_incref"]=wasmExports["hiwire_incref"])(a0);var _JsProxy_GetAttr=Module["_JsProxy_GetAttr"]=(a0,a1)=>(_JsProxy_GetAttr=Module["_JsProxy_GetAttr"]=wasmExports["JsProxy_GetAttr"])(a0,a1);var _handle_next_result=Module["_handle_next_result"]=(a0,a1,a2)=>(_handle_next_result=Module["_handle_next_result"]=wasmExports["handle_next_result"])(a0,a1,a2);var _free=Module["_free"]=a0=>(_free=Module["_free"]=wasmExports["free"])(a0);var _JsProxy_create_objmap=Module["_JsProxy_create_objmap"]=(a0,a1)=>(_JsProxy_create_objmap=Module["_JsProxy_create_objmap"]=wasmExports["JsProxy_create_objmap"])(a0,a1);var _JsProxy_am_send=Module["_JsProxy_am_send"]=(a0,a1,a2)=>(_JsProxy_am_send=Module["_JsProxy_am_send"]=wasmExports["JsProxy_am_send"])(a0,a1,a2);var _python2js_track_proxies=Module["_python2js_track_proxies"]=(a0,a1,a2)=>(_python2js_track_proxies=Module["_python2js_track_proxies"]=wasmExports["python2js_track_proxies"])(a0,a1,a2);var _JsvObject_CallMethodId_OneArg=Module["_JsvObject_CallMethodId_OneArg"]=(a0,a1,a2)=>(_JsvObject_CallMethodId_OneArg=Module["_JsvObject_CallMethodId_OneArg"]=wasmExports["JsvObject_CallMethodId_OneArg"])(a0,a1,a2);var _JsProxy_IterNext=Module["_JsProxy_IterNext"]=a0=>(_JsProxy_IterNext=Module["_JsProxy_IterNext"]=wasmExports["JsProxy_IterNext"])(a0);var __PyGen_SetStopIterationValue=Module["__PyGen_SetStopIterationValue"]=a0=>(__PyGen_SetStopIterationValue=Module["__PyGen_SetStopIterationValue"]=wasmExports["_PyGen_SetStopIterationValue"])(a0);var _JsGenerator_send=Module["_JsGenerator_send"]=(a0,a1)=>(_JsGenerator_send=Module["_JsGenerator_send"]=wasmExports["JsGenerator_send"])(a0,a1);var _PyErr_SetNone=Module["_PyErr_SetNone"]=a0=>(_PyErr_SetNone=Module["_PyErr_SetNone"]=wasmExports["PyErr_SetNone"])(a0);var _JsException_js_error_getter=Module["_JsException_js_error_getter"]=(a0,a1)=>(_JsException_js_error_getter=Module["_JsException_js_error_getter"]=wasmExports["JsException_js_error_getter"])(a0,a1);var _process_throw_args=Module["_process_throw_args"]=(a0,a1,a2,a3)=>(_process_throw_args=Module["_process_throw_args"]=wasmExports["process_throw_args"])(a0,a1,a2,a3);var _PyErr_NormalizeException=Module["_PyErr_NormalizeException"]=(a0,a1,a2)=>(_PyErr_NormalizeException=Module["_PyErr_NormalizeException"]=wasmExports["PyErr_NormalizeException"])(a0,a1,a2);var _PyException_GetTraceback=Module["_PyException_GetTraceback"]=a0=>(_PyException_GetTraceback=Module["_PyException_GetTraceback"]=wasmExports["PyException_GetTraceback"])(a0);var _PyException_SetTraceback=Module["_PyException_SetTraceback"]=(a0,a1)=>(_PyException_SetTraceback=Module["_PyException_SetTraceback"]=wasmExports["PyException_SetTraceback"])(a0,a1);var _PyErr_Restore=Module["_PyErr_Restore"]=(a0,a1,a2)=>(_PyErr_Restore=Module["_PyErr_Restore"]=wasmExports["PyErr_Restore"])(a0,a1,a2);var _PyErr_ExceptionMatches=Module["_PyErr_ExceptionMatches"]=a0=>(_PyErr_ExceptionMatches=Module["_PyErr_ExceptionMatches"]=wasmExports["PyErr_ExceptionMatches"])(a0);var _PyErr_Clear=Module["_PyErr_Clear"]=()=>(_PyErr_Clear=Module["_PyErr_Clear"]=wasmExports["PyErr_Clear"])();var _JsvObject_CallMethodId_NoArgs=Module["_JsvObject_CallMethodId_NoArgs"]=(a0,a1)=>(_JsvObject_CallMethodId_NoArgs=Module["_JsvObject_CallMethodId_NoArgs"]=wasmExports["JsvObject_CallMethodId_NoArgs"])(a0,a1);var _PyErr_Fetch=Module["_PyErr_Fetch"]=(a0,a1,a2)=>(_PyErr_Fetch=Module["_PyErr_Fetch"]=wasmExports["PyErr_Fetch"])(a0,a1,a2);var __agen_handle_result_js_c=Module["__agen_handle_result_js_c"]=(a0,a1,a2,a3,a4)=>(__agen_handle_result_js_c=Module["__agen_handle_result_js_c"]=wasmExports["_agen_handle_result_js_c"])(a0,a1,a2,a3,a4);var _PyObject_CallOneArg=Module["_PyObject_CallOneArg"]=(a0,a1)=>(_PyObject_CallOneArg=Module["_PyObject_CallOneArg"]=wasmExports["PyObject_CallOneArg"])(a0,a1);var __agen_handle_result=Module["__agen_handle_result"]=(a0,a1)=>(__agen_handle_result=Module["__agen_handle_result"]=wasmExports["_agen_handle_result"])(a0,a1);var _JsArray_sq_item=Module["_JsArray_sq_item"]=(a0,a1)=>(_JsArray_sq_item=Module["_JsArray_sq_item"]=wasmExports["JsArray_sq_item"])(a0,a1);var _JsArray_sq_ass_item=Module["_JsArray_sq_ass_item"]=(a0,a1,a2)=>(_JsArray_sq_ass_item=Module["_JsArray_sq_ass_item"]=wasmExports["JsArray_sq_ass_item"])(a0,a1,a2);var _JsTypedArray_sq_ass_item=Module["_JsTypedArray_sq_ass_item"]=(a0,a1,a2)=>(_JsTypedArray_sq_ass_item=Module["_JsTypedArray_sq_ass_item"]=wasmExports["JsTypedArray_sq_ass_item"])(a0,a1,a2);var _JsMap_update=Module["_JsMap_update"]=(a0,a1,a2)=>(_JsMap_update=Module["_JsMap_update"]=wasmExports["JsMap_update"])(a0,a1,a2);var _wrap_promise=Module["_wrap_promise"]=(a0,a1,a2)=>(_wrap_promise=Module["_wrap_promise"]=wasmExports["wrap_promise"])(a0,a1,a2);var _PyTuple_GetItem=Module["_PyTuple_GetItem"]=(a0,a1)=>(_PyTuple_GetItem=Module["_PyTuple_GetItem"]=wasmExports["PyTuple_GetItem"])(a0,a1);var _JsvObject_CallMethodId=Module["_JsvObject_CallMethodId"]=(a0,a1,a2)=>(_JsvObject_CallMethodId=Module["_JsvObject_CallMethodId"]=wasmExports["JsvObject_CallMethodId"])(a0,a1,a2);var _JsBuffer_CopyIntoMemoryView=Module["_JsBuffer_CopyIntoMemoryView"]=(a0,a1,a2,a3)=>(_JsBuffer_CopyIntoMemoryView=Module["_JsBuffer_CopyIntoMemoryView"]=wasmExports["JsBuffer_CopyIntoMemoryView"])(a0,a1,a2,a3);var _PyMem_Malloc=Module["_PyMem_Malloc"]=a0=>(_PyMem_Malloc=Module["_PyMem_Malloc"]=wasmExports["PyMem_Malloc"])(a0);var _PyMemoryView_FromObject=Module["_PyMemoryView_FromObject"]=a0=>(_PyMemoryView_FromObject=Module["_PyMemoryView_FromObject"]=wasmExports["PyMemoryView_FromObject"])(a0);var _JsBuffer_cinit=Module["_JsBuffer_cinit"]=a0=>(_JsBuffer_cinit=Module["_JsBuffer_cinit"]=wasmExports["JsBuffer_cinit"])(a0);var _JsRef_new=Module["_JsRef_new"]=a0=>(_JsRef_new=Module["_JsRef_new"]=wasmExports["JsRef_new"])(a0);var _PyTuple_Pack=Module["_PyTuple_Pack"]=(a0,a1)=>(_PyTuple_Pack=Module["_PyTuple_Pack"]=wasmExports["PyTuple_Pack"])(a0,a1);var _PyLong_FromLong=Module["_PyLong_FromLong"]=a0=>(_PyLong_FromLong=Module["_PyLong_FromLong"]=wasmExports["PyLong_FromLong"])(a0);var _PyDict_GetItemWithError=Module["_PyDict_GetItemWithError"]=(a0,a1)=>(_PyDict_GetItemWithError=Module["_PyDict_GetItemWithError"]=wasmExports["PyDict_GetItemWithError"])(a0,a1);var _PyObject_SelfIter=Module["_PyObject_SelfIter"]=a0=>(_PyObject_SelfIter=Module["_PyObject_SelfIter"]=wasmExports["PyObject_SelfIter"])(a0);var _PyVectorcall_Call=Module["_PyVectorcall_Call"]=(a0,a1,a2)=>(_PyVectorcall_Call=Module["_PyVectorcall_Call"]=wasmExports["PyVectorcall_Call"])(a0,a1,a2);var _PyErr_NoMemory=Module["_PyErr_NoMemory"]=()=>(_PyErr_NoMemory=Module["_PyErr_NoMemory"]=wasmExports["PyErr_NoMemory"])();var _PyType_FromSpecWithBases=Module["_PyType_FromSpecWithBases"]=(a0,a1)=>(_PyType_FromSpecWithBases=Module["_PyType_FromSpecWithBases"]=wasmExports["PyType_FromSpecWithBases"])(a0,a1);var __PyObject_SetAttrId=Module["__PyObject_SetAttrId"]=(a0,a1,a2)=>(__PyObject_SetAttrId=Module["__PyObject_SetAttrId"]=wasmExports["_PyObject_SetAttrId"])(a0,a1,a2);var _PyMem_Free=Module["_PyMem_Free"]=a0=>(_PyMem_Free=Module["_PyMem_Free"]=wasmExports["PyMem_Free"])(a0);var _PyDict_SetItem=Module["_PyDict_SetItem"]=(a0,a1,a2)=>(_PyDict_SetItem=Module["_PyDict_SetItem"]=wasmExports["PyDict_SetItem"])(a0,a1,a2);var _JsProxy_create=Module["_JsProxy_create"]=a0=>(_JsProxy_create=Module["_JsProxy_create"]=wasmExports["JsProxy_create"])(a0);var _JsProxy_Check=Module["_JsProxy_Check"]=a0=>(_JsProxy_Check=Module["_JsProxy_Check"]=wasmExports["JsProxy_Check"])(a0);var _PyType_IsSubtype=Module["_PyType_IsSubtype"]=(a0,a1)=>(_PyType_IsSubtype=Module["_PyType_IsSubtype"]=wasmExports["PyType_IsSubtype"])(a0,a1);var _JsProxy_init_docstrings=Module["_JsProxy_init_docstrings"]=a0=>(_JsProxy_init_docstrings=Module["_JsProxy_init_docstrings"]=wasmExports["JsProxy_init_docstrings"])(a0);var _run_sync_not_supported=Module["_run_sync_not_supported"]=(a0,a1)=>(_run_sync_not_supported=Module["_run_sync_not_supported"]=wasmExports["run_sync_not_supported"])(a0,a1);var _run_sync=Module["_run_sync"]=(a0,a1)=>(_run_sync=Module["_run_sync"]=wasmExports["run_sync"])(a0,a1);var _py_is_awaitable=Module["_py_is_awaitable"]=a0=>(_py_is_awaitable=Module["_py_is_awaitable"]=wasmExports["py_is_awaitable"])(a0);var _JsvPromise_Syncify=Module["_JsvPromise_Syncify"]=a0=>(_JsvPromise_Syncify=Module["_JsvPromise_Syncify"]=wasmExports["JsvPromise_Syncify"])(a0);var _can_run_sync=Module["_can_run_sync"]=(a0,a1)=>(_can_run_sync=Module["_can_run_sync"]=wasmExports["can_run_sync"])(a0,a1);var _PyDict_New=Module["_PyDict_New"]=()=>(_PyDict_New=Module["_PyDict_New"]=wasmExports["PyDict_New"])();var _PyObject_SetAttrString=Module["_PyObject_SetAttrString"]=(a0,a1,a2)=>(_PyObject_SetAttrString=Module["_PyObject_SetAttrString"]=wasmExports["PyObject_SetAttrString"])(a0,a1,a2);var _PyModule_AddObject=Module["_PyModule_AddObject"]=(a0,a1,a2)=>(_PyModule_AddObject=Module["_PyModule_AddObject"]=wasmExports["PyModule_AddObject"])(a0,a1,a2);var _PyType_Ready=Module["_PyType_Ready"]=a0=>(_PyType_Ready=Module["_PyType_Ready"]=wasmExports["PyType_Ready"])(a0);var _JsMethod_Vectorcall_impl=Module["_JsMethod_Vectorcall_impl"]=(a0,a1,a2,a3,a4,a5)=>(_JsMethod_Vectorcall_impl=Module["_JsMethod_Vectorcall_impl"]=wasmExports["JsMethod_Vectorcall_impl"])(a0,a1,a2,a3,a4,a5);var _JsvObject_CallMethodId_TwoArgs=Module["_JsvObject_CallMethodId_TwoArgs"]=(a0,a1,a2,a3)=>(_JsvObject_CallMethodId_TwoArgs=Module["_JsvObject_CallMethodId_TwoArgs"]=wasmExports["JsvObject_CallMethodId_TwoArgs"])(a0,a1,a2,a3);var _PyObject_Repr=Module["_PyObject_Repr"]=a0=>(_PyObject_Repr=Module["_PyObject_Repr"]=wasmExports["PyObject_Repr"])(a0);var _PyIndex_Check=Module["_PyIndex_Check"]=a0=>(_PyIndex_Check=Module["_PyIndex_Check"]=wasmExports["PyIndex_Check"])(a0);var _PyNumber_AsSsize_t=Module["_PyNumber_AsSsize_t"]=(a0,a1)=>(_PyNumber_AsSsize_t=Module["_PyNumber_AsSsize_t"]=wasmExports["PyNumber_AsSsize_t"])(a0,a1);var _PySlice_Unpack=Module["_PySlice_Unpack"]=(a0,a1,a2,a3)=>(_PySlice_Unpack=Module["_PySlice_Unpack"]=wasmExports["PySlice_Unpack"])(a0,a1,a2,a3);var _PySlice_AdjustIndices=Module["_PySlice_AdjustIndices"]=(a0,a1,a2,a3)=>(_PySlice_AdjustIndices=Module["_PySlice_AdjustIndices"]=wasmExports["PySlice_AdjustIndices"])(a0,a1,a2,a3);var _PySequence_Fast=Module["_PySequence_Fast"]=(a0,a1)=>(_PySequence_Fast=Module["_PySequence_Fast"]=wasmExports["PySequence_Fast"])(a0,a1);var __PyArg_ParseTupleAndKeywords_SizeT=Module["__PyArg_ParseTupleAndKeywords_SizeT"]=(a0,a1,a2,a3,a4)=>(__PyArg_ParseTupleAndKeywords_SizeT=Module["__PyArg_ParseTupleAndKeywords_SizeT"]=wasmExports["_PyArg_ParseTupleAndKeywords_SizeT"])(a0,a1,a2,a3,a4);var _PySet_New=Module["_PySet_New"]=a0=>(_PySet_New=Module["_PySet_New"]=wasmExports["PySet_New"])(a0);var __PySet_Update=Module["__PySet_Update"]=(a0,a1)=>(__PySet_Update=Module["__PySet_Update"]=wasmExports["_PySet_Update"])(a0,a1);var _PyUnicode_FromString=Module["_PyUnicode_FromString"]=a0=>(_PyUnicode_FromString=Module["_PyUnicode_FromString"]=wasmExports["PyUnicode_FromString"])(a0);var _PySet_Discard=Module["_PySet_Discard"]=(a0,a1)=>(_PySet_Discard=Module["_PySet_Discard"]=wasmExports["PySet_Discard"])(a0,a1);var _PyList_New=Module["_PyList_New"]=a0=>(_PyList_New=Module["_PyList_New"]=wasmExports["PyList_New"])(a0);var __PyList_Extend=Module["__PyList_Extend"]=(a0,a1)=>(__PyList_Extend=Module["__PyList_Extend"]=wasmExports["_PyList_Extend"])(a0,a1);var _PyList_Sort=Module["_PyList_Sort"]=a0=>(_PyList_Sort=Module["_PyList_Sort"]=wasmExports["PyList_Sort"])(a0);var __PyArg_ParseStack_SizeT=Module["__PyArg_ParseStack_SizeT"]=(a0,a1,a2,a3)=>(__PyArg_ParseStack_SizeT=Module["__PyArg_ParseStack_SizeT"]=wasmExports["_PyArg_ParseStack_SizeT"])(a0,a1,a2,a3);var _PyObject_GetIter=Module["_PyObject_GetIter"]=a0=>(_PyObject_GetIter=Module["_PyObject_GetIter"]=wasmExports["PyObject_GetIter"])(a0);var _PyObject_RichCompareBool=Module["_PyObject_RichCompareBool"]=(a0,a1,a2)=>(_PyObject_RichCompareBool=Module["_PyObject_RichCompareBool"]=wasmExports["PyObject_RichCompareBool"])(a0,a1,a2);var __PyArg_ParseStackAndKeywords_SizeT=Module["__PyArg_ParseStackAndKeywords_SizeT"]=(a0,a1,a2,a3,a4)=>(__PyArg_ParseStackAndKeywords_SizeT=Module["__PyArg_ParseStackAndKeywords_SizeT"]=wasmExports["_PyArg_ParseStackAndKeywords_SizeT"])(a0,a1,a2,a3,a4);var _hiwire_pop=Module["_hiwire_pop"]=a0=>(_hiwire_pop=Module["_hiwire_pop"]=wasmExports["hiwire_pop"])(a0);var _puts=Module["_puts"]=a0=>(_puts=Module["_puts"]=wasmExports["puts"])(a0);var _strncmp=Module["_strncmp"]=(a0,a1,a2)=>(_strncmp=Module["_strncmp"]=wasmExports["strncmp"])(a0,a1,a2);var _PyObject_GenericSetAttr=Module["_PyObject_GenericSetAttr"]=(a0,a1,a2)=>(_PyObject_GenericSetAttr=Module["_PyObject_GenericSetAttr"]=wasmExports["PyObject_GenericSetAttr"])(a0,a1,a2);var __Py_HashBytes=Module["__Py_HashBytes"]=(a0,a1)=>(__Py_HashBytes=Module["__Py_HashBytes"]=wasmExports["_Py_HashBytes"])(a0,a1);var _JsMethod_Construct_impl=Module["_JsMethod_Construct_impl"]=(a0,a1,a2,a3,a4)=>(_JsMethod_Construct_impl=Module["_JsMethod_Construct_impl"]=wasmExports["JsMethod_Construct_impl"])(a0,a1,a2,a3,a4);var __PyArg_CheckPositional=Module["__PyArg_CheckPositional"]=(a0,a1,a2,a3)=>(__PyArg_CheckPositional=Module["__PyArg_CheckPositional"]=wasmExports["_PyArg_CheckPositional"])(a0,a1,a2,a3);var __PyNumber_Index=Module["__PyNumber_Index"]=a0=>(__PyNumber_Index=Module["__PyNumber_Index"]=wasmExports["_PyNumber_Index"])(a0);var _PyLong_AsSsize_t=Module["_PyLong_AsSsize_t"]=a0=>(_PyLong_AsSsize_t=Module["_PyLong_AsSsize_t"]=wasmExports["PyLong_AsSsize_t"])(a0);var _PyLong_FromSsize_t=Module["_PyLong_FromSsize_t"]=a0=>(_PyLong_FromSsize_t=Module["_PyLong_FromSsize_t"]=wasmExports["PyLong_FromSsize_t"])(a0);var _PyObject_GetItem=Module["_PyObject_GetItem"]=(a0,a1)=>(_PyObject_GetItem=Module["_PyObject_GetItem"]=wasmExports["PyObject_GetItem"])(a0,a1);var _PyObject_DelItem=Module["_PyObject_DelItem"]=(a0,a1)=>(_PyObject_DelItem=Module["_PyObject_DelItem"]=wasmExports["PyObject_DelItem"])(a0,a1);var _PyObject_SetItem=Module["_PyObject_SetItem"]=(a0,a1,a2)=>(_PyObject_SetItem=Module["_PyObject_SetItem"]=wasmExports["PyObject_SetItem"])(a0,a1,a2);var _PyObject_GetBuffer=Module["_PyObject_GetBuffer"]=(a0,a1,a2)=>(_PyObject_GetBuffer=Module["_PyObject_GetBuffer"]=wasmExports["PyObject_GetBuffer"])(a0,a1,a2);var _PyBuffer_Release=Module["_PyBuffer_Release"]=a0=>(_PyBuffer_Release=Module["_PyBuffer_Release"]=wasmExports["PyBuffer_Release"])(a0);var _PyBytes_FromStringAndSize=Module["_PyBytes_FromStringAndSize"]=(a0,a1)=>(_PyBytes_FromStringAndSize=Module["_PyBytes_FromStringAndSize"]=wasmExports["PyBytes_FromStringAndSize"])(a0,a1);var _PyObject_Vectorcall=Module["_PyObject_Vectorcall"]=(a0,a1,a2,a3)=>(_PyObject_Vectorcall=Module["_PyObject_Vectorcall"]=wasmExports["PyObject_Vectorcall"])(a0,a1,a2,a3);var _Py_EnterRecursiveCall=Module["_Py_EnterRecursiveCall"]=a0=>(_Py_EnterRecursiveCall=Module["_Py_EnterRecursiveCall"]=wasmExports["Py_EnterRecursiveCall"])(a0);var _Py_LeaveRecursiveCall=Module["_Py_LeaveRecursiveCall"]=()=>(_Py_LeaveRecursiveCall=Module["_Py_LeaveRecursiveCall"]=wasmExports["Py_LeaveRecursiveCall"])();var _Py2JsConverter_convert=Module["_Py2JsConverter_convert"]=(a0,a1,a2)=>(_Py2JsConverter_convert=Module["_Py2JsConverter_convert"]=wasmExports["Py2JsConverter_convert"])(a0,a1,a2);var __PyUnicode_EQ=Module["__PyUnicode_EQ"]=(a0,a1)=>(__PyUnicode_EQ=Module["__PyUnicode_EQ"]=wasmExports["_PyUnicode_EQ"])(a0,a1);var _PyUnicode_FromFormat=Module["_PyUnicode_FromFormat"]=(a0,a1)=>(_PyUnicode_FromFormat=Module["_PyUnicode_FromFormat"]=wasmExports["PyUnicode_FromFormat"])(a0,a1);var _PyType_GenericNew=Module["_PyType_GenericNew"]=(a0,a1,a2)=>(_PyType_GenericNew=Module["_PyType_GenericNew"]=wasmExports["PyType_GenericNew"])(a0,a1,a2);var _PyObject_IsInstance=Module["_PyObject_IsInstance"]=(a0,a1)=>(_PyObject_IsInstance=Module["_PyObject_IsInstance"]=wasmExports["PyObject_IsInstance"])(a0,a1);var _python2js_inner=Module["_python2js_inner"]=(a0,a1,a2,a3,a4)=>(_python2js_inner=Module["_python2js_inner"]=wasmExports["python2js_inner"])(a0,a1,a2,a3,a4);var _python2js_custom=Module["_python2js_custom"]=(a0,a1,a2,a3,a4)=>(_python2js_custom=Module["_python2js_custom"]=wasmExports["python2js_custom"])(a0,a1,a2,a3,a4);var _PyObject_GC_UnTrack=Module["_PyObject_GC_UnTrack"]=a0=>(_PyObject_GC_UnTrack=Module["_PyObject_GC_UnTrack"]=wasmExports["PyObject_GC_UnTrack"])(a0);var _check_gil=Module["_check_gil"]=()=>(_check_gil=Module["_check_gil"]=wasmExports["check_gil"])();var _PyGILState_Check=Module["_PyGILState_Check"]=()=>(_PyGILState_Check=Module["_PyGILState_Check"]=wasmExports["PyGILState_Check"])();var _PyGen_GetCode=Module["_PyGen_GetCode"]=a0=>(_PyGen_GetCode=Module["_PyGen_GetCode"]=wasmExports["PyGen_GetCode"])(a0);var _pyproxy_getflags=Module["_pyproxy_getflags"]=(a0,a1)=>(_pyproxy_getflags=Module["_pyproxy_getflags"]=wasmExports["pyproxy_getflags"])(a0,a1);var _PyObject_HasAttr=Module["_PyObject_HasAttr"]=(a0,a1)=>(_PyObject_HasAttr=Module["_PyObject_HasAttr"]=wasmExports["PyObject_HasAttr"])(a0,a1);var __PyObject_NextNotImplemented=Module["__PyObject_NextNotImplemented"]=a0=>(__PyObject_NextNotImplemented=Module["__PyObject_NextNotImplemented"]=wasmExports["_PyObject_NextNotImplemented"])(a0);var _PyObject_IsSubclass=Module["_PyObject_IsSubclass"]=(a0,a1)=>(_PyObject_IsSubclass=Module["_PyObject_IsSubclass"]=wasmExports["PyObject_IsSubclass"])(a0,a1);var __pyproxy_repr=Module["__pyproxy_repr"]=a0=>(__pyproxy_repr=Module["__pyproxy_repr"]=wasmExports["_pyproxy_repr"])(a0);var _PyObject_Str=Module["_PyObject_Str"]=a0=>(_PyObject_Str=Module["_PyObject_Str"]=wasmExports["PyObject_Str"])(a0);var __pyproxy_type=Module["__pyproxy_type"]=a0=>(__pyproxy_type=Module["__pyproxy_type"]=wasmExports["_pyproxy_type"])(a0);var __pyproxy_hasattr=Module["__pyproxy_hasattr"]=(a0,a1)=>(__pyproxy_hasattr=Module["__pyproxy_hasattr"]=wasmExports["_pyproxy_hasattr"])(a0,a1);var _python2js_json_adaptor=Module["_python2js_json_adaptor"]=(a0,a1,a2)=>(_python2js_json_adaptor=Module["_python2js_json_adaptor"]=wasmExports["python2js_json_adaptor"])(a0,a1,a2);var __pyproxy_getattr=Module["__pyproxy_getattr"]=(a0,a1,a2)=>(__pyproxy_getattr=Module["__pyproxy_getattr"]=wasmExports["_pyproxy_getattr"])(a0,a1,a2);var __PyObject_GetMethod=Module["__PyObject_GetMethod"]=(a0,a1,a2)=>(__PyObject_GetMethod=Module["__PyObject_GetMethod"]=wasmExports["_PyObject_GetMethod"])(a0,a1,a2);var __pyproxy_setattr=Module["__pyproxy_setattr"]=(a0,a1,a2)=>(__pyproxy_setattr=Module["__pyproxy_setattr"]=wasmExports["_pyproxy_setattr"])(a0,a1,a2);var _PyObject_SetAttr=Module["_PyObject_SetAttr"]=(a0,a1,a2)=>(_PyObject_SetAttr=Module["_PyObject_SetAttr"]=wasmExports["PyObject_SetAttr"])(a0,a1,a2);var __pyproxy_delattr=Module["__pyproxy_delattr"]=(a0,a1)=>(__pyproxy_delattr=Module["__pyproxy_delattr"]=wasmExports["_pyproxy_delattr"])(a0,a1);var __pyproxy_getitem=Module["__pyproxy_getitem"]=(a0,a1,a2,a3)=>(__pyproxy_getitem=Module["__pyproxy_getitem"]=wasmExports["_pyproxy_getitem"])(a0,a1,a2,a3);var __pyproxy_setitem=Module["__pyproxy_setitem"]=(a0,a1,a2)=>(__pyproxy_setitem=Module["__pyproxy_setitem"]=wasmExports["_pyproxy_setitem"])(a0,a1,a2);var __pyproxy_delitem=Module["__pyproxy_delitem"]=(a0,a1)=>(__pyproxy_delitem=Module["__pyproxy_delitem"]=wasmExports["_pyproxy_delitem"])(a0,a1);var __pyproxy_slice_assign=Module["__pyproxy_slice_assign"]=(a0,a1,a2,a3)=>(__pyproxy_slice_assign=Module["__pyproxy_slice_assign"]=wasmExports["_pyproxy_slice_assign"])(a0,a1,a2,a3);var _PySequence_Size=Module["_PySequence_Size"]=a0=>(_PySequence_Size=Module["_PySequence_Size"]=wasmExports["PySequence_Size"])(a0);var _PySequence_GetSlice=Module["_PySequence_GetSlice"]=(a0,a1,a2)=>(_PySequence_GetSlice=Module["_PySequence_GetSlice"]=wasmExports["PySequence_GetSlice"])(a0,a1,a2);var _PySequence_SetSlice=Module["_PySequence_SetSlice"]=(a0,a1,a2,a3)=>(_PySequence_SetSlice=Module["_PySequence_SetSlice"]=wasmExports["PySequence_SetSlice"])(a0,a1,a2,a3);var _python2js_with_depth=Module["_python2js_with_depth"]=(a0,a1,a2)=>(_python2js_with_depth=Module["_python2js_with_depth"]=wasmExports["python2js_with_depth"])(a0,a1,a2);var __pyproxy_pop=Module["__pyproxy_pop"]=(a0,a1)=>(__pyproxy_pop=Module["__pyproxy_pop"]=wasmExports["_pyproxy_pop"])(a0,a1);var __pyproxy_contains=Module["__pyproxy_contains"]=(a0,a1)=>(__pyproxy_contains=Module["__pyproxy_contains"]=wasmExports["_pyproxy_contains"])(a0,a1);var _PySequence_Contains=Module["_PySequence_Contains"]=(a0,a1)=>(_PySequence_Contains=Module["_PySequence_Contains"]=wasmExports["PySequence_Contains"])(a0,a1);var __pyproxy_ownKeys=Module["__pyproxy_ownKeys"]=a0=>(__pyproxy_ownKeys=Module["__pyproxy_ownKeys"]=wasmExports["_pyproxy_ownKeys"])(a0);var _PyObject_Dir=Module["_PyObject_Dir"]=a0=>(_PyObject_Dir=Module["_PyObject_Dir"]=wasmExports["PyObject_Dir"])(a0);var _PyList_Size=Module["_PyList_Size"]=a0=>(_PyList_Size=Module["_PyList_Size"]=wasmExports["PyList_Size"])(a0);var _PyList_GetItem=Module["_PyList_GetItem"]=(a0,a1)=>(_PyList_GetItem=Module["_PyList_GetItem"]=wasmExports["PyList_GetItem"])(a0,a1);var __pyproxy_apply=Module["__pyproxy_apply"]=(a0,a1,a2,a3,a4)=>(__pyproxy_apply=Module["__pyproxy_apply"]=wasmExports["_pyproxy_apply"])(a0,a1,a2,a3,a4);var _PyTuple_New=Module["_PyTuple_New"]=a0=>(_PyTuple_New=Module["_PyTuple_New"]=wasmExports["PyTuple_New"])(a0);var __pyproxy_apply_promising=Module["__pyproxy_apply_promising"]=(a0,a1,a2,a3,a4,a5,a6)=>(__pyproxy_apply_promising=Module["__pyproxy_apply_promising"]=wasmExports["_pyproxy_apply_promising"])(a0,a1,a2,a3,a4,a5,a6);var _get_cframe=Module["_get_cframe"]=()=>(_get_cframe=Module["_get_cframe"]=wasmExports["get_cframe"])();var _exit_cframe=Module["_exit_cframe"]=a0=>(_exit_cframe=Module["_exit_cframe"]=wasmExports["exit_cframe"])(a0);var __iscoroutinefunction=Module["__iscoroutinefunction"]=a0=>(__iscoroutinefunction=Module["__iscoroutinefunction"]=wasmExports["_iscoroutinefunction"])(a0);var __pyproxy_iter_next=Module["__pyproxy_iter_next"]=(a0,a1,a2)=>(__pyproxy_iter_next=Module["__pyproxy_iter_next"]=wasmExports["_pyproxy_iter_next"])(a0,a1,a2);var _PyIter_Next=Module["_PyIter_Next"]=a0=>(_PyIter_Next=Module["_PyIter_Next"]=wasmExports["PyIter_Next"])(a0);var __pyproxyGen_Send=Module["__pyproxyGen_Send"]=(a0,a1)=>(__pyproxyGen_Send=Module["__pyproxyGen_Send"]=wasmExports["_pyproxyGen_Send"])(a0,a1);var _PyIter_Send=Module["_PyIter_Send"]=(a0,a1,a2)=>(_PyIter_Send=Module["_PyIter_Send"]=wasmExports["PyIter_Send"])(a0,a1,a2);var __pyproxyGen_return=Module["__pyproxyGen_return"]=(a0,a1)=>(__pyproxyGen_return=Module["__pyproxyGen_return"]=wasmExports["_pyproxyGen_return"])(a0,a1);var __PyGen_FetchStopIterationValue=Module["__PyGen_FetchStopIterationValue"]=a0=>(__PyGen_FetchStopIterationValue=Module["__PyGen_FetchStopIterationValue"]=wasmExports["_PyGen_FetchStopIterationValue"])(a0);var __pyproxyGen_throw=Module["__pyproxyGen_throw"]=(a0,a1)=>(__pyproxyGen_throw=Module["__pyproxyGen_throw"]=wasmExports["_pyproxyGen_throw"])(a0,a1);var __pyproxyGen_asend=Module["__pyproxyGen_asend"]=(a0,a1)=>(__pyproxyGen_asend=Module["__pyproxyGen_asend"]=wasmExports["_pyproxyGen_asend"])(a0,a1);var __pyproxyGen_areturn=Module["__pyproxyGen_areturn"]=a0=>(__pyproxyGen_areturn=Module["__pyproxyGen_areturn"]=wasmExports["_pyproxyGen_areturn"])(a0);var __pyproxyGen_athrow=Module["__pyproxyGen_athrow"]=(a0,a1)=>(__pyproxyGen_athrow=Module["__pyproxyGen_athrow"]=wasmExports["_pyproxyGen_athrow"])(a0,a1);var __pyproxy_aiter_next=Module["__pyproxy_aiter_next"]=a0=>(__pyproxy_aiter_next=Module["__pyproxy_aiter_next"]=wasmExports["_pyproxy_aiter_next"])(a0);var _FutureDoneCallback_call_resolve=Module["_FutureDoneCallback_call_resolve"]=(a0,a1)=>(_FutureDoneCallback_call_resolve=Module["_FutureDoneCallback_call_resolve"]=wasmExports["FutureDoneCallback_call_resolve"])(a0,a1);var _FutureDoneCallback_call_reject=Module["_FutureDoneCallback_call_reject"]=a0=>(_FutureDoneCallback_call_reject=Module["_FutureDoneCallback_call_reject"]=wasmExports["FutureDoneCallback_call_reject"])(a0);var _FutureDoneCallback_call=Module["_FutureDoneCallback_call"]=(a0,a1,a2)=>(_FutureDoneCallback_call=Module["_FutureDoneCallback_call"]=wasmExports["FutureDoneCallback_call"])(a0,a1,a2);var _PyArg_UnpackTuple=Module["_PyArg_UnpackTuple"]=(a0,a1,a2,a3,a4)=>(_PyArg_UnpackTuple=Module["_PyArg_UnpackTuple"]=wasmExports["PyArg_UnpackTuple"])(a0,a1,a2,a3,a4);var __pyproxy_ensure_future=Module["__pyproxy_ensure_future"]=(a0,a1,a2)=>(__pyproxy_ensure_future=Module["__pyproxy_ensure_future"]=wasmExports["_pyproxy_ensure_future"])(a0,a1,a2);var __pyproxy_get_buffer=Module["__pyproxy_get_buffer"]=a0=>(__pyproxy_get_buffer=Module["__pyproxy_get_buffer"]=wasmExports["_pyproxy_get_buffer"])(a0);var _PyBuffer_FillContiguousStrides=Module["_PyBuffer_FillContiguousStrides"]=(a0,a1,a2,a3,a4)=>(_PyBuffer_FillContiguousStrides=Module["_PyBuffer_FillContiguousStrides"]=wasmExports["PyBuffer_FillContiguousStrides"])(a0,a1,a2,a3,a4);var _PyBuffer_IsContiguous=Module["_PyBuffer_IsContiguous"]=(a0,a1)=>(_PyBuffer_IsContiguous=Module["_PyBuffer_IsContiguous"]=wasmExports["PyBuffer_IsContiguous"])(a0,a1);var _create_promise_handles_result_helper=Module["_create_promise_handles_result_helper"]=(a0,a1,a2)=>(_create_promise_handles_result_helper=Module["_create_promise_handles_result_helper"]=wasmExports["create_promise_handles_result_helper"])(a0,a1,a2);var __python2js_buffer=Module["__python2js_buffer"]=a0=>(__python2js_buffer=Module["__python2js_buffer"]=wasmExports["_python2js_buffer"])(a0);var _jslib_init_buffers=Module["_jslib_init_buffers"]=()=>(_jslib_init_buffers=Module["_jslib_init_buffers"]=wasmExports["jslib_init_buffers"])();var _JsRef_pop=Module["_JsRef_pop"]=a0=>(_JsRef_pop=Module["_JsRef_pop"]=wasmExports["JsRef_pop"])(a0);var _JsrString_FromId=Module["_JsrString_FromId"]=a0=>(_JsrString_FromId=Module["_JsrString_FromId"]=wasmExports["JsrString_FromId"])(a0);var _hiwire_intern=Module["_hiwire_intern"]=a0=>(_hiwire_intern=Module["_hiwire_intern"]=wasmExports["hiwire_intern"])(a0);var __python2js=Module["__python2js"]=(a0,a1)=>(__python2js=Module["__python2js"]=wasmExports["_python2js"])(a0,a1);var _PySequence_GetItem=Module["_PySequence_GetItem"]=(a0,a1)=>(_PySequence_GetItem=Module["_PySequence_GetItem"]=wasmExports["PySequence_GetItem"])(a0,a1);var _PyObject_CheckBuffer=Module["_PyObject_CheckBuffer"]=a0=>(_PyObject_CheckBuffer=Module["_PyObject_CheckBuffer"]=wasmExports["PyObject_CheckBuffer"])(a0);var _PyFloat_AsDouble=Module["_PyFloat_AsDouble"]=a0=>(_PyFloat_AsDouble=Module["_PyFloat_AsDouble"]=wasmExports["PyFloat_AsDouble"])(a0);var _python2js__default_converter=Module["_python2js__default_converter"]=(a0,a1)=>(_python2js__default_converter=Module["_python2js__default_converter"]=wasmExports["python2js__default_converter"])(a0,a1);var _PyLong_AsLongAndOverflow=Module["_PyLong_AsLongAndOverflow"]=(a0,a1)=>(_PyLong_AsLongAndOverflow=Module["_PyLong_AsLongAndOverflow"]=wasmExports["PyLong_AsLongAndOverflow"])(a0,a1);var __PyLong_NumBits=Module["__PyLong_NumBits"]=a0=>(__PyLong_NumBits=Module["__PyLong_NumBits"]=wasmExports["_PyLong_NumBits"])(a0);var __PyLong_AsByteArray=Module["__PyLong_AsByteArray"]=(a0,a1,a2,a3,a4)=>(__PyLong_AsByteArray=Module["__PyLong_AsByteArray"]=wasmExports["_PyLong_AsByteArray"])(a0,a1,a2,a3,a4);var _py_version_minor=Module["_py_version_minor"]=()=>(_py_version_minor=Module["_py_version_minor"]=wasmExports["py_version_minor"])();var _py_version_micro=Module["_py_version_micro"]=()=>(_py_version_micro=Module["_py_version_micro"]=wasmExports["py_version_micro"])();var _saveAsyncioState=Module["_saveAsyncioState"]=a0=>(_saveAsyncioState=Module["_saveAsyncioState"]=wasmExports["saveAsyncioState"])(a0);var _PyObject_Hash=Module["_PyObject_Hash"]=a0=>(_PyObject_Hash=Module["_PyObject_Hash"]=wasmExports["PyObject_Hash"])(a0);var __PyDict_GetItem_KnownHash=Module["__PyDict_GetItem_KnownHash"]=(a0,a1,a2)=>(__PyDict_GetItem_KnownHash=Module["__PyDict_GetItem_KnownHash"]=wasmExports["_PyDict_GetItem_KnownHash"])(a0,a1,a2);var _restoreAsyncioState=Module["_restoreAsyncioState"]=a0=>(_restoreAsyncioState=Module["_restoreAsyncioState"]=wasmExports["restoreAsyncioState"])(a0);var _captureThreadState=Module["_captureThreadState"]=()=>(_captureThreadState=Module["_captureThreadState"]=wasmExports["captureThreadState"])();var _PyInterpreterState_Get=Module["_PyInterpreterState_Get"]=()=>(_PyInterpreterState_Get=Module["_PyInterpreterState_Get"]=wasmExports["PyInterpreterState_Get"])();var _PyThreadState_New=Module["_PyThreadState_New"]=a0=>(_PyThreadState_New=Module["_PyThreadState_New"]=wasmExports["PyThreadState_New"])(a0);var _restoreThreadState=Module["_restoreThreadState"]=a0=>(_restoreThreadState=Module["_restoreThreadState"]=wasmExports["restoreThreadState"])(a0);var _PyThreadState_Delete=Module["_PyThreadState_Delete"]=a0=>(_PyThreadState_Delete=Module["_PyThreadState_Delete"]=wasmExports["PyThreadState_Delete"])(a0);var _PyThreadState_Get=Module["_PyThreadState_Get"]=()=>(_PyThreadState_Get=Module["_PyThreadState_Get"]=wasmExports["PyThreadState_Get"])();var _restore_cframe=Module["_restore_cframe"]=a0=>(_restore_cframe=Module["_restore_cframe"]=wasmExports["restore_cframe"])(a0);var _PyObject_GetArenaAllocator=Module["_PyObject_GetArenaAllocator"]=a0=>(_PyObject_GetArenaAllocator=Module["_PyObject_GetArenaAllocator"]=wasmExports["PyObject_GetArenaAllocator"])(a0);var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["__main_argc_argv"])(a0,a1);var _PyImport_AppendInittab=Module["_PyImport_AppendInittab"]=(a0,a1)=>(_PyImport_AppendInittab=Module["_PyImport_AppendInittab"]=wasmExports["PyImport_AppendInittab"])(a0,a1);var _PyPreConfig_InitPythonConfig=Module["_PyPreConfig_InitPythonConfig"]=a0=>(_PyPreConfig_InitPythonConfig=Module["_PyPreConfig_InitPythonConfig"]=wasmExports["PyPreConfig_InitPythonConfig"])(a0);var _Py_PreInitializeFromBytesArgs=Module["_Py_PreInitializeFromBytesArgs"]=(a0,a1,a2,a3)=>(_Py_PreInitializeFromBytesArgs=Module["_Py_PreInitializeFromBytesArgs"]=wasmExports["Py_PreInitializeFromBytesArgs"])(a0,a1,a2,a3);var _PyStatus_Exception=Module["_PyStatus_Exception"]=a0=>(_PyStatus_Exception=Module["_PyStatus_Exception"]=wasmExports["PyStatus_Exception"])(a0);var _PyConfig_InitPythonConfig=Module["_PyConfig_InitPythonConfig"]=a0=>(_PyConfig_InitPythonConfig=Module["_PyConfig_InitPythonConfig"]=wasmExports["PyConfig_InitPythonConfig"])(a0);var _PyConfig_SetBytesArgv=Module["_PyConfig_SetBytesArgv"]=(a0,a1,a2,a3)=>(_PyConfig_SetBytesArgv=Module["_PyConfig_SetBytesArgv"]=wasmExports["PyConfig_SetBytesArgv"])(a0,a1,a2,a3);var _PyConfig_SetBytesString=Module["_PyConfig_SetBytesString"]=(a0,a1,a2,a3)=>(_PyConfig_SetBytesString=Module["_PyConfig_SetBytesString"]=wasmExports["PyConfig_SetBytesString"])(a0,a1,a2,a3);var _Py_InitializeFromConfig=Module["_Py_InitializeFromConfig"]=(a0,a1)=>(_Py_InitializeFromConfig=Module["_Py_InitializeFromConfig"]=wasmExports["Py_InitializeFromConfig"])(a0,a1);var _PyConfig_Clear=Module["_PyConfig_Clear"]=a0=>(_PyConfig_Clear=Module["_PyConfig_Clear"]=wasmExports["PyConfig_Clear"])(a0);var _Py_ExitStatusException=Module["_Py_ExitStatusException"]=a0=>(_Py_ExitStatusException=Module["_Py_ExitStatusException"]=wasmExports["Py_ExitStatusException"])(a0);var _run_main=Module["_run_main"]=()=>(_run_main=Module["_run_main"]=wasmExports["run_main"])();var _Py_GetBuildInfo=Module["_Py_GetBuildInfo"]=()=>(_Py_GetBuildInfo=Module["_Py_GetBuildInfo"]=wasmExports["Py_GetBuildInfo"])();var _PyOS_snprintf=Module["_PyOS_snprintf"]=(a0,a1,a2,a3)=>(_PyOS_snprintf=Module["_PyOS_snprintf"]=wasmExports["PyOS_snprintf"])(a0,a1,a2,a3);var __Py_gitversion=Module["__Py_gitversion"]=()=>(__Py_gitversion=Module["__Py_gitversion"]=wasmExports["_Py_gitversion"])();var __Py_gitidentifier=Module["__Py_gitidentifier"]=()=>(__Py_gitidentifier=Module["__Py_gitidentifier"]=wasmExports["_Py_gitidentifier"])();var __PyToken_OneChar=Module["__PyToken_OneChar"]=a0=>(__PyToken_OneChar=Module["__PyToken_OneChar"]=wasmExports["_PyToken_OneChar"])(a0);var __PyToken_TwoChars=Module["__PyToken_TwoChars"]=(a0,a1)=>(__PyToken_TwoChars=Module["__PyToken_TwoChars"]=wasmExports["_PyToken_TwoChars"])(a0,a1);var __PyToken_ThreeChars=Module["__PyToken_ThreeChars"]=(a0,a1,a2)=>(__PyToken_ThreeChars=Module["__PyToken_ThreeChars"]=wasmExports["_PyToken_ThreeChars"])(a0,a1,a2);var _strlen=Module["_strlen"]=a0=>(_strlen=Module["_strlen"]=wasmExports["strlen"])(a0);var _PyUnicode_DecodeUTF8=Module["_PyUnicode_DecodeUTF8"]=(a0,a1,a2)=>(_PyUnicode_DecodeUTF8=Module["_PyUnicode_DecodeUTF8"]=wasmExports["PyUnicode_DecodeUTF8"])(a0,a1,a2);var _PyUnicode_Substring=Module["_PyUnicode_Substring"]=(a0,a1,a2)=>(_PyUnicode_Substring=Module["_PyUnicode_Substring"]=wasmExports["PyUnicode_Substring"])(a0,a1,a2);var __PyImport_GetModuleAttrString=Module["__PyImport_GetModuleAttrString"]=(a0,a1)=>(__PyImport_GetModuleAttrString=Module["__PyImport_GetModuleAttrString"]=wasmExports["_PyImport_GetModuleAttrString"])(a0,a1);var __PyUnicode_EqualToASCIIString=Module["__PyUnicode_EqualToASCIIString"]=(a0,a1)=>(__PyUnicode_EqualToASCIIString=Module["__PyUnicode_EqualToASCIIString"]=wasmExports["_PyUnicode_EqualToASCIIString"])(a0,a1);var __PyArena_Malloc=Module["__PyArena_Malloc"]=(a0,a1)=>(__PyArena_Malloc=Module["__PyArena_Malloc"]=wasmExports["_PyArena_Malloc"])(a0,a1);var _strncpy=Module["_strncpy"]=(a0,a1,a2)=>(_strncpy=Module["_strncpy"]=wasmExports["strncpy"])(a0,a1,a2);var _PyMem_Realloc=Module["_PyMem_Realloc"]=(a0,a1)=>(_PyMem_Realloc=Module["_PyMem_Realloc"]=wasmExports["PyMem_Realloc"])(a0,a1);var _PyMem_Calloc=Module["_PyMem_Calloc"]=(a0,a1)=>(_PyMem_Calloc=Module["_PyMem_Calloc"]=wasmExports["PyMem_Calloc"])(a0,a1);var __PyArena_AddPyObject=Module["__PyArena_AddPyObject"]=(a0,a1)=>(__PyArena_AddPyObject=Module["__PyArena_AddPyObject"]=wasmExports["_PyArena_AddPyObject"])(a0,a1);var _PyBytes_AsString=Module["_PyBytes_AsString"]=a0=>(_PyBytes_AsString=Module["_PyBytes_AsString"]=wasmExports["PyBytes_AsString"])(a0);var _PyUnicode_InternFromString=Module["_PyUnicode_InternFromString"]=a0=>(_PyUnicode_InternFromString=Module["_PyUnicode_InternFromString"]=wasmExports["PyUnicode_InternFromString"])(a0);var __PyObject_FastCall=Module["__PyObject_FastCall"]=(a0,a1,a2)=>(__PyObject_FastCall=Module["__PyObject_FastCall"]=wasmExports["_PyObject_FastCall"])(a0,a1,a2);var __PyType_Name=Module["__PyType_Name"]=a0=>(__PyType_Name=Module["__PyType_Name"]=wasmExports["_PyType_Name"])(a0);var __PyUnicode_InternImmortal=Module["__PyUnicode_InternImmortal"]=(a0,a1)=>(__PyUnicode_InternImmortal=Module["__PyUnicode_InternImmortal"]=wasmExports["_PyUnicode_InternImmortal"])(a0,a1);var _PyBytes_AsStringAndSize=Module["_PyBytes_AsStringAndSize"]=(a0,a1,a2)=>(_PyBytes_AsStringAndSize=Module["_PyBytes_AsStringAndSize"]=wasmExports["PyBytes_AsStringAndSize"])(a0,a1,a2);var _strchr=Module["_strchr"]=(a0,a1)=>(_strchr=Module["_strchr"]=wasmExports["strchr"])(a0,a1);var _PyUnicode_CompareWithASCIIString=Module["_PyUnicode_CompareWithASCIIString"]=(a0,a1)=>(_PyUnicode_CompareWithASCIIString=Module["_PyUnicode_CompareWithASCIIString"]=wasmExports["PyUnicode_CompareWithASCIIString"])(a0,a1);var ___errno_location=()=>(___errno_location=wasmExports["__errno_location"])();var _PyOS_strtoul=Module["_PyOS_strtoul"]=(a0,a1,a2)=>(_PyOS_strtoul=Module["_PyOS_strtoul"]=wasmExports["PyOS_strtoul"])(a0,a1,a2);var _PyLong_FromString=Module["_PyLong_FromString"]=(a0,a1,a2)=>(_PyLong_FromString=Module["_PyLong_FromString"]=wasmExports["PyLong_FromString"])(a0,a1,a2);var _PyOS_strtol=Module["_PyOS_strtol"]=(a0,a1,a2)=>(_PyOS_strtol=Module["_PyOS_strtol"]=wasmExports["PyOS_strtol"])(a0,a1,a2);var _PyOS_string_to_double=Module["_PyOS_string_to_double"]=(a0,a1,a2)=>(_PyOS_string_to_double=Module["_PyOS_string_to_double"]=wasmExports["PyOS_string_to_double"])(a0,a1,a2);var _PyComplex_FromCComplex=Module["_PyComplex_FromCComplex"]=a0=>(_PyComplex_FromCComplex=Module["_PyComplex_FromCComplex"]=wasmExports["PyComplex_FromCComplex"])(a0);var _PyFloat_FromDouble=Module["_PyFloat_FromDouble"]=a0=>(_PyFloat_FromDouble=Module["_PyFloat_FromDouble"]=wasmExports["PyFloat_FromDouble"])(a0);var _Py_BuildValue=Module["_Py_BuildValue"]=(a0,a1)=>(_Py_BuildValue=Module["_Py_BuildValue"]=wasmExports["Py_BuildValue"])(a0,a1);var _PyUnicode_FromFormatV=Module["_PyUnicode_FromFormatV"]=(a0,a1)=>(_PyUnicode_FromFormatV=Module["_PyUnicode_FromFormatV"]=wasmExports["PyUnicode_FromFormatV"])(a0,a1);var __PyErr_ProgramDecodedTextObject=Module["__PyErr_ProgramDecodedTextObject"]=(a0,a1,a2)=>(__PyErr_ProgramDecodedTextObject=Module["__PyErr_ProgramDecodedTextObject"]=wasmExports["_PyErr_ProgramDecodedTextObject"])(a0,a1,a2);var _PyUnicode_FromStringAndSize=Module["_PyUnicode_FromStringAndSize"]=(a0,a1)=>(_PyUnicode_FromStringAndSize=Module["_PyUnicode_FromStringAndSize"]=wasmExports["PyUnicode_FromStringAndSize"])(a0,a1);var _strcpy=Module["_strcpy"]=(a0,a1)=>(_strcpy=Module["_strcpy"]=wasmExports["strcpy"])(a0,a1);var __PyUnicode_InternMortal=Module["__PyUnicode_InternMortal"]=(a0,a1)=>(__PyUnicode_InternMortal=Module["__PyUnicode_InternMortal"]=wasmExports["_PyUnicode_InternMortal"])(a0,a1);var _PyUnicode_GetLength=Module["_PyUnicode_GetLength"]=a0=>(_PyUnicode_GetLength=Module["_PyUnicode_GetLength"]=wasmExports["PyUnicode_GetLength"])(a0);var _PyBytes_FromString=Module["_PyBytes_FromString"]=a0=>(_PyBytes_FromString=Module["_PyBytes_FromString"]=wasmExports["PyBytes_FromString"])(a0);var _PyBytes_Concat=Module["_PyBytes_Concat"]=(a0,a1)=>(_PyBytes_Concat=Module["_PyBytes_Concat"]=wasmExports["PyBytes_Concat"])(a0,a1);var __PyUnicodeWriter_Init=Module["__PyUnicodeWriter_Init"]=a0=>(__PyUnicodeWriter_Init=Module["__PyUnicodeWriter_Init"]=wasmExports["_PyUnicodeWriter_Init"])(a0);var __PyUnicodeWriter_WriteStr=Module["__PyUnicodeWriter_WriteStr"]=(a0,a1)=>(__PyUnicodeWriter_WriteStr=Module["__PyUnicodeWriter_WriteStr"]=wasmExports["_PyUnicodeWriter_WriteStr"])(a0,a1);var __PyUnicodeWriter_Dealloc=Module["__PyUnicodeWriter_Dealloc"]=a0=>(__PyUnicodeWriter_Dealloc=Module["__PyUnicodeWriter_Dealloc"]=wasmExports["_PyUnicodeWriter_Dealloc"])(a0);var __PyUnicodeWriter_Finish=Module["__PyUnicodeWriter_Finish"]=a0=>(__PyUnicodeWriter_Finish=Module["__PyUnicodeWriter_Finish"]=wasmExports["_PyUnicodeWriter_Finish"])(a0);var _strpbrk=Module["_strpbrk"]=(a0,a1)=>(_strpbrk=Module["_strpbrk"]=wasmExports["strpbrk"])(a0,a1);var _PyUnicode_DecodeUTF8Stateful=Module["_PyUnicode_DecodeUTF8Stateful"]=(a0,a1,a2,a3)=>(_PyUnicode_DecodeUTF8Stateful=Module["_PyUnicode_DecodeUTF8Stateful"]=wasmExports["PyUnicode_DecodeUTF8Stateful"])(a0,a1,a2,a3);var _siprintf=Module["_siprintf"]=(a0,a1,a2)=>(_siprintf=Module["_siprintf"]=wasmExports["siprintf"])(a0,a1,a2);var __PyUnicode_DecodeUnicodeEscapeInternal=Module["__PyUnicode_DecodeUnicodeEscapeInternal"]=(a0,a1,a2,a3,a4)=>(__PyUnicode_DecodeUnicodeEscapeInternal=Module["__PyUnicode_DecodeUnicodeEscapeInternal"]=wasmExports["_PyUnicode_DecodeUnicodeEscapeInternal"])(a0,a1,a2,a3,a4);var __PyErr_BadInternalCall=Module["__PyErr_BadInternalCall"]=(a0,a1)=>(__PyErr_BadInternalCall=Module["__PyErr_BadInternalCall"]=wasmExports["_PyErr_BadInternalCall"])(a0,a1);var __PyBytes_DecodeEscape=Module["__PyBytes_DecodeEscape"]=(a0,a1,a2,a3)=>(__PyBytes_DecodeEscape=Module["__PyBytes_DecodeEscape"]=wasmExports["_PyBytes_DecodeEscape"])(a0,a1,a2,a3);var _PyErr_WarnExplicitObject=Module["_PyErr_WarnExplicitObject"]=(a0,a1,a2,a3,a4,a5)=>(_PyErr_WarnExplicitObject=Module["_PyErr_WarnExplicitObject"]=wasmExports["PyErr_WarnExplicitObject"])(a0,a1,a2,a3,a4,a5);var _PySys_Audit=Module["_PySys_Audit"]=(a0,a1,a2)=>(_PySys_Audit=Module["_PySys_Audit"]=wasmExports["PySys_Audit"])(a0,a1,a2);var _fflush=Module["_fflush"]=a0=>(_fflush=Module["_fflush"]=wasmExports["fflush"])(a0);var _fputs=Module["_fputs"]=(a0,a1)=>(_fputs=Module["_fputs"]=wasmExports["fputs"])(a0,a1);var _PyMem_RawFree=Module["_PyMem_RawFree"]=a0=>(_PyMem_RawFree=Module["_PyMem_RawFree"]=wasmExports["PyMem_RawFree"])(a0);var _PyEval_RestoreThread=Module["_PyEval_RestoreThread"]=a0=>(_PyEval_RestoreThread=Module["_PyEval_RestoreThread"]=wasmExports["PyEval_RestoreThread"])(a0);var _PyEval_SaveThread=Module["_PyEval_SaveThread"]=()=>(_PyEval_SaveThread=Module["_PyEval_SaveThread"]=wasmExports["PyEval_SaveThread"])();var _PyMem_RawRealloc=Module["_PyMem_RawRealloc"]=(a0,a1)=>(_PyMem_RawRealloc=Module["_PyMem_RawRealloc"]=wasmExports["PyMem_RawRealloc"])(a0,a1);var _clearerr=Module["_clearerr"]=a0=>(_clearerr=Module["_clearerr"]=wasmExports["clearerr"])(a0);var _fgets=Module["_fgets"]=(a0,a1,a2)=>(_fgets=Module["_fgets"]=wasmExports["fgets"])(a0,a1,a2);var _feof=Module["_feof"]=a0=>(_feof=Module["_feof"]=wasmExports["feof"])(a0);var __PyOS_InterruptOccurred=Module["__PyOS_InterruptOccurred"]=a0=>(__PyOS_InterruptOccurred=Module["__PyOS_InterruptOccurred"]=wasmExports["_PyOS_InterruptOccurred"])(a0);var _PyErr_CheckSignals=Module["_PyErr_CheckSignals"]=()=>(_PyErr_CheckSignals=Module["_PyErr_CheckSignals"]=wasmExports["PyErr_CheckSignals"])();var _PyOS_Readline=Module["_PyOS_Readline"]=(a0,a1,a2)=>(_PyOS_Readline=Module["_PyOS_Readline"]=wasmExports["PyOS_Readline"])(a0,a1,a2);var _PyThread_allocate_lock=Module["_PyThread_allocate_lock"]=()=>(_PyThread_allocate_lock=Module["_PyThread_allocate_lock"]=wasmExports["PyThread_allocate_lock"])();var _PyThread_acquire_lock=Module["_PyThread_acquire_lock"]=(a0,a1)=>(_PyThread_acquire_lock=Module["_PyThread_acquire_lock"]=wasmExports["PyThread_acquire_lock"])(a0,a1);var _isatty=Module["_isatty"]=a0=>(_isatty=Module["_isatty"]=wasmExports["isatty"])(a0);var _PyThread_release_lock=Module["_PyThread_release_lock"]=a0=>(_PyThread_release_lock=Module["_PyThread_release_lock"]=wasmExports["PyThread_release_lock"])(a0);var _PyUnicode_Decode=Module["_PyUnicode_Decode"]=(a0,a1,a2,a3)=>(_PyUnicode_Decode=Module["_PyUnicode_Decode"]=wasmExports["PyUnicode_Decode"])(a0,a1,a2,a3);var _PyUnicode_AsUTF8String=Module["_PyUnicode_AsUTF8String"]=a0=>(_PyUnicode_AsUTF8String=Module["_PyUnicode_AsUTF8String"]=wasmExports["PyUnicode_AsUTF8String"])(a0);var __Py_FatalErrorFunc=Module["__Py_FatalErrorFunc"]=(a0,a1)=>(__Py_FatalErrorFunc=Module["__Py_FatalErrorFunc"]=wasmExports["_Py_FatalErrorFunc"])(a0,a1);var __Py_dup=Module["__Py_dup"]=a0=>(__Py_dup=Module["__Py_dup"]=wasmExports["_Py_dup"])(a0);var _fdopen=Module["_fdopen"]=(a0,a1)=>(_fdopen=Module["_fdopen"]=wasmExports["fdopen"])(a0,a1);var _fclose=Module["_fclose"]=a0=>(_fclose=Module["_fclose"]=wasmExports["fclose"])(a0);var _memcmp=Module["_memcmp"]=(a0,a1,a2)=>(_memcmp=Module["_memcmp"]=wasmExports["memcmp"])(a0,a1,a2);var _tolower=Module["_tolower"]=a0=>(_tolower=Module["_tolower"]=wasmExports["tolower"])(a0);var __PyUnicode_ScanIdentifier=Module["__PyUnicode_ScanIdentifier"]=a0=>(__PyUnicode_ScanIdentifier=Module["__PyUnicode_ScanIdentifier"]=wasmExports["_PyUnicode_ScanIdentifier"])(a0);var __PyUnicode_IsPrintable=Module["__PyUnicode_IsPrintable"]=a0=>(__PyUnicode_IsPrintable=Module["__PyUnicode_IsPrintable"]=wasmExports["_PyUnicode_IsPrintable"])(a0);var _isxdigit=Module["_isxdigit"]=a0=>(_isxdigit=Module["_isxdigit"]=wasmExports["isxdigit"])(a0);var _PyObject_CallNoArgs=Module["_PyObject_CallNoArgs"]=a0=>(_PyObject_CallNoArgs=Module["_PyObject_CallNoArgs"]=wasmExports["PyObject_CallNoArgs"])(a0);var _getc=Module["_getc"]=a0=>(_getc=Module["_getc"]=wasmExports["getc"])(a0);var _ungetc=Module["_ungetc"]=(a0,a1)=>(_ungetc=Module["_ungetc"]=wasmExports["ungetc"])(a0,a1);var __Py_UniversalNewlineFgetsWithSize=Module["__Py_UniversalNewlineFgetsWithSize"]=(a0,a1,a2,a3,a4)=>(__Py_UniversalNewlineFgetsWithSize=Module["__Py_UniversalNewlineFgetsWithSize"]=wasmExports["_Py_UniversalNewlineFgetsWithSize"])(a0,a1,a2,a3,a4);var _memchr=Module["_memchr"]=(a0,a1,a2)=>(_memchr=Module["_memchr"]=wasmExports["memchr"])(a0,a1,a2);var _PyObject_Malloc=Module["_PyObject_Malloc"]=a0=>(_PyObject_Malloc=Module["_PyObject_Malloc"]=wasmExports["PyObject_Malloc"])(a0);var _PyObject_Free=Module["_PyObject_Free"]=a0=>(_PyObject_Free=Module["_PyObject_Free"]=wasmExports["PyObject_Free"])(a0);var _ftell=Module["_ftell"]=a0=>(_ftell=Module["_ftell"]=wasmExports["ftell"])(a0);var _lseek=Module["_lseek"]=(a0,a1,a2)=>(_lseek=Module["_lseek"]=wasmExports["lseek"])(a0,a1,a2);var _PyErr_SetFromErrnoWithFilename=Module["_PyErr_SetFromErrnoWithFilename"]=(a0,a1)=>(_PyErr_SetFromErrnoWithFilename=Module["_PyErr_SetFromErrnoWithFilename"]=wasmExports["PyErr_SetFromErrnoWithFilename"])(a0,a1);var __PyObject_CallFunction_SizeT=Module["__PyObject_CallFunction_SizeT"]=(a0,a1,a2)=>(__PyObject_CallFunction_SizeT=Module["__PyObject_CallFunction_SizeT"]=wasmExports["_PyObject_CallFunction_SizeT"])(a0,a1,a2);var _PyObject_GetAttr=Module["_PyObject_GetAttr"]=(a0,a1)=>(_PyObject_GetAttr=Module["_PyObject_GetAttr"]=wasmExports["PyObject_GetAttr"])(a0,a1);var __PyObject_MakeTpCall=Module["__PyObject_MakeTpCall"]=(a0,a1,a2,a3,a4)=>(__PyObject_MakeTpCall=Module["__PyObject_MakeTpCall"]=wasmExports["_PyObject_MakeTpCall"])(a0,a1,a2,a3,a4);var __Py_CheckFunctionResult=Module["__Py_CheckFunctionResult"]=(a0,a1,a2,a3)=>(__Py_CheckFunctionResult=Module["__Py_CheckFunctionResult"]=wasmExports["_Py_CheckFunctionResult"])(a0,a1,a2,a3);var _strcspn=Module["_strcspn"]=(a0,a1)=>(_strcspn=Module["_strcspn"]=wasmExports["strcspn"])(a0,a1);var __Py_BuildValue_SizeT=Module["__Py_BuildValue_SizeT"]=(a0,a1)=>(__Py_BuildValue_SizeT=Module["__Py_BuildValue_SizeT"]=wasmExports["_Py_BuildValue_SizeT"])(a0,a1);var _PyObject_Type=Module["_PyObject_Type"]=a0=>(_PyObject_Type=Module["_PyObject_Type"]=wasmExports["PyObject_Type"])(a0);var __PyErr_SetString=Module["__PyErr_SetString"]=(a0,a1,a2)=>(__PyErr_SetString=Module["__PyErr_SetString"]=wasmExports["_PyErr_SetString"])(a0,a1,a2);var _PyObject_Size=Module["_PyObject_Size"]=a0=>(_PyObject_Size=Module["_PyObject_Size"]=wasmExports["PyObject_Size"])(a0);var _PyMapping_Size=Module["_PyMapping_Size"]=a0=>(_PyMapping_Size=Module["_PyMapping_Size"]=wasmExports["PyMapping_Size"])(a0);var _PyObject_Length=Module["_PyObject_Length"]=a0=>(_PyObject_Length=Module["_PyObject_Length"]=wasmExports["PyObject_Length"])(a0);var __PyObject_HasLen=Module["__PyObject_HasLen"]=a0=>(__PyObject_HasLen=Module["__PyObject_HasLen"]=wasmExports["_PyObject_HasLen"])(a0);var _PyObject_LengthHint=Module["_PyObject_LengthHint"]=(a0,a1)=>(_PyObject_LengthHint=Module["_PyObject_LengthHint"]=wasmExports["PyObject_LengthHint"])(a0,a1);var __PyErr_ExceptionMatches=Module["__PyErr_ExceptionMatches"]=(a0,a1)=>(__PyErr_ExceptionMatches=Module["__PyErr_ExceptionMatches"]=wasmExports["_PyErr_ExceptionMatches"])(a0,a1);var __PyErr_Clear=Module["__PyErr_Clear"]=a0=>(__PyErr_Clear=Module["__PyErr_Clear"]=wasmExports["_PyErr_Clear"])(a0);var __PyObject_LookupSpecial=Module["__PyObject_LookupSpecial"]=(a0,a1)=>(__PyObject_LookupSpecial=Module["__PyObject_LookupSpecial"]=wasmExports["_PyObject_LookupSpecial"])(a0,a1);var _Py_GenericAlias=Module["_Py_GenericAlias"]=(a0,a1)=>(_Py_GenericAlias=Module["_Py_GenericAlias"]=wasmExports["Py_GenericAlias"])(a0,a1);var __PyObject_LookupAttr=Module["__PyObject_LookupAttr"]=(a0,a1,a2)=>(__PyObject_LookupAttr=Module["__PyObject_LookupAttr"]=wasmExports["_PyObject_LookupAttr"])(a0,a1,a2);var __PyErr_Format=Module["__PyErr_Format"]=(a0,a1,a2,a3)=>(__PyErr_Format=Module["__PyErr_Format"]=wasmExports["_PyErr_Format"])(a0,a1,a2,a3);var _PySequence_SetItem=Module["_PySequence_SetItem"]=(a0,a1,a2)=>(_PySequence_SetItem=Module["_PySequence_SetItem"]=wasmExports["PySequence_SetItem"])(a0,a1,a2);var _PySequence_DelItem=Module["_PySequence_DelItem"]=(a0,a1)=>(_PySequence_DelItem=Module["_PySequence_DelItem"]=wasmExports["PySequence_DelItem"])(a0,a1);var _PyObject_DelItemString=Module["_PyObject_DelItemString"]=(a0,a1)=>(_PyObject_DelItemString=Module["_PyObject_DelItemString"]=wasmExports["PyObject_DelItemString"])(a0,a1);var _PyObject_CheckReadBuffer=Module["_PyObject_CheckReadBuffer"]=a0=>(_PyObject_CheckReadBuffer=Module["_PyObject_CheckReadBuffer"]=wasmExports["PyObject_CheckReadBuffer"])(a0);var _PyObject_AsCharBuffer=Module["_PyObject_AsCharBuffer"]=(a0,a1,a2)=>(_PyObject_AsCharBuffer=Module["_PyObject_AsCharBuffer"]=wasmExports["PyObject_AsCharBuffer"])(a0,a1,a2);var _PyObject_AsReadBuffer=Module["_PyObject_AsReadBuffer"]=(a0,a1,a2)=>(_PyObject_AsReadBuffer=Module["_PyObject_AsReadBuffer"]=wasmExports["PyObject_AsReadBuffer"])(a0,a1,a2);var _PyObject_AsWriteBuffer=Module["_PyObject_AsWriteBuffer"]=(a0,a1,a2)=>(_PyObject_AsWriteBuffer=Module["_PyObject_AsWriteBuffer"]=wasmExports["PyObject_AsWriteBuffer"])(a0,a1,a2);var _PyBuffer_GetPointer=Module["_PyBuffer_GetPointer"]=(a0,a1)=>(_PyBuffer_GetPointer=Module["_PyBuffer_GetPointer"]=wasmExports["PyBuffer_GetPointer"])(a0,a1);var __Py_add_one_to_index_F=Module["__Py_add_one_to_index_F"]=(a0,a1,a2)=>(__Py_add_one_to_index_F=Module["__Py_add_one_to_index_F"]=wasmExports["_Py_add_one_to_index_F"])(a0,a1,a2);var __Py_add_one_to_index_C=Module["__Py_add_one_to_index_C"]=(a0,a1,a2)=>(__Py_add_one_to_index_C=Module["__Py_add_one_to_index_C"]=wasmExports["_Py_add_one_to_index_C"])(a0,a1,a2);var _PyBuffer_SizeFromFormat=Module["_PyBuffer_SizeFromFormat"]=a0=>(_PyBuffer_SizeFromFormat=Module["_PyBuffer_SizeFromFormat"]=wasmExports["PyBuffer_SizeFromFormat"])(a0);var _PyObject_CallFunctionObjArgs=Module["_PyObject_CallFunctionObjArgs"]=(a0,a1)=>(_PyObject_CallFunctionObjArgs=Module["_PyObject_CallFunctionObjArgs"]=wasmExports["PyObject_CallFunctionObjArgs"])(a0,a1);var _PyBuffer_FromContiguous=Module["_PyBuffer_FromContiguous"]=(a0,a1,a2,a3)=>(_PyBuffer_FromContiguous=Module["_PyBuffer_FromContiguous"]=wasmExports["PyBuffer_FromContiguous"])(a0,a1,a2,a3);var _memset=Module["_memset"]=(a0,a1,a2)=>(_memset=Module["_memset"]=wasmExports["memset"])(a0,a1,a2);var _PyObject_CopyData=Module["_PyObject_CopyData"]=(a0,a1)=>(_PyObject_CopyData=Module["_PyObject_CopyData"]=wasmExports["PyObject_CopyData"])(a0,a1);var _PyBuffer_FillInfo=Module["_PyBuffer_FillInfo"]=(a0,a1,a2,a3,a4,a5)=>(_PyBuffer_FillInfo=Module["_PyBuffer_FillInfo"]=wasmExports["PyBuffer_FillInfo"])(a0,a1,a2,a3,a4,a5);var _PyObject_Format=Module["_PyObject_Format"]=(a0,a1)=>(_PyObject_Format=Module["_PyObject_Format"]=wasmExports["PyObject_Format"])(a0,a1);var _PyUnicode_New=Module["_PyUnicode_New"]=(a0,a1)=>(_PyUnicode_New=Module["_PyUnicode_New"]=wasmExports["PyUnicode_New"])(a0,a1);var _PyNumber_Check=Module["_PyNumber_Check"]=a0=>(_PyNumber_Check=Module["_PyNumber_Check"]=wasmExports["PyNumber_Check"])(a0);var _PyNumber_Or=Module["_PyNumber_Or"]=(a0,a1)=>(_PyNumber_Or=Module["_PyNumber_Or"]=wasmExports["PyNumber_Or"])(a0,a1);var _PyNumber_Xor=Module["_PyNumber_Xor"]=(a0,a1)=>(_PyNumber_Xor=Module["_PyNumber_Xor"]=wasmExports["PyNumber_Xor"])(a0,a1);var _PyNumber_And=Module["_PyNumber_And"]=(a0,a1)=>(_PyNumber_And=Module["_PyNumber_And"]=wasmExports["PyNumber_And"])(a0,a1);var _PyNumber_Lshift=Module["_PyNumber_Lshift"]=(a0,a1)=>(_PyNumber_Lshift=Module["_PyNumber_Lshift"]=wasmExports["PyNumber_Lshift"])(a0,a1);var _PyNumber_Rshift=Module["_PyNumber_Rshift"]=(a0,a1)=>(_PyNumber_Rshift=Module["_PyNumber_Rshift"]=wasmExports["PyNumber_Rshift"])(a0,a1);var _PyNumber_Subtract=Module["_PyNumber_Subtract"]=(a0,a1)=>(_PyNumber_Subtract=Module["_PyNumber_Subtract"]=wasmExports["PyNumber_Subtract"])(a0,a1);var _PyNumber_Divmod=Module["_PyNumber_Divmod"]=(a0,a1)=>(_PyNumber_Divmod=Module["_PyNumber_Divmod"]=wasmExports["PyNumber_Divmod"])(a0,a1);var _PyNumber_Add=Module["_PyNumber_Add"]=(a0,a1)=>(_PyNumber_Add=Module["_PyNumber_Add"]=wasmExports["PyNumber_Add"])(a0,a1);var _PyNumber_Multiply=Module["_PyNumber_Multiply"]=(a0,a1)=>(_PyNumber_Multiply=Module["_PyNumber_Multiply"]=wasmExports["PyNumber_Multiply"])(a0,a1);var _PyNumber_MatrixMultiply=Module["_PyNumber_MatrixMultiply"]=(a0,a1)=>(_PyNumber_MatrixMultiply=Module["_PyNumber_MatrixMultiply"]=wasmExports["PyNumber_MatrixMultiply"])(a0,a1);var _PyNumber_FloorDivide=Module["_PyNumber_FloorDivide"]=(a0,a1)=>(_PyNumber_FloorDivide=Module["_PyNumber_FloorDivide"]=wasmExports["PyNumber_FloorDivide"])(a0,a1);var _PyNumber_TrueDivide=Module["_PyNumber_TrueDivide"]=(a0,a1)=>(_PyNumber_TrueDivide=Module["_PyNumber_TrueDivide"]=wasmExports["PyNumber_TrueDivide"])(a0,a1);var _PyNumber_Remainder=Module["_PyNumber_Remainder"]=(a0,a1)=>(_PyNumber_Remainder=Module["_PyNumber_Remainder"]=wasmExports["PyNumber_Remainder"])(a0,a1);var _PyNumber_Power=Module["_PyNumber_Power"]=(a0,a1,a2)=>(_PyNumber_Power=Module["_PyNumber_Power"]=wasmExports["PyNumber_Power"])(a0,a1,a2);var _PyNumber_InPlaceOr=Module["_PyNumber_InPlaceOr"]=(a0,a1)=>(_PyNumber_InPlaceOr=Module["_PyNumber_InPlaceOr"]=wasmExports["PyNumber_InPlaceOr"])(a0,a1);var _PyNumber_InPlaceXor=Module["_PyNumber_InPlaceXor"]=(a0,a1)=>(_PyNumber_InPlaceXor=Module["_PyNumber_InPlaceXor"]=wasmExports["PyNumber_InPlaceXor"])(a0,a1);var _PyNumber_InPlaceAnd=Module["_PyNumber_InPlaceAnd"]=(a0,a1)=>(_PyNumber_InPlaceAnd=Module["_PyNumber_InPlaceAnd"]=wasmExports["PyNumber_InPlaceAnd"])(a0,a1);var _PyNumber_InPlaceLshift=Module["_PyNumber_InPlaceLshift"]=(a0,a1)=>(_PyNumber_InPlaceLshift=Module["_PyNumber_InPlaceLshift"]=wasmExports["PyNumber_InPlaceLshift"])(a0,a1);var _PyNumber_InPlaceRshift=Module["_PyNumber_InPlaceRshift"]=(a0,a1)=>(_PyNumber_InPlaceRshift=Module["_PyNumber_InPlaceRshift"]=wasmExports["PyNumber_InPlaceRshift"])(a0,a1);var _PyNumber_InPlaceSubtract=Module["_PyNumber_InPlaceSubtract"]=(a0,a1)=>(_PyNumber_InPlaceSubtract=Module["_PyNumber_InPlaceSubtract"]=wasmExports["PyNumber_InPlaceSubtract"])(a0,a1);var _PyNumber_InPlaceMatrixMultiply=Module["_PyNumber_InPlaceMatrixMultiply"]=(a0,a1)=>(_PyNumber_InPlaceMatrixMultiply=Module["_PyNumber_InPlaceMatrixMultiply"]=wasmExports["PyNumber_InPlaceMatrixMultiply"])(a0,a1);var _PyNumber_InPlaceFloorDivide=Module["_PyNumber_InPlaceFloorDivide"]=(a0,a1)=>(_PyNumber_InPlaceFloorDivide=Module["_PyNumber_InPlaceFloorDivide"]=wasmExports["PyNumber_InPlaceFloorDivide"])(a0,a1);var _PyNumber_InPlaceTrueDivide=Module["_PyNumber_InPlaceTrueDivide"]=(a0,a1)=>(_PyNumber_InPlaceTrueDivide=Module["_PyNumber_InPlaceTrueDivide"]=wasmExports["PyNumber_InPlaceTrueDivide"])(a0,a1);var _PyNumber_InPlaceRemainder=Module["_PyNumber_InPlaceRemainder"]=(a0,a1)=>(_PyNumber_InPlaceRemainder=Module["_PyNumber_InPlaceRemainder"]=wasmExports["PyNumber_InPlaceRemainder"])(a0,a1);var _PyNumber_InPlaceAdd=Module["_PyNumber_InPlaceAdd"]=(a0,a1)=>(_PyNumber_InPlaceAdd=Module["_PyNumber_InPlaceAdd"]=wasmExports["PyNumber_InPlaceAdd"])(a0,a1);var _PyNumber_InPlaceMultiply=Module["_PyNumber_InPlaceMultiply"]=(a0,a1)=>(_PyNumber_InPlaceMultiply=Module["_PyNumber_InPlaceMultiply"]=wasmExports["PyNumber_InPlaceMultiply"])(a0,a1);var _PyNumber_InPlacePower=Module["_PyNumber_InPlacePower"]=(a0,a1,a2)=>(_PyNumber_InPlacePower=Module["_PyNumber_InPlacePower"]=wasmExports["PyNumber_InPlacePower"])(a0,a1,a2);var _PyNumber_Negative=Module["_PyNumber_Negative"]=a0=>(_PyNumber_Negative=Module["_PyNumber_Negative"]=wasmExports["PyNumber_Negative"])(a0);var _PyNumber_Positive=Module["_PyNumber_Positive"]=a0=>(_PyNumber_Positive=Module["_PyNumber_Positive"]=wasmExports["PyNumber_Positive"])(a0);var _PyNumber_Invert=Module["_PyNumber_Invert"]=a0=>(_PyNumber_Invert=Module["_PyNumber_Invert"]=wasmExports["PyNumber_Invert"])(a0);var _PyNumber_Absolute=Module["_PyNumber_Absolute"]=a0=>(_PyNumber_Absolute=Module["_PyNumber_Absolute"]=wasmExports["PyNumber_Absolute"])(a0);var _PyErr_WarnFormat=Module["_PyErr_WarnFormat"]=(a0,a1,a2,a3)=>(_PyErr_WarnFormat=Module["_PyErr_WarnFormat"]=wasmExports["PyErr_WarnFormat"])(a0,a1,a2,a3);var _PyNumber_Index=Module["_PyNumber_Index"]=a0=>(_PyNumber_Index=Module["_PyNumber_Index"]=wasmExports["PyNumber_Index"])(a0);var __PyLong_Copy=Module["__PyLong_Copy"]=a0=>(__PyLong_Copy=Module["__PyLong_Copy"]=wasmExports["_PyLong_Copy"])(a0);var _PyNumber_Long=Module["_PyNumber_Long"]=a0=>(_PyNumber_Long=Module["_PyNumber_Long"]=wasmExports["PyNumber_Long"])(a0);var _PyErr_WarnEx=Module["_PyErr_WarnEx"]=(a0,a1,a2)=>(_PyErr_WarnEx=Module["_PyErr_WarnEx"]=wasmExports["PyErr_WarnEx"])(a0,a1,a2);var _PyLong_FromUnicodeObject=Module["_PyLong_FromUnicodeObject"]=(a0,a1)=>(_PyLong_FromUnicodeObject=Module["_PyLong_FromUnicodeObject"]=wasmExports["PyLong_FromUnicodeObject"])(a0,a1);var __PyLong_FromBytes=Module["__PyLong_FromBytes"]=(a0,a1,a2)=>(__PyLong_FromBytes=Module["__PyLong_FromBytes"]=wasmExports["_PyLong_FromBytes"])(a0,a1,a2);var _PyNumber_Float=Module["_PyNumber_Float"]=a0=>(_PyNumber_Float=Module["_PyNumber_Float"]=wasmExports["PyNumber_Float"])(a0);var _PyLong_AsDouble=Module["_PyLong_AsDouble"]=a0=>(_PyLong_AsDouble=Module["_PyLong_AsDouble"]=wasmExports["PyLong_AsDouble"])(a0);var _PyFloat_FromString=Module["_PyFloat_FromString"]=a0=>(_PyFloat_FromString=Module["_PyFloat_FromString"]=wasmExports["PyFloat_FromString"])(a0);var _PyNumber_ToBase=Module["_PyNumber_ToBase"]=(a0,a1)=>(_PyNumber_ToBase=Module["_PyNumber_ToBase"]=wasmExports["PyNumber_ToBase"])(a0,a1);var __PyLong_Format=Module["__PyLong_Format"]=(a0,a1)=>(__PyLong_Format=Module["__PyLong_Format"]=wasmExports["_PyLong_Format"])(a0,a1);var _PySequence_Check=Module["_PySequence_Check"]=a0=>(_PySequence_Check=Module["_PySequence_Check"]=wasmExports["PySequence_Check"])(a0);var _PySequence_Length=Module["_PySequence_Length"]=a0=>(_PySequence_Length=Module["_PySequence_Length"]=wasmExports["PySequence_Length"])(a0);var _PySequence_Concat=Module["_PySequence_Concat"]=(a0,a1)=>(_PySequence_Concat=Module["_PySequence_Concat"]=wasmExports["PySequence_Concat"])(a0,a1);var _PySequence_Repeat=Module["_PySequence_Repeat"]=(a0,a1)=>(_PySequence_Repeat=Module["_PySequence_Repeat"]=wasmExports["PySequence_Repeat"])(a0,a1);var _PySequence_InPlaceConcat=Module["_PySequence_InPlaceConcat"]=(a0,a1)=>(_PySequence_InPlaceConcat=Module["_PySequence_InPlaceConcat"]=wasmExports["PySequence_InPlaceConcat"])(a0,a1);var _PySequence_InPlaceRepeat=Module["_PySequence_InPlaceRepeat"]=(a0,a1)=>(_PySequence_InPlaceRepeat=Module["_PySequence_InPlaceRepeat"]=wasmExports["PySequence_InPlaceRepeat"])(a0,a1);var __PySlice_FromIndices=Module["__PySlice_FromIndices"]=(a0,a1)=>(__PySlice_FromIndices=Module["__PySlice_FromIndices"]=wasmExports["_PySlice_FromIndices"])(a0,a1);var _PySequence_DelSlice=Module["_PySequence_DelSlice"]=(a0,a1,a2)=>(_PySequence_DelSlice=Module["_PySequence_DelSlice"]=wasmExports["PySequence_DelSlice"])(a0,a1,a2);var _PySequence_Tuple=Module["_PySequence_Tuple"]=a0=>(_PySequence_Tuple=Module["_PySequence_Tuple"]=wasmExports["PySequence_Tuple"])(a0);var _PyList_AsTuple=Module["_PyList_AsTuple"]=a0=>(_PyList_AsTuple=Module["_PyList_AsTuple"]=wasmExports["PyList_AsTuple"])(a0);var __PyTuple_Resize=Module["__PyTuple_Resize"]=(a0,a1)=>(__PyTuple_Resize=Module["__PyTuple_Resize"]=wasmExports["_PyTuple_Resize"])(a0,a1);var _PySeqIter_New=Module["_PySeqIter_New"]=a0=>(_PySeqIter_New=Module["_PySeqIter_New"]=wasmExports["PySeqIter_New"])(a0);var _PySequence_List=Module["_PySequence_List"]=a0=>(_PySequence_List=Module["_PySequence_List"]=wasmExports["PySequence_List"])(a0);var __PySequence_IterSearch=Module["__PySequence_IterSearch"]=(a0,a1,a2)=>(__PySequence_IterSearch=Module["__PySequence_IterSearch"]=wasmExports["_PySequence_IterSearch"])(a0,a1,a2);var _PySequence_Count=Module["_PySequence_Count"]=(a0,a1)=>(_PySequence_Count=Module["_PySequence_Count"]=wasmExports["PySequence_Count"])(a0,a1);var _PySequence_In=Module["_PySequence_In"]=(a0,a1)=>(_PySequence_In=Module["_PySequence_In"]=wasmExports["PySequence_In"])(a0,a1);var _PySequence_Index=Module["_PySequence_Index"]=(a0,a1)=>(_PySequence_Index=Module["_PySequence_Index"]=wasmExports["PySequence_Index"])(a0,a1);var _PyMapping_Check=Module["_PyMapping_Check"]=a0=>(_PyMapping_Check=Module["_PyMapping_Check"]=wasmExports["PyMapping_Check"])(a0);var _PyMapping_Length=Module["_PyMapping_Length"]=a0=>(_PyMapping_Length=Module["_PyMapping_Length"]=wasmExports["PyMapping_Length"])(a0);var _PyMapping_GetItemString=Module["_PyMapping_GetItemString"]=(a0,a1)=>(_PyMapping_GetItemString=Module["_PyMapping_GetItemString"]=wasmExports["PyMapping_GetItemString"])(a0,a1);var _PyMapping_SetItemString=Module["_PyMapping_SetItemString"]=(a0,a1,a2)=>(_PyMapping_SetItemString=Module["_PyMapping_SetItemString"]=wasmExports["PyMapping_SetItemString"])(a0,a1,a2);var _PyMapping_HasKeyString=Module["_PyMapping_HasKeyString"]=(a0,a1)=>(_PyMapping_HasKeyString=Module["_PyMapping_HasKeyString"]=wasmExports["PyMapping_HasKeyString"])(a0,a1);var _PyMapping_HasKey=Module["_PyMapping_HasKey"]=(a0,a1)=>(_PyMapping_HasKey=Module["_PyMapping_HasKey"]=wasmExports["PyMapping_HasKey"])(a0,a1);var _PyMapping_Keys=Module["_PyMapping_Keys"]=a0=>(_PyMapping_Keys=Module["_PyMapping_Keys"]=wasmExports["PyMapping_Keys"])(a0);var _PyDict_Keys=Module["_PyDict_Keys"]=a0=>(_PyDict_Keys=Module["_PyDict_Keys"]=wasmExports["PyDict_Keys"])(a0);var _PyMapping_Items=Module["_PyMapping_Items"]=a0=>(_PyMapping_Items=Module["_PyMapping_Items"]=wasmExports["PyMapping_Items"])(a0);var _PyDict_Items=Module["_PyDict_Items"]=a0=>(_PyDict_Items=Module["_PyDict_Items"]=wasmExports["PyDict_Items"])(a0);var _PyMapping_Values=Module["_PyMapping_Values"]=a0=>(_PyMapping_Values=Module["_PyMapping_Values"]=wasmExports["PyMapping_Values"])(a0);var _PyDict_Values=Module["_PyDict_Values"]=a0=>(_PyDict_Values=Module["_PyDict_Values"]=wasmExports["PyDict_Values"])(a0);var __Py_CheckRecursiveCall=Module["__Py_CheckRecursiveCall"]=(a0,a1)=>(__Py_CheckRecursiveCall=Module["__Py_CheckRecursiveCall"]=wasmExports["_Py_CheckRecursiveCall"])(a0,a1);var _PyObject_IsTrue=Module["_PyObject_IsTrue"]=a0=>(_PyObject_IsTrue=Module["_PyObject_IsTrue"]=wasmExports["PyObject_IsTrue"])(a0);var __PyObject_RealIsInstance=Module["__PyObject_RealIsInstance"]=(a0,a1)=>(__PyObject_RealIsInstance=Module["__PyObject_RealIsInstance"]=wasmExports["_PyObject_RealIsInstance"])(a0,a1);var __PyObject_RealIsSubclass=Module["__PyObject_RealIsSubclass"]=(a0,a1)=>(__PyObject_RealIsSubclass=Module["__PyObject_RealIsSubclass"]=wasmExports["_PyObject_RealIsSubclass"])(a0,a1);var _PyIter_Check=Module["_PyIter_Check"]=a0=>(_PyIter_Check=Module["_PyIter_Check"]=wasmExports["PyIter_Check"])(a0);var _PyObject_GetAIter=Module["_PyObject_GetAIter"]=a0=>(_PyObject_GetAIter=Module["_PyObject_GetAIter"]=wasmExports["PyObject_GetAIter"])(a0);var _PyAIter_Check=Module["_PyAIter_Check"]=a0=>(_PyAIter_Check=Module["_PyAIter_Check"]=wasmExports["PyAIter_Check"])(a0);var __PySequence_BytesToCharpArray=Module["__PySequence_BytesToCharpArray"]=a0=>(__PySequence_BytesToCharpArray=Module["__PySequence_BytesToCharpArray"]=wasmExports["_PySequence_BytesToCharpArray"])(a0);var __Py_FreeCharPArray=Module["__Py_FreeCharPArray"]=a0=>(__Py_FreeCharPArray=Module["__Py_FreeCharPArray"]=wasmExports["_Py_FreeCharPArray"])(a0);var _PyBool_FromLong=Module["_PyBool_FromLong"]=a0=>(_PyBool_FromLong=Module["_PyBool_FromLong"]=wasmExports["PyBool_FromLong"])(a0);var __PyArg_NoKeywords=Module["__PyArg_NoKeywords"]=(a0,a1)=>(__PyArg_NoKeywords=Module["__PyArg_NoKeywords"]=wasmExports["_PyArg_NoKeywords"])(a0,a1);var __PyArg_NoKwnames=Module["__PyArg_NoKwnames"]=(a0,a1)=>(__PyArg_NoKwnames=Module["__PyArg_NoKwnames"]=wasmExports["_PyArg_NoKwnames"])(a0,a1);var _memrchr=Module["_memrchr"]=(a0,a1,a2)=>(_memrchr=Module["_memrchr"]=wasmExports["memrchr"])(a0,a1,a2);var __PyEval_SliceIndex=Module["__PyEval_SliceIndex"]=(a0,a1)=>(__PyEval_SliceIndex=Module["__PyEval_SliceIndex"]=wasmExports["_PyEval_SliceIndex"])(a0,a1);var _PyByteArray_FromObject=Module["_PyByteArray_FromObject"]=a0=>(_PyByteArray_FromObject=Module["_PyByteArray_FromObject"]=wasmExports["PyByteArray_FromObject"])(a0);var _PyByteArray_FromStringAndSize=Module["_PyByteArray_FromStringAndSize"]=(a0,a1)=>(_PyByteArray_FromStringAndSize=Module["_PyByteArray_FromStringAndSize"]=wasmExports["PyByteArray_FromStringAndSize"])(a0,a1);var __PyObject_New=Module["__PyObject_New"]=a0=>(__PyObject_New=Module["__PyObject_New"]=wasmExports["_PyObject_New"])(a0);var _PyByteArray_Size=Module["_PyByteArray_Size"]=a0=>(_PyByteArray_Size=Module["_PyByteArray_Size"]=wasmExports["PyByteArray_Size"])(a0);var _PyByteArray_AsString=Module["_PyByteArray_AsString"]=a0=>(_PyByteArray_AsString=Module["_PyByteArray_AsString"]=wasmExports["PyByteArray_AsString"])(a0);var _PyByteArray_Resize=Module["_PyByteArray_Resize"]=(a0,a1)=>(_PyByteArray_Resize=Module["_PyByteArray_Resize"]=wasmExports["PyByteArray_Resize"])(a0,a1);var _PyObject_Realloc=Module["_PyObject_Realloc"]=(a0,a1)=>(_PyObject_Realloc=Module["_PyObject_Realloc"]=wasmExports["PyObject_Realloc"])(a0,a1);var _PyByteArray_Concat=Module["_PyByteArray_Concat"]=(a0,a1)=>(_PyByteArray_Concat=Module["_PyByteArray_Concat"]=wasmExports["PyByteArray_Concat"])(a0,a1);var __Py_GetConfig=Module["__Py_GetConfig"]=()=>(__Py_GetConfig=Module["__Py_GetConfig"]=wasmExports["_Py_GetConfig"])();var __PyObject_GC_New=Module["__PyObject_GC_New"]=a0=>(__PyObject_GC_New=Module["__PyObject_GC_New"]=wasmExports["_PyObject_GC_New"])(a0);var __PyArg_UnpackKeywords=Module["__PyArg_UnpackKeywords"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(__PyArg_UnpackKeywords=Module["__PyArg_UnpackKeywords"]=wasmExports["_PyArg_UnpackKeywords"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var __PyArg_BadArgument=Module["__PyArg_BadArgument"]=(a0,a1,a2,a3)=>(__PyArg_BadArgument=Module["__PyArg_BadArgument"]=wasmExports["_PyArg_BadArgument"])(a0,a1,a2,a3);var _PyUnicode_AsEncodedString=Module["_PyUnicode_AsEncodedString"]=(a0,a1,a2)=>(_PyUnicode_AsEncodedString=Module["_PyUnicode_AsEncodedString"]=wasmExports["PyUnicode_AsEncodedString"])(a0,a1,a2);var _PyBuffer_ToContiguous=Module["_PyBuffer_ToContiguous"]=(a0,a1,a2,a3)=>(_PyBuffer_ToContiguous=Module["_PyBuffer_ToContiguous"]=wasmExports["PyBuffer_ToContiguous"])(a0,a1,a2,a3);var _PyObject_GC_Del=Module["_PyObject_GC_Del"]=a0=>(_PyObject_GC_Del=Module["_PyObject_GC_Del"]=wasmExports["PyObject_GC_Del"])(a0);var __PyBytes_FormatEx=Module["__PyBytes_FormatEx"]=(a0,a1,a2,a3)=>(__PyBytes_FormatEx=Module["__PyBytes_FormatEx"]=wasmExports["_PyBytes_FormatEx"])(a0,a1,a2,a3);var __PyBytes_Repeat=Module["__PyBytes_Repeat"]=(a0,a1,a2,a3)=>(__PyBytes_Repeat=Module["__PyBytes_Repeat"]=wasmExports["_PyBytes_Repeat"])(a0,a1,a2,a3);var _memmove=Module["_memmove"]=(a0,a1,a2)=>(_memmove=Module["_memmove"]=wasmExports["memmove"])(a0,a1,a2);var __PyObject_GetState=Module["__PyObject_GetState"]=a0=>(__PyObject_GetState=Module["__PyObject_GetState"]=wasmExports["_PyObject_GetState"])(a0);var _PyUnicode_DecodeLatin1=Module["_PyUnicode_DecodeLatin1"]=(a0,a1,a2)=>(_PyUnicode_DecodeLatin1=Module["_PyUnicode_DecodeLatin1"]=wasmExports["PyUnicode_DecodeLatin1"])(a0,a1,a2);var __PyLong_AsInt=Module["__PyLong_AsInt"]=a0=>(__PyLong_AsInt=Module["__PyLong_AsInt"]=wasmExports["_PyLong_AsInt"])(a0);var _PyLong_FromSize_t=Module["_PyLong_FromSize_t"]=a0=>(_PyLong_FromSize_t=Module["_PyLong_FromSize_t"]=wasmExports["PyLong_FromSize_t"])(a0);var _PyUnicode_GetDefaultEncoding=Module["_PyUnicode_GetDefaultEncoding"]=()=>(_PyUnicode_GetDefaultEncoding=Module["_PyUnicode_GetDefaultEncoding"]=wasmExports["PyUnicode_GetDefaultEncoding"])();var _PyUnicode_FromEncodedObject=Module["_PyUnicode_FromEncodedObject"]=(a0,a1,a2)=>(_PyUnicode_FromEncodedObject=Module["_PyUnicode_FromEncodedObject"]=wasmExports["PyUnicode_FromEncodedObject"])(a0,a1,a2);var __PyBytes_FromHex=Module["__PyBytes_FromHex"]=(a0,a1)=>(__PyBytes_FromHex=Module["__PyBytes_FromHex"]=wasmExports["_PyBytes_FromHex"])(a0,a1);var __Py_strhex_with_sep=Module["__Py_strhex_with_sep"]=(a0,a1,a2,a3)=>(__Py_strhex_with_sep=Module["__Py_strhex_with_sep"]=wasmExports["_Py_strhex_with_sep"])(a0,a1,a2,a3);var _PyList_Append=Module["_PyList_Append"]=(a0,a1)=>(_PyList_Append=Module["_PyList_Append"]=wasmExports["PyList_Append"])(a0,a1);var _PyList_Reverse=Module["_PyList_Reverse"]=a0=>(_PyList_Reverse=Module["_PyList_Reverse"]=wasmExports["PyList_Reverse"])(a0);var __PyEval_GetBuiltin=Module["__PyEval_GetBuiltin"]=a0=>(__PyEval_GetBuiltin=Module["__PyEval_GetBuiltin"]=wasmExports["_PyEval_GetBuiltin"])(a0);var _PyObject_GenericGetAttr=Module["_PyObject_GenericGetAttr"]=(a0,a1)=>(_PyObject_GenericGetAttr=Module["_PyObject_GenericGetAttr"]=wasmExports["PyObject_GenericGetAttr"])(a0,a1);var _PyType_GenericAlloc=Module["_PyType_GenericAlloc"]=(a0,a1)=>(_PyType_GenericAlloc=Module["_PyType_GenericAlloc"]=wasmExports["PyType_GenericAlloc"])(a0,a1);var _PyObject_Calloc=Module["_PyObject_Calloc"]=(a0,a1)=>(_PyObject_Calloc=Module["_PyObject_Calloc"]=wasmExports["PyObject_Calloc"])(a0,a1);var __Py_NewReference=Module["__Py_NewReference"]=a0=>(__Py_NewReference=Module["__Py_NewReference"]=wasmExports["_Py_NewReference"])(a0);var _PyBytes_FromFormatV=Module["_PyBytes_FromFormatV"]=(a0,a1)=>(_PyBytes_FromFormatV=Module["_PyBytes_FromFormatV"]=wasmExports["PyBytes_FromFormatV"])(a0,a1);var __PyBytesWriter_Resize=Module["__PyBytesWriter_Resize"]=(a0,a1,a2)=>(__PyBytesWriter_Resize=Module["__PyBytesWriter_Resize"]=wasmExports["_PyBytesWriter_Resize"])(a0,a1,a2);var __PyBytesWriter_Finish=Module["__PyBytesWriter_Finish"]=(a0,a1)=>(__PyBytesWriter_Finish=Module["__PyBytesWriter_Finish"]=wasmExports["_PyBytesWriter_Finish"])(a0,a1);var __PyBytesWriter_Init=Module["__PyBytesWriter_Init"]=a0=>(__PyBytesWriter_Init=Module["__PyBytesWriter_Init"]=wasmExports["_PyBytesWriter_Init"])(a0);var __PyBytesWriter_Alloc=Module["__PyBytesWriter_Alloc"]=(a0,a1)=>(__PyBytesWriter_Alloc=Module["__PyBytesWriter_Alloc"]=wasmExports["_PyBytesWriter_Alloc"])(a0,a1);var __PyBytesWriter_WriteBytes=Module["__PyBytesWriter_WriteBytes"]=(a0,a1,a2,a3)=>(__PyBytesWriter_WriteBytes=Module["__PyBytesWriter_WriteBytes"]=wasmExports["_PyBytesWriter_WriteBytes"])(a0,a1,a2,a3);var __PyBytes_Resize=Module["__PyBytes_Resize"]=(a0,a1)=>(__PyBytes_Resize=Module["__PyBytes_Resize"]=wasmExports["_PyBytes_Resize"])(a0,a1);var __PyBytesWriter_Dealloc=Module["__PyBytesWriter_Dealloc"]=a0=>(__PyBytesWriter_Dealloc=Module["__PyBytesWriter_Dealloc"]=wasmExports["_PyBytesWriter_Dealloc"])(a0);var _PyBytes_FromFormat=Module["_PyBytes_FromFormat"]=(a0,a1)=>(_PyBytes_FromFormat=Module["_PyBytes_FromFormat"]=wasmExports["PyBytes_FromFormat"])(a0,a1);var _PyObject_ASCII=Module["_PyObject_ASCII"]=a0=>(_PyObject_ASCII=Module["_PyObject_ASCII"]=wasmExports["PyObject_ASCII"])(a0);var __PyLong_FormatBytesWriter=Module["__PyLong_FormatBytesWriter"]=(a0,a1,a2,a3,a4)=>(__PyLong_FormatBytesWriter=Module["__PyLong_FormatBytesWriter"]=wasmExports["_PyLong_FormatBytesWriter"])(a0,a1,a2,a3,a4);var __PyUnicode_FormatLong=Module["__PyUnicode_FormatLong"]=(a0,a1,a2,a3)=>(__PyUnicode_FormatLong=Module["__PyUnicode_FormatLong"]=wasmExports["_PyUnicode_FormatLong"])(a0,a1,a2,a3);var _PyOS_double_to_string=Module["_PyOS_double_to_string"]=(a0,a1,a2,a3,a4)=>(_PyOS_double_to_string=Module["_PyOS_double_to_string"]=wasmExports["PyOS_double_to_string"])(a0,a1,a2,a3,a4);var __PyBytesWriter_Prepare=Module["__PyBytesWriter_Prepare"]=(a0,a1,a2)=>(__PyBytesWriter_Prepare=Module["__PyBytesWriter_Prepare"]=wasmExports["_PyBytesWriter_Prepare"])(a0,a1,a2);var _PyBytes_DecodeEscape=Module["_PyBytes_DecodeEscape"]=(a0,a1,a2,a3,a4)=>(_PyBytes_DecodeEscape=Module["_PyBytes_DecodeEscape"]=wasmExports["PyBytes_DecodeEscape"])(a0,a1,a2,a3,a4);var _PyBytes_Size=Module["_PyBytes_Size"]=a0=>(_PyBytes_Size=Module["_PyBytes_Size"]=wasmExports["PyBytes_Size"])(a0);var __PyBytes_Find=Module["__PyBytes_Find"]=(a0,a1,a2,a3,a4)=>(__PyBytes_Find=Module["__PyBytes_Find"]=wasmExports["_PyBytes_Find"])(a0,a1,a2,a3,a4);var __PyBytes_ReverseFind=Module["__PyBytes_ReverseFind"]=(a0,a1,a2,a3,a4)=>(__PyBytes_ReverseFind=Module["__PyBytes_ReverseFind"]=wasmExports["_PyBytes_ReverseFind"])(a0,a1,a2,a3,a4);var _PyBytes_Repr=Module["_PyBytes_Repr"]=(a0,a1)=>(_PyBytes_Repr=Module["_PyBytes_Repr"]=wasmExports["PyBytes_Repr"])(a0,a1);var __PyBytes_Join=Module["__PyBytes_Join"]=(a0,a1)=>(__PyBytes_Join=Module["__PyBytes_Join"]=wasmExports["_PyBytes_Join"])(a0,a1);var _PyBytes_FromObject=Module["_PyBytes_FromObject"]=a0=>(_PyBytes_FromObject=Module["_PyBytes_FromObject"]=wasmExports["PyBytes_FromObject"])(a0);var _PyErr_BadArgument=Module["_PyErr_BadArgument"]=()=>(_PyErr_BadArgument=Module["_PyErr_BadArgument"]=wasmExports["PyErr_BadArgument"])();var __Py_NewReferenceNoTotal=Module["__Py_NewReferenceNoTotal"]=a0=>(__Py_NewReferenceNoTotal=Module["__Py_NewReferenceNoTotal"]=wasmExports["_Py_NewReferenceNoTotal"])(a0);var _PyBytes_ConcatAndDel=Module["_PyBytes_ConcatAndDel"]=(a0,a1)=>(_PyBytes_ConcatAndDel=Module["_PyBytes_ConcatAndDel"]=wasmExports["PyBytes_ConcatAndDel"])(a0,a1);var __PyErr_FormatFromCauseTstate=Module["__PyErr_FormatFromCauseTstate"]=(a0,a1,a2,a3)=>(__PyErr_FormatFromCauseTstate=Module["__PyErr_FormatFromCauseTstate"]=wasmExports["_PyErr_FormatFromCauseTstate"])(a0,a1,a2,a3);var __Py_FatalErrorFormat=Module["__Py_FatalErrorFormat"]=(a0,a1,a2)=>(__Py_FatalErrorFormat=Module["__Py_FatalErrorFormat"]=wasmExports["_Py_FatalErrorFormat"])(a0,a1,a2);var __PyObject_FastCallDictTstate=Module["__PyObject_FastCallDictTstate"]=(a0,a1,a2,a3,a4)=>(__PyObject_FastCallDictTstate=Module["__PyObject_FastCallDictTstate"]=wasmExports["_PyObject_FastCallDictTstate"])(a0,a1,a2,a3,a4);var _PyVectorcall_Function=Module["_PyVectorcall_Function"]=a0=>(_PyVectorcall_Function=Module["_PyVectorcall_Function"]=wasmExports["PyVectorcall_Function"])(a0);var __PyErr_NoMemory=Module["__PyErr_NoMemory"]=a0=>(__PyErr_NoMemory=Module["__PyErr_NoMemory"]=wasmExports["_PyErr_NoMemory"])(a0);var _PyDict_Next=Module["_PyDict_Next"]=(a0,a1,a2,a3)=>(_PyDict_Next=Module["_PyDict_Next"]=wasmExports["PyDict_Next"])(a0,a1,a2,a3);var _PyObject_VectorcallDict=Module["_PyObject_VectorcallDict"]=(a0,a1,a2,a3)=>(_PyObject_VectorcallDict=Module["_PyObject_VectorcallDict"]=wasmExports["PyObject_VectorcallDict"])(a0,a1,a2,a3);var _PyModule_GetNameObject=Module["_PyModule_GetNameObject"]=a0=>(_PyModule_GetNameObject=Module["_PyModule_GetNameObject"]=wasmExports["PyModule_GetNameObject"])(a0);var _PyCallable_Check=Module["_PyCallable_Check"]=a0=>(_PyCallable_Check=Module["_PyCallable_Check"]=wasmExports["PyCallable_Check"])(a0);var __PyStack_AsDict=Module["__PyStack_AsDict"]=(a0,a1)=>(__PyStack_AsDict=Module["__PyStack_AsDict"]=wasmExports["_PyStack_AsDict"])(a0,a1);var __PyObject_Call=Module["__PyObject_Call"]=(a0,a1,a2,a3)=>(__PyObject_Call=Module["__PyObject_Call"]=wasmExports["_PyObject_Call"])(a0,a1,a2,a3);var _PyObject_Call=Module["_PyObject_Call"]=(a0,a1,a2)=>(_PyObject_Call=Module["_PyObject_Call"]=wasmExports["PyObject_Call"])(a0,a1,a2);var _PyCFunction_Call=Module["_PyCFunction_Call"]=(a0,a1,a2)=>(_PyCFunction_Call=Module["_PyCFunction_Call"]=wasmExports["PyCFunction_Call"])(a0,a1,a2);var __PyFunction_Vectorcall=Module["__PyFunction_Vectorcall"]=(a0,a1,a2,a3)=>(__PyFunction_Vectorcall=Module["__PyFunction_Vectorcall"]=wasmExports["_PyFunction_Vectorcall"])(a0,a1,a2,a3);var _PyEval_CallObjectWithKeywords=Module["_PyEval_CallObjectWithKeywords"]=(a0,a1,a2)=>(_PyEval_CallObjectWithKeywords=Module["_PyEval_CallObjectWithKeywords"]=wasmExports["PyEval_CallObjectWithKeywords"])(a0,a1,a2);var _PyObject_CallObject=Module["_PyObject_CallObject"]=(a0,a1)=>(_PyObject_CallObject=Module["_PyObject_CallObject"]=wasmExports["PyObject_CallObject"])(a0,a1);var __PyObject_Call_Prepend=Module["__PyObject_Call_Prepend"]=(a0,a1,a2,a3,a4)=>(__PyObject_Call_Prepend=Module["__PyObject_Call_Prepend"]=wasmExports["_PyObject_Call_Prepend"])(a0,a1,a2,a3,a4);var _PyObject_CallFunction=Module["_PyObject_CallFunction"]=(a0,a1,a2)=>(_PyObject_CallFunction=Module["_PyObject_CallFunction"]=wasmExports["PyObject_CallFunction"])(a0,a1,a2);var __Py_VaBuildStack_SizeT=Module["__Py_VaBuildStack_SizeT"]=(a0,a1,a2,a3,a4)=>(__Py_VaBuildStack_SizeT=Module["__Py_VaBuildStack_SizeT"]=wasmExports["_Py_VaBuildStack_SizeT"])(a0,a1,a2,a3,a4);var __Py_VaBuildStack=Module["__Py_VaBuildStack"]=(a0,a1,a2,a3,a4)=>(__Py_VaBuildStack=Module["__Py_VaBuildStack"]=wasmExports["_Py_VaBuildStack"])(a0,a1,a2,a3,a4);var _PyEval_CallFunction=Module["_PyEval_CallFunction"]=(a0,a1,a2)=>(_PyEval_CallFunction=Module["_PyEval_CallFunction"]=wasmExports["PyEval_CallFunction"])(a0,a1,a2);var _PyObject_CallMethod=Module["_PyObject_CallMethod"]=(a0,a1,a2,a3)=>(_PyObject_CallMethod=Module["_PyObject_CallMethod"]=wasmExports["PyObject_CallMethod"])(a0,a1,a2,a3);var _PyEval_CallMethod=Module["_PyEval_CallMethod"]=(a0,a1,a2,a3)=>(_PyEval_CallMethod=Module["_PyEval_CallMethod"]=wasmExports["PyEval_CallMethod"])(a0,a1,a2,a3);var __PyObject_CallMethod=Module["__PyObject_CallMethod"]=(a0,a1,a2,a3)=>(__PyObject_CallMethod=Module["__PyObject_CallMethod"]=wasmExports["_PyObject_CallMethod"])(a0,a1,a2,a3);var __PyObject_CallMethodId=Module["__PyObject_CallMethodId"]=(a0,a1,a2,a3)=>(__PyObject_CallMethodId=Module["__PyObject_CallMethodId"]=wasmExports["_PyObject_CallMethodId"])(a0,a1,a2,a3);var __PyObject_CallMethod_SizeT=Module["__PyObject_CallMethod_SizeT"]=(a0,a1,a2,a3)=>(__PyObject_CallMethod_SizeT=Module["__PyObject_CallMethod_SizeT"]=wasmExports["_PyObject_CallMethod_SizeT"])(a0,a1,a2,a3);var __PyObject_CallMethodId_SizeT=Module["__PyObject_CallMethodId_SizeT"]=(a0,a1,a2,a3)=>(__PyObject_CallMethodId_SizeT=Module["__PyObject_CallMethodId_SizeT"]=wasmExports["_PyObject_CallMethodId_SizeT"])(a0,a1,a2,a3);var _PyObject_CallMethodObjArgs=Module["_PyObject_CallMethodObjArgs"]=(a0,a1,a2)=>(_PyObject_CallMethodObjArgs=Module["_PyObject_CallMethodObjArgs"]=wasmExports["PyObject_CallMethodObjArgs"])(a0,a1,a2);var _PyVectorcall_NARGS=Module["_PyVectorcall_NARGS"]=a0=>(_PyVectorcall_NARGS=Module["_PyVectorcall_NARGS"]=wasmExports["PyVectorcall_NARGS"])(a0);var _PyCapsule_New=Module["_PyCapsule_New"]=(a0,a1,a2)=>(_PyCapsule_New=Module["_PyCapsule_New"]=wasmExports["PyCapsule_New"])(a0,a1,a2);var _PyCapsule_IsValid=Module["_PyCapsule_IsValid"]=(a0,a1)=>(_PyCapsule_IsValid=Module["_PyCapsule_IsValid"]=wasmExports["PyCapsule_IsValid"])(a0,a1);var _PyCapsule_GetPointer=Module["_PyCapsule_GetPointer"]=(a0,a1)=>(_PyCapsule_GetPointer=Module["_PyCapsule_GetPointer"]=wasmExports["PyCapsule_GetPointer"])(a0,a1);var _PyCapsule_GetName=Module["_PyCapsule_GetName"]=a0=>(_PyCapsule_GetName=Module["_PyCapsule_GetName"]=wasmExports["PyCapsule_GetName"])(a0);var _PyCapsule_GetDestructor=Module["_PyCapsule_GetDestructor"]=a0=>(_PyCapsule_GetDestructor=Module["_PyCapsule_GetDestructor"]=wasmExports["PyCapsule_GetDestructor"])(a0);var _PyCapsule_GetContext=Module["_PyCapsule_GetContext"]=a0=>(_PyCapsule_GetContext=Module["_PyCapsule_GetContext"]=wasmExports["PyCapsule_GetContext"])(a0);var _PyCapsule_SetPointer=Module["_PyCapsule_SetPointer"]=(a0,a1)=>(_PyCapsule_SetPointer=Module["_PyCapsule_SetPointer"]=wasmExports["PyCapsule_SetPointer"])(a0,a1);var _PyCapsule_SetName=Module["_PyCapsule_SetName"]=(a0,a1)=>(_PyCapsule_SetName=Module["_PyCapsule_SetName"]=wasmExports["PyCapsule_SetName"])(a0,a1);var _PyCapsule_SetDestructor=Module["_PyCapsule_SetDestructor"]=(a0,a1)=>(_PyCapsule_SetDestructor=Module["_PyCapsule_SetDestructor"]=wasmExports["PyCapsule_SetDestructor"])(a0,a1);var _PyCapsule_SetContext=Module["_PyCapsule_SetContext"]=(a0,a1)=>(_PyCapsule_SetContext=Module["_PyCapsule_SetContext"]=wasmExports["PyCapsule_SetContext"])(a0,a1);var _PyCapsule_Import=Module["_PyCapsule_Import"]=(a0,a1)=>(_PyCapsule_Import=Module["_PyCapsule_Import"]=wasmExports["PyCapsule_Import"])(a0,a1);var _PyCell_New=Module["_PyCell_New"]=a0=>(_PyCell_New=Module["_PyCell_New"]=wasmExports["PyCell_New"])(a0);var _PyCell_Get=Module["_PyCell_Get"]=a0=>(_PyCell_Get=Module["_PyCell_Get"]=wasmExports["PyCell_Get"])(a0);var _PyCell_Set=Module["_PyCell_Set"]=(a0,a1)=>(_PyCell_Set=Module["_PyCell_Set"]=wasmExports["PyCell_Set"])(a0,a1);var _PyObject_RichCompare=Module["_PyObject_RichCompare"]=(a0,a1,a2)=>(_PyObject_RichCompare=Module["_PyObject_RichCompare"]=wasmExports["PyObject_RichCompare"])(a0,a1,a2);var _PyMethod_Function=Module["_PyMethod_Function"]=a0=>(_PyMethod_Function=Module["_PyMethod_Function"]=wasmExports["PyMethod_Function"])(a0);var _PyMethod_Self=Module["_PyMethod_Self"]=a0=>(_PyMethod_Self=Module["_PyMethod_Self"]=wasmExports["PyMethod_Self"])(a0);var _PyMethod_New=Module["_PyMethod_New"]=(a0,a1)=>(_PyMethod_New=Module["_PyMethod_New"]=wasmExports["PyMethod_New"])(a0,a1);var _PyObject_ClearWeakRefs=Module["_PyObject_ClearWeakRefs"]=a0=>(_PyObject_ClearWeakRefs=Module["_PyObject_ClearWeakRefs"]=wasmExports["PyObject_ClearWeakRefs"])(a0);var __Py_HashPointer=Module["__Py_HashPointer"]=a0=>(__Py_HashPointer=Module["__Py_HashPointer"]=wasmExports["_Py_HashPointer"])(a0);var __PyType_GetDict=Module["__PyType_GetDict"]=a0=>(__PyType_GetDict=Module["__PyType_GetDict"]=wasmExports["_PyType_GetDict"])(a0);var __PyType_Lookup=Module["__PyType_Lookup"]=(a0,a1)=>(__PyType_Lookup=Module["__PyType_Lookup"]=wasmExports["_PyType_Lookup"])(a0,a1);var _PyInstanceMethod_New=Module["_PyInstanceMethod_New"]=a0=>(_PyInstanceMethod_New=Module["_PyInstanceMethod_New"]=wasmExports["PyInstanceMethod_New"])(a0);var _PyInstanceMethod_Function=Module["_PyInstanceMethod_Function"]=a0=>(_PyInstanceMethod_Function=Module["_PyInstanceMethod_Function"]=wasmExports["PyInstanceMethod_Function"])(a0);var _PyCode_AddWatcher=Module["_PyCode_AddWatcher"]=a0=>(_PyCode_AddWatcher=Module["_PyCode_AddWatcher"]=wasmExports["PyCode_AddWatcher"])(a0);var _PyCode_ClearWatcher=Module["_PyCode_ClearWatcher"]=a0=>(_PyCode_ClearWatcher=Module["_PyCode_ClearWatcher"]=wasmExports["PyCode_ClearWatcher"])(a0);var __PyCode_Validate=Module["__PyCode_Validate"]=a0=>(__PyCode_Validate=Module["__PyCode_Validate"]=wasmExports["_PyCode_Validate"])(a0);var __PyCode_New=Module["__PyCode_New"]=a0=>(__PyCode_New=Module["__PyCode_New"]=wasmExports["_PyCode_New"])(a0);var __PyObject_NewVar=Module["__PyObject_NewVar"]=(a0,a1)=>(__PyObject_NewVar=Module["__PyObject_NewVar"]=wasmExports["_PyObject_NewVar"])(a0,a1);var _PyFrozenSet_New=Module["_PyFrozenSet_New"]=a0=>(_PyFrozenSet_New=Module["_PyFrozenSet_New"]=wasmExports["PyFrozenSet_New"])(a0);var _PyUnstable_Code_NewWithPosOnlyArgs=Module["_PyUnstable_Code_NewWithPosOnlyArgs"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17)=>(_PyUnstable_Code_NewWithPosOnlyArgs=Module["_PyUnstable_Code_NewWithPosOnlyArgs"]=wasmExports["PyUnstable_Code_NewWithPosOnlyArgs"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17);var _PyUnicode_Compare=Module["_PyUnicode_Compare"]=(a0,a1)=>(_PyUnicode_Compare=Module["_PyUnicode_Compare"]=wasmExports["PyUnicode_Compare"])(a0,a1);var _PyUnstable_Code_New=Module["_PyUnstable_Code_New"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)=>(_PyUnstable_Code_New=Module["_PyUnstable_Code_New"]=wasmExports["PyUnstable_Code_New"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16);var _PyCode_NewEmpty=Module["_PyCode_NewEmpty"]=(a0,a1,a2)=>(_PyCode_NewEmpty=Module["_PyCode_NewEmpty"]=wasmExports["PyCode_NewEmpty"])(a0,a1,a2);var _PyUnicode_DecodeFSDefault=Module["_PyUnicode_DecodeFSDefault"]=a0=>(_PyUnicode_DecodeFSDefault=Module["_PyUnicode_DecodeFSDefault"]=wasmExports["PyUnicode_DecodeFSDefault"])(a0);var _PyCode_Addr2Line=Module["_PyCode_Addr2Line"]=(a0,a1)=>(_PyCode_Addr2Line=Module["_PyCode_Addr2Line"]=wasmExports["PyCode_Addr2Line"])(a0,a1);var __PyCode_CheckLineNumber=Module["__PyCode_CheckLineNumber"]=(a0,a1)=>(__PyCode_CheckLineNumber=Module["__PyCode_CheckLineNumber"]=wasmExports["_PyCode_CheckLineNumber"])(a0,a1);var _PyCode_Addr2Location=Module["_PyCode_Addr2Location"]=(a0,a1,a2,a3,a4,a5)=>(_PyCode_Addr2Location=Module["_PyCode_Addr2Location"]=wasmExports["PyCode_Addr2Location"])(a0,a1,a2,a3,a4,a5);var _PyUnstable_Code_GetExtra=Module["_PyUnstable_Code_GetExtra"]=(a0,a1,a2)=>(_PyUnstable_Code_GetExtra=Module["_PyUnstable_Code_GetExtra"]=wasmExports["PyUnstable_Code_GetExtra"])(a0,a1,a2);var _PyUnstable_Code_SetExtra=Module["_PyUnstable_Code_SetExtra"]=(a0,a1,a2)=>(_PyUnstable_Code_SetExtra=Module["_PyUnstable_Code_SetExtra"]=wasmExports["PyUnstable_Code_SetExtra"])(a0,a1,a2);var _PyCode_GetVarnames=Module["_PyCode_GetVarnames"]=a0=>(_PyCode_GetVarnames=Module["_PyCode_GetVarnames"]=wasmExports["PyCode_GetVarnames"])(a0);var _PyCode_GetCellvars=Module["_PyCode_GetCellvars"]=a0=>(_PyCode_GetCellvars=Module["_PyCode_GetCellvars"]=wasmExports["PyCode_GetCellvars"])(a0);var _PyCode_GetFreevars=Module["_PyCode_GetFreevars"]=a0=>(_PyCode_GetFreevars=Module["_PyCode_GetFreevars"]=wasmExports["PyCode_GetFreevars"])(a0);var _PyCode_GetCode=Module["_PyCode_GetCode"]=a0=>(_PyCode_GetCode=Module["_PyCode_GetCode"]=wasmExports["PyCode_GetCode"])(a0);var __PyCode_ConstantKey=Module["__PyCode_ConstantKey"]=a0=>(__PyCode_ConstantKey=Module["__PyCode_ConstantKey"]=wasmExports["_PyCode_ConstantKey"])(a0);var _PyComplex_AsCComplex=Module["_PyComplex_AsCComplex"]=(a0,a1)=>(_PyComplex_AsCComplex=Module["_PyComplex_AsCComplex"]=wasmExports["PyComplex_AsCComplex"])(a0,a1);var __PySet_NextEntry=Module["__PySet_NextEntry"]=(a0,a1,a2,a3)=>(__PySet_NextEntry=Module["__PySet_NextEntry"]=wasmExports["_PySet_NextEntry"])(a0,a1,a2,a3);var _PyLong_FromVoidPtr=Module["_PyLong_FromVoidPtr"]=a0=>(_PyLong_FromVoidPtr=Module["_PyLong_FromVoidPtr"]=wasmExports["PyLong_FromVoidPtr"])(a0);var __PyUnicode_FromASCII=Module["__PyUnicode_FromASCII"]=(a0,a1)=>(__PyUnicode_FromASCII=Module["__PyUnicode_FromASCII"]=wasmExports["_PyUnicode_FromASCII"])(a0,a1);var _PyErr_WriteUnraisable=Module["_PyErr_WriteUnraisable"]=a0=>(_PyErr_WriteUnraisable=Module["_PyErr_WriteUnraisable"]=wasmExports["PyErr_WriteUnraisable"])(a0);var __PyUnicode_Copy=Module["__PyUnicode_Copy"]=a0=>(__PyUnicode_Copy=Module["__PyUnicode_Copy"]=wasmExports["_PyUnicode_Copy"])(a0);var __Py_c_sum=Module["__Py_c_sum"]=(a0,a1,a2)=>(__Py_c_sum=Module["__Py_c_sum"]=wasmExports["_Py_c_sum"])(a0,a1,a2);var __Py_c_diff=Module["__Py_c_diff"]=(a0,a1,a2)=>(__Py_c_diff=Module["__Py_c_diff"]=wasmExports["_Py_c_diff"])(a0,a1,a2);var __Py_c_neg=Module["__Py_c_neg"]=(a0,a1)=>(__Py_c_neg=Module["__Py_c_neg"]=wasmExports["_Py_c_neg"])(a0,a1);var __Py_c_prod=Module["__Py_c_prod"]=(a0,a1,a2)=>(__Py_c_prod=Module["__Py_c_prod"]=wasmExports["_Py_c_prod"])(a0,a1,a2);var __Py_c_quot=Module["__Py_c_quot"]=(a0,a1,a2)=>(__Py_c_quot=Module["__Py_c_quot"]=wasmExports["_Py_c_quot"])(a0,a1,a2);var __Py_c_pow=Module["__Py_c_pow"]=(a0,a1,a2)=>(__Py_c_pow=Module["__Py_c_pow"]=wasmExports["_Py_c_pow"])(a0,a1,a2);var _hypot=Module["_hypot"]=(a0,a1)=>(_hypot=Module["_hypot"]=wasmExports["hypot"])(a0,a1);var _atan2=Module["_atan2"]=(a0,a1)=>(_atan2=Module["_atan2"]=wasmExports["atan2"])(a0,a1);var _pow=Module["_pow"]=(a0,a1)=>(_pow=Module["_pow"]=wasmExports["pow"])(a0,a1);var _log=Module["_log"]=a0=>(_log=Module["_log"]=wasmExports["log"])(a0);var _exp=Module["_exp"]=a0=>(_exp=Module["_exp"]=wasmExports["exp"])(a0);var _sin=Module["_sin"]=a0=>(_sin=Module["_sin"]=wasmExports["sin"])(a0);var _cos=Module["_cos"]=a0=>(_cos=Module["_cos"]=wasmExports["cos"])(a0);var __Py_c_abs=Module["__Py_c_abs"]=a0=>(__Py_c_abs=Module["__Py_c_abs"]=wasmExports["_Py_c_abs"])(a0);var _PyComplex_FromDoubles=Module["_PyComplex_FromDoubles"]=(a0,a1)=>(_PyComplex_FromDoubles=Module["_PyComplex_FromDoubles"]=wasmExports["PyComplex_FromDoubles"])(a0,a1);var _PyComplex_RealAsDouble=Module["_PyComplex_RealAsDouble"]=a0=>(_PyComplex_RealAsDouble=Module["_PyComplex_RealAsDouble"]=wasmExports["PyComplex_RealAsDouble"])(a0);var _PyComplex_ImagAsDouble=Module["_PyComplex_ImagAsDouble"]=a0=>(_PyComplex_ImagAsDouble=Module["_PyComplex_ImagAsDouble"]=wasmExports["PyComplex_ImagAsDouble"])(a0);var __Py_HashDouble=Module["__Py_HashDouble"]=(a0,a1)=>(__Py_HashDouble=Module["__Py_HashDouble"]=wasmExports["_Py_HashDouble"])(a0,a1);var __PyUnicode_TransformDecimalAndSpaceToASCII=Module["__PyUnicode_TransformDecimalAndSpaceToASCII"]=a0=>(__PyUnicode_TransformDecimalAndSpaceToASCII=Module["__PyUnicode_TransformDecimalAndSpaceToASCII"]=wasmExports["_PyUnicode_TransformDecimalAndSpaceToASCII"])(a0);var __Py_string_to_number_with_underscores=Module["__Py_string_to_number_with_underscores"]=(a0,a1,a2,a3,a4,a5)=>(__Py_string_to_number_with_underscores=Module["__Py_string_to_number_with_underscores"]=wasmExports["_Py_string_to_number_with_underscores"])(a0,a1,a2,a3,a4,a5);var _PyCMethod_New=Module["_PyCMethod_New"]=(a0,a1,a2,a3)=>(_PyCMethod_New=Module["_PyCMethod_New"]=wasmExports["PyCMethod_New"])(a0,a1,a2,a3);var _PyMember_GetOne=Module["_PyMember_GetOne"]=(a0,a1)=>(_PyMember_GetOne=Module["_PyMember_GetOne"]=wasmExports["PyMember_GetOne"])(a0,a1);var _PyMember_SetOne=Module["_PyMember_SetOne"]=(a0,a1,a2)=>(_PyMember_SetOne=Module["_PyMember_SetOne"]=wasmExports["PyMember_SetOne"])(a0,a1,a2);var _PyTuple_GetSlice=Module["_PyTuple_GetSlice"]=(a0,a1,a2)=>(_PyTuple_GetSlice=Module["_PyTuple_GetSlice"]=wasmExports["PyTuple_GetSlice"])(a0,a1,a2);var _PyDescr_NewMethod=Module["_PyDescr_NewMethod"]=(a0,a1)=>(_PyDescr_NewMethod=Module["_PyDescr_NewMethod"]=wasmExports["PyDescr_NewMethod"])(a0,a1);var __PyObject_FunctionStr=Module["__PyObject_FunctionStr"]=a0=>(__PyObject_FunctionStr=Module["__PyObject_FunctionStr"]=wasmExports["_PyObject_FunctionStr"])(a0);var _PyDescr_NewClassMethod=Module["_PyDescr_NewClassMethod"]=(a0,a1)=>(_PyDescr_NewClassMethod=Module["_PyDescr_NewClassMethod"]=wasmExports["PyDescr_NewClassMethod"])(a0,a1);var _PyDescr_NewMember=Module["_PyDescr_NewMember"]=(a0,a1)=>(_PyDescr_NewMember=Module["_PyDescr_NewMember"]=wasmExports["PyDescr_NewMember"])(a0,a1);var _PyDescr_NewGetSet=Module["_PyDescr_NewGetSet"]=(a0,a1)=>(_PyDescr_NewGetSet=Module["_PyDescr_NewGetSet"]=wasmExports["PyDescr_NewGetSet"])(a0,a1);var _PyDescr_NewWrapper=Module["_PyDescr_NewWrapper"]=(a0,a1,a2)=>(_PyDescr_NewWrapper=Module["_PyDescr_NewWrapper"]=wasmExports["PyDescr_NewWrapper"])(a0,a1,a2);var _PyDescr_IsData=Module["_PyDescr_IsData"]=a0=>(_PyDescr_IsData=Module["_PyDescr_IsData"]=wasmExports["PyDescr_IsData"])(a0);var _PyDictProxy_New=Module["_PyDictProxy_New"]=a0=>(_PyDictProxy_New=Module["_PyDictProxy_New"]=wasmExports["PyDictProxy_New"])(a0);var __PyTrash_cond=Module["__PyTrash_cond"]=(a0,a1)=>(__PyTrash_cond=Module["__PyTrash_cond"]=wasmExports["_PyTrash_cond"])(a0,a1);var __PyThreadState_UncheckedGet=Module["__PyThreadState_UncheckedGet"]=()=>(__PyThreadState_UncheckedGet=Module["__PyThreadState_UncheckedGet"]=wasmExports["_PyThreadState_UncheckedGet"])();var __PyTrash_begin=Module["__PyTrash_begin"]=(a0,a1)=>(__PyTrash_begin=Module["__PyTrash_begin"]=wasmExports["_PyTrash_begin"])(a0,a1);var __PyTrash_end=Module["__PyTrash_end"]=a0=>(__PyTrash_end=Module["__PyTrash_end"]=wasmExports["_PyTrash_end"])(a0);var _PyWrapper_New=Module["_PyWrapper_New"]=(a0,a1)=>(_PyWrapper_New=Module["_PyWrapper_New"]=wasmExports["PyWrapper_New"])(a0,a1);var _PyType_GetQualName=Module["_PyType_GetQualName"]=a0=>(_PyType_GetQualName=Module["_PyType_GetQualName"]=wasmExports["PyType_GetQualName"])(a0);var __PyType_GetDocFromInternalDoc=Module["__PyType_GetDocFromInternalDoc"]=(a0,a1)=>(__PyType_GetDocFromInternalDoc=Module["__PyType_GetDocFromInternalDoc"]=wasmExports["_PyType_GetDocFromInternalDoc"])(a0,a1);var __PyType_GetTextSignatureFromInternalDoc=Module["__PyType_GetTextSignatureFromInternalDoc"]=(a0,a1)=>(__PyType_GetTextSignatureFromInternalDoc=Module["__PyType_GetTextSignatureFromInternalDoc"]=wasmExports["_PyType_GetTextSignatureFromInternalDoc"])(a0,a1);var _PyDict_Contains=Module["_PyDict_Contains"]=(a0,a1)=>(_PyDict_Contains=Module["_PyDict_Contains"]=wasmExports["PyDict_Contains"])(a0,a1);var __PyArg_UnpackStack=Module["__PyArg_UnpackStack"]=(a0,a1,a2,a3,a4,a5)=>(__PyArg_UnpackStack=Module["__PyArg_UnpackStack"]=wasmExports["_PyArg_UnpackStack"])(a0,a1,a2,a3,a4,a5);var __PyObject_IsAbstract=Module["__PyObject_IsAbstract"]=a0=>(__PyObject_IsAbstract=Module["__PyObject_IsAbstract"]=wasmExports["_PyObject_IsAbstract"])(a0);var _PyException_GetCause=Module["_PyException_GetCause"]=a0=>(_PyException_GetCause=Module["_PyException_GetCause"]=wasmExports["PyException_GetCause"])(a0);var _PyException_SetCause=Module["_PyException_SetCause"]=(a0,a1)=>(_PyException_SetCause=Module["_PyException_SetCause"]=wasmExports["PyException_SetCause"])(a0,a1);var _PyException_GetContext=Module["_PyException_GetContext"]=a0=>(_PyException_GetContext=Module["_PyException_GetContext"]=wasmExports["PyException_GetContext"])(a0);var _PyException_SetContext=Module["_PyException_SetContext"]=(a0,a1)=>(_PyException_SetContext=Module["_PyException_SetContext"]=wasmExports["PyException_SetContext"])(a0,a1);var _PyException_GetArgs=Module["_PyException_GetArgs"]=a0=>(_PyException_GetArgs=Module["_PyException_GetArgs"]=wasmExports["PyException_GetArgs"])(a0);var _PyException_SetArgs=Module["_PyException_SetArgs"]=(a0,a1)=>(_PyException_SetArgs=Module["_PyException_SetArgs"]=wasmExports["PyException_SetArgs"])(a0,a1);var _PyExceptionClass_Name=Module["_PyExceptionClass_Name"]=a0=>(_PyExceptionClass_Name=Module["_PyExceptionClass_Name"]=wasmExports["PyExceptionClass_Name"])(a0);var __PyExc_CreateExceptionGroup=Module["__PyExc_CreateExceptionGroup"]=(a0,a1)=>(__PyExc_CreateExceptionGroup=Module["__PyExc_CreateExceptionGroup"]=wasmExports["_PyExc_CreateExceptionGroup"])(a0,a1);var __PyExc_PrepReraiseStar=Module["__PyExc_PrepReraiseStar"]=(a0,a1)=>(__PyExc_PrepReraiseStar=Module["__PyExc_PrepReraiseStar"]=wasmExports["_PyExc_PrepReraiseStar"])(a0,a1);var _PyUnstable_Exc_PrepReraiseStar=Module["_PyUnstable_Exc_PrepReraiseStar"]=(a0,a1)=>(_PyUnstable_Exc_PrepReraiseStar=Module["_PyUnstable_Exc_PrepReraiseStar"]=wasmExports["PyUnstable_Exc_PrepReraiseStar"])(a0,a1);var _PyUnicodeEncodeError_GetEncoding=Module["_PyUnicodeEncodeError_GetEncoding"]=a0=>(_PyUnicodeEncodeError_GetEncoding=Module["_PyUnicodeEncodeError_GetEncoding"]=wasmExports["PyUnicodeEncodeError_GetEncoding"])(a0);var _PyUnicodeDecodeError_GetEncoding=Module["_PyUnicodeDecodeError_GetEncoding"]=a0=>(_PyUnicodeDecodeError_GetEncoding=Module["_PyUnicodeDecodeError_GetEncoding"]=wasmExports["PyUnicodeDecodeError_GetEncoding"])(a0);var _PyUnicodeEncodeError_GetObject=Module["_PyUnicodeEncodeError_GetObject"]=a0=>(_PyUnicodeEncodeError_GetObject=Module["_PyUnicodeEncodeError_GetObject"]=wasmExports["PyUnicodeEncodeError_GetObject"])(a0);var _PyUnicodeDecodeError_GetObject=Module["_PyUnicodeDecodeError_GetObject"]=a0=>(_PyUnicodeDecodeError_GetObject=Module["_PyUnicodeDecodeError_GetObject"]=wasmExports["PyUnicodeDecodeError_GetObject"])(a0);var _PyUnicodeTranslateError_GetObject=Module["_PyUnicodeTranslateError_GetObject"]=a0=>(_PyUnicodeTranslateError_GetObject=Module["_PyUnicodeTranslateError_GetObject"]=wasmExports["PyUnicodeTranslateError_GetObject"])(a0);var _PyUnicodeEncodeError_GetStart=Module["_PyUnicodeEncodeError_GetStart"]=(a0,a1)=>(_PyUnicodeEncodeError_GetStart=Module["_PyUnicodeEncodeError_GetStart"]=wasmExports["PyUnicodeEncodeError_GetStart"])(a0,a1);var _PyUnicodeDecodeError_GetStart=Module["_PyUnicodeDecodeError_GetStart"]=(a0,a1)=>(_PyUnicodeDecodeError_GetStart=Module["_PyUnicodeDecodeError_GetStart"]=wasmExports["PyUnicodeDecodeError_GetStart"])(a0,a1);var _PyUnicodeTranslateError_GetStart=Module["_PyUnicodeTranslateError_GetStart"]=(a0,a1)=>(_PyUnicodeTranslateError_GetStart=Module["_PyUnicodeTranslateError_GetStart"]=wasmExports["PyUnicodeTranslateError_GetStart"])(a0,a1);var _PyUnicodeEncodeError_SetStart=Module["_PyUnicodeEncodeError_SetStart"]=(a0,a1)=>(_PyUnicodeEncodeError_SetStart=Module["_PyUnicodeEncodeError_SetStart"]=wasmExports["PyUnicodeEncodeError_SetStart"])(a0,a1);var _PyUnicodeDecodeError_SetStart=Module["_PyUnicodeDecodeError_SetStart"]=(a0,a1)=>(_PyUnicodeDecodeError_SetStart=Module["_PyUnicodeDecodeError_SetStart"]=wasmExports["PyUnicodeDecodeError_SetStart"])(a0,a1);var _PyUnicodeTranslateError_SetStart=Module["_PyUnicodeTranslateError_SetStart"]=(a0,a1)=>(_PyUnicodeTranslateError_SetStart=Module["_PyUnicodeTranslateError_SetStart"]=wasmExports["PyUnicodeTranslateError_SetStart"])(a0,a1);var _PyUnicodeEncodeError_GetEnd=Module["_PyUnicodeEncodeError_GetEnd"]=(a0,a1)=>(_PyUnicodeEncodeError_GetEnd=Module["_PyUnicodeEncodeError_GetEnd"]=wasmExports["PyUnicodeEncodeError_GetEnd"])(a0,a1);var _PyUnicodeDecodeError_GetEnd=Module["_PyUnicodeDecodeError_GetEnd"]=(a0,a1)=>(_PyUnicodeDecodeError_GetEnd=Module["_PyUnicodeDecodeError_GetEnd"]=wasmExports["PyUnicodeDecodeError_GetEnd"])(a0,a1);var _PyUnicodeTranslateError_GetEnd=Module["_PyUnicodeTranslateError_GetEnd"]=(a0,a1)=>(_PyUnicodeTranslateError_GetEnd=Module["_PyUnicodeTranslateError_GetEnd"]=wasmExports["PyUnicodeTranslateError_GetEnd"])(a0,a1);var _PyUnicodeEncodeError_SetEnd=Module["_PyUnicodeEncodeError_SetEnd"]=(a0,a1)=>(_PyUnicodeEncodeError_SetEnd=Module["_PyUnicodeEncodeError_SetEnd"]=wasmExports["PyUnicodeEncodeError_SetEnd"])(a0,a1);var _PyUnicodeDecodeError_SetEnd=Module["_PyUnicodeDecodeError_SetEnd"]=(a0,a1)=>(_PyUnicodeDecodeError_SetEnd=Module["_PyUnicodeDecodeError_SetEnd"]=wasmExports["PyUnicodeDecodeError_SetEnd"])(a0,a1);var _PyUnicodeTranslateError_SetEnd=Module["_PyUnicodeTranslateError_SetEnd"]=(a0,a1)=>(_PyUnicodeTranslateError_SetEnd=Module["_PyUnicodeTranslateError_SetEnd"]=wasmExports["PyUnicodeTranslateError_SetEnd"])(a0,a1);var _PyUnicodeEncodeError_GetReason=Module["_PyUnicodeEncodeError_GetReason"]=a0=>(_PyUnicodeEncodeError_GetReason=Module["_PyUnicodeEncodeError_GetReason"]=wasmExports["PyUnicodeEncodeError_GetReason"])(a0);var _PyUnicodeDecodeError_GetReason=Module["_PyUnicodeDecodeError_GetReason"]=a0=>(_PyUnicodeDecodeError_GetReason=Module["_PyUnicodeDecodeError_GetReason"]=wasmExports["PyUnicodeDecodeError_GetReason"])(a0);var _PyUnicodeTranslateError_GetReason=Module["_PyUnicodeTranslateError_GetReason"]=a0=>(_PyUnicodeTranslateError_GetReason=Module["_PyUnicodeTranslateError_GetReason"]=wasmExports["PyUnicodeTranslateError_GetReason"])(a0);var _PyUnicodeEncodeError_SetReason=Module["_PyUnicodeEncodeError_SetReason"]=(a0,a1)=>(_PyUnicodeEncodeError_SetReason=Module["_PyUnicodeEncodeError_SetReason"]=wasmExports["PyUnicodeEncodeError_SetReason"])(a0,a1);var _PyUnicodeDecodeError_SetReason=Module["_PyUnicodeDecodeError_SetReason"]=(a0,a1)=>(_PyUnicodeDecodeError_SetReason=Module["_PyUnicodeDecodeError_SetReason"]=wasmExports["PyUnicodeDecodeError_SetReason"])(a0,a1);var _PyUnicodeTranslateError_SetReason=Module["_PyUnicodeTranslateError_SetReason"]=(a0,a1)=>(_PyUnicodeTranslateError_SetReason=Module["_PyUnicodeTranslateError_SetReason"]=wasmExports["PyUnicodeTranslateError_SetReason"])(a0,a1);var _PyUnicodeDecodeError_Create=Module["_PyUnicodeDecodeError_Create"]=(a0,a1,a2,a3,a4,a5)=>(_PyUnicodeDecodeError_Create=Module["_PyUnicodeDecodeError_Create"]=wasmExports["PyUnicodeDecodeError_Create"])(a0,a1,a2,a3,a4,a5);var __PyUnicodeTranslateError_Create=Module["__PyUnicodeTranslateError_Create"]=(a0,a1,a2,a3)=>(__PyUnicodeTranslateError_Create=Module["__PyUnicodeTranslateError_Create"]=wasmExports["_PyUnicodeTranslateError_Create"])(a0,a1,a2,a3);var _PyModule_GetDict=Module["_PyModule_GetDict"]=a0=>(_PyModule_GetDict=Module["_PyModule_GetDict"]=wasmExports["PyModule_GetDict"])(a0);var _PyErr_NewException=Module["_PyErr_NewException"]=(a0,a1,a2)=>(_PyErr_NewException=Module["_PyErr_NewException"]=wasmExports["PyErr_NewException"])(a0,a1,a2);var __PyException_AddNote=Module["__PyException_AddNote"]=(a0,a1)=>(__PyException_AddNote=Module["__PyException_AddNote"]=wasmExports["_PyException_AddNote"])(a0,a1);var _PySet_Add=Module["_PySet_Add"]=(a0,a1)=>(_PySet_Add=Module["_PySet_Add"]=wasmExports["PySet_Add"])(a0,a1);var _PySet_Contains=Module["_PySet_Contains"]=(a0,a1)=>(_PySet_Contains=Module["_PySet_Contains"]=wasmExports["PySet_Contains"])(a0,a1);var _PyTuple_Size=Module["_PyTuple_Size"]=a0=>(_PyTuple_Size=Module["_PyTuple_Size"]=wasmExports["PyTuple_Size"])(a0);var _PyDict_Copy=Module["_PyDict_Copy"]=a0=>(_PyDict_Copy=Module["_PyDict_Copy"]=wasmExports["PyDict_Copy"])(a0);var _PyUnicode_ReadChar=Module["_PyUnicode_ReadChar"]=(a0,a1)=>(_PyUnicode_ReadChar=Module["_PyUnicode_ReadChar"]=wasmExports["PyUnicode_ReadChar"])(a0,a1);var _PyObject_GenericGetDict=Module["_PyObject_GenericGetDict"]=(a0,a1)=>(_PyObject_GenericGetDict=Module["_PyObject_GenericGetDict"]=wasmExports["PyObject_GenericGetDict"])(a0,a1);var _PyObject_GenericSetDict=Module["_PyObject_GenericSetDict"]=(a0,a1,a2)=>(_PyObject_GenericSetDict=Module["_PyObject_GenericSetDict"]=wasmExports["PyObject_GenericSetDict"])(a0,a1,a2);var _PyList_SetSlice=Module["_PyList_SetSlice"]=(a0,a1,a2,a3)=>(_PyList_SetSlice=Module["_PyList_SetSlice"]=wasmExports["PyList_SetSlice"])(a0,a1,a2,a3);var __PyUnicodeWriter_WriteASCIIString=Module["__PyUnicodeWriter_WriteASCIIString"]=(a0,a1,a2)=>(__PyUnicodeWriter_WriteASCIIString=Module["__PyUnicodeWriter_WriteASCIIString"]=wasmExports["_PyUnicodeWriter_WriteASCIIString"])(a0,a1,a2);var _PyObject_GC_Track=Module["_PyObject_GC_Track"]=a0=>(_PyObject_GC_Track=Module["_PyObject_GC_Track"]=wasmExports["PyObject_GC_Track"])(a0);var __PyGen_Finalize=Module["__PyGen_Finalize"]=a0=>(__PyGen_Finalize=Module["__PyGen_Finalize"]=wasmExports["_PyGen_Finalize"])(a0);var _PyObject_CallFinalizerFromDealloc=Module["_PyObject_CallFinalizerFromDealloc"]=a0=>(_PyObject_CallFinalizerFromDealloc=Module["_PyObject_CallFinalizerFromDealloc"]=wasmExports["PyObject_CallFinalizerFromDealloc"])(a0);var __PyObject_GC_NewVar=Module["__PyObject_GC_NewVar"]=(a0,a1)=>(__PyObject_GC_NewVar=Module["__PyObject_GC_NewVar"]=wasmExports["_PyObject_GC_NewVar"])(a0,a1);var _PyUnstable_InterpreterFrame_GetLine=Module["_PyUnstable_InterpreterFrame_GetLine"]=a0=>(_PyUnstable_InterpreterFrame_GetLine=Module["_PyUnstable_InterpreterFrame_GetLine"]=wasmExports["PyUnstable_InterpreterFrame_GetLine"])(a0);var _PyGen_NewWithQualName=Module["_PyGen_NewWithQualName"]=(a0,a1,a2)=>(_PyGen_NewWithQualName=Module["_PyGen_NewWithQualName"]=wasmExports["PyGen_NewWithQualName"])(a0,a1,a2);var _PyGen_New=Module["_PyGen_New"]=a0=>(_PyGen_New=Module["_PyGen_New"]=wasmExports["PyGen_New"])(a0);var _PyCoro_New=Module["_PyCoro_New"]=(a0,a1,a2)=>(_PyCoro_New=Module["_PyCoro_New"]=wasmExports["PyCoro_New"])(a0,a1,a2);var _PyAsyncGen_New=Module["_PyAsyncGen_New"]=(a0,a1,a2)=>(_PyAsyncGen_New=Module["_PyAsyncGen_New"]=wasmExports["PyAsyncGen_New"])(a0,a1,a2);var __PyErr_ChainStackItem=Module["__PyErr_ChainStackItem"]=a0=>(__PyErr_ChainStackItem=Module["__PyErr_ChainStackItem"]=wasmExports["_PyErr_ChainStackItem"])(a0);var __PyEval_EvalFrameDefault=Module["__PyEval_EvalFrameDefault"]=(a0,a1,a2)=>(__PyEval_EvalFrameDefault=Module["__PyEval_EvalFrameDefault"]=wasmExports["_PyEval_EvalFrameDefault"])(a0,a1,a2);var _PyFile_FromFd=Module["_PyFile_FromFd"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_PyFile_FromFd=Module["_PyFile_FromFd"]=wasmExports["PyFile_FromFd"])(a0,a1,a2,a3,a4,a5,a6,a7);var _PyFile_GetLine=Module["_PyFile_GetLine"]=(a0,a1)=>(_PyFile_GetLine=Module["_PyFile_GetLine"]=wasmExports["PyFile_GetLine"])(a0,a1);var _PyFile_WriteObject=Module["_PyFile_WriteObject"]=(a0,a1,a2)=>(_PyFile_WriteObject=Module["_PyFile_WriteObject"]=wasmExports["PyFile_WriteObject"])(a0,a1,a2);var _PyFile_WriteString=Module["_PyFile_WriteString"]=(a0,a1)=>(_PyFile_WriteString=Module["_PyFile_WriteString"]=wasmExports["PyFile_WriteString"])(a0,a1);var _PyObject_AsFileDescriptor=Module["_PyObject_AsFileDescriptor"]=a0=>(_PyObject_AsFileDescriptor=Module["_PyObject_AsFileDescriptor"]=wasmExports["PyObject_AsFileDescriptor"])(a0);var __PyLong_FileDescriptor_Converter=Module["__PyLong_FileDescriptor_Converter"]=(a0,a1)=>(__PyLong_FileDescriptor_Converter=Module["__PyLong_FileDescriptor_Converter"]=wasmExports["_PyLong_FileDescriptor_Converter"])(a0,a1);var _flockfile=Module["_flockfile"]=a0=>(_flockfile=Module["_flockfile"]=wasmExports["flockfile"])(a0);var _getc_unlocked=Module["_getc_unlocked"]=a0=>(_getc_unlocked=Module["_getc_unlocked"]=wasmExports["getc_unlocked"])(a0);var _funlockfile=Module["_funlockfile"]=a0=>(_funlockfile=Module["_funlockfile"]=wasmExports["funlockfile"])(a0);var _Py_UniversalNewlineFgets=Module["_Py_UniversalNewlineFgets"]=(a0,a1,a2,a3)=>(_Py_UniversalNewlineFgets=Module["_Py_UniversalNewlineFgets"]=wasmExports["Py_UniversalNewlineFgets"])(a0,a1,a2,a3);var _PyFile_NewStdPrinter=Module["_PyFile_NewStdPrinter"]=a0=>(_PyFile_NewStdPrinter=Module["_PyFile_NewStdPrinter"]=wasmExports["PyFile_NewStdPrinter"])(a0);var _PyFile_SetOpenCodeHook=Module["_PyFile_SetOpenCodeHook"]=(a0,a1)=>(_PyFile_SetOpenCodeHook=Module["_PyFile_SetOpenCodeHook"]=wasmExports["PyFile_SetOpenCodeHook"])(a0,a1);var _Py_IsInitialized=Module["_Py_IsInitialized"]=()=>(_Py_IsInitialized=Module["_Py_IsInitialized"]=wasmExports["Py_IsInitialized"])();var _PyFile_OpenCodeObject=Module["_PyFile_OpenCodeObject"]=a0=>(_PyFile_OpenCodeObject=Module["_PyFile_OpenCodeObject"]=wasmExports["PyFile_OpenCodeObject"])(a0);var _PyFile_OpenCode=Module["_PyFile_OpenCode"]=a0=>(_PyFile_OpenCode=Module["_PyFile_OpenCode"]=wasmExports["PyFile_OpenCode"])(a0);var __PyUnicode_AsUTF8String=Module["__PyUnicode_AsUTF8String"]=(a0,a1)=>(__PyUnicode_AsUTF8String=Module["__PyUnicode_AsUTF8String"]=wasmExports["_PyUnicode_AsUTF8String"])(a0,a1);var __Py_write=Module["__Py_write"]=(a0,a1,a2)=>(__Py_write=Module["__Py_write"]=wasmExports["_Py_write"])(a0,a1,a2);var _PyFloat_GetMax=Module["_PyFloat_GetMax"]=()=>(_PyFloat_GetMax=Module["_PyFloat_GetMax"]=wasmExports["PyFloat_GetMax"])();var _PyFloat_GetMin=Module["_PyFloat_GetMin"]=()=>(_PyFloat_GetMin=Module["_PyFloat_GetMin"]=wasmExports["PyFloat_GetMin"])();var _PyFloat_GetInfo=Module["_PyFloat_GetInfo"]=()=>(_PyFloat_GetInfo=Module["_PyFloat_GetInfo"]=wasmExports["PyFloat_GetInfo"])();var _PyStructSequence_New=Module["_PyStructSequence_New"]=a0=>(_PyStructSequence_New=Module["_PyStructSequence_New"]=wasmExports["PyStructSequence_New"])(a0);var __PyLong_Sign=Module["__PyLong_Sign"]=a0=>(__PyLong_Sign=Module["__PyLong_Sign"]=wasmExports["_PyLong_Sign"])(a0);var _frexp=Module["_frexp"]=(a0,a1)=>(_frexp=Module["_frexp"]=wasmExports["frexp"])(a0,a1);var _modf=Module["_modf"]=(a0,a1)=>(_modf=Module["_modf"]=wasmExports["modf"])(a0,a1);var _PyLong_FromDouble=Module["_PyLong_FromDouble"]=a0=>(_PyLong_FromDouble=Module["_PyLong_FromDouble"]=wasmExports["PyLong_FromDouble"])(a0);var __PyLong_Lshift=Module["__PyLong_Lshift"]=(a0,a1)=>(__PyLong_Lshift=Module["__PyLong_Lshift"]=wasmExports["_PyLong_Lshift"])(a0,a1);var __PyFloat_DebugMallocStats=Module["__PyFloat_DebugMallocStats"]=a0=>(__PyFloat_DebugMallocStats=Module["__PyFloat_DebugMallocStats"]=wasmExports["_PyFloat_DebugMallocStats"])(a0);var __PyDebugAllocatorStats=Module["__PyDebugAllocatorStats"]=(a0,a1,a2,a3)=>(__PyDebugAllocatorStats=Module["__PyDebugAllocatorStats"]=wasmExports["_PyDebugAllocatorStats"])(a0,a1,a2,a3);var _PyFloat_Pack2=Module["_PyFloat_Pack2"]=(a0,a1,a2)=>(_PyFloat_Pack2=Module["_PyFloat_Pack2"]=wasmExports["PyFloat_Pack2"])(a0,a1,a2);var _ldexp=Module["_ldexp"]=(a0,a1)=>(_ldexp=Module["_ldexp"]=wasmExports["ldexp"])(a0,a1);var _PyFloat_Pack4=Module["_PyFloat_Pack4"]=(a0,a1,a2)=>(_PyFloat_Pack4=Module["_PyFloat_Pack4"]=wasmExports["PyFloat_Pack4"])(a0,a1,a2);var _PyFloat_Pack8=Module["_PyFloat_Pack8"]=(a0,a1,a2)=>(_PyFloat_Pack8=Module["_PyFloat_Pack8"]=wasmExports["PyFloat_Pack8"])(a0,a1,a2);var _PyFloat_Unpack2=Module["_PyFloat_Unpack2"]=(a0,a1)=>(_PyFloat_Unpack2=Module["_PyFloat_Unpack2"]=wasmExports["PyFloat_Unpack2"])(a0,a1);var _PyFloat_Unpack4=Module["_PyFloat_Unpack4"]=(a0,a1)=>(_PyFloat_Unpack4=Module["_PyFloat_Unpack4"]=wasmExports["PyFloat_Unpack4"])(a0,a1);var _PyFloat_Unpack8=Module["_PyFloat_Unpack8"]=(a0,a1)=>(_PyFloat_Unpack8=Module["_PyFloat_Unpack8"]=wasmExports["PyFloat_Unpack8"])(a0,a1);var _fmod=Module["_fmod"]=(a0,a1)=>(_fmod=Module["_fmod"]=wasmExports["fmod"])(a0,a1);var _PyErr_SetFromErrno=Module["_PyErr_SetFromErrno"]=a0=>(_PyErr_SetFromErrno=Module["_PyErr_SetFromErrno"]=wasmExports["PyErr_SetFromErrno"])(a0);var _round=Module["_round"]=a0=>(_round=Module["_round"]=wasmExports["round"])(a0);var __Py_dg_dtoa=Module["__Py_dg_dtoa"]=(a0,a1,a2,a3,a4,a5)=>(__Py_dg_dtoa=Module["__Py_dg_dtoa"]=wasmExports["_Py_dg_dtoa"])(a0,a1,a2,a3,a4,a5);var __Py_dg_strtod=Module["__Py_dg_strtod"]=(a0,a1)=>(__Py_dg_strtod=Module["__Py_dg_strtod"]=wasmExports["_Py_dg_strtod"])(a0,a1);var __Py_dg_freedtoa=Module["__Py_dg_freedtoa"]=a0=>(__Py_dg_freedtoa=Module["__Py_dg_freedtoa"]=wasmExports["_Py_dg_freedtoa"])(a0);var __Py_parse_inf_or_nan=Module["__Py_parse_inf_or_nan"]=(a0,a1)=>(__Py_parse_inf_or_nan=Module["__Py_parse_inf_or_nan"]=wasmExports["_Py_parse_inf_or_nan"])(a0,a1);var _strtol=Module["_strtol"]=(a0,a1,a2)=>(_strtol=Module["_strtol"]=wasmExports["strtol"])(a0,a1,a2);var __PyFloat_FormatAdvancedWriter=Module["__PyFloat_FormatAdvancedWriter"]=(a0,a1,a2,a3,a4)=>(__PyFloat_FormatAdvancedWriter=Module["__PyFloat_FormatAdvancedWriter"]=wasmExports["_PyFloat_FormatAdvancedWriter"])(a0,a1,a2,a3,a4);var _PyFrame_GetLineNumber=Module["_PyFrame_GetLineNumber"]=a0=>(_PyFrame_GetLineNumber=Module["_PyFrame_GetLineNumber"]=wasmExports["PyFrame_GetLineNumber"])(a0);var _PyFrame_New=Module["_PyFrame_New"]=(a0,a1,a2,a3)=>(_PyFrame_New=Module["_PyFrame_New"]=wasmExports["PyFrame_New"])(a0,a1,a2,a3);var _PyDict_Size=Module["_PyDict_Size"]=a0=>(_PyDict_Size=Module["_PyDict_Size"]=wasmExports["PyDict_Size"])(a0);var _PyDict_Merge=Module["_PyDict_Merge"]=(a0,a1,a2)=>(_PyDict_Merge=Module["_PyDict_Merge"]=wasmExports["PyDict_Merge"])(a0,a1,a2);var _PyFrame_GetVar=Module["_PyFrame_GetVar"]=(a0,a1)=>(_PyFrame_GetVar=Module["_PyFrame_GetVar"]=wasmExports["PyFrame_GetVar"])(a0,a1);var __PyUnicode_Equal=Module["__PyUnicode_Equal"]=(a0,a1)=>(__PyUnicode_Equal=Module["__PyUnicode_Equal"]=wasmExports["_PyUnicode_Equal"])(a0,a1);var _PyFrame_GetVarString=Module["_PyFrame_GetVarString"]=(a0,a1)=>(_PyFrame_GetVarString=Module["_PyFrame_GetVarString"]=wasmExports["PyFrame_GetVarString"])(a0,a1);var _PyFrame_FastToLocalsWithError=Module["_PyFrame_FastToLocalsWithError"]=a0=>(_PyFrame_FastToLocalsWithError=Module["_PyFrame_FastToLocalsWithError"]=wasmExports["PyFrame_FastToLocalsWithError"])(a0);var _PyFrame_FastToLocals=Module["_PyFrame_FastToLocals"]=a0=>(_PyFrame_FastToLocals=Module["_PyFrame_FastToLocals"]=wasmExports["PyFrame_FastToLocals"])(a0);var _PyFrame_LocalsToFast=Module["_PyFrame_LocalsToFast"]=(a0,a1)=>(_PyFrame_LocalsToFast=Module["_PyFrame_LocalsToFast"]=wasmExports["PyFrame_LocalsToFast"])(a0,a1);var __PyFrame_IsEntryFrame=Module["__PyFrame_IsEntryFrame"]=a0=>(__PyFrame_IsEntryFrame=Module["__PyFrame_IsEntryFrame"]=wasmExports["_PyFrame_IsEntryFrame"])(a0);var _PyFrame_GetCode=Module["_PyFrame_GetCode"]=a0=>(_PyFrame_GetCode=Module["_PyFrame_GetCode"]=wasmExports["PyFrame_GetCode"])(a0);var _PyFrame_GetBack=Module["_PyFrame_GetBack"]=a0=>(_PyFrame_GetBack=Module["_PyFrame_GetBack"]=wasmExports["PyFrame_GetBack"])(a0);var _PyFrame_GetLocals=Module["_PyFrame_GetLocals"]=a0=>(_PyFrame_GetLocals=Module["_PyFrame_GetLocals"]=wasmExports["PyFrame_GetLocals"])(a0);var _PyFrame_GetGlobals=Module["_PyFrame_GetGlobals"]=a0=>(_PyFrame_GetGlobals=Module["_PyFrame_GetGlobals"]=wasmExports["PyFrame_GetGlobals"])(a0);var _PyFrame_GetBuiltins=Module["_PyFrame_GetBuiltins"]=a0=>(_PyFrame_GetBuiltins=Module["_PyFrame_GetBuiltins"]=wasmExports["PyFrame_GetBuiltins"])(a0);var _PyFrame_GetLasti=Module["_PyFrame_GetLasti"]=a0=>(_PyFrame_GetLasti=Module["_PyFrame_GetLasti"]=wasmExports["PyFrame_GetLasti"])(a0);var _PyFrame_GetGenerator=Module["_PyFrame_GetGenerator"]=a0=>(_PyFrame_GetGenerator=Module["_PyFrame_GetGenerator"]=wasmExports["PyFrame_GetGenerator"])(a0);var _PyCompile_OpcodeStackEffect=Module["_PyCompile_OpcodeStackEffect"]=(a0,a1)=>(_PyCompile_OpcodeStackEffect=Module["_PyCompile_OpcodeStackEffect"]=wasmExports["PyCompile_OpcodeStackEffect"])(a0,a1);var _PyFunction_AddWatcher=Module["_PyFunction_AddWatcher"]=a0=>(_PyFunction_AddWatcher=Module["_PyFunction_AddWatcher"]=wasmExports["PyFunction_AddWatcher"])(a0);var _PyFunction_ClearWatcher=Module["_PyFunction_ClearWatcher"]=a0=>(_PyFunction_ClearWatcher=Module["_PyFunction_ClearWatcher"]=wasmExports["PyFunction_ClearWatcher"])(a0);var _PyFunction_NewWithQualName=Module["_PyFunction_NewWithQualName"]=(a0,a1,a2)=>(_PyFunction_NewWithQualName=Module["_PyFunction_NewWithQualName"]=wasmExports["PyFunction_NewWithQualName"])(a0,a1,a2);var _PyFunction_New=Module["_PyFunction_New"]=(a0,a1)=>(_PyFunction_New=Module["_PyFunction_New"]=wasmExports["PyFunction_New"])(a0,a1);var _PyFunction_GetCode=Module["_PyFunction_GetCode"]=a0=>(_PyFunction_GetCode=Module["_PyFunction_GetCode"]=wasmExports["PyFunction_GetCode"])(a0);var _PyFunction_GetGlobals=Module["_PyFunction_GetGlobals"]=a0=>(_PyFunction_GetGlobals=Module["_PyFunction_GetGlobals"]=wasmExports["PyFunction_GetGlobals"])(a0);var _PyFunction_GetModule=Module["_PyFunction_GetModule"]=a0=>(_PyFunction_GetModule=Module["_PyFunction_GetModule"]=wasmExports["PyFunction_GetModule"])(a0);var _PyFunction_GetDefaults=Module["_PyFunction_GetDefaults"]=a0=>(_PyFunction_GetDefaults=Module["_PyFunction_GetDefaults"]=wasmExports["PyFunction_GetDefaults"])(a0);var _PyFunction_SetDefaults=Module["_PyFunction_SetDefaults"]=(a0,a1)=>(_PyFunction_SetDefaults=Module["_PyFunction_SetDefaults"]=wasmExports["PyFunction_SetDefaults"])(a0,a1);var _PyFunction_SetVectorcall=Module["_PyFunction_SetVectorcall"]=(a0,a1)=>(_PyFunction_SetVectorcall=Module["_PyFunction_SetVectorcall"]=wasmExports["PyFunction_SetVectorcall"])(a0,a1);var _PyFunction_GetKwDefaults=Module["_PyFunction_GetKwDefaults"]=a0=>(_PyFunction_GetKwDefaults=Module["_PyFunction_GetKwDefaults"]=wasmExports["PyFunction_GetKwDefaults"])(a0);var _PyFunction_SetKwDefaults=Module["_PyFunction_SetKwDefaults"]=(a0,a1)=>(_PyFunction_SetKwDefaults=Module["_PyFunction_SetKwDefaults"]=wasmExports["PyFunction_SetKwDefaults"])(a0,a1);var _PyFunction_GetClosure=Module["_PyFunction_GetClosure"]=a0=>(_PyFunction_GetClosure=Module["_PyFunction_GetClosure"]=wasmExports["PyFunction_GetClosure"])(a0);var _PyFunction_SetClosure=Module["_PyFunction_SetClosure"]=(a0,a1)=>(_PyFunction_SetClosure=Module["_PyFunction_SetClosure"]=wasmExports["PyFunction_SetClosure"])(a0,a1);var _PyFunction_GetAnnotations=Module["_PyFunction_GetAnnotations"]=a0=>(_PyFunction_GetAnnotations=Module["_PyFunction_GetAnnotations"]=wasmExports["PyFunction_GetAnnotations"])(a0);var _PyFunction_SetAnnotations=Module["_PyFunction_SetAnnotations"]=(a0,a1)=>(_PyFunction_SetAnnotations=Module["_PyFunction_SetAnnotations"]=wasmExports["PyFunction_SetAnnotations"])(a0,a1);var _PyClassMethod_New=Module["_PyClassMethod_New"]=a0=>(_PyClassMethod_New=Module["_PyClassMethod_New"]=wasmExports["PyClassMethod_New"])(a0);var _PyStaticMethod_New=Module["_PyStaticMethod_New"]=a0=>(_PyStaticMethod_New=Module["_PyStaticMethod_New"]=wasmExports["PyStaticMethod_New"])(a0);var __PyInterpreterState_LookUpID=Module["__PyInterpreterState_LookUpID"]=a0=>(__PyInterpreterState_LookUpID=Module["__PyInterpreterState_LookUpID"]=wasmExports["_PyInterpreterState_LookUpID"])(a0);var __PyInterpreterState_IDDecref=Module["__PyInterpreterState_IDDecref"]=a0=>(__PyInterpreterState_IDDecref=Module["__PyInterpreterState_IDDecref"]=wasmExports["_PyInterpreterState_IDDecref"])(a0);var _PyLong_FromLongLong=Module["_PyLong_FromLongLong"]=a0=>(_PyLong_FromLongLong=Module["_PyLong_FromLongLong"]=wasmExports["PyLong_FromLongLong"])(a0);var _PyLong_AsLongLongAndOverflow=Module["_PyLong_AsLongLongAndOverflow"]=(a0,a1)=>(_PyLong_AsLongLongAndOverflow=Module["_PyLong_AsLongLongAndOverflow"]=wasmExports["PyLong_AsLongLongAndOverflow"])(a0,a1);var _PyArg_ParseTupleAndKeywords=Module["_PyArg_ParseTupleAndKeywords"]=(a0,a1,a2,a3,a4)=>(_PyArg_ParseTupleAndKeywords=Module["_PyArg_ParseTupleAndKeywords"]=wasmExports["PyArg_ParseTupleAndKeywords"])(a0,a1,a2,a3,a4);var __PyInterpreterState_IDIncref=Module["__PyInterpreterState_IDIncref"]=a0=>(__PyInterpreterState_IDIncref=Module["__PyInterpreterState_IDIncref"]=wasmExports["_PyInterpreterState_IDIncref"])(a0);var __PyInterpreterID_New=Module["__PyInterpreterID_New"]=a0=>(__PyInterpreterID_New=Module["__PyInterpreterID_New"]=wasmExports["_PyInterpreterID_New"])(a0);var __PyInterpreterState_GetIDObject=Module["__PyInterpreterState_GetIDObject"]=a0=>(__PyInterpreterState_GetIDObject=Module["__PyInterpreterState_GetIDObject"]=wasmExports["_PyInterpreterState_GetIDObject"])(a0);var __PyInterpreterState_IDInitref=Module["__PyInterpreterState_IDInitref"]=a0=>(__PyInterpreterState_IDInitref=Module["__PyInterpreterState_IDInitref"]=wasmExports["_PyInterpreterState_IDInitref"])(a0);var _PyInterpreterState_GetID=Module["_PyInterpreterState_GetID"]=a0=>(_PyInterpreterState_GetID=Module["_PyInterpreterState_GetID"]=wasmExports["PyInterpreterState_GetID"])(a0);var __PyInterpreterID_LookUp=Module["__PyInterpreterID_LookUp"]=a0=>(__PyInterpreterID_LookUp=Module["__PyInterpreterID_LookUp"]=wasmExports["_PyInterpreterID_LookUp"])(a0);var _PyLong_AsLongLong=Module["_PyLong_AsLongLong"]=a0=>(_PyLong_AsLongLong=Module["_PyLong_AsLongLong"]=wasmExports["PyLong_AsLongLong"])(a0);var _PyCallIter_New=Module["_PyCallIter_New"]=(a0,a1)=>(_PyCallIter_New=Module["_PyCallIter_New"]=wasmExports["PyCallIter_New"])(a0,a1);var __PyList_DebugMallocStats=Module["__PyList_DebugMallocStats"]=a0=>(__PyList_DebugMallocStats=Module["__PyList_DebugMallocStats"]=wasmExports["_PyList_DebugMallocStats"])(a0);var _PyList_SetItem=Module["_PyList_SetItem"]=(a0,a1,a2)=>(_PyList_SetItem=Module["_PyList_SetItem"]=wasmExports["PyList_SetItem"])(a0,a1,a2);var _PyList_Insert=Module["_PyList_Insert"]=(a0,a1,a2)=>(_PyList_Insert=Module["_PyList_Insert"]=wasmExports["PyList_Insert"])(a0,a1,a2);var _PyList_GetSlice=Module["_PyList_GetSlice"]=(a0,a1,a2)=>(_PyList_GetSlice=Module["_PyList_GetSlice"]=wasmExports["PyList_GetSlice"])(a0,a1,a2);var _Py_ReprEnter=Module["_Py_ReprEnter"]=a0=>(_Py_ReprEnter=Module["_Py_ReprEnter"]=wasmExports["Py_ReprEnter"])(a0);var __PyUnicodeWriter_WriteChar=Module["__PyUnicodeWriter_WriteChar"]=(a0,a1)=>(__PyUnicodeWriter_WriteChar=Module["__PyUnicodeWriter_WriteChar"]=wasmExports["_PyUnicodeWriter_WriteChar"])(a0,a1);var _Py_ReprLeave=Module["_Py_ReprLeave"]=a0=>(_Py_ReprLeave=Module["_Py_ReprLeave"]=wasmExports["Py_ReprLeave"])(a0);var __PyEval_SliceIndexNotNone=Module["__PyEval_SliceIndexNotNone"]=(a0,a1)=>(__PyEval_SliceIndexNotNone=Module["__PyEval_SliceIndexNotNone"]=wasmExports["_PyEval_SliceIndexNotNone"])(a0,a1);var _PyObject_HashNotImplemented=Module["_PyObject_HashNotImplemented"]=a0=>(_PyObject_HashNotImplemented=Module["_PyObject_HashNotImplemented"]=wasmExports["PyObject_HashNotImplemented"])(a0);var __PyLong_New=Module["__PyLong_New"]=a0=>(__PyLong_New=Module["__PyLong_New"]=wasmExports["_PyLong_New"])(a0);var __PyLong_FromDigits=Module["__PyLong_FromDigits"]=(a0,a1,a2)=>(__PyLong_FromDigits=Module["__PyLong_FromDigits"]=wasmExports["_PyLong_FromDigits"])(a0,a1,a2);var _PyLong_FromUnsignedLong=Module["_PyLong_FromUnsignedLong"]=a0=>(_PyLong_FromUnsignedLong=Module["_PyLong_FromUnsignedLong"]=wasmExports["PyLong_FromUnsignedLong"])(a0);var _PyLong_FromUnsignedLongLong=Module["_PyLong_FromUnsignedLongLong"]=a0=>(_PyLong_FromUnsignedLongLong=Module["_PyLong_FromUnsignedLongLong"]=wasmExports["PyLong_FromUnsignedLongLong"])(a0);var _PyLong_AsUnsignedLong=Module["_PyLong_AsUnsignedLong"]=a0=>(_PyLong_AsUnsignedLong=Module["_PyLong_AsUnsignedLong"]=wasmExports["PyLong_AsUnsignedLong"])(a0);var _PyLong_AsSize_t=Module["_PyLong_AsSize_t"]=a0=>(_PyLong_AsSize_t=Module["_PyLong_AsSize_t"]=wasmExports["PyLong_AsSize_t"])(a0);var _PyLong_AsUnsignedLongMask=Module["_PyLong_AsUnsignedLongMask"]=a0=>(_PyLong_AsUnsignedLongMask=Module["_PyLong_AsUnsignedLongMask"]=wasmExports["PyLong_AsUnsignedLongMask"])(a0);var __PyLong_FromByteArray=Module["__PyLong_FromByteArray"]=(a0,a1,a2,a3)=>(__PyLong_FromByteArray=Module["__PyLong_FromByteArray"]=wasmExports["_PyLong_FromByteArray"])(a0,a1,a2,a3);var _PyLong_AsVoidPtr=Module["_PyLong_AsVoidPtr"]=a0=>(_PyLong_AsVoidPtr=Module["_PyLong_AsVoidPtr"]=wasmExports["PyLong_AsVoidPtr"])(a0);var _PyLong_AsUnsignedLongLong=Module["_PyLong_AsUnsignedLongLong"]=a0=>(_PyLong_AsUnsignedLongLong=Module["_PyLong_AsUnsignedLongLong"]=wasmExports["PyLong_AsUnsignedLongLong"])(a0);var _PyLong_AsUnsignedLongLongMask=Module["_PyLong_AsUnsignedLongLongMask"]=a0=>(_PyLong_AsUnsignedLongLongMask=Module["_PyLong_AsUnsignedLongLongMask"]=wasmExports["PyLong_AsUnsignedLongLongMask"])(a0);var __PyLong_UnsignedShort_Converter=Module["__PyLong_UnsignedShort_Converter"]=(a0,a1)=>(__PyLong_UnsignedShort_Converter=Module["__PyLong_UnsignedShort_Converter"]=wasmExports["_PyLong_UnsignedShort_Converter"])(a0,a1);var __PyLong_UnsignedInt_Converter=Module["__PyLong_UnsignedInt_Converter"]=(a0,a1)=>(__PyLong_UnsignedInt_Converter=Module["__PyLong_UnsignedInt_Converter"]=wasmExports["_PyLong_UnsignedInt_Converter"])(a0,a1);var __PyLong_UnsignedLong_Converter=Module["__PyLong_UnsignedLong_Converter"]=(a0,a1)=>(__PyLong_UnsignedLong_Converter=Module["__PyLong_UnsignedLong_Converter"]=wasmExports["_PyLong_UnsignedLong_Converter"])(a0,a1);var __PyLong_UnsignedLongLong_Converter=Module["__PyLong_UnsignedLongLong_Converter"]=(a0,a1)=>(__PyLong_UnsignedLongLong_Converter=Module["__PyLong_UnsignedLongLong_Converter"]=wasmExports["_PyLong_UnsignedLongLong_Converter"])(a0,a1);var __PyLong_Size_t_Converter=Module["__PyLong_Size_t_Converter"]=(a0,a1)=>(__PyLong_Size_t_Converter=Module["__PyLong_Size_t_Converter"]=wasmExports["_PyLong_Size_t_Converter"])(a0,a1);var __PyUnicodeWriter_PrepareInternal=Module["__PyUnicodeWriter_PrepareInternal"]=(a0,a1,a2)=>(__PyUnicodeWriter_PrepareInternal=Module["__PyUnicodeWriter_PrepareInternal"]=wasmExports["_PyUnicodeWriter_PrepareInternal"])(a0,a1,a2);var __PyLong_FormatWriter=Module["__PyLong_FormatWriter"]=(a0,a1,a2,a3)=>(__PyLong_FormatWriter=Module["__PyLong_FormatWriter"]=wasmExports["_PyLong_FormatWriter"])(a0,a1,a2,a3);var __PyLong_Frexp=Module["__PyLong_Frexp"]=(a0,a1)=>(__PyLong_Frexp=Module["__PyLong_Frexp"]=wasmExports["_PyLong_Frexp"])(a0,a1);var __PyLong_Rshift=Module["__PyLong_Rshift"]=(a0,a1)=>(__PyLong_Rshift=Module["__PyLong_Rshift"]=wasmExports["_PyLong_Rshift"])(a0,a1);var __PyLong_GCD=Module["__PyLong_GCD"]=(a0,a1)=>(__PyLong_GCD=Module["__PyLong_GCD"]=wasmExports["_PyLong_GCD"])(a0,a1);var __PyLong_DivmodNear=Module["__PyLong_DivmodNear"]=(a0,a1)=>(__PyLong_DivmodNear=Module["__PyLong_DivmodNear"]=wasmExports["_PyLong_DivmodNear"])(a0,a1);var _PyLong_GetInfo=Module["_PyLong_GetInfo"]=()=>(_PyLong_GetInfo=Module["_PyLong_GetInfo"]=wasmExports["PyLong_GetInfo"])();var _PyUnstable_Long_IsCompact=Module["_PyUnstable_Long_IsCompact"]=a0=>(_PyUnstable_Long_IsCompact=Module["_PyUnstable_Long_IsCompact"]=wasmExports["PyUnstable_Long_IsCompact"])(a0);var _PyUnstable_Long_CompactValue=Module["_PyUnstable_Long_CompactValue"]=a0=>(_PyUnstable_Long_CompactValue=Module["_PyUnstable_Long_CompactValue"]=wasmExports["PyUnstable_Long_CompactValue"])(a0);var _PyObject_Bytes=Module["_PyObject_Bytes"]=a0=>(_PyObject_Bytes=Module["_PyObject_Bytes"]=wasmExports["PyObject_Bytes"])(a0);var __PyLong_FormatAdvancedWriter=Module["__PyLong_FormatAdvancedWriter"]=(a0,a1,a2,a3,a4)=>(__PyLong_FormatAdvancedWriter=Module["__PyLong_FormatAdvancedWriter"]=wasmExports["_PyLong_FormatAdvancedWriter"])(a0,a1,a2,a3,a4);var __PyDict_DebugMallocStats=Module["__PyDict_DebugMallocStats"]=a0=>(__PyDict_DebugMallocStats=Module["__PyDict_DebugMallocStats"]=wasmExports["_PyDict_DebugMallocStats"])(a0);var __PyDict_CheckConsistency=Module["__PyDict_CheckConsistency"]=(a0,a1)=>(__PyDict_CheckConsistency=Module["__PyDict_CheckConsistency"]=wasmExports["_PyDict_CheckConsistency"])(a0,a1);var __PyObject_AssertFailed=Module["__PyObject_AssertFailed"]=(a0,a1,a2,a3,a4,a5)=>(__PyObject_AssertFailed=Module["__PyObject_AssertFailed"]=wasmExports["_PyObject_AssertFailed"])(a0,a1,a2,a3,a4,a5);var __PyDict_HasOnlyStringKeys=Module["__PyDict_HasOnlyStringKeys"]=a0=>(__PyDict_HasOnlyStringKeys=Module["__PyDict_HasOnlyStringKeys"]=wasmExports["_PyDict_HasOnlyStringKeys"])(a0);var __PyDict_Next=Module["__PyDict_Next"]=(a0,a1,a2,a3,a4)=>(__PyDict_Next=Module["__PyDict_Next"]=wasmExports["_PyDict_Next"])(a0,a1,a2,a3,a4);var __PyDict_MaybeUntrack=Module["__PyDict_MaybeUntrack"]=a0=>(__PyDict_MaybeUntrack=Module["__PyDict_MaybeUntrack"]=wasmExports["_PyDict_MaybeUntrack"])(a0);var _PyObject_IS_GC=Module["_PyObject_IS_GC"]=a0=>(_PyObject_IS_GC=Module["_PyObject_IS_GC"]=wasmExports["PyObject_IS_GC"])(a0);var __PyDict_NewPresized=Module["__PyDict_NewPresized"]=a0=>(__PyDict_NewPresized=Module["__PyDict_NewPresized"]=wasmExports["_PyDict_NewPresized"])(a0);var _PyDict_GetItem=Module["_PyDict_GetItem"]=(a0,a1)=>(_PyDict_GetItem=Module["_PyDict_GetItem"]=wasmExports["PyDict_GetItem"])(a0,a1);var __PyDict_GetItemWithError=Module["__PyDict_GetItemWithError"]=(a0,a1)=>(__PyDict_GetItemWithError=Module["__PyDict_GetItemWithError"]=wasmExports["_PyDict_GetItemWithError"])(a0,a1);var __PyDict_GetItemIdWithError=Module["__PyDict_GetItemIdWithError"]=(a0,a1)=>(__PyDict_GetItemIdWithError=Module["__PyDict_GetItemIdWithError"]=wasmExports["_PyDict_GetItemIdWithError"])(a0,a1);var __PyDict_GetItemStringWithError=Module["__PyDict_GetItemStringWithError"]=(a0,a1)=>(__PyDict_GetItemStringWithError=Module["__PyDict_GetItemStringWithError"]=wasmExports["_PyDict_GetItemStringWithError"])(a0,a1);var __PyDict_SetItem_KnownHash=Module["__PyDict_SetItem_KnownHash"]=(a0,a1,a2,a3)=>(__PyDict_SetItem_KnownHash=Module["__PyDict_SetItem_KnownHash"]=wasmExports["_PyDict_SetItem_KnownHash"])(a0,a1,a2,a3);var _PyDict_DelItem=Module["_PyDict_DelItem"]=(a0,a1)=>(_PyDict_DelItem=Module["_PyDict_DelItem"]=wasmExports["PyDict_DelItem"])(a0,a1);var __PyDict_DelItem_KnownHash=Module["__PyDict_DelItem_KnownHash"]=(a0,a1,a2)=>(__PyDict_DelItem_KnownHash=Module["__PyDict_DelItem_KnownHash"]=wasmExports["_PyDict_DelItem_KnownHash"])(a0,a1,a2);var __PyErr_SetKeyError=Module["__PyErr_SetKeyError"]=a0=>(__PyErr_SetKeyError=Module["__PyErr_SetKeyError"]=wasmExports["_PyErr_SetKeyError"])(a0);var __PyDict_DelItemIf=Module["__PyDict_DelItemIf"]=(a0,a1,a2)=>(__PyDict_DelItemIf=Module["__PyDict_DelItemIf"]=wasmExports["_PyDict_DelItemIf"])(a0,a1,a2);var _PyDict_Clear=Module["_PyDict_Clear"]=a0=>(_PyDict_Clear=Module["_PyDict_Clear"]=wasmExports["PyDict_Clear"])(a0);var __PyDict_Pop=Module["__PyDict_Pop"]=(a0,a1,a2)=>(__PyDict_Pop=Module["__PyDict_Pop"]=wasmExports["_PyDict_Pop"])(a0,a1,a2);var _PyDict_MergeFromSeq2=Module["_PyDict_MergeFromSeq2"]=(a0,a1,a2)=>(_PyDict_MergeFromSeq2=Module["_PyDict_MergeFromSeq2"]=wasmExports["PyDict_MergeFromSeq2"])(a0,a1,a2);var _PyDict_SetDefault=Module["_PyDict_SetDefault"]=(a0,a1,a2)=>(_PyDict_SetDefault=Module["_PyDict_SetDefault"]=wasmExports["PyDict_SetDefault"])(a0,a1,a2);var _PyDict_Update=Module["_PyDict_Update"]=(a0,a1)=>(_PyDict_Update=Module["_PyDict_Update"]=wasmExports["PyDict_Update"])(a0,a1);var __PyDict_MergeEx=Module["__PyDict_MergeEx"]=(a0,a1,a2)=>(__PyDict_MergeEx=Module["__PyDict_MergeEx"]=wasmExports["_PyDict_MergeEx"])(a0,a1,a2);var __PyDict_SizeOf=Module["__PyDict_SizeOf"]=a0=>(__PyDict_SizeOf=Module["__PyDict_SizeOf"]=wasmExports["_PyDict_SizeOf"])(a0);var __PyDict_Contains_KnownHash=Module["__PyDict_Contains_KnownHash"]=(a0,a1,a2)=>(__PyDict_Contains_KnownHash=Module["__PyDict_Contains_KnownHash"]=wasmExports["_PyDict_Contains_KnownHash"])(a0,a1,a2);var __PyDict_ContainsId=Module["__PyDict_ContainsId"]=(a0,a1)=>(__PyDict_ContainsId=Module["__PyDict_ContainsId"]=wasmExports["_PyDict_ContainsId"])(a0,a1);var _PyArg_ValidateKeywordArguments=Module["_PyArg_ValidateKeywordArguments"]=a0=>(_PyArg_ValidateKeywordArguments=Module["_PyArg_ValidateKeywordArguments"]=wasmExports["PyArg_ValidateKeywordArguments"])(a0);var _PyDict_GetItemString=Module["_PyDict_GetItemString"]=(a0,a1)=>(_PyDict_GetItemString=Module["_PyDict_GetItemString"]=wasmExports["PyDict_GetItemString"])(a0,a1);var __PyDict_SetItemId=Module["__PyDict_SetItemId"]=(a0,a1,a2)=>(__PyDict_SetItemId=Module["__PyDict_SetItemId"]=wasmExports["_PyDict_SetItemId"])(a0,a1,a2);var __PyDict_DelItemId=Module["__PyDict_DelItemId"]=(a0,a1)=>(__PyDict_DelItemId=Module["__PyDict_DelItemId"]=wasmExports["_PyDict_DelItemId"])(a0,a1);var _PyDict_DelItemString=Module["_PyDict_DelItemString"]=(a0,a1)=>(_PyDict_DelItemString=Module["_PyDict_DelItemString"]=wasmExports["PyDict_DelItemString"])(a0,a1);var __PyDictView_New=Module["__PyDictView_New"]=(a0,a1)=>(__PyDictView_New=Module["__PyDictView_New"]=wasmExports["_PyDictView_New"])(a0,a1);var __PyDictView_Intersect=Module["__PyDictView_Intersect"]=(a0,a1)=>(__PyDictView_Intersect=Module["__PyDictView_Intersect"]=wasmExports["_PyDictView_Intersect"])(a0,a1);var __PyObject_VisitManagedDict=Module["__PyObject_VisitManagedDict"]=(a0,a1,a2)=>(__PyObject_VisitManagedDict=Module["__PyObject_VisitManagedDict"]=wasmExports["_PyObject_VisitManagedDict"])(a0,a1,a2);var __PyObject_ClearManagedDict=Module["__PyObject_ClearManagedDict"]=a0=>(__PyObject_ClearManagedDict=Module["__PyObject_ClearManagedDict"]=wasmExports["_PyObject_ClearManagedDict"])(a0);var _PyDict_Watch=Module["_PyDict_Watch"]=(a0,a1)=>(_PyDict_Watch=Module["_PyDict_Watch"]=wasmExports["PyDict_Watch"])(a0,a1);var _PyDict_Unwatch=Module["_PyDict_Unwatch"]=(a0,a1)=>(_PyDict_Unwatch=Module["_PyDict_Unwatch"]=wasmExports["PyDict_Unwatch"])(a0,a1);var _PyDict_AddWatcher=Module["_PyDict_AddWatcher"]=a0=>(_PyDict_AddWatcher=Module["_PyDict_AddWatcher"]=wasmExports["PyDict_AddWatcher"])(a0);var _PyDict_ClearWatcher=Module["_PyDict_ClearWatcher"]=a0=>(_PyDict_ClearWatcher=Module["_PyDict_ClearWatcher"]=wasmExports["PyDict_ClearWatcher"])(a0);var _PyODict_New=Module["_PyODict_New"]=()=>(_PyODict_New=Module["_PyODict_New"]=wasmExports["PyODict_New"])();var _PyODict_SetItem=Module["_PyODict_SetItem"]=(a0,a1,a2)=>(_PyODict_SetItem=Module["_PyODict_SetItem"]=wasmExports["PyODict_SetItem"])(a0,a1,a2);var __PyErr_ChainExceptions1=Module["__PyErr_ChainExceptions1"]=a0=>(__PyErr_ChainExceptions1=Module["__PyErr_ChainExceptions1"]=wasmExports["_PyErr_ChainExceptions1"])(a0);var _PyODict_DelItem=Module["_PyODict_DelItem"]=(a0,a1)=>(_PyODict_DelItem=Module["_PyODict_DelItem"]=wasmExports["PyODict_DelItem"])(a0,a1);var _PyMemoryView_FromMemory=Module["_PyMemoryView_FromMemory"]=(a0,a1,a2)=>(_PyMemoryView_FromMemory=Module["_PyMemoryView_FromMemory"]=wasmExports["PyMemoryView_FromMemory"])(a0,a1,a2);var _PyMemoryView_FromBuffer=Module["_PyMemoryView_FromBuffer"]=a0=>(_PyMemoryView_FromBuffer=Module["_PyMemoryView_FromBuffer"]=wasmExports["PyMemoryView_FromBuffer"])(a0);var _PyMemoryView_GetContiguous=Module["_PyMemoryView_GetContiguous"]=(a0,a1,a2)=>(_PyMemoryView_GetContiguous=Module["_PyMemoryView_GetContiguous"]=wasmExports["PyMemoryView_GetContiguous"])(a0,a1,a2);var _PyUnicode_AsASCIIString=Module["_PyUnicode_AsASCIIString"]=a0=>(_PyUnicode_AsASCIIString=Module["_PyUnicode_AsASCIIString"]=wasmExports["PyUnicode_AsASCIIString"])(a0);var _PyCFunction_New=Module["_PyCFunction_New"]=(a0,a1)=>(_PyCFunction_New=Module["_PyCFunction_New"]=wasmExports["PyCFunction_New"])(a0,a1);var _PyCFunction_NewEx=Module["_PyCFunction_NewEx"]=(a0,a1,a2)=>(_PyCFunction_NewEx=Module["_PyCFunction_NewEx"]=wasmExports["PyCFunction_NewEx"])(a0,a1,a2);var _PyCFunction_GetFunction=Module["_PyCFunction_GetFunction"]=a0=>(_PyCFunction_GetFunction=Module["_PyCFunction_GetFunction"]=wasmExports["PyCFunction_GetFunction"])(a0);var _PyCFunction_GetSelf=Module["_PyCFunction_GetSelf"]=a0=>(_PyCFunction_GetSelf=Module["_PyCFunction_GetSelf"]=wasmExports["PyCFunction_GetSelf"])(a0);var _PyCFunction_GetFlags=Module["_PyCFunction_GetFlags"]=a0=>(_PyCFunction_GetFlags=Module["_PyCFunction_GetFlags"]=wasmExports["PyCFunction_GetFlags"])(a0);var _PyModuleDef_Init=Module["_PyModuleDef_Init"]=a0=>(_PyModuleDef_Init=Module["_PyModuleDef_Init"]=wasmExports["PyModuleDef_Init"])(a0);var _PyModule_NewObject=Module["_PyModule_NewObject"]=a0=>(_PyModule_NewObject=Module["_PyModule_NewObject"]=wasmExports["PyModule_NewObject"])(a0);var _PyModule_New=Module["_PyModule_New"]=a0=>(_PyModule_New=Module["_PyModule_New"]=wasmExports["PyModule_New"])(a0);var __PyImport_IsInitialized=Module["__PyImport_IsInitialized"]=a0=>(__PyImport_IsInitialized=Module["__PyImport_IsInitialized"]=wasmExports["_PyImport_IsInitialized"])(a0);var __PyModule_CreateInitialized=Module["__PyModule_CreateInitialized"]=(a0,a1)=>(__PyModule_CreateInitialized=Module["__PyModule_CreateInitialized"]=wasmExports["_PyModule_CreateInitialized"])(a0,a1);var _PyModule_SetDocString=Module["_PyModule_SetDocString"]=(a0,a1)=>(_PyModule_SetDocString=Module["_PyModule_SetDocString"]=wasmExports["PyModule_SetDocString"])(a0,a1);var _PyModule_FromDefAndSpec2=Module["_PyModule_FromDefAndSpec2"]=(a0,a1,a2)=>(_PyModule_FromDefAndSpec2=Module["_PyModule_FromDefAndSpec2"]=wasmExports["PyModule_FromDefAndSpec2"])(a0,a1,a2);var __PyImport_CheckSubinterpIncompatibleExtensionAllowed=Module["__PyImport_CheckSubinterpIncompatibleExtensionAllowed"]=a0=>(__PyImport_CheckSubinterpIncompatibleExtensionAllowed=Module["__PyImport_CheckSubinterpIncompatibleExtensionAllowed"]=wasmExports["_PyImport_CheckSubinterpIncompatibleExtensionAllowed"])(a0);var _PyModule_ExecDef=Module["_PyModule_ExecDef"]=(a0,a1)=>(_PyModule_ExecDef=Module["_PyModule_ExecDef"]=wasmExports["PyModule_ExecDef"])(a0,a1);var _PyModule_GetName=Module["_PyModule_GetName"]=a0=>(_PyModule_GetName=Module["_PyModule_GetName"]=wasmExports["PyModule_GetName"])(a0);var _PyModule_GetFilenameObject=Module["_PyModule_GetFilenameObject"]=a0=>(_PyModule_GetFilenameObject=Module["_PyModule_GetFilenameObject"]=wasmExports["PyModule_GetFilenameObject"])(a0);var _PyModule_GetFilename=Module["_PyModule_GetFilename"]=a0=>(_PyModule_GetFilename=Module["_PyModule_GetFilename"]=wasmExports["PyModule_GetFilename"])(a0);var _PyModule_GetDef=Module["_PyModule_GetDef"]=a0=>(_PyModule_GetDef=Module["_PyModule_GetDef"]=wasmExports["PyModule_GetDef"])(a0);var _PyModule_GetState=Module["_PyModule_GetState"]=a0=>(_PyModule_GetState=Module["_PyModule_GetState"]=wasmExports["PyModule_GetState"])(a0);var __PyModule_Clear=Module["__PyModule_Clear"]=a0=>(__PyModule_Clear=Module["__PyModule_Clear"]=wasmExports["_PyModule_Clear"])(a0);var __PyModule_ClearDict=Module["__PyModule_ClearDict"]=a0=>(__PyModule_ClearDict=Module["__PyModule_ClearDict"]=wasmExports["_PyModule_ClearDict"])(a0);var __PyModuleSpec_IsInitializing=Module["__PyModuleSpec_IsInitializing"]=a0=>(__PyModuleSpec_IsInitializing=Module["__PyModuleSpec_IsInitializing"]=wasmExports["_PyModuleSpec_IsInitializing"])(a0);var _PySys_FormatStderr=Module["_PySys_FormatStderr"]=(a0,a1)=>(_PySys_FormatStderr=Module["_PySys_FormatStderr"]=wasmExports["PySys_FormatStderr"])(a0,a1);var _PyUnicode_Join=Module["_PyUnicode_Join"]=(a0,a1)=>(_PyUnicode_Join=Module["_PyUnicode_Join"]=wasmExports["PyUnicode_Join"])(a0,a1);var __PyNamespace_New=Module["__PyNamespace_New"]=a0=>(__PyNamespace_New=Module["__PyNamespace_New"]=wasmExports["_PyNamespace_New"])(a0);var __PyObject_CheckConsistency=Module["__PyObject_CheckConsistency"]=(a0,a1)=>(__PyObject_CheckConsistency=Module["__PyObject_CheckConsistency"]=wasmExports["_PyObject_CheckConsistency"])(a0,a1);var __PyType_CheckConsistency=Module["__PyType_CheckConsistency"]=a0=>(__PyType_CheckConsistency=Module["__PyType_CheckConsistency"]=wasmExports["_PyType_CheckConsistency"])(a0);var __PyUnicode_CheckConsistency=Module["__PyUnicode_CheckConsistency"]=(a0,a1)=>(__PyUnicode_CheckConsistency=Module["__PyUnicode_CheckConsistency"]=wasmExports["_PyUnicode_CheckConsistency"])(a0,a1);var __PyObject_IsFreed=Module["__PyObject_IsFreed"]=a0=>(__PyObject_IsFreed=Module["__PyObject_IsFreed"]=wasmExports["_PyObject_IsFreed"])(a0);var _fiprintf=Module["_fiprintf"]=(a0,a1,a2)=>(_fiprintf=Module["_fiprintf"]=wasmExports["fiprintf"])(a0,a1,a2);var _fwrite=Module["_fwrite"]=(a0,a1,a2,a3)=>(_fwrite=Module["_fwrite"]=wasmExports["fwrite"])(a0,a1,a2,a3);var _fputc=Module["_fputc"]=(a0,a1)=>(_fputc=Module["_fputc"]=wasmExports["fputc"])(a0,a1);var __PyObject_Dump=Module["__PyObject_Dump"]=a0=>(__PyObject_Dump=Module["__PyObject_Dump"]=wasmExports["_PyObject_Dump"])(a0);var _Py_IncRef=Module["_Py_IncRef"]=a0=>(_Py_IncRef=Module["_Py_IncRef"]=wasmExports["Py_IncRef"])(a0);var _Py_DecRef=Module["_Py_DecRef"]=a0=>(_Py_DecRef=Module["_Py_DecRef"]=wasmExports["Py_DecRef"])(a0);var __Py_IncRef=Module["__Py_IncRef"]=a0=>(__Py_IncRef=Module["__Py_IncRef"]=wasmExports["_Py_IncRef"])(a0);var __Py_DecRef=Module["__Py_DecRef"]=a0=>(__Py_DecRef=Module["__Py_DecRef"]=wasmExports["_Py_DecRef"])(a0);var _PyObject_Init=Module["_PyObject_Init"]=(a0,a1)=>(_PyObject_Init=Module["_PyObject_Init"]=wasmExports["PyObject_Init"])(a0,a1);var _PyObject_InitVar=Module["_PyObject_InitVar"]=(a0,a1,a2)=>(_PyObject_InitVar=Module["_PyObject_InitVar"]=wasmExports["PyObject_InitVar"])(a0,a1,a2);var _PyObject_CallFinalizer=Module["_PyObject_CallFinalizer"]=a0=>(_PyObject_CallFinalizer=Module["_PyObject_CallFinalizer"]=wasmExports["PyObject_CallFinalizer"])(a0);var _PyObject_Print=Module["_PyObject_Print"]=(a0,a1,a2)=>(_PyObject_Print=Module["_PyObject_Print"]=wasmExports["PyObject_Print"])(a0,a1,a2);var _ferror=Module["_ferror"]=a0=>(_ferror=Module["_ferror"]=wasmExports["ferror"])(a0);var __Py_BreakPoint=Module["__Py_BreakPoint"]=()=>(__Py_BreakPoint=Module["__Py_BreakPoint"]=wasmExports["_Py_BreakPoint"])();var _PyGILState_Ensure=Module["_PyGILState_Ensure"]=()=>(_PyGILState_Ensure=Module["_PyGILState_Ensure"]=wasmExports["PyGILState_Ensure"])();var _PyGILState_Release=Module["_PyGILState_Release"]=a0=>(_PyGILState_Release=Module["_PyGILState_Release"]=wasmExports["PyGILState_Release"])(a0);var __PyUnicode_AsASCIIString=Module["__PyUnicode_AsASCIIString"]=(a0,a1)=>(__PyUnicode_AsASCIIString=Module["__PyUnicode_AsASCIIString"]=wasmExports["_PyUnicode_AsASCIIString"])(a0,a1);var _PyUnicode_DecodeASCII=Module["_PyUnicode_DecodeASCII"]=(a0,a1,a2)=>(_PyUnicode_DecodeASCII=Module["_PyUnicode_DecodeASCII"]=wasmExports["PyUnicode_DecodeASCII"])(a0,a1,a2);var _PyObject_HasAttrString=Module["_PyObject_HasAttrString"]=(a0,a1)=>(_PyObject_HasAttrString=Module["_PyObject_HasAttrString"]=wasmExports["PyObject_HasAttrString"])(a0,a1);var __PyObject_LookupAttrId=Module["__PyObject_LookupAttrId"]=(a0,a1,a2)=>(__PyObject_LookupAttrId=Module["__PyObject_LookupAttrId"]=wasmExports["_PyObject_LookupAttrId"])(a0,a1,a2);var __PyObject_GetDictPtr=Module["__PyObject_GetDictPtr"]=a0=>(__PyObject_GetDictPtr=Module["__PyObject_GetDictPtr"]=wasmExports["_PyObject_GetDictPtr"])(a0);var __PyObject_GenericSetAttrWithDict=Module["__PyObject_GenericSetAttrWithDict"]=(a0,a1,a2,a3)=>(__PyObject_GenericSetAttrWithDict=Module["__PyObject_GenericSetAttrWithDict"]=wasmExports["_PyObject_GenericSetAttrWithDict"])(a0,a1,a2,a3);var _PyObject_Not=Module["_PyObject_Not"]=a0=>(_PyObject_Not=Module["_PyObject_Not"]=wasmExports["PyObject_Not"])(a0);var __PyObject_DebugTypeStats=Module["__PyObject_DebugTypeStats"]=a0=>(__PyObject_DebugTypeStats=Module["__PyObject_DebugTypeStats"]=wasmExports["_PyObject_DebugTypeStats"])(a0);var __PyTuple_DebugMallocStats=Module["__PyTuple_DebugMallocStats"]=a0=>(__PyTuple_DebugMallocStats=Module["__PyTuple_DebugMallocStats"]=wasmExports["_PyTuple_DebugMallocStats"])(a0);var _PyThreadState_GetDict=Module["_PyThreadState_GetDict"]=()=>(_PyThreadState_GetDict=Module["_PyThreadState_GetDict"]=wasmExports["PyThreadState_GetDict"])();var _PyThread_tss_get=Module["_PyThread_tss_get"]=a0=>(_PyThread_tss_get=Module["_PyThread_tss_get"]=wasmExports["PyThread_tss_get"])(a0);var _PyMem_RawMalloc=Module["_PyMem_RawMalloc"]=a0=>(_PyMem_RawMalloc=Module["_PyMem_RawMalloc"]=wasmExports["PyMem_RawMalloc"])(a0);var _PyThread_tss_set=Module["_PyThread_tss_set"]=(a0,a1)=>(_PyThread_tss_set=Module["_PyThread_tss_set"]=wasmExports["PyThread_tss_set"])(a0,a1);var _PyThread_tss_is_created=Module["_PyThread_tss_is_created"]=a0=>(_PyThread_tss_is_created=Module["_PyThread_tss_is_created"]=wasmExports["PyThread_tss_is_created"])(a0);var _PyObject_GET_WEAKREFS_LISTPTR=Module["_PyObject_GET_WEAKREFS_LISTPTR"]=a0=>(_PyObject_GET_WEAKREFS_LISTPTR=Module["_PyObject_GET_WEAKREFS_LISTPTR"]=wasmExports["PyObject_GET_WEAKREFS_LISTPTR"])(a0);var _Py_NewRef=Module["_Py_NewRef"]=a0=>(_Py_NewRef=Module["_Py_NewRef"]=wasmExports["Py_NewRef"])(a0);var _Py_XNewRef=Module["_Py_XNewRef"]=a0=>(_Py_XNewRef=Module["_Py_XNewRef"]=wasmExports["Py_XNewRef"])(a0);var _Py_Is=Module["_Py_Is"]=(a0,a1)=>(_Py_Is=Module["_Py_Is"]=wasmExports["Py_Is"])(a0,a1);var _Py_IsNone=Module["_Py_IsNone"]=a0=>(_Py_IsNone=Module["_Py_IsNone"]=wasmExports["Py_IsNone"])(a0);var _Py_IsTrue=Module["_Py_IsTrue"]=a0=>(_Py_IsTrue=Module["_Py_IsTrue"]=wasmExports["Py_IsTrue"])(a0);var _Py_IsFalse=Module["_Py_IsFalse"]=a0=>(_Py_IsFalse=Module["_Py_IsFalse"]=wasmExports["Py_IsFalse"])(a0);var _calloc=Module["_calloc"]=(a0,a1)=>(_calloc=Module["_calloc"]=wasmExports["calloc"])(a0,a1);var _realloc=Module["_realloc"]=(a0,a1)=>(_realloc=Module["_realloc"]=wasmExports["realloc"])(a0,a1);var __PyMem_SetDefaultAllocator=Module["__PyMem_SetDefaultAllocator"]=(a0,a1)=>(__PyMem_SetDefaultAllocator=Module["__PyMem_SetDefaultAllocator"]=wasmExports["_PyMem_SetDefaultAllocator"])(a0,a1);var __PyMem_GetAllocatorName=Module["__PyMem_GetAllocatorName"]=(a0,a1)=>(__PyMem_GetAllocatorName=Module["__PyMem_GetAllocatorName"]=wasmExports["_PyMem_GetAllocatorName"])(a0,a1);var __PyMem_SetupAllocators=Module["__PyMem_SetupAllocators"]=a0=>(__PyMem_SetupAllocators=Module["__PyMem_SetupAllocators"]=wasmExports["_PyMem_SetupAllocators"])(a0);var __PyMem_GetCurrentAllocatorName=Module["__PyMem_GetCurrentAllocatorName"]=()=>(__PyMem_GetCurrentAllocatorName=Module["__PyMem_GetCurrentAllocatorName"]=wasmExports["_PyMem_GetCurrentAllocatorName"])();var _PyMem_SetupDebugHooks=Module["_PyMem_SetupDebugHooks"]=()=>(_PyMem_SetupDebugHooks=Module["_PyMem_SetupDebugHooks"]=wasmExports["PyMem_SetupDebugHooks"])();var _PyMem_GetAllocator=Module["_PyMem_GetAllocator"]=(a0,a1)=>(_PyMem_GetAllocator=Module["_PyMem_GetAllocator"]=wasmExports["PyMem_GetAllocator"])(a0,a1);var _PyMem_SetAllocator=Module["_PyMem_SetAllocator"]=(a0,a1)=>(_PyMem_SetAllocator=Module["_PyMem_SetAllocator"]=wasmExports["PyMem_SetAllocator"])(a0,a1);var _PyObject_SetArenaAllocator=Module["_PyObject_SetArenaAllocator"]=a0=>(_PyObject_SetArenaAllocator=Module["_PyObject_SetArenaAllocator"]=wasmExports["PyObject_SetArenaAllocator"])(a0);var _PyMem_RawCalloc=Module["_PyMem_RawCalloc"]=(a0,a1)=>(_PyMem_RawCalloc=Module["_PyMem_RawCalloc"]=wasmExports["PyMem_RawCalloc"])(a0,a1);var __PyMem_RawWcsdup=Module["__PyMem_RawWcsdup"]=a0=>(__PyMem_RawWcsdup=Module["__PyMem_RawWcsdup"]=wasmExports["_PyMem_RawWcsdup"])(a0);var _wcslen=Module["_wcslen"]=a0=>(_wcslen=Module["_wcslen"]=wasmExports["wcslen"])(a0);var __PyMem_RawStrdup=Module["__PyMem_RawStrdup"]=a0=>(__PyMem_RawStrdup=Module["__PyMem_RawStrdup"]=wasmExports["_PyMem_RawStrdup"])(a0);var __PyMem_Strdup=Module["__PyMem_Strdup"]=a0=>(__PyMem_Strdup=Module["__PyMem_Strdup"]=wasmExports["_PyMem_Strdup"])(a0);var _PyPickleBuffer_FromObject=Module["_PyPickleBuffer_FromObject"]=a0=>(_PyPickleBuffer_FromObject=Module["_PyPickleBuffer_FromObject"]=wasmExports["PyPickleBuffer_FromObject"])(a0);var _PyPickleBuffer_GetBuffer=Module["_PyPickleBuffer_GetBuffer"]=a0=>(_PyPickleBuffer_GetBuffer=Module["_PyPickleBuffer_GetBuffer"]=wasmExports["PyPickleBuffer_GetBuffer"])(a0);var _PyPickleBuffer_Release=Module["_PyPickleBuffer_Release"]=a0=>(_PyPickleBuffer_Release=Module["_PyPickleBuffer_Release"]=wasmExports["PyPickleBuffer_Release"])(a0);var __PySlice_GetLongIndices=Module["__PySlice_GetLongIndices"]=(a0,a1,a2,a3,a4)=>(__PySlice_GetLongIndices=Module["__PySlice_GetLongIndices"]=wasmExports["_PySlice_GetLongIndices"])(a0,a1,a2,a3,a4);var _PySet_Size=Module["_PySet_Size"]=a0=>(_PySet_Size=Module["_PySet_Size"]=wasmExports["PySet_Size"])(a0);var _PySet_Clear=Module["_PySet_Clear"]=a0=>(_PySet_Clear=Module["_PySet_Clear"]=wasmExports["PySet_Clear"])(a0);var _PySet_Pop=Module["_PySet_Pop"]=a0=>(_PySet_Pop=Module["_PySet_Pop"]=wasmExports["PySet_Pop"])(a0);var _PySlice_New=Module["_PySlice_New"]=(a0,a1,a2)=>(_PySlice_New=Module["_PySlice_New"]=wasmExports["PySlice_New"])(a0,a1,a2);var _PySlice_GetIndices=Module["_PySlice_GetIndices"]=(a0,a1,a2,a3,a4)=>(_PySlice_GetIndices=Module["_PySlice_GetIndices"]=wasmExports["PySlice_GetIndices"])(a0,a1,a2,a3,a4);var _PySlice_GetIndicesEx=Module["_PySlice_GetIndicesEx"]=(a0,a1,a2,a3,a4,a5)=>(_PySlice_GetIndicesEx=Module["_PySlice_GetIndicesEx"]=wasmExports["PySlice_GetIndicesEx"])(a0,a1,a2,a3,a4,a5);var _PyStructSequence_SetItem=Module["_PyStructSequence_SetItem"]=(a0,a1,a2)=>(_PyStructSequence_SetItem=Module["_PyStructSequence_SetItem"]=wasmExports["PyStructSequence_SetItem"])(a0,a1,a2);var _PyStructSequence_GetItem=Module["_PyStructSequence_GetItem"]=(a0,a1)=>(_PyStructSequence_GetItem=Module["_PyStructSequence_GetItem"]=wasmExports["PyStructSequence_GetItem"])(a0,a1);var _PyStructSequence_InitType2=Module["_PyStructSequence_InitType2"]=(a0,a1)=>(_PyStructSequence_InitType2=Module["_PyStructSequence_InitType2"]=wasmExports["PyStructSequence_InitType2"])(a0,a1);var _PyStructSequence_InitType=Module["_PyStructSequence_InitType"]=(a0,a1)=>(_PyStructSequence_InitType=Module["_PyStructSequence_InitType"]=wasmExports["PyStructSequence_InitType"])(a0,a1);var __PyStructSequence_NewType=Module["__PyStructSequence_NewType"]=(a0,a1)=>(__PyStructSequence_NewType=Module["__PyStructSequence_NewType"]=wasmExports["_PyStructSequence_NewType"])(a0,a1);var _PyStructSequence_NewType=Module["_PyStructSequence_NewType"]=a0=>(_PyStructSequence_NewType=Module["_PyStructSequence_NewType"]=wasmExports["PyStructSequence_NewType"])(a0);var _PyTuple_SetItem=Module["_PyTuple_SetItem"]=(a0,a1,a2)=>(_PyTuple_SetItem=Module["_PyTuple_SetItem"]=wasmExports["PyTuple_SetItem"])(a0,a1,a2);var __PyTuple_MaybeUntrack=Module["__PyTuple_MaybeUntrack"]=a0=>(__PyTuple_MaybeUntrack=Module["__PyTuple_MaybeUntrack"]=wasmExports["_PyTuple_MaybeUntrack"])(a0);var __PyObject_GC_Resize=Module["__PyObject_GC_Resize"]=(a0,a1)=>(__PyObject_GC_Resize=Module["__PyObject_GC_Resize"]=wasmExports["_PyObject_GC_Resize"])(a0,a1);var _PyType_GetDict=Module["_PyType_GetDict"]=a0=>(_PyType_GetDict=Module["_PyType_GetDict"]=wasmExports["PyType_GetDict"])(a0);var _strrchr=Module["_strrchr"]=(a0,a1)=>(_strrchr=Module["_strrchr"]=wasmExports["strrchr"])(a0,a1);var _PyType_ClearCache=Module["_PyType_ClearCache"]=()=>(_PyType_ClearCache=Module["_PyType_ClearCache"]=wasmExports["PyType_ClearCache"])();var _PyType_AddWatcher=Module["_PyType_AddWatcher"]=a0=>(_PyType_AddWatcher=Module["_PyType_AddWatcher"]=wasmExports["PyType_AddWatcher"])(a0);var _PyType_ClearWatcher=Module["_PyType_ClearWatcher"]=a0=>(_PyType_ClearWatcher=Module["_PyType_ClearWatcher"]=wasmExports["PyType_ClearWatcher"])(a0);var _PyType_Watch=Module["_PyType_Watch"]=(a0,a1)=>(_PyType_Watch=Module["_PyType_Watch"]=wasmExports["PyType_Watch"])(a0,a1);var _PyType_Unwatch=Module["_PyType_Unwatch"]=(a0,a1)=>(_PyType_Unwatch=Module["_PyType_Unwatch"]=wasmExports["PyType_Unwatch"])(a0,a1);var _PyType_Modified=Module["_PyType_Modified"]=a0=>(_PyType_Modified=Module["_PyType_Modified"]=wasmExports["PyType_Modified"])(a0);var _PyUnstable_Type_AssignVersionTag=Module["_PyUnstable_Type_AssignVersionTag"]=a0=>(_PyUnstable_Type_AssignVersionTag=Module["_PyUnstable_Type_AssignVersionTag"]=wasmExports["PyUnstable_Type_AssignVersionTag"])(a0);var __PyObject_LookupSpecialId=Module["__PyObject_LookupSpecialId"]=(a0,a1)=>(__PyObject_LookupSpecialId=Module["__PyObject_LookupSpecialId"]=wasmExports["_PyObject_LookupSpecialId"])(a0,a1);var _PyType_GetFlags=Module["_PyType_GetFlags"]=a0=>(_PyType_GetFlags=Module["_PyType_GetFlags"]=wasmExports["PyType_GetFlags"])(a0);var _PyType_SUPPORTS_WEAKREFS=Module["_PyType_SUPPORTS_WEAKREFS"]=a0=>(_PyType_SUPPORTS_WEAKREFS=Module["_PyType_SUPPORTS_WEAKREFS"]=wasmExports["PyType_SUPPORTS_WEAKREFS"])(a0);var __PyType_CalculateMetaclass=Module["__PyType_CalculateMetaclass"]=(a0,a1)=>(__PyType_CalculateMetaclass=Module["__PyType_CalculateMetaclass"]=wasmExports["_PyType_CalculateMetaclass"])(a0,a1);var _PyType_FromMetaclass=Module["_PyType_FromMetaclass"]=(a0,a1,a2,a3)=>(_PyType_FromMetaclass=Module["_PyType_FromMetaclass"]=wasmExports["PyType_FromMetaclass"])(a0,a1,a2,a3);var _PyType_FromModuleAndSpec=Module["_PyType_FromModuleAndSpec"]=(a0,a1,a2)=>(_PyType_FromModuleAndSpec=Module["_PyType_FromModuleAndSpec"]=wasmExports["PyType_FromModuleAndSpec"])(a0,a1,a2);var _PyType_FromSpec=Module["_PyType_FromSpec"]=a0=>(_PyType_FromSpec=Module["_PyType_FromSpec"]=wasmExports["PyType_FromSpec"])(a0);var _PyType_GetName=Module["_PyType_GetName"]=a0=>(_PyType_GetName=Module["_PyType_GetName"]=wasmExports["PyType_GetName"])(a0);var _PyType_GetSlot=Module["_PyType_GetSlot"]=(a0,a1)=>(_PyType_GetSlot=Module["_PyType_GetSlot"]=wasmExports["PyType_GetSlot"])(a0,a1);var _PyType_GetModule=Module["_PyType_GetModule"]=a0=>(_PyType_GetModule=Module["_PyType_GetModule"]=wasmExports["PyType_GetModule"])(a0);var _PyType_GetModuleState=Module["_PyType_GetModuleState"]=a0=>(_PyType_GetModuleState=Module["_PyType_GetModuleState"]=wasmExports["PyType_GetModuleState"])(a0);var _PyType_GetModuleByDef=Module["_PyType_GetModuleByDef"]=(a0,a1)=>(_PyType_GetModuleByDef=Module["_PyType_GetModuleByDef"]=wasmExports["PyType_GetModuleByDef"])(a0,a1);var _PyObject_GetTypeData=Module["_PyObject_GetTypeData"]=(a0,a1)=>(_PyObject_GetTypeData=Module["_PyObject_GetTypeData"]=wasmExports["PyObject_GetTypeData"])(a0,a1);var _PyType_GetTypeDataSize=Module["_PyType_GetTypeDataSize"]=a0=>(_PyType_GetTypeDataSize=Module["_PyType_GetTypeDataSize"]=wasmExports["PyType_GetTypeDataSize"])(a0);var _PyObject_GetItemData=Module["_PyObject_GetItemData"]=a0=>(_PyObject_GetItemData=Module["_PyObject_GetItemData"]=wasmExports["PyObject_GetItemData"])(a0);var __PyType_LookupId=Module["__PyType_LookupId"]=(a0,a1)=>(__PyType_LookupId=Module["__PyType_LookupId"]=wasmExports["_PyType_LookupId"])(a0,a1);var _PyArg_ParseTuple=Module["_PyArg_ParseTuple"]=(a0,a1,a2)=>(_PyArg_ParseTuple=Module["_PyArg_ParseTuple"]=wasmExports["PyArg_ParseTuple"])(a0,a1,a2);var _PyUnicode_IsIdentifier=Module["_PyUnicode_IsIdentifier"]=a0=>(_PyUnicode_IsIdentifier=Module["_PyUnicode_IsIdentifier"]=wasmExports["PyUnicode_IsIdentifier"])(a0);var _PyEval_GetGlobals=Module["_PyEval_GetGlobals"]=()=>(_PyEval_GetGlobals=Module["_PyEval_GetGlobals"]=wasmExports["PyEval_GetGlobals"])();var __PyWeakref_ClearRef=Module["__PyWeakref_ClearRef"]=a0=>(__PyWeakref_ClearRef=Module["__PyWeakref_ClearRef"]=wasmExports["_PyWeakref_ClearRef"])(a0);var _PyWeakref_NewRef=Module["_PyWeakref_NewRef"]=(a0,a1)=>(_PyWeakref_NewRef=Module["_PyWeakref_NewRef"]=wasmExports["PyWeakref_NewRef"])(a0,a1);var _PyImport_GetModule=Module["_PyImport_GetModule"]=a0=>(_PyImport_GetModule=Module["_PyImport_GetModule"]=wasmExports["PyImport_GetModule"])(a0);var _PyImport_Import=Module["_PyImport_Import"]=a0=>(_PyImport_Import=Module["_PyImport_Import"]=wasmExports["PyImport_Import"])(a0);var __PyArg_UnpackKeywordsWithVararg=Module["__PyArg_UnpackKeywordsWithVararg"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(__PyArg_UnpackKeywordsWithVararg=Module["__PyArg_UnpackKeywordsWithVararg"]=wasmExports["_PyArg_UnpackKeywordsWithVararg"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var __Py_hashtable_len=Module["__Py_hashtable_len"]=a0=>(__Py_hashtable_len=Module["__Py_hashtable_len"]=wasmExports["_Py_hashtable_len"])(a0);var __Py_GetErrorHandler=Module["__Py_GetErrorHandler"]=a0=>(__Py_GetErrorHandler=Module["__Py_GetErrorHandler"]=wasmExports["_Py_GetErrorHandler"])(a0);var __PyUnicode_FastCopyCharacters=Module["__PyUnicode_FastCopyCharacters"]=(a0,a1,a2,a3,a4)=>(__PyUnicode_FastCopyCharacters=Module["__PyUnicode_FastCopyCharacters"]=wasmExports["_PyUnicode_FastCopyCharacters"])(a0,a1,a2,a3,a4);var _PyUnicode_CopyCharacters=Module["_PyUnicode_CopyCharacters"]=(a0,a1,a2,a3,a4)=>(_PyUnicode_CopyCharacters=Module["_PyUnicode_CopyCharacters"]=wasmExports["PyUnicode_CopyCharacters"])(a0,a1,a2,a3,a4);var _PyUnicode_Resize=Module["_PyUnicode_Resize"]=(a0,a1)=>(_PyUnicode_Resize=Module["_PyUnicode_Resize"]=wasmExports["PyUnicode_Resize"])(a0,a1);var _PyUnicode_FromWideChar=Module["_PyUnicode_FromWideChar"]=(a0,a1)=>(_PyUnicode_FromWideChar=Module["_PyUnicode_FromWideChar"]=wasmExports["PyUnicode_FromWideChar"])(a0,a1);var _PyUnicode_FromKindAndData=Module["_PyUnicode_FromKindAndData"]=(a0,a1,a2)=>(_PyUnicode_FromKindAndData=Module["_PyUnicode_FromKindAndData"]=wasmExports["PyUnicode_FromKindAndData"])(a0,a1,a2);var __PyUnicode_FindMaxChar=Module["__PyUnicode_FindMaxChar"]=(a0,a1,a2)=>(__PyUnicode_FindMaxChar=Module["__PyUnicode_FindMaxChar"]=wasmExports["_PyUnicode_FindMaxChar"])(a0,a1,a2);var _PyUnicode_AsUCS4=Module["_PyUnicode_AsUCS4"]=(a0,a1,a2,a3)=>(_PyUnicode_AsUCS4=Module["_PyUnicode_AsUCS4"]=wasmExports["PyUnicode_AsUCS4"])(a0,a1,a2,a3);var _PyUnicode_AsUCS4Copy=Module["_PyUnicode_AsUCS4Copy"]=a0=>(_PyUnicode_AsUCS4Copy=Module["_PyUnicode_AsUCS4Copy"]=wasmExports["PyUnicode_AsUCS4Copy"])(a0);var _PyUnicode_Fill=Module["_PyUnicode_Fill"]=(a0,a1,a2,a3)=>(_PyUnicode_Fill=Module["_PyUnicode_Fill"]=wasmExports["PyUnicode_Fill"])(a0,a1,a2,a3);var _PyUnicode_AsWideChar=Module["_PyUnicode_AsWideChar"]=(a0,a1,a2)=>(_PyUnicode_AsWideChar=Module["_PyUnicode_AsWideChar"]=wasmExports["PyUnicode_AsWideChar"])(a0,a1,a2);var _PyUnicode_AsWideCharString=Module["_PyUnicode_AsWideCharString"]=(a0,a1)=>(_PyUnicode_AsWideCharString=Module["_PyUnicode_AsWideCharString"]=wasmExports["PyUnicode_AsWideCharString"])(a0,a1);var __PyUnicode_WideCharString_Converter=Module["__PyUnicode_WideCharString_Converter"]=(a0,a1)=>(__PyUnicode_WideCharString_Converter=Module["__PyUnicode_WideCharString_Converter"]=wasmExports["_PyUnicode_WideCharString_Converter"])(a0,a1);var __PyUnicode_WideCharString_Opt_Converter=Module["__PyUnicode_WideCharString_Opt_Converter"]=(a0,a1)=>(__PyUnicode_WideCharString_Opt_Converter=Module["__PyUnicode_WideCharString_Opt_Converter"]=wasmExports["_PyUnicode_WideCharString_Opt_Converter"])(a0,a1);var _PyUnicode_FromOrdinal=Module["_PyUnicode_FromOrdinal"]=a0=>(_PyUnicode_FromOrdinal=Module["_PyUnicode_FromOrdinal"]=wasmExports["PyUnicode_FromOrdinal"])(a0);var _PyUnicode_FromObject=Module["_PyUnicode_FromObject"]=a0=>(_PyUnicode_FromObject=Module["_PyUnicode_FromObject"]=wasmExports["PyUnicode_FromObject"])(a0);var __PyInterpreterState_GetConfig=Module["__PyInterpreterState_GetConfig"]=a0=>(__PyInterpreterState_GetConfig=Module["__PyInterpreterState_GetConfig"]=wasmExports["_PyInterpreterState_GetConfig"])(a0);var __PyCodec_Lookup=Module["__PyCodec_Lookup"]=a0=>(__PyCodec_Lookup=Module["__PyCodec_Lookup"]=wasmExports["_PyCodec_Lookup"])(a0);var _PyCodec_LookupError=Module["_PyCodec_LookupError"]=a0=>(_PyCodec_LookupError=Module["_PyCodec_LookupError"]=wasmExports["PyCodec_LookupError"])(a0);var _PyUnicode_DecodeUTF16Stateful=Module["_PyUnicode_DecodeUTF16Stateful"]=(a0,a1,a2,a3,a4)=>(_PyUnicode_DecodeUTF16Stateful=Module["_PyUnicode_DecodeUTF16Stateful"]=wasmExports["PyUnicode_DecodeUTF16Stateful"])(a0,a1,a2,a3,a4);var _PyUnicode_DecodeUTF32Stateful=Module["_PyUnicode_DecodeUTF32Stateful"]=(a0,a1,a2,a3,a4)=>(_PyUnicode_DecodeUTF32Stateful=Module["_PyUnicode_DecodeUTF32Stateful"]=wasmExports["PyUnicode_DecodeUTF32Stateful"])(a0,a1,a2,a3,a4);var __PyCodec_DecodeText=Module["__PyCodec_DecodeText"]=(a0,a1,a2)=>(__PyCodec_DecodeText=Module["__PyCodec_DecodeText"]=wasmExports["_PyCodec_DecodeText"])(a0,a1,a2);var _PyUnicode_DecodeUTF16=Module["_PyUnicode_DecodeUTF16"]=(a0,a1,a2,a3)=>(_PyUnicode_DecodeUTF16=Module["_PyUnicode_DecodeUTF16"]=wasmExports["PyUnicode_DecodeUTF16"])(a0,a1,a2,a3);var _PyUnicode_DecodeUTF32=Module["_PyUnicode_DecodeUTF32"]=(a0,a1,a2,a3)=>(_PyUnicode_DecodeUTF32=Module["_PyUnicode_DecodeUTF32"]=wasmExports["PyUnicode_DecodeUTF32"])(a0,a1,a2,a3);var _PyUnicode_AsDecodedObject=Module["_PyUnicode_AsDecodedObject"]=(a0,a1,a2)=>(_PyUnicode_AsDecodedObject=Module["_PyUnicode_AsDecodedObject"]=wasmExports["PyUnicode_AsDecodedObject"])(a0,a1,a2);var _PyCodec_Decode=Module["_PyCodec_Decode"]=(a0,a1,a2)=>(_PyCodec_Decode=Module["_PyCodec_Decode"]=wasmExports["PyCodec_Decode"])(a0,a1,a2);var _PyUnicode_AsDecodedUnicode=Module["_PyUnicode_AsDecodedUnicode"]=(a0,a1,a2)=>(_PyUnicode_AsDecodedUnicode=Module["_PyUnicode_AsDecodedUnicode"]=wasmExports["PyUnicode_AsDecodedUnicode"])(a0,a1,a2);var _PyUnicode_AsEncodedObject=Module["_PyUnicode_AsEncodedObject"]=(a0,a1,a2)=>(_PyUnicode_AsEncodedObject=Module["_PyUnicode_AsEncodedObject"]=wasmExports["PyUnicode_AsEncodedObject"])(a0,a1,a2);var _PyCodec_Encode=Module["_PyCodec_Encode"]=(a0,a1,a2)=>(_PyCodec_Encode=Module["_PyCodec_Encode"]=wasmExports["PyCodec_Encode"])(a0,a1,a2);var _PyUnicode_EncodeLocale=Module["_PyUnicode_EncodeLocale"]=(a0,a1)=>(_PyUnicode_EncodeLocale=Module["_PyUnicode_EncodeLocale"]=wasmExports["PyUnicode_EncodeLocale"])(a0,a1);var __Py_EncodeLocaleEx=Module["__Py_EncodeLocaleEx"]=(a0,a1,a2,a3,a4,a5)=>(__Py_EncodeLocaleEx=Module["__Py_EncodeLocaleEx"]=wasmExports["_Py_EncodeLocaleEx"])(a0,a1,a2,a3,a4,a5);var _PyCodec_StrictErrors=Module["_PyCodec_StrictErrors"]=a0=>(_PyCodec_StrictErrors=Module["_PyCodec_StrictErrors"]=wasmExports["PyCodec_StrictErrors"])(a0);var _PyUnicode_EncodeFSDefault=Module["_PyUnicode_EncodeFSDefault"]=a0=>(_PyUnicode_EncodeFSDefault=Module["_PyUnicode_EncodeFSDefault"]=wasmExports["PyUnicode_EncodeFSDefault"])(a0);var __PyUnicode_EncodeUTF16=Module["__PyUnicode_EncodeUTF16"]=(a0,a1,a2)=>(__PyUnicode_EncodeUTF16=Module["__PyUnicode_EncodeUTF16"]=wasmExports["_PyUnicode_EncodeUTF16"])(a0,a1,a2);var __PyUnicode_EncodeUTF32=Module["__PyUnicode_EncodeUTF32"]=(a0,a1,a2)=>(__PyUnicode_EncodeUTF32=Module["__PyUnicode_EncodeUTF32"]=wasmExports["_PyUnicode_EncodeUTF32"])(a0,a1,a2);var __PyCodec_EncodeText=Module["__PyCodec_EncodeText"]=(a0,a1,a2)=>(__PyCodec_EncodeText=Module["__PyCodec_EncodeText"]=wasmExports["_PyCodec_EncodeText"])(a0,a1,a2);var _wcscmp=Module["_wcscmp"]=(a0,a1)=>(_wcscmp=Module["_wcscmp"]=wasmExports["wcscmp"])(a0,a1);var __PyUnicode_AsLatin1String=Module["__PyUnicode_AsLatin1String"]=(a0,a1)=>(__PyUnicode_AsLatin1String=Module["__PyUnicode_AsLatin1String"]=wasmExports["_PyUnicode_AsLatin1String"])(a0,a1);var _PyUnicode_AsEncodedUnicode=Module["_PyUnicode_AsEncodedUnicode"]=(a0,a1,a2)=>(_PyUnicode_AsEncodedUnicode=Module["_PyUnicode_AsEncodedUnicode"]=wasmExports["PyUnicode_AsEncodedUnicode"])(a0,a1,a2);var _PyUnicode_DecodeLocaleAndSize=Module["_PyUnicode_DecodeLocaleAndSize"]=(a0,a1,a2)=>(_PyUnicode_DecodeLocaleAndSize=Module["_PyUnicode_DecodeLocaleAndSize"]=wasmExports["PyUnicode_DecodeLocaleAndSize"])(a0,a1,a2);var __Py_DecodeLocaleEx=Module["__Py_DecodeLocaleEx"]=(a0,a1,a2,a3,a4,a5)=>(__Py_DecodeLocaleEx=Module["__Py_DecodeLocaleEx"]=wasmExports["_Py_DecodeLocaleEx"])(a0,a1,a2,a3,a4,a5);var _PyUnicode_DecodeLocale=Module["_PyUnicode_DecodeLocale"]=(a0,a1)=>(_PyUnicode_DecodeLocale=Module["_PyUnicode_DecodeLocale"]=wasmExports["PyUnicode_DecodeLocale"])(a0,a1);var _PyUnicode_DecodeFSDefaultAndSize=Module["_PyUnicode_DecodeFSDefaultAndSize"]=(a0,a1)=>(_PyUnicode_DecodeFSDefaultAndSize=Module["_PyUnicode_DecodeFSDefaultAndSize"]=wasmExports["PyUnicode_DecodeFSDefaultAndSize"])(a0,a1);var _PyUnicode_FSConverter=Module["_PyUnicode_FSConverter"]=(a0,a1)=>(_PyUnicode_FSConverter=Module["_PyUnicode_FSConverter"]=wasmExports["PyUnicode_FSConverter"])(a0,a1);var _PyOS_FSPath=Module["_PyOS_FSPath"]=a0=>(_PyOS_FSPath=Module["_PyOS_FSPath"]=wasmExports["PyOS_FSPath"])(a0);var _PyUnicode_FSDecoder=Module["_PyUnicode_FSDecoder"]=(a0,a1)=>(_PyUnicode_FSDecoder=Module["_PyUnicode_FSDecoder"]=wasmExports["PyUnicode_FSDecoder"])(a0,a1);var _wmemchr=Module["_wmemchr"]=(a0,a1,a2)=>(_wmemchr=Module["_wmemchr"]=wasmExports["wmemchr"])(a0,a1,a2);var _PyUnicode_GetSize=Module["_PyUnicode_GetSize"]=a0=>(_PyUnicode_GetSize=Module["_PyUnicode_GetSize"]=wasmExports["PyUnicode_GetSize"])(a0);var _PyUnicode_WriteChar=Module["_PyUnicode_WriteChar"]=(a0,a1,a2)=>(_PyUnicode_WriteChar=Module["_PyUnicode_WriteChar"]=wasmExports["PyUnicode_WriteChar"])(a0,a1,a2);var _PyUnicode_DecodeUTF7=Module["_PyUnicode_DecodeUTF7"]=(a0,a1,a2)=>(_PyUnicode_DecodeUTF7=Module["_PyUnicode_DecodeUTF7"]=wasmExports["PyUnicode_DecodeUTF7"])(a0,a1,a2);var _PyUnicode_DecodeUTF7Stateful=Module["_PyUnicode_DecodeUTF7Stateful"]=(a0,a1,a2,a3)=>(_PyUnicode_DecodeUTF7Stateful=Module["_PyUnicode_DecodeUTF7Stateful"]=wasmExports["PyUnicode_DecodeUTF7Stateful"])(a0,a1,a2,a3);var __PyUnicode_EncodeUTF7=Module["__PyUnicode_EncodeUTF7"]=(a0,a1,a2,a3)=>(__PyUnicode_EncodeUTF7=Module["__PyUnicode_EncodeUTF7"]=wasmExports["_PyUnicode_EncodeUTF7"])(a0,a1,a2,a3);var __Py_DecodeUTF8Ex=Module["__Py_DecodeUTF8Ex"]=(a0,a1,a2,a3,a4,a5)=>(__Py_DecodeUTF8Ex=Module["__Py_DecodeUTF8Ex"]=wasmExports["_Py_DecodeUTF8Ex"])(a0,a1,a2,a3,a4,a5);var __Py_DecodeUTF8_surrogateescape=Module["__Py_DecodeUTF8_surrogateescape"]=(a0,a1,a2)=>(__Py_DecodeUTF8_surrogateescape=Module["__Py_DecodeUTF8_surrogateescape"]=wasmExports["_Py_DecodeUTF8_surrogateescape"])(a0,a1,a2);var __Py_EncodeUTF8Ex=Module["__Py_EncodeUTF8Ex"]=(a0,a1,a2,a3,a4,a5)=>(__Py_EncodeUTF8Ex=Module["__Py_EncodeUTF8Ex"]=wasmExports["_Py_EncodeUTF8Ex"])(a0,a1,a2,a3,a4,a5);var _PyUnicode_AsUTF32String=Module["_PyUnicode_AsUTF32String"]=a0=>(_PyUnicode_AsUTF32String=Module["_PyUnicode_AsUTF32String"]=wasmExports["PyUnicode_AsUTF32String"])(a0);var _PyUnicode_AsUTF16String=Module["_PyUnicode_AsUTF16String"]=a0=>(_PyUnicode_AsUTF16String=Module["_PyUnicode_AsUTF16String"]=wasmExports["PyUnicode_AsUTF16String"])(a0);var __PyUnicode_DecodeUnicodeEscapeStateful=Module["__PyUnicode_DecodeUnicodeEscapeStateful"]=(a0,a1,a2,a3)=>(__PyUnicode_DecodeUnicodeEscapeStateful=Module["__PyUnicode_DecodeUnicodeEscapeStateful"]=wasmExports["_PyUnicode_DecodeUnicodeEscapeStateful"])(a0,a1,a2,a3);var _PyUnicode_DecodeUnicodeEscape=Module["_PyUnicode_DecodeUnicodeEscape"]=(a0,a1,a2)=>(_PyUnicode_DecodeUnicodeEscape=Module["_PyUnicode_DecodeUnicodeEscape"]=wasmExports["PyUnicode_DecodeUnicodeEscape"])(a0,a1,a2);var _PyUnicode_AsUnicodeEscapeString=Module["_PyUnicode_AsUnicodeEscapeString"]=a0=>(_PyUnicode_AsUnicodeEscapeString=Module["_PyUnicode_AsUnicodeEscapeString"]=wasmExports["PyUnicode_AsUnicodeEscapeString"])(a0);var __PyUnicode_DecodeRawUnicodeEscapeStateful=Module["__PyUnicode_DecodeRawUnicodeEscapeStateful"]=(a0,a1,a2,a3)=>(__PyUnicode_DecodeRawUnicodeEscapeStateful=Module["__PyUnicode_DecodeRawUnicodeEscapeStateful"]=wasmExports["_PyUnicode_DecodeRawUnicodeEscapeStateful"])(a0,a1,a2,a3);var _PyUnicode_DecodeRawUnicodeEscape=Module["_PyUnicode_DecodeRawUnicodeEscape"]=(a0,a1,a2)=>(_PyUnicode_DecodeRawUnicodeEscape=Module["_PyUnicode_DecodeRawUnicodeEscape"]=wasmExports["PyUnicode_DecodeRawUnicodeEscape"])(a0,a1,a2);var _PyUnicode_AsRawUnicodeEscapeString=Module["_PyUnicode_AsRawUnicodeEscapeString"]=a0=>(_PyUnicode_AsRawUnicodeEscapeString=Module["_PyUnicode_AsRawUnicodeEscapeString"]=wasmExports["PyUnicode_AsRawUnicodeEscapeString"])(a0);var _PyUnicode_AsLatin1String=Module["_PyUnicode_AsLatin1String"]=a0=>(_PyUnicode_AsLatin1String=Module["_PyUnicode_AsLatin1String"]=wasmExports["PyUnicode_AsLatin1String"])(a0);var __PyUnicodeWriter_PrepareKindInternal=Module["__PyUnicodeWriter_PrepareKindInternal"]=(a0,a1)=>(__PyUnicodeWriter_PrepareKindInternal=Module["__PyUnicodeWriter_PrepareKindInternal"]=wasmExports["_PyUnicodeWriter_PrepareKindInternal"])(a0,a1);var _PyUnicode_DecodeCharmap=Module["_PyUnicode_DecodeCharmap"]=(a0,a1,a2,a3)=>(_PyUnicode_DecodeCharmap=Module["_PyUnicode_DecodeCharmap"]=wasmExports["PyUnicode_DecodeCharmap"])(a0,a1,a2,a3);var _PyUnicode_BuildEncodingMap=Module["_PyUnicode_BuildEncodingMap"]=a0=>(_PyUnicode_BuildEncodingMap=Module["_PyUnicode_BuildEncodingMap"]=wasmExports["PyUnicode_BuildEncodingMap"])(a0);var __PyUnicode_EncodeCharmap=Module["__PyUnicode_EncodeCharmap"]=(a0,a1,a2)=>(__PyUnicode_EncodeCharmap=Module["__PyUnicode_EncodeCharmap"]=wasmExports["_PyUnicode_EncodeCharmap"])(a0,a1,a2);var _PyUnicode_AsCharmapString=Module["_PyUnicode_AsCharmapString"]=(a0,a1)=>(_PyUnicode_AsCharmapString=Module["_PyUnicode_AsCharmapString"]=wasmExports["PyUnicode_AsCharmapString"])(a0,a1);var _PyUnicode_Translate=Module["_PyUnicode_Translate"]=(a0,a1,a2)=>(_PyUnicode_Translate=Module["_PyUnicode_Translate"]=wasmExports["PyUnicode_Translate"])(a0,a1,a2);var __PyUnicode_IsWhitespace=Module["__PyUnicode_IsWhitespace"]=a0=>(__PyUnicode_IsWhitespace=Module["__PyUnicode_IsWhitespace"]=wasmExports["_PyUnicode_IsWhitespace"])(a0);var __PyUnicode_ToDecimalDigit=Module["__PyUnicode_ToDecimalDigit"]=a0=>(__PyUnicode_ToDecimalDigit=Module["__PyUnicode_ToDecimalDigit"]=wasmExports["_PyUnicode_ToDecimalDigit"])(a0);var __PyUnicode_InsertThousandsGrouping=Module["__PyUnicode_InsertThousandsGrouping"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(__PyUnicode_InsertThousandsGrouping=Module["__PyUnicode_InsertThousandsGrouping"]=wasmExports["_PyUnicode_InsertThousandsGrouping"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _PyUnicode_Count=Module["_PyUnicode_Count"]=(a0,a1,a2,a3)=>(_PyUnicode_Count=Module["_PyUnicode_Count"]=wasmExports["PyUnicode_Count"])(a0,a1,a2,a3);var _PyUnicode_Find=Module["_PyUnicode_Find"]=(a0,a1,a2,a3,a4)=>(_PyUnicode_Find=Module["_PyUnicode_Find"]=wasmExports["PyUnicode_Find"])(a0,a1,a2,a3,a4);var _PyUnicode_FindChar=Module["_PyUnicode_FindChar"]=(a0,a1,a2,a3,a4)=>(_PyUnicode_FindChar=Module["_PyUnicode_FindChar"]=wasmExports["PyUnicode_FindChar"])(a0,a1,a2,a3,a4);var _PyUnicode_Tailmatch=Module["_PyUnicode_Tailmatch"]=(a0,a1,a2,a3,a4)=>(_PyUnicode_Tailmatch=Module["_PyUnicode_Tailmatch"]=wasmExports["PyUnicode_Tailmatch"])(a0,a1,a2,a3,a4);var __PyUnicode_JoinArray=Module["__PyUnicode_JoinArray"]=(a0,a1,a2)=>(__PyUnicode_JoinArray=Module["__PyUnicode_JoinArray"]=wasmExports["_PyUnicode_JoinArray"])(a0,a1,a2);var __PyUnicode_FastFill=Module["__PyUnicode_FastFill"]=(a0,a1,a2,a3)=>(__PyUnicode_FastFill=Module["__PyUnicode_FastFill"]=wasmExports["_PyUnicode_FastFill"])(a0,a1,a2,a3);var _PyUnicode_Splitlines=Module["_PyUnicode_Splitlines"]=(a0,a1)=>(_PyUnicode_Splitlines=Module["_PyUnicode_Splitlines"]=wasmExports["PyUnicode_Splitlines"])(a0,a1);var __PyUnicode_IsLinebreak=Module["__PyUnicode_IsLinebreak"]=a0=>(__PyUnicode_IsLinebreak=Module["__PyUnicode_IsLinebreak"]=wasmExports["_PyUnicode_IsLinebreak"])(a0);var _wmemcmp=Module["_wmemcmp"]=(a0,a1,a2)=>(_wmemcmp=Module["_wmemcmp"]=wasmExports["wmemcmp"])(a0,a1,a2);var __PyUnicode_EqualToASCIIId=Module["__PyUnicode_EqualToASCIIId"]=(a0,a1)=>(__PyUnicode_EqualToASCIIId=Module["__PyUnicode_EqualToASCIIId"]=wasmExports["_PyUnicode_EqualToASCIIId"])(a0,a1);var _PyUnicode_RichCompare=Module["_PyUnicode_RichCompare"]=(a0,a1,a2)=>(_PyUnicode_RichCompare=Module["_PyUnicode_RichCompare"]=wasmExports["PyUnicode_RichCompare"])(a0,a1,a2);var _PyUnicode_Contains=Module["_PyUnicode_Contains"]=(a0,a1)=>(_PyUnicode_Contains=Module["_PyUnicode_Contains"]=wasmExports["PyUnicode_Contains"])(a0,a1);var _PyUnicode_Concat=Module["_PyUnicode_Concat"]=(a0,a1)=>(_PyUnicode_Concat=Module["_PyUnicode_Concat"]=wasmExports["PyUnicode_Concat"])(a0,a1);var _PyUnicode_Append=Module["_PyUnicode_Append"]=(a0,a1)=>(_PyUnicode_Append=Module["_PyUnicode_Append"]=wasmExports["PyUnicode_Append"])(a0,a1);var _PyUnicode_AppendAndDel=Module["_PyUnicode_AppendAndDel"]=(a0,a1)=>(_PyUnicode_AppendAndDel=Module["_PyUnicode_AppendAndDel"]=wasmExports["PyUnicode_AppendAndDel"])(a0,a1);var __PyUnicode_IsXidStart=Module["__PyUnicode_IsXidStart"]=a0=>(__PyUnicode_IsXidStart=Module["__PyUnicode_IsXidStart"]=wasmExports["_PyUnicode_IsXidStart"])(a0);var __PyUnicode_IsXidContinue=Module["__PyUnicode_IsXidContinue"]=a0=>(__PyUnicode_IsXidContinue=Module["__PyUnicode_IsXidContinue"]=wasmExports["_PyUnicode_IsXidContinue"])(a0);var __PyUnicode_XStrip=Module["__PyUnicode_XStrip"]=(a0,a1,a2)=>(__PyUnicode_XStrip=Module["__PyUnicode_XStrip"]=wasmExports["_PyUnicode_XStrip"])(a0,a1,a2);var _PyUnicode_Replace=Module["_PyUnicode_Replace"]=(a0,a1,a2,a3)=>(_PyUnicode_Replace=Module["_PyUnicode_Replace"]=wasmExports["PyUnicode_Replace"])(a0,a1,a2,a3);var _PyUnicode_Split=Module["_PyUnicode_Split"]=(a0,a1,a2)=>(_PyUnicode_Split=Module["_PyUnicode_Split"]=wasmExports["PyUnicode_Split"])(a0,a1,a2);var _PyUnicode_Partition=Module["_PyUnicode_Partition"]=(a0,a1)=>(_PyUnicode_Partition=Module["_PyUnicode_Partition"]=wasmExports["PyUnicode_Partition"])(a0,a1);var _PyUnicode_RPartition=Module["_PyUnicode_RPartition"]=(a0,a1)=>(_PyUnicode_RPartition=Module["_PyUnicode_RPartition"]=wasmExports["PyUnicode_RPartition"])(a0,a1);var _PyUnicode_RSplit=Module["_PyUnicode_RSplit"]=(a0,a1,a2)=>(_PyUnicode_RSplit=Module["_PyUnicode_RSplit"]=wasmExports["PyUnicode_RSplit"])(a0,a1,a2);var __PyUnicodeWriter_WriteSubstring=Module["__PyUnicodeWriter_WriteSubstring"]=(a0,a1,a2,a3)=>(__PyUnicodeWriter_WriteSubstring=Module["__PyUnicodeWriter_WriteSubstring"]=wasmExports["_PyUnicodeWriter_WriteSubstring"])(a0,a1,a2,a3);var __PyUnicodeWriter_WriteLatin1String=Module["__PyUnicodeWriter_WriteLatin1String"]=(a0,a1,a2)=>(__PyUnicodeWriter_WriteLatin1String=Module["__PyUnicodeWriter_WriteLatin1String"]=wasmExports["_PyUnicodeWriter_WriteLatin1String"])(a0,a1,a2);var _PyUnicode_Format=Module["_PyUnicode_Format"]=(a0,a1)=>(_PyUnicode_Format=Module["_PyUnicode_Format"]=wasmExports["PyUnicode_Format"])(a0,a1);var __Py_hashtable_new_full=Module["__Py_hashtable_new_full"]=(a0,a1,a2,a3,a4)=>(__Py_hashtable_new_full=Module["__Py_hashtable_new_full"]=wasmExports["_Py_hashtable_new_full"])(a0,a1,a2,a3,a4);var __Py_hashtable_get=Module["__Py_hashtable_get"]=(a0,a1)=>(__Py_hashtable_get=Module["__Py_hashtable_get"]=wasmExports["_Py_hashtable_get"])(a0,a1);var __Py_hashtable_set=Module["__Py_hashtable_set"]=(a0,a1,a2)=>(__Py_hashtable_set=Module["__Py_hashtable_set"]=wasmExports["_Py_hashtable_set"])(a0,a1,a2);var __PyUnicode_InternInPlace=Module["__PyUnicode_InternInPlace"]=(a0,a1)=>(__PyUnicode_InternInPlace=Module["__PyUnicode_InternInPlace"]=wasmExports["_PyUnicode_InternInPlace"])(a0,a1);var _PyUnicode_InternInPlace=Module["_PyUnicode_InternInPlace"]=a0=>(_PyUnicode_InternInPlace=Module["_PyUnicode_InternInPlace"]=wasmExports["PyUnicode_InternInPlace"])(a0);var _PyUnicode_InternImmortal=Module["_PyUnicode_InternImmortal"]=a0=>(_PyUnicode_InternImmortal=Module["_PyUnicode_InternImmortal"]=wasmExports["PyUnicode_InternImmortal"])(a0);var __Py_hashtable_destroy=Module["__Py_hashtable_destroy"]=a0=>(__Py_hashtable_destroy=Module["__Py_hashtable_destroy"]=wasmExports["_Py_hashtable_destroy"])(a0);var _PyInit__string=Module["_PyInit__string"]=()=>(_PyInit__string=Module["_PyInit__string"]=wasmExports["PyInit__string"])();var __PyUnicode_IsLowercase=Module["__PyUnicode_IsLowercase"]=a0=>(__PyUnicode_IsLowercase=Module["__PyUnicode_IsLowercase"]=wasmExports["_PyUnicode_IsLowercase"])(a0);var __PyUnicode_IsUppercase=Module["__PyUnicode_IsUppercase"]=a0=>(__PyUnicode_IsUppercase=Module["__PyUnicode_IsUppercase"]=wasmExports["_PyUnicode_IsUppercase"])(a0);var __PyUnicode_IsTitlecase=Module["__PyUnicode_IsTitlecase"]=a0=>(__PyUnicode_IsTitlecase=Module["__PyUnicode_IsTitlecase"]=wasmExports["_PyUnicode_IsTitlecase"])(a0);var __PyUnicode_IsDecimalDigit=Module["__PyUnicode_IsDecimalDigit"]=a0=>(__PyUnicode_IsDecimalDigit=Module["__PyUnicode_IsDecimalDigit"]=wasmExports["_PyUnicode_IsDecimalDigit"])(a0);var __PyUnicode_IsDigit=Module["__PyUnicode_IsDigit"]=a0=>(__PyUnicode_IsDigit=Module["__PyUnicode_IsDigit"]=wasmExports["_PyUnicode_IsDigit"])(a0);var __PyUnicode_IsNumeric=Module["__PyUnicode_IsNumeric"]=a0=>(__PyUnicode_IsNumeric=Module["__PyUnicode_IsNumeric"]=wasmExports["_PyUnicode_IsNumeric"])(a0);var __PyUnicode_IsAlpha=Module["__PyUnicode_IsAlpha"]=a0=>(__PyUnicode_IsAlpha=Module["__PyUnicode_IsAlpha"]=wasmExports["_PyUnicode_IsAlpha"])(a0);var __PyUnicode_FormatAdvancedWriter=Module["__PyUnicode_FormatAdvancedWriter"]=(a0,a1,a2,a3,a4)=>(__PyUnicode_FormatAdvancedWriter=Module["__PyUnicode_FormatAdvancedWriter"]=wasmExports["_PyUnicode_FormatAdvancedWriter"])(a0,a1,a2,a3,a4);var __PyUnicode_ToTitleFull=Module["__PyUnicode_ToTitleFull"]=(a0,a1)=>(__PyUnicode_ToTitleFull=Module["__PyUnicode_ToTitleFull"]=wasmExports["_PyUnicode_ToTitleFull"])(a0,a1);var __PyUnicode_IsCaseIgnorable=Module["__PyUnicode_IsCaseIgnorable"]=a0=>(__PyUnicode_IsCaseIgnorable=Module["__PyUnicode_IsCaseIgnorable"]=wasmExports["_PyUnicode_IsCaseIgnorable"])(a0);var __PyUnicode_IsCased=Module["__PyUnicode_IsCased"]=a0=>(__PyUnicode_IsCased=Module["__PyUnicode_IsCased"]=wasmExports["_PyUnicode_IsCased"])(a0);var __PyUnicode_ToLowerFull=Module["__PyUnicode_ToLowerFull"]=(a0,a1)=>(__PyUnicode_ToLowerFull=Module["__PyUnicode_ToLowerFull"]=wasmExports["_PyUnicode_ToLowerFull"])(a0,a1);var __PyUnicode_ToFoldedFull=Module["__PyUnicode_ToFoldedFull"]=(a0,a1)=>(__PyUnicode_ToFoldedFull=Module["__PyUnicode_ToFoldedFull"]=wasmExports["_PyUnicode_ToFoldedFull"])(a0,a1);var __PyUnicode_ToUpperFull=Module["__PyUnicode_ToUpperFull"]=(a0,a1)=>(__PyUnicode_ToUpperFull=Module["__PyUnicode_ToUpperFull"]=wasmExports["_PyUnicode_ToUpperFull"])(a0,a1);var __PyUnicode_ToNumeric=Module["__PyUnicode_ToNumeric"]=a0=>(__PyUnicode_ToNumeric=Module["__PyUnicode_ToNumeric"]=wasmExports["_PyUnicode_ToNumeric"])(a0);var __PyUnicode_ToTitlecase=Module["__PyUnicode_ToTitlecase"]=a0=>(__PyUnicode_ToTitlecase=Module["__PyUnicode_ToTitlecase"]=wasmExports["_PyUnicode_ToTitlecase"])(a0);var __PyUnicode_ToDigit=Module["__PyUnicode_ToDigit"]=a0=>(__PyUnicode_ToDigit=Module["__PyUnicode_ToDigit"]=wasmExports["_PyUnicode_ToDigit"])(a0);var __PyUnicode_ToUppercase=Module["__PyUnicode_ToUppercase"]=a0=>(__PyUnicode_ToUppercase=Module["__PyUnicode_ToUppercase"]=wasmExports["_PyUnicode_ToUppercase"])(a0);var __PyUnicode_ToLowercase=Module["__PyUnicode_ToLowercase"]=a0=>(__PyUnicode_ToLowercase=Module["__PyUnicode_ToLowercase"]=wasmExports["_PyUnicode_ToLowercase"])(a0);var __PyWeakref_GetWeakrefCount=Module["__PyWeakref_GetWeakrefCount"]=a0=>(__PyWeakref_GetWeakrefCount=Module["__PyWeakref_GetWeakrefCount"]=wasmExports["_PyWeakref_GetWeakrefCount"])(a0);var _PyWeakref_NewProxy=Module["_PyWeakref_NewProxy"]=(a0,a1)=>(_PyWeakref_NewProxy=Module["_PyWeakref_NewProxy"]=wasmExports["PyWeakref_NewProxy"])(a0,a1);var _PyWeakref_GetObject=Module["_PyWeakref_GetObject"]=a0=>(_PyWeakref_GetObject=Module["_PyWeakref_GetObject"]=wasmExports["PyWeakref_GetObject"])(a0);var _PyErr_ResourceWarning=Module["_PyErr_ResourceWarning"]=(a0,a1,a2,a3)=>(_PyErr_ResourceWarning=Module["_PyErr_ResourceWarning"]=wasmExports["PyErr_ResourceWarning"])(a0,a1,a2,a3);var _PyErr_WarnExplicit=Module["_PyErr_WarnExplicit"]=(a0,a1,a2,a3,a4,a5)=>(_PyErr_WarnExplicit=Module["_PyErr_WarnExplicit"]=wasmExports["PyErr_WarnExplicit"])(a0,a1,a2,a3,a4,a5);var _PyErr_WarnExplicitFormat=Module["_PyErr_WarnExplicitFormat"]=(a0,a1,a2,a3,a4,a5,a6)=>(_PyErr_WarnExplicitFormat=Module["_PyErr_WarnExplicitFormat"]=wasmExports["PyErr_WarnExplicitFormat"])(a0,a1,a2,a3,a4,a5,a6);var __Py_IsInterpreterFinalizing=Module["__Py_IsInterpreterFinalizing"]=a0=>(__Py_IsInterpreterFinalizing=Module["__Py_IsInterpreterFinalizing"]=wasmExports["_Py_IsInterpreterFinalizing"])(a0);var __PyWarnings_Init=Module["__PyWarnings_Init"]=()=>(__PyWarnings_Init=Module["__PyWarnings_Init"]=wasmExports["_PyWarnings_Init"])();var _PyThreadState_GetFrame=Module["_PyThreadState_GetFrame"]=a0=>(_PyThreadState_GetFrame=Module["_PyThreadState_GetFrame"]=wasmExports["PyThreadState_GetFrame"])(a0);var __PySys_GetAttr=Module["__PySys_GetAttr"]=(a0,a1)=>(__PySys_GetAttr=Module["__PySys_GetAttr"]=wasmExports["_PySys_GetAttr"])(a0,a1);var __Py_DisplaySourceLine=Module["__Py_DisplaySourceLine"]=(a0,a1,a2,a3,a4,a5)=>(__Py_DisplaySourceLine=Module["__Py_DisplaySourceLine"]=wasmExports["_Py_DisplaySourceLine"])(a0,a1,a2,a3,a4,a5);var _PyModule_AddObjectRef=Module["_PyModule_AddObjectRef"]=(a0,a1,a2)=>(_PyModule_AddObjectRef=Module["_PyModule_AddObjectRef"]=wasmExports["PyModule_AddObjectRef"])(a0,a1,a2);var _PyInit__ast=Module["_PyInit__ast"]=()=>(_PyInit__ast=Module["_PyInit__ast"]=wasmExports["PyInit__ast"])();var _PyModule_AddIntConstant=Module["_PyModule_AddIntConstant"]=(a0,a1,a2)=>(_PyModule_AddIntConstant=Module["_PyModule_AddIntConstant"]=wasmExports["PyModule_AddIntConstant"])(a0,a1,a2);var _PyInit__tokenize=Module["_PyInit__tokenize"]=()=>(_PyInit__tokenize=Module["_PyInit__tokenize"]=wasmExports["PyInit__tokenize"])();var _PyModule_AddType=Module["_PyModule_AddType"]=(a0,a1)=>(_PyModule_AddType=Module["_PyModule_AddType"]=wasmExports["PyModule_AddType"])(a0,a1);var _PyErr_SyntaxLocationObject=Module["_PyErr_SyntaxLocationObject"]=(a0,a1,a2)=>(_PyErr_SyntaxLocationObject=Module["_PyErr_SyntaxLocationObject"]=wasmExports["PyErr_SyntaxLocationObject"])(a0,a1,a2);var _snprintf=Module["_snprintf"]=(a0,a1,a2,a3)=>(_snprintf=Module["_snprintf"]=wasmExports["snprintf"])(a0,a1,a2,a3);var _PyImport_ImportModuleLevelObject=Module["_PyImport_ImportModuleLevelObject"]=(a0,a1,a2,a3,a4)=>(_PyImport_ImportModuleLevelObject=Module["_PyImport_ImportModuleLevelObject"]=wasmExports["PyImport_ImportModuleLevelObject"])(a0,a1,a2,a3,a4);var _PyEval_MergeCompilerFlags=Module["_PyEval_MergeCompilerFlags"]=a0=>(_PyEval_MergeCompilerFlags=Module["_PyEval_MergeCompilerFlags"]=wasmExports["PyEval_MergeCompilerFlags"])(a0);var __PyArena_New=Module["__PyArena_New"]=()=>(__PyArena_New=Module["__PyArena_New"]=wasmExports["_PyArena_New"])();var __PyArena_Free=Module["__PyArena_Free"]=a0=>(__PyArena_Free=Module["__PyArena_Free"]=wasmExports["_PyArena_Free"])(a0);var __PyAST_Compile=Module["__PyAST_Compile"]=(a0,a1,a2,a3,a4)=>(__PyAST_Compile=Module["__PyAST_Compile"]=wasmExports["_PyAST_Compile"])(a0,a1,a2,a3,a4);var __Py_SourceAsString=Module["__Py_SourceAsString"]=(a0,a1,a2,a3,a4)=>(__Py_SourceAsString=Module["__Py_SourceAsString"]=wasmExports["_Py_SourceAsString"])(a0,a1,a2,a3,a4);var _Py_CompileStringObject=Module["_Py_CompileStringObject"]=(a0,a1,a2,a3,a4)=>(_Py_CompileStringObject=Module["_Py_CompileStringObject"]=wasmExports["Py_CompileStringObject"])(a0,a1,a2,a3,a4);var _PyEval_GetBuiltins=Module["_PyEval_GetBuiltins"]=()=>(_PyEval_GetBuiltins=Module["_PyEval_GetBuiltins"]=wasmExports["PyEval_GetBuiltins"])();var _PyEval_EvalCode=Module["_PyEval_EvalCode"]=(a0,a1,a2)=>(_PyEval_EvalCode=Module["_PyEval_EvalCode"]=wasmExports["PyEval_EvalCode"])(a0,a1,a2);var _PyRun_StringFlags=Module["_PyRun_StringFlags"]=(a0,a1,a2,a3,a4)=>(_PyRun_StringFlags=Module["_PyRun_StringFlags"]=wasmExports["PyRun_StringFlags"])(a0,a1,a2,a3,a4);var _PyEval_EvalCodeEx=Module["_PyEval_EvalCodeEx"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_PyEval_EvalCodeEx=Module["_PyEval_EvalCodeEx"]=wasmExports["PyEval_EvalCodeEx"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _Py_GetRecursionLimit=Module["_Py_GetRecursionLimit"]=()=>(_Py_GetRecursionLimit=Module["_Py_GetRecursionLimit"]=wasmExports["Py_GetRecursionLimit"])();var _Py_SetRecursionLimit=Module["_Py_SetRecursionLimit"]=a0=>(_Py_SetRecursionLimit=Module["_Py_SetRecursionLimit"]=wasmExports["Py_SetRecursionLimit"])(a0);var _PyEval_EvalFrame=Module["_PyEval_EvalFrame"]=a0=>(_PyEval_EvalFrame=Module["_PyEval_EvalFrame"]=wasmExports["PyEval_EvalFrame"])(a0);var _PyEval_EvalFrameEx=Module["_PyEval_EvalFrameEx"]=(a0,a1)=>(_PyEval_EvalFrameEx=Module["_PyEval_EvalFrameEx"]=wasmExports["PyEval_EvalFrameEx"])(a0,a1);var _PyTraceBack_Here=Module["_PyTraceBack_Here"]=a0=>(_PyTraceBack_Here=Module["_PyTraceBack_Here"]=wasmExports["PyTraceBack_Here"])(a0);var _PyErr_SetHandledException=Module["_PyErr_SetHandledException"]=a0=>(_PyErr_SetHandledException=Module["_PyErr_SetHandledException"]=wasmExports["PyErr_SetHandledException"])(a0);var __PyErr_GetTopmostException=Module["__PyErr_GetTopmostException"]=a0=>(__PyErr_GetTopmostException=Module["__PyErr_GetTopmostException"]=wasmExports["_PyErr_GetTopmostException"])(a0);var __PyErr_SetObject=Module["__PyErr_SetObject"]=(a0,a1,a2)=>(__PyErr_SetObject=Module["__PyErr_SetObject"]=wasmExports["_PyErr_SetObject"])(a0,a1,a2);var _PyThreadState_EnterTracing=Module["_PyThreadState_EnterTracing"]=a0=>(_PyThreadState_EnterTracing=Module["_PyThreadState_EnterTracing"]=wasmExports["PyThreadState_EnterTracing"])(a0);var _PyThreadState_LeaveTracing=Module["_PyThreadState_LeaveTracing"]=a0=>(_PyThreadState_LeaveTracing=Module["_PyThreadState_LeaveTracing"]=wasmExports["PyThreadState_LeaveTracing"])(a0);var _PyEval_SetProfile=Module["_PyEval_SetProfile"]=(a0,a1)=>(_PyEval_SetProfile=Module["_PyEval_SetProfile"]=wasmExports["PyEval_SetProfile"])(a0,a1);var __PyEval_SetProfile=Module["__PyEval_SetProfile"]=(a0,a1,a2)=>(__PyEval_SetProfile=Module["__PyEval_SetProfile"]=wasmExports["_PyEval_SetProfile"])(a0,a1,a2);var __PyErr_WriteUnraisableMsg=Module["__PyErr_WriteUnraisableMsg"]=(a0,a1)=>(__PyErr_WriteUnraisableMsg=Module["__PyErr_WriteUnraisableMsg"]=wasmExports["_PyErr_WriteUnraisableMsg"])(a0,a1);var _PyEval_SetProfileAllThreads=Module["_PyEval_SetProfileAllThreads"]=(a0,a1)=>(_PyEval_SetProfileAllThreads=Module["_PyEval_SetProfileAllThreads"]=wasmExports["PyEval_SetProfileAllThreads"])(a0,a1);var _PyInterpreterState_ThreadHead=Module["_PyInterpreterState_ThreadHead"]=a0=>(_PyInterpreterState_ThreadHead=Module["_PyInterpreterState_ThreadHead"]=wasmExports["PyInterpreterState_ThreadHead"])(a0);var _PyThreadState_Next=Module["_PyThreadState_Next"]=a0=>(_PyThreadState_Next=Module["_PyThreadState_Next"]=wasmExports["PyThreadState_Next"])(a0);var _PyEval_SetTrace=Module["_PyEval_SetTrace"]=(a0,a1)=>(_PyEval_SetTrace=Module["_PyEval_SetTrace"]=wasmExports["PyEval_SetTrace"])(a0,a1);var __PyEval_SetTrace=Module["__PyEval_SetTrace"]=(a0,a1,a2)=>(__PyEval_SetTrace=Module["__PyEval_SetTrace"]=wasmExports["_PyEval_SetTrace"])(a0,a1,a2);var _PyEval_SetTraceAllThreads=Module["_PyEval_SetTraceAllThreads"]=(a0,a1)=>(_PyEval_SetTraceAllThreads=Module["_PyEval_SetTraceAllThreads"]=wasmExports["PyEval_SetTraceAllThreads"])(a0,a1);var _PyEval_GetFrame=Module["_PyEval_GetFrame"]=()=>(_PyEval_GetFrame=Module["_PyEval_GetFrame"]=wasmExports["PyEval_GetFrame"])();var __PyEval_GetBuiltinId=Module["__PyEval_GetBuiltinId"]=a0=>(__PyEval_GetBuiltinId=Module["__PyEval_GetBuiltinId"]=wasmExports["_PyEval_GetBuiltinId"])(a0);var _PyEval_GetLocals=Module["_PyEval_GetLocals"]=()=>(_PyEval_GetLocals=Module["_PyEval_GetLocals"]=wasmExports["PyEval_GetLocals"])();var _PyEval_GetFuncName=Module["_PyEval_GetFuncName"]=a0=>(_PyEval_GetFuncName=Module["_PyEval_GetFuncName"]=wasmExports["PyEval_GetFuncName"])(a0);var _PyEval_GetFuncDesc=Module["_PyEval_GetFuncDesc"]=a0=>(_PyEval_GetFuncDesc=Module["_PyEval_GetFuncDesc"]=wasmExports["PyEval_GetFuncDesc"])(a0);var _PyUnstable_Eval_RequestCodeExtraIndex=Module["_PyUnstable_Eval_RequestCodeExtraIndex"]=a0=>(_PyUnstable_Eval_RequestCodeExtraIndex=Module["_PyUnstable_Eval_RequestCodeExtraIndex"]=wasmExports["PyUnstable_Eval_RequestCodeExtraIndex"])(a0);var _PyCodec_Register=Module["_PyCodec_Register"]=a0=>(_PyCodec_Register=Module["_PyCodec_Register"]=wasmExports["PyCodec_Register"])(a0);var _PyCodec_Unregister=Module["_PyCodec_Unregister"]=a0=>(_PyCodec_Unregister=Module["_PyCodec_Unregister"]=wasmExports["PyCodec_Unregister"])(a0);var _PyCodec_KnownEncoding=Module["_PyCodec_KnownEncoding"]=a0=>(_PyCodec_KnownEncoding=Module["_PyCodec_KnownEncoding"]=wasmExports["PyCodec_KnownEncoding"])(a0);var __PyCodecInfo_GetIncrementalDecoder=Module["__PyCodecInfo_GetIncrementalDecoder"]=(a0,a1)=>(__PyCodecInfo_GetIncrementalDecoder=Module["__PyCodecInfo_GetIncrementalDecoder"]=wasmExports["_PyCodecInfo_GetIncrementalDecoder"])(a0,a1);var __PyCodecInfo_GetIncrementalEncoder=Module["__PyCodecInfo_GetIncrementalEncoder"]=(a0,a1)=>(__PyCodecInfo_GetIncrementalEncoder=Module["__PyCodecInfo_GetIncrementalEncoder"]=wasmExports["_PyCodecInfo_GetIncrementalEncoder"])(a0,a1);var _PyCodec_Encoder=Module["_PyCodec_Encoder"]=a0=>(_PyCodec_Encoder=Module["_PyCodec_Encoder"]=wasmExports["PyCodec_Encoder"])(a0);var _PyCodec_Decoder=Module["_PyCodec_Decoder"]=a0=>(_PyCodec_Decoder=Module["_PyCodec_Decoder"]=wasmExports["PyCodec_Decoder"])(a0);var _PyCodec_IncrementalEncoder=Module["_PyCodec_IncrementalEncoder"]=(a0,a1)=>(_PyCodec_IncrementalEncoder=Module["_PyCodec_IncrementalEncoder"]=wasmExports["PyCodec_IncrementalEncoder"])(a0,a1);var _PyCodec_IncrementalDecoder=Module["_PyCodec_IncrementalDecoder"]=(a0,a1)=>(_PyCodec_IncrementalDecoder=Module["_PyCodec_IncrementalDecoder"]=wasmExports["PyCodec_IncrementalDecoder"])(a0,a1);var _PyCodec_StreamReader=Module["_PyCodec_StreamReader"]=(a0,a1,a2)=>(_PyCodec_StreamReader=Module["_PyCodec_StreamReader"]=wasmExports["PyCodec_StreamReader"])(a0,a1,a2);var _PyCodec_StreamWriter=Module["_PyCodec_StreamWriter"]=(a0,a1,a2)=>(_PyCodec_StreamWriter=Module["_PyCodec_StreamWriter"]=wasmExports["PyCodec_StreamWriter"])(a0,a1,a2);var __PyCodec_LookupTextEncoding=Module["__PyCodec_LookupTextEncoding"]=(a0,a1)=>(__PyCodec_LookupTextEncoding=Module["__PyCodec_LookupTextEncoding"]=wasmExports["_PyCodec_LookupTextEncoding"])(a0,a1);var _PyCodec_RegisterError=Module["_PyCodec_RegisterError"]=(a0,a1)=>(_PyCodec_RegisterError=Module["_PyCodec_RegisterError"]=wasmExports["PyCodec_RegisterError"])(a0,a1);var _PyCodec_IgnoreErrors=Module["_PyCodec_IgnoreErrors"]=a0=>(_PyCodec_IgnoreErrors=Module["_PyCodec_IgnoreErrors"]=wasmExports["PyCodec_IgnoreErrors"])(a0);var _PyCodec_ReplaceErrors=Module["_PyCodec_ReplaceErrors"]=a0=>(_PyCodec_ReplaceErrors=Module["_PyCodec_ReplaceErrors"]=wasmExports["PyCodec_ReplaceErrors"])(a0);var _PyCodec_XMLCharRefReplaceErrors=Module["_PyCodec_XMLCharRefReplaceErrors"]=a0=>(_PyCodec_XMLCharRefReplaceErrors=Module["_PyCodec_XMLCharRefReplaceErrors"]=wasmExports["PyCodec_XMLCharRefReplaceErrors"])(a0);var _PyCodec_BackslashReplaceErrors=Module["_PyCodec_BackslashReplaceErrors"]=a0=>(_PyCodec_BackslashReplaceErrors=Module["_PyCodec_BackslashReplaceErrors"]=wasmExports["PyCodec_BackslashReplaceErrors"])(a0);var _PyCodec_NameReplaceErrors=Module["_PyCodec_NameReplaceErrors"]=a0=>(_PyCodec_NameReplaceErrors=Module["_PyCodec_NameReplaceErrors"]=wasmExports["PyCodec_NameReplaceErrors"])(a0);var _PyCompile_OpcodeStackEffectWithJump=Module["_PyCompile_OpcodeStackEffectWithJump"]=(a0,a1,a2)=>(_PyCompile_OpcodeStackEffectWithJump=Module["_PyCompile_OpcodeStackEffectWithJump"]=wasmExports["PyCompile_OpcodeStackEffectWithJump"])(a0,a1,a2);var __PyCompile_CodeGen=Module["__PyCompile_CodeGen"]=(a0,a1,a2,a3,a4)=>(__PyCompile_CodeGen=Module["__PyCompile_CodeGen"]=wasmExports["_PyCompile_CodeGen"])(a0,a1,a2,a3,a4);var __PyCompile_OptimizeCfg=Module["__PyCompile_OptimizeCfg"]=(a0,a1,a2)=>(__PyCompile_OptimizeCfg=Module["__PyCompile_OptimizeCfg"]=wasmExports["_PyCompile_OptimizeCfg"])(a0,a1,a2);var __PyCompile_Assemble=Module["__PyCompile_Assemble"]=(a0,a1,a2)=>(__PyCompile_Assemble=Module["__PyCompile_Assemble"]=wasmExports["_PyCompile_Assemble"])(a0,a1,a2);var _PyCode_Optimize=Module["_PyCode_Optimize"]=(a0,a1,a2,a3)=>(_PyCode_Optimize=Module["_PyCode_Optimize"]=wasmExports["PyCode_Optimize"])(a0,a1,a2,a3);var _PySymtable_Lookup=Module["_PySymtable_Lookup"]=(a0,a1)=>(_PySymtable_Lookup=Module["_PySymtable_Lookup"]=wasmExports["PySymtable_Lookup"])(a0,a1);var _PyErr_ProgramTextObject=Module["_PyErr_ProgramTextObject"]=(a0,a1)=>(_PyErr_ProgramTextObject=Module["_PyErr_ProgramTextObject"]=wasmExports["PyErr_ProgramTextObject"])(a0,a1);var __PyContext_NewHamtForTests=Module["__PyContext_NewHamtForTests"]=()=>(__PyContext_NewHamtForTests=Module["__PyContext_NewHamtForTests"]=wasmExports["_PyContext_NewHamtForTests"])();var _PyContext_New=Module["_PyContext_New"]=()=>(_PyContext_New=Module["_PyContext_New"]=wasmExports["PyContext_New"])();var _PyContext_Copy=Module["_PyContext_Copy"]=a0=>(_PyContext_Copy=Module["_PyContext_Copy"]=wasmExports["PyContext_Copy"])(a0);var _PyContext_CopyCurrent=Module["_PyContext_CopyCurrent"]=()=>(_PyContext_CopyCurrent=Module["_PyContext_CopyCurrent"]=wasmExports["PyContext_CopyCurrent"])();var _PyContext_Enter=Module["_PyContext_Enter"]=a0=>(_PyContext_Enter=Module["_PyContext_Enter"]=wasmExports["PyContext_Enter"])(a0);var _PyContext_Exit=Module["_PyContext_Exit"]=a0=>(_PyContext_Exit=Module["_PyContext_Exit"]=wasmExports["PyContext_Exit"])(a0);var _PyContextVar_New=Module["_PyContextVar_New"]=(a0,a1)=>(_PyContextVar_New=Module["_PyContextVar_New"]=wasmExports["PyContextVar_New"])(a0,a1);var _PyContextVar_Get=Module["_PyContextVar_Get"]=(a0,a1,a2)=>(_PyContextVar_Get=Module["_PyContextVar_Get"]=wasmExports["PyContextVar_Get"])(a0,a1,a2);var _PyContextVar_Set=Module["_PyContextVar_Set"]=(a0,a1)=>(_PyContextVar_Set=Module["_PyContextVar_Set"]=wasmExports["PyContextVar_Set"])(a0,a1);var _PyContextVar_Reset=Module["_PyContextVar_Reset"]=(a0,a1)=>(_PyContextVar_Reset=Module["_PyContextVar_Reset"]=wasmExports["PyContextVar_Reset"])(a0,a1);var __PyErr_Restore=Module["__PyErr_Restore"]=(a0,a1,a2,a3)=>(__PyErr_Restore=Module["__PyErr_Restore"]=wasmExports["_PyErr_Restore"])(a0,a1,a2,a3);var __PyErr_SetNone=Module["__PyErr_SetNone"]=(a0,a1)=>(__PyErr_SetNone=Module["__PyErr_SetNone"]=wasmExports["_PyErr_SetNone"])(a0,a1);var __PyErr_NormalizeException=Module["__PyErr_NormalizeException"]=(a0,a1,a2,a3)=>(__PyErr_NormalizeException=Module["__PyErr_NormalizeException"]=wasmExports["_PyErr_NormalizeException"])(a0,a1,a2,a3);var __PyErr_Fetch=Module["__PyErr_Fetch"]=(a0,a1,a2,a3)=>(__PyErr_Fetch=Module["__PyErr_Fetch"]=wasmExports["_PyErr_Fetch"])(a0,a1,a2,a3);var __PyErr_GetExcInfo=Module["__PyErr_GetExcInfo"]=(a0,a1,a2,a3)=>(__PyErr_GetExcInfo=Module["__PyErr_GetExcInfo"]=wasmExports["_PyErr_GetExcInfo"])(a0,a1,a2,a3);var __PyErr_GetHandledException=Module["__PyErr_GetHandledException"]=a0=>(__PyErr_GetHandledException=Module["__PyErr_GetHandledException"]=wasmExports["_PyErr_GetHandledException"])(a0);var _PyErr_GetHandledException=Module["_PyErr_GetHandledException"]=()=>(_PyErr_GetHandledException=Module["_PyErr_GetHandledException"]=wasmExports["PyErr_GetHandledException"])();var __PyErr_SetHandledException=Module["__PyErr_SetHandledException"]=(a0,a1)=>(__PyErr_SetHandledException=Module["__PyErr_SetHandledException"]=wasmExports["_PyErr_SetHandledException"])(a0,a1);var _PyErr_GetExcInfo=Module["_PyErr_GetExcInfo"]=(a0,a1,a2)=>(_PyErr_GetExcInfo=Module["_PyErr_GetExcInfo"]=wasmExports["PyErr_GetExcInfo"])(a0,a1,a2);var _PyErr_SetExcInfo=Module["_PyErr_SetExcInfo"]=(a0,a1,a2)=>(_PyErr_SetExcInfo=Module["_PyErr_SetExcInfo"]=wasmExports["PyErr_SetExcInfo"])(a0,a1,a2);var __PyErr_StackItemToExcInfoTuple=Module["__PyErr_StackItemToExcInfoTuple"]=a0=>(__PyErr_StackItemToExcInfoTuple=Module["__PyErr_StackItemToExcInfoTuple"]=wasmExports["_PyErr_StackItemToExcInfoTuple"])(a0);var __PyErr_ChainExceptions=Module["__PyErr_ChainExceptions"]=(a0,a1,a2)=>(__PyErr_ChainExceptions=Module["__PyErr_ChainExceptions"]=wasmExports["_PyErr_ChainExceptions"])(a0,a1,a2);var _PyErr_SetFromErrnoWithFilenameObject=Module["_PyErr_SetFromErrnoWithFilenameObject"]=(a0,a1)=>(_PyErr_SetFromErrnoWithFilenameObject=Module["_PyErr_SetFromErrnoWithFilenameObject"]=wasmExports["PyErr_SetFromErrnoWithFilenameObject"])(a0,a1);var _PyErr_SetFromErrnoWithFilenameObjects=Module["_PyErr_SetFromErrnoWithFilenameObjects"]=(a0,a1,a2)=>(_PyErr_SetFromErrnoWithFilenameObjects=Module["_PyErr_SetFromErrnoWithFilenameObjects"]=wasmExports["PyErr_SetFromErrnoWithFilenameObjects"])(a0,a1,a2);var _strerror=Module["_strerror"]=a0=>(_strerror=Module["_strerror"]=wasmExports["strerror"])(a0);var _PyErr_SetImportErrorSubclass=Module["_PyErr_SetImportErrorSubclass"]=(a0,a1,a2,a3)=>(_PyErr_SetImportErrorSubclass=Module["_PyErr_SetImportErrorSubclass"]=wasmExports["PyErr_SetImportErrorSubclass"])(a0,a1,a2,a3);var _PyErr_SetImportError=Module["_PyErr_SetImportError"]=(a0,a1,a2)=>(_PyErr_SetImportError=Module["_PyErr_SetImportError"]=wasmExports["PyErr_SetImportError"])(a0,a1,a2);var _PyErr_BadInternalCall=Module["_PyErr_BadInternalCall"]=()=>(_PyErr_BadInternalCall=Module["_PyErr_BadInternalCall"]=wasmExports["PyErr_BadInternalCall"])();var _PyErr_FormatV=Module["_PyErr_FormatV"]=(a0,a1,a2)=>(_PyErr_FormatV=Module["_PyErr_FormatV"]=wasmExports["PyErr_FormatV"])(a0,a1,a2);var _PyErr_NewExceptionWithDoc=Module["_PyErr_NewExceptionWithDoc"]=(a0,a1,a2,a3)=>(_PyErr_NewExceptionWithDoc=Module["_PyErr_NewExceptionWithDoc"]=wasmExports["PyErr_NewExceptionWithDoc"])(a0,a1,a2,a3);var _PyTraceBack_Print=Module["_PyTraceBack_Print"]=(a0,a1)=>(_PyTraceBack_Print=Module["_PyTraceBack_Print"]=wasmExports["PyTraceBack_Print"])(a0,a1);var __PyTraceBack_FromFrame=Module["__PyTraceBack_FromFrame"]=(a0,a1)=>(__PyTraceBack_FromFrame=Module["__PyTraceBack_FromFrame"]=wasmExports["_PyTraceBack_FromFrame"])(a0,a1);var _PyErr_SyntaxLocation=Module["_PyErr_SyntaxLocation"]=(a0,a1)=>(_PyErr_SyntaxLocation=Module["_PyErr_SyntaxLocation"]=wasmExports["PyErr_SyntaxLocation"])(a0,a1);var _PyErr_SyntaxLocationEx=Module["_PyErr_SyntaxLocationEx"]=(a0,a1,a2)=>(_PyErr_SyntaxLocationEx=Module["_PyErr_SyntaxLocationEx"]=wasmExports["PyErr_SyntaxLocationEx"])(a0,a1,a2);var _PyErr_RangedSyntaxLocationObject=Module["_PyErr_RangedSyntaxLocationObject"]=(a0,a1,a2,a3,a4)=>(_PyErr_RangedSyntaxLocationObject=Module["_PyErr_RangedSyntaxLocationObject"]=wasmExports["PyErr_RangedSyntaxLocationObject"])(a0,a1,a2,a3,a4);var _PyErr_ProgramText=Module["_PyErr_ProgramText"]=(a0,a1)=>(_PyErr_ProgramText=Module["_PyErr_ProgramText"]=wasmExports["PyErr_ProgramText"])(a0,a1);var __Py_fopen_obj=Module["__Py_fopen_obj"]=(a0,a1)=>(__Py_fopen_obj=Module["__Py_fopen_obj"]=wasmExports["_Py_fopen_obj"])(a0,a1);var _PyUnstable_InterpreterFrame_GetCode=Module["_PyUnstable_InterpreterFrame_GetCode"]=a0=>(_PyUnstable_InterpreterFrame_GetCode=Module["_PyUnstable_InterpreterFrame_GetCode"]=wasmExports["PyUnstable_InterpreterFrame_GetCode"])(a0);var _PyUnstable_InterpreterFrame_GetLasti=Module["_PyUnstable_InterpreterFrame_GetLasti"]=a0=>(_PyUnstable_InterpreterFrame_GetLasti=Module["_PyUnstable_InterpreterFrame_GetLasti"]=wasmExports["PyUnstable_InterpreterFrame_GetLasti"])(a0);var _Py_FrozenMain=Module["_Py_FrozenMain"]=(a0,a1)=>(_Py_FrozenMain=Module["_Py_FrozenMain"]=wasmExports["Py_FrozenMain"])(a0,a1);var __PyRuntime_Initialize=Module["__PyRuntime_Initialize"]=a0=>(__PyRuntime_Initialize=Module["__PyRuntime_Initialize"]=wasmExports["_PyRuntime_Initialize"])(a0);var _Py_GETENV=Module["_Py_GETENV"]=a0=>(_Py_GETENV=Module["_Py_GETENV"]=wasmExports["Py_GETENV"])(a0);var _Py_GetVersion=Module["_Py_GetVersion"]=()=>(_Py_GetVersion=Module["_Py_GetVersion"]=wasmExports["Py_GetVersion"])();var _Py_GetCopyright=Module["_Py_GetCopyright"]=()=>(_Py_GetCopyright=Module["_Py_GetCopyright"]=wasmExports["Py_GetCopyright"])();var _PyImport_ImportFrozenModule=Module["_PyImport_ImportFrozenModule"]=a0=>(_PyImport_ImportFrozenModule=Module["_PyImport_ImportFrozenModule"]=wasmExports["PyImport_ImportFrozenModule"])(a0);var _PyRun_AnyFileExFlags=Module["_PyRun_AnyFileExFlags"]=(a0,a1,a2,a3)=>(_PyRun_AnyFileExFlags=Module["_PyRun_AnyFileExFlags"]=wasmExports["PyRun_AnyFileExFlags"])(a0,a1,a2,a3);var _Py_FinalizeEx=Module["_Py_FinalizeEx"]=()=>(_Py_FinalizeEx=Module["_Py_FinalizeEx"]=wasmExports["Py_FinalizeEx"])();var _PyArg_Parse=Module["_PyArg_Parse"]=(a0,a1,a2)=>(_PyArg_Parse=Module["_PyArg_Parse"]=wasmExports["PyArg_Parse"])(a0,a1,a2);var __PyArg_Parse_SizeT=Module["__PyArg_Parse_SizeT"]=(a0,a1,a2)=>(__PyArg_Parse_SizeT=Module["__PyArg_Parse_SizeT"]=wasmExports["_PyArg_Parse_SizeT"])(a0,a1,a2);var __PyArg_ParseStack=Module["__PyArg_ParseStack"]=(a0,a1,a2,a3)=>(__PyArg_ParseStack=Module["__PyArg_ParseStack"]=wasmExports["_PyArg_ParseStack"])(a0,a1,a2,a3);var _PyArg_VaParse=Module["_PyArg_VaParse"]=(a0,a1,a2)=>(_PyArg_VaParse=Module["_PyArg_VaParse"]=wasmExports["PyArg_VaParse"])(a0,a1,a2);var __PyArg_VaParse_SizeT=Module["__PyArg_VaParse_SizeT"]=(a0,a1,a2)=>(__PyArg_VaParse_SizeT=Module["__PyArg_VaParse_SizeT"]=wasmExports["_PyArg_VaParse_SizeT"])(a0,a1,a2);var _PyArg_VaParseTupleAndKeywords=Module["_PyArg_VaParseTupleAndKeywords"]=(a0,a1,a2,a3,a4)=>(_PyArg_VaParseTupleAndKeywords=Module["_PyArg_VaParseTupleAndKeywords"]=wasmExports["PyArg_VaParseTupleAndKeywords"])(a0,a1,a2,a3,a4);var __PyArg_VaParseTupleAndKeywords_SizeT=Module["__PyArg_VaParseTupleAndKeywords_SizeT"]=(a0,a1,a2,a3,a4)=>(__PyArg_VaParseTupleAndKeywords_SizeT=Module["__PyArg_VaParseTupleAndKeywords_SizeT"]=wasmExports["_PyArg_VaParseTupleAndKeywords_SizeT"])(a0,a1,a2,a3,a4);var __PyArg_ParseTupleAndKeywordsFast=Module["__PyArg_ParseTupleAndKeywordsFast"]=(a0,a1,a2,a3)=>(__PyArg_ParseTupleAndKeywordsFast=Module["__PyArg_ParseTupleAndKeywordsFast"]=wasmExports["_PyArg_ParseTupleAndKeywordsFast"])(a0,a1,a2,a3);var __PyArg_ParseTupleAndKeywordsFast_SizeT=Module["__PyArg_ParseTupleAndKeywordsFast_SizeT"]=(a0,a1,a2,a3)=>(__PyArg_ParseTupleAndKeywordsFast_SizeT=Module["__PyArg_ParseTupleAndKeywordsFast_SizeT"]=wasmExports["_PyArg_ParseTupleAndKeywordsFast_SizeT"])(a0,a1,a2,a3);var __PyArg_ParseStackAndKeywords=Module["__PyArg_ParseStackAndKeywords"]=(a0,a1,a2,a3,a4)=>(__PyArg_ParseStackAndKeywords=Module["__PyArg_ParseStackAndKeywords"]=wasmExports["_PyArg_ParseStackAndKeywords"])(a0,a1,a2,a3,a4);var __PyArg_VaParseTupleAndKeywordsFast=Module["__PyArg_VaParseTupleAndKeywordsFast"]=(a0,a1,a2,a3)=>(__PyArg_VaParseTupleAndKeywordsFast=Module["__PyArg_VaParseTupleAndKeywordsFast"]=wasmExports["_PyArg_VaParseTupleAndKeywordsFast"])(a0,a1,a2,a3);var __PyArg_VaParseTupleAndKeywordsFast_SizeT=Module["__PyArg_VaParseTupleAndKeywordsFast_SizeT"]=(a0,a1,a2,a3)=>(__PyArg_VaParseTupleAndKeywordsFast_SizeT=Module["__PyArg_VaParseTupleAndKeywordsFast_SizeT"]=wasmExports["_PyArg_VaParseTupleAndKeywordsFast_SizeT"])(a0,a1,a2,a3);var _PyThreadState_Swap=Module["_PyThreadState_Swap"]=a0=>(_PyThreadState_Swap=Module["_PyThreadState_Swap"]=wasmExports["PyThreadState_Swap"])(a0);var _PyThreadState_Clear=Module["_PyThreadState_Clear"]=a0=>(_PyThreadState_Clear=Module["_PyThreadState_Clear"]=wasmExports["PyThreadState_Clear"])(a0);var __PyArg_NoPositional=Module["__PyArg_NoPositional"]=(a0,a1)=>(__PyArg_NoPositional=Module["__PyArg_NoPositional"]=wasmExports["_PyArg_NoPositional"])(a0,a1);var _Py_GetCompiler=Module["_Py_GetCompiler"]=()=>(_Py_GetCompiler=Module["_Py_GetCompiler"]=wasmExports["Py_GetCompiler"])();var _Py_GetPlatform=Module["_Py_GetPlatform"]=()=>(_Py_GetPlatform=Module["_Py_GetPlatform"]=wasmExports["Py_GetPlatform"])();var __PyEval_SetSwitchInterval=Module["__PyEval_SetSwitchInterval"]=a0=>(__PyEval_SetSwitchInterval=Module["__PyEval_SetSwitchInterval"]=wasmExports["_PyEval_SetSwitchInterval"])(a0);var __PyEval_GetSwitchInterval=Module["__PyEval_GetSwitchInterval"]=()=>(__PyEval_GetSwitchInterval=Module["__PyEval_GetSwitchInterval"]=wasmExports["_PyEval_GetSwitchInterval"])();var _PyEval_ThreadsInitialized=Module["_PyEval_ThreadsInitialized"]=()=>(_PyEval_ThreadsInitialized=Module["_PyEval_ThreadsInitialized"]=wasmExports["PyEval_ThreadsInitialized"])();var _PyThread_init_thread=Module["_PyThread_init_thread"]=()=>(_PyThread_init_thread=Module["_PyThread_init_thread"]=wasmExports["PyThread_init_thread"])();var _pthread_mutex_lock=Module["_pthread_mutex_lock"]=a0=>(_pthread_mutex_lock=Module["_pthread_mutex_lock"]=wasmExports["pthread_mutex_lock"])(a0);var _pthread_cond_timedwait=Module["_pthread_cond_timedwait"]=(a0,a1,a2)=>(_pthread_cond_timedwait=Module["_pthread_cond_timedwait"]=wasmExports["pthread_cond_timedwait"])(a0,a1,a2);var _pthread_mutex_unlock=Module["_pthread_mutex_unlock"]=a0=>(_pthread_mutex_unlock=Module["_pthread_mutex_unlock"]=wasmExports["pthread_mutex_unlock"])(a0);var _pthread_cond_signal=Module["_pthread_cond_signal"]=a0=>(_pthread_cond_signal=Module["_pthread_cond_signal"]=wasmExports["pthread_cond_signal"])(a0);var _PyThread_exit_thread=Module["_PyThread_exit_thread"]=()=>(_PyThread_exit_thread=Module["_PyThread_exit_thread"]=wasmExports["PyThread_exit_thread"])();var _PyThread_get_thread_ident=Module["_PyThread_get_thread_ident"]=()=>(_PyThread_get_thread_ident=Module["_PyThread_get_thread_ident"]=wasmExports["PyThread_get_thread_ident"])();var _pthread_cond_destroy=Module["_pthread_cond_destroy"]=a0=>(_pthread_cond_destroy=Module["_pthread_cond_destroy"]=wasmExports["pthread_cond_destroy"])(a0);var _pthread_mutex_destroy=Module["_pthread_mutex_destroy"]=a0=>(_pthread_mutex_destroy=Module["_pthread_mutex_destroy"]=wasmExports["pthread_mutex_destroy"])(a0);var _PyEval_InitThreads=Module["_PyEval_InitThreads"]=()=>(_PyEval_InitThreads=Module["_PyEval_InitThreads"]=wasmExports["PyEval_InitThreads"])();var _PyEval_AcquireLock=Module["_PyEval_AcquireLock"]=()=>(_PyEval_AcquireLock=Module["_PyEval_AcquireLock"]=wasmExports["PyEval_AcquireLock"])();var _PyEval_ReleaseLock=Module["_PyEval_ReleaseLock"]=()=>(_PyEval_ReleaseLock=Module["_PyEval_ReleaseLock"]=wasmExports["PyEval_ReleaseLock"])();var _pthread_cond_wait=Module["_pthread_cond_wait"]=(a0,a1)=>(_pthread_cond_wait=Module["_pthread_cond_wait"]=wasmExports["pthread_cond_wait"])(a0,a1);var _PyEval_AcquireThread=Module["_PyEval_AcquireThread"]=a0=>(_PyEval_AcquireThread=Module["_PyEval_AcquireThread"]=wasmExports["PyEval_AcquireThread"])(a0);var _PyEval_ReleaseThread=Module["_PyEval_ReleaseThread"]=a0=>(_PyEval_ReleaseThread=Module["_PyEval_ReleaseThread"]=wasmExports["PyEval_ReleaseThread"])(a0);var __PyThread_at_fork_reinit=Module["__PyThread_at_fork_reinit"]=a0=>(__PyThread_at_fork_reinit=Module["__PyThread_at_fork_reinit"]=wasmExports["_PyThread_at_fork_reinit"])(a0);var __PyThreadState_DeleteExcept=Module["__PyThreadState_DeleteExcept"]=a0=>(__PyThreadState_DeleteExcept=Module["__PyThreadState_DeleteExcept"]=wasmExports["_PyThreadState_DeleteExcept"])(a0);var __PyEval_SignalAsyncExc=Module["__PyEval_SignalAsyncExc"]=a0=>(__PyEval_SignalAsyncExc=Module["__PyEval_SignalAsyncExc"]=wasmExports["_PyEval_SignalAsyncExc"])(a0);var __PyEval_SignalReceived=Module["__PyEval_SignalReceived"]=a0=>(__PyEval_SignalReceived=Module["__PyEval_SignalReceived"]=wasmExports["_PyEval_SignalReceived"])(a0);var __PyEval_AddPendingCall=Module["__PyEval_AddPendingCall"]=(a0,a1,a2,a3)=>(__PyEval_AddPendingCall=Module["__PyEval_AddPendingCall"]=wasmExports["_PyEval_AddPendingCall"])(a0,a1,a2,a3);var _Py_AddPendingCall=Module["_Py_AddPendingCall"]=(a0,a1)=>(_Py_AddPendingCall=Module["_Py_AddPendingCall"]=wasmExports["Py_AddPendingCall"])(a0,a1);var __PyErr_Print=Module["__PyErr_Print"]=a0=>(__PyErr_Print=Module["__PyErr_Print"]=wasmExports["_PyErr_Print"])(a0);var __PyEval_MakePendingCalls=Module["__PyEval_MakePendingCalls"]=a0=>(__PyEval_MakePendingCalls=Module["__PyEval_MakePendingCalls"]=wasmExports["_PyEval_MakePendingCalls"])(a0);var __PyErr_CheckSignalsTstate=Module["__PyErr_CheckSignalsTstate"]=a0=>(__PyErr_CheckSignalsTstate=Module["__PyErr_CheckSignalsTstate"]=wasmExports["_PyErr_CheckSignalsTstate"])(a0);var _Py_MakePendingCalls=Module["_Py_MakePendingCalls"]=()=>(_Py_MakePendingCalls=Module["_Py_MakePendingCalls"]=wasmExports["Py_MakePendingCalls"])();var _PyThread_free_lock=Module["_PyThread_free_lock"]=a0=>(_PyThread_free_lock=Module["_PyThread_free_lock"]=wasmExports["PyThread_free_lock"])(a0);var _pthread_mutex_init=Module["_pthread_mutex_init"]=(a0,a1)=>(_pthread_mutex_init=Module["_pthread_mutex_init"]=wasmExports["pthread_mutex_init"])(a0,a1);var __Py_hashtable_hash_ptr=Module["__Py_hashtable_hash_ptr"]=a0=>(__Py_hashtable_hash_ptr=Module["__Py_hashtable_hash_ptr"]=wasmExports["_Py_hashtable_hash_ptr"])(a0);var __Py_HashPointerRaw=Module["__Py_HashPointerRaw"]=a0=>(__Py_HashPointerRaw=Module["__Py_HashPointerRaw"]=wasmExports["_Py_HashPointerRaw"])(a0);var __Py_hashtable_compare_direct=Module["__Py_hashtable_compare_direct"]=(a0,a1)=>(__Py_hashtable_compare_direct=Module["__Py_hashtable_compare_direct"]=wasmExports["_Py_hashtable_compare_direct"])(a0,a1);var __Py_hashtable_size=Module["__Py_hashtable_size"]=a0=>(__Py_hashtable_size=Module["__Py_hashtable_size"]=wasmExports["_Py_hashtable_size"])(a0);var __Py_hashtable_steal=Module["__Py_hashtable_steal"]=(a0,a1)=>(__Py_hashtable_steal=Module["__Py_hashtable_steal"]=wasmExports["_Py_hashtable_steal"])(a0,a1);var __Py_hashtable_foreach=Module["__Py_hashtable_foreach"]=(a0,a1,a2)=>(__Py_hashtable_foreach=Module["__Py_hashtable_foreach"]=wasmExports["_Py_hashtable_foreach"])(a0,a1,a2);var __Py_hashtable_new=Module["__Py_hashtable_new"]=(a0,a1)=>(__Py_hashtable_new=Module["__Py_hashtable_new"]=wasmExports["_Py_hashtable_new"])(a0,a1);var __Py_hashtable_clear=Module["__Py_hashtable_clear"]=a0=>(__Py_hashtable_clear=Module["__Py_hashtable_clear"]=wasmExports["_Py_hashtable_clear"])(a0);var __PyImport_AcquireLock=Module["__PyImport_AcquireLock"]=a0=>(__PyImport_AcquireLock=Module["__PyImport_AcquireLock"]=wasmExports["_PyImport_AcquireLock"])(a0);var __PyImport_ReleaseLock=Module["__PyImport_ReleaseLock"]=a0=>(__PyImport_ReleaseLock=Module["__PyImport_ReleaseLock"]=wasmExports["_PyImport_ReleaseLock"])(a0);var __PyImport_GetModuleId=Module["__PyImport_GetModuleId"]=a0=>(__PyImport_GetModuleId=Module["__PyImport_GetModuleId"]=wasmExports["_PyImport_GetModuleId"])(a0);var __PyImport_SetModule=Module["__PyImport_SetModule"]=(a0,a1)=>(__PyImport_SetModule=Module["__PyImport_SetModule"]=wasmExports["_PyImport_SetModule"])(a0,a1);var __PyImport_SetModuleString=Module["__PyImport_SetModuleString"]=(a0,a1)=>(__PyImport_SetModuleString=Module["__PyImport_SetModuleString"]=wasmExports["_PyImport_SetModuleString"])(a0,a1);var _PyImport_AddModuleObject=Module["_PyImport_AddModuleObject"]=a0=>(_PyImport_AddModuleObject=Module["_PyImport_AddModuleObject"]=wasmExports["PyImport_AddModuleObject"])(a0);var _PyImport_AddModule=Module["_PyImport_AddModule"]=a0=>(_PyImport_AddModule=Module["_PyImport_AddModule"]=wasmExports["PyImport_AddModule"])(a0);var _PyState_FindModule=Module["_PyState_FindModule"]=a0=>(_PyState_FindModule=Module["_PyState_FindModule"]=wasmExports["PyState_FindModule"])(a0);var __PyState_AddModule=Module["__PyState_AddModule"]=(a0,a1,a2)=>(__PyState_AddModule=Module["__PyState_AddModule"]=wasmExports["_PyState_AddModule"])(a0,a1,a2);var _PyState_AddModule=Module["_PyState_AddModule"]=(a0,a1)=>(_PyState_AddModule=Module["_PyState_AddModule"]=wasmExports["PyState_AddModule"])(a0,a1);var _PyState_RemoveModule=Module["_PyState_RemoveModule"]=a0=>(_PyState_RemoveModule=Module["_PyState_RemoveModule"]=wasmExports["PyState_RemoveModule"])(a0);var __PyImport_ClearExtension=Module["__PyImport_ClearExtension"]=(a0,a1)=>(__PyImport_ClearExtension=Module["__PyImport_ClearExtension"]=wasmExports["_PyImport_ClearExtension"])(a0,a1);var __PyInterpreterState_HasFeature=Module["__PyInterpreterState_HasFeature"]=(a0,a1)=>(__PyInterpreterState_HasFeature=Module["__PyInterpreterState_HasFeature"]=wasmExports["_PyInterpreterState_HasFeature"])(a0,a1);var __PyImport_FixupExtensionObject=Module["__PyImport_FixupExtensionObject"]=(a0,a1,a2,a3)=>(__PyImport_FixupExtensionObject=Module["__PyImport_FixupExtensionObject"]=wasmExports["_PyImport_FixupExtensionObject"])(a0,a1,a2,a3);var __PyImport_FixupBuiltin=Module["__PyImport_FixupBuiltin"]=(a0,a1,a2)=>(__PyImport_FixupBuiltin=Module["__PyImport_FixupBuiltin"]=wasmExports["_PyImport_FixupBuiltin"])(a0,a1,a2);var _PyImport_ExtendInittab=Module["_PyImport_ExtendInittab"]=a0=>(_PyImport_ExtendInittab=Module["_PyImport_ExtendInittab"]=wasmExports["PyImport_ExtendInittab"])(a0);var _PyImport_GetMagicNumber=Module["_PyImport_GetMagicNumber"]=()=>(_PyImport_GetMagicNumber=Module["_PyImport_GetMagicNumber"]=wasmExports["PyImport_GetMagicNumber"])();var _PyImport_GetMagicTag=Module["_PyImport_GetMagicTag"]=()=>(_PyImport_GetMagicTag=Module["_PyImport_GetMagicTag"]=wasmExports["PyImport_GetMagicTag"])();var _PyImport_ExecCodeModule=Module["_PyImport_ExecCodeModule"]=(a0,a1)=>(_PyImport_ExecCodeModule=Module["_PyImport_ExecCodeModule"]=wasmExports["PyImport_ExecCodeModule"])(a0,a1);var _PyImport_ExecCodeModuleObject=Module["_PyImport_ExecCodeModuleObject"]=(a0,a1,a2,a3)=>(_PyImport_ExecCodeModuleObject=Module["_PyImport_ExecCodeModuleObject"]=wasmExports["PyImport_ExecCodeModuleObject"])(a0,a1,a2,a3);var _PyImport_ExecCodeModuleWithPathnames=Module["_PyImport_ExecCodeModuleWithPathnames"]=(a0,a1,a2,a3)=>(_PyImport_ExecCodeModuleWithPathnames=Module["_PyImport_ExecCodeModuleWithPathnames"]=wasmExports["PyImport_ExecCodeModuleWithPathnames"])(a0,a1,a2,a3);var _PyImport_ExecCodeModuleEx=Module["_PyImport_ExecCodeModuleEx"]=(a0,a1,a2)=>(_PyImport_ExecCodeModuleEx=Module["_PyImport_ExecCodeModuleEx"]=wasmExports["PyImport_ExecCodeModuleEx"])(a0,a1,a2);var _PyImport_ImportFrozenModuleObject=Module["_PyImport_ImportFrozenModuleObject"]=a0=>(_PyImport_ImportFrozenModuleObject=Module["_PyImport_ImportFrozenModuleObject"]=wasmExports["PyImport_ImportFrozenModuleObject"])(a0);var _PyMarshal_ReadObjectFromString=Module["_PyMarshal_ReadObjectFromString"]=(a0,a1)=>(_PyMarshal_ReadObjectFromString=Module["_PyMarshal_ReadObjectFromString"]=wasmExports["PyMarshal_ReadObjectFromString"])(a0,a1);var _PyImport_GetImporter=Module["_PyImport_GetImporter"]=a0=>(_PyImport_GetImporter=Module["_PyImport_GetImporter"]=wasmExports["PyImport_GetImporter"])(a0);var _PyImport_ImportModuleNoBlock=Module["_PyImport_ImportModuleNoBlock"]=a0=>(_PyImport_ImportModuleNoBlock=Module["_PyImport_ImportModuleNoBlock"]=wasmExports["PyImport_ImportModuleNoBlock"])(a0);var __PyTime_GetPerfCounter=Module["__PyTime_GetPerfCounter"]=()=>(__PyTime_GetPerfCounter=Module["__PyTime_GetPerfCounter"]=wasmExports["_PyTime_GetPerfCounter"])();var __PyTime_AsMicroseconds=Module["__PyTime_AsMicroseconds"]=(a0,a1)=>(__PyTime_AsMicroseconds=Module["__PyTime_AsMicroseconds"]=wasmExports["_PyTime_AsMicroseconds"])(a0,a1);var _PyImport_ImportModuleLevel=Module["_PyImport_ImportModuleLevel"]=(a0,a1,a2,a3,a4)=>(_PyImport_ImportModuleLevel=Module["_PyImport_ImportModuleLevel"]=wasmExports["PyImport_ImportModuleLevel"])(a0,a1,a2,a3,a4);var _PyImport_ReloadModule=Module["_PyImport_ReloadModule"]=a0=>(_PyImport_ReloadModule=Module["_PyImport_ReloadModule"]=wasmExports["PyImport_ReloadModule"])(a0);var _PyStatus_NoMemory=Module["_PyStatus_NoMemory"]=a0=>(_PyStatus_NoMemory=Module["_PyStatus_NoMemory"]=wasmExports["PyStatus_NoMemory"])(a0);var __PyImport_GetModuleAttr=Module["__PyImport_GetModuleAttr"]=(a0,a1)=>(__PyImport_GetModuleAttr=Module["__PyImport_GetModuleAttr"]=wasmExports["_PyImport_GetModuleAttr"])(a0,a1);var _PyInit__imp=Module["_PyInit__imp"]=()=>(_PyInit__imp=Module["_PyInit__imp"]=wasmExports["PyInit__imp"])();var _getenv=Module["_getenv"]=a0=>(_getenv=Module["_getenv"]=wasmExports["getenv"])(a0);var _PyStatus_Ok=Module["_PyStatus_Ok"]=a0=>(_PyStatus_Ok=Module["_PyStatus_Ok"]=wasmExports["PyStatus_Ok"])(a0);var _PyStatus_Error=Module["_PyStatus_Error"]=(a0,a1)=>(_PyStatus_Error=Module["_PyStatus_Error"]=wasmExports["PyStatus_Error"])(a0,a1);var _PyStatus_Exit=Module["_PyStatus_Exit"]=(a0,a1)=>(_PyStatus_Exit=Module["_PyStatus_Exit"]=wasmExports["PyStatus_Exit"])(a0,a1);var _PyStatus_IsError=Module["_PyStatus_IsError"]=a0=>(_PyStatus_IsError=Module["_PyStatus_IsError"]=wasmExports["PyStatus_IsError"])(a0);var _PyStatus_IsExit=Module["_PyStatus_IsExit"]=a0=>(_PyStatus_IsExit=Module["_PyStatus_IsExit"]=wasmExports["PyStatus_IsExit"])(a0);var __PyErr_SetFromPyStatus=Module["__PyErr_SetFromPyStatus"]=a0=>(__PyErr_SetFromPyStatus=Module["__PyErr_SetFromPyStatus"]=wasmExports["_PyErr_SetFromPyStatus"])(a0);var __PyWideStringList_Clear=Module["__PyWideStringList_Clear"]=a0=>(__PyWideStringList_Clear=Module["__PyWideStringList_Clear"]=wasmExports["_PyWideStringList_Clear"])(a0);var __PyWideStringList_Copy=Module["__PyWideStringList_Copy"]=(a0,a1)=>(__PyWideStringList_Copy=Module["__PyWideStringList_Copy"]=wasmExports["_PyWideStringList_Copy"])(a0,a1);var _PyWideStringList_Insert=Module["_PyWideStringList_Insert"]=(a0,a1,a2,a3)=>(_PyWideStringList_Insert=Module["_PyWideStringList_Insert"]=wasmExports["PyWideStringList_Insert"])(a0,a1,a2,a3);var _PyWideStringList_Append=Module["_PyWideStringList_Append"]=(a0,a1,a2)=>(_PyWideStringList_Append=Module["_PyWideStringList_Append"]=wasmExports["PyWideStringList_Append"])(a0,a1,a2);var __PyWideStringList_Extend=Module["__PyWideStringList_Extend"]=(a0,a1,a2)=>(__PyWideStringList_Extend=Module["__PyWideStringList_Extend"]=wasmExports["_PyWideStringList_Extend"])(a0,a1,a2);var __PyWideStringList_AsList=Module["__PyWideStringList_AsList"]=a0=>(__PyWideStringList_AsList=Module["__PyWideStringList_AsList"]=wasmExports["_PyWideStringList_AsList"])(a0);var _Py_SetStandardStreamEncoding=Module["_Py_SetStandardStreamEncoding"]=(a0,a1)=>(_Py_SetStandardStreamEncoding=Module["_Py_SetStandardStreamEncoding"]=wasmExports["Py_SetStandardStreamEncoding"])(a0,a1);var __Py_ClearStandardStreamEncoding=Module["__Py_ClearStandardStreamEncoding"]=()=>(__Py_ClearStandardStreamEncoding=Module["__Py_ClearStandardStreamEncoding"]=wasmExports["_Py_ClearStandardStreamEncoding"])();var __Py_ClearArgcArgv=Module["__Py_ClearArgcArgv"]=()=>(__Py_ClearArgcArgv=Module["__Py_ClearArgcArgv"]=wasmExports["_Py_ClearArgcArgv"])();var _Py_GetArgcArgv=Module["_Py_GetArgcArgv"]=(a0,a1)=>(_Py_GetArgcArgv=Module["_Py_GetArgcArgv"]=wasmExports["Py_GetArgcArgv"])(a0,a1);var __PyConfig_InitCompatConfig=Module["__PyConfig_InitCompatConfig"]=a0=>(__PyConfig_InitCompatConfig=Module["__PyConfig_InitCompatConfig"]=wasmExports["_PyConfig_InitCompatConfig"])(a0);var _PyConfig_InitIsolatedConfig=Module["_PyConfig_InitIsolatedConfig"]=a0=>(_PyConfig_InitIsolatedConfig=Module["_PyConfig_InitIsolatedConfig"]=wasmExports["PyConfig_InitIsolatedConfig"])(a0);var _PyConfig_SetString=Module["_PyConfig_SetString"]=(a0,a1,a2,a3)=>(_PyConfig_SetString=Module["_PyConfig_SetString"]=wasmExports["PyConfig_SetString"])(a0,a1,a2,a3);var __Py_PreInitializeFromConfig=Module["__Py_PreInitializeFromConfig"]=(a0,a1,a2)=>(__Py_PreInitializeFromConfig=Module["__Py_PreInitializeFromConfig"]=wasmExports["_Py_PreInitializeFromConfig"])(a0,a1,a2);var _Py_DecodeLocale=Module["_Py_DecodeLocale"]=(a0,a1)=>(_Py_DecodeLocale=Module["_Py_DecodeLocale"]=wasmExports["Py_DecodeLocale"])(a0,a1);var __PyConfig_AsDict=Module["__PyConfig_AsDict"]=a0=>(__PyConfig_AsDict=Module["__PyConfig_AsDict"]=wasmExports["_PyConfig_AsDict"])(a0);var __PyConfig_FromDict=Module["__PyConfig_FromDict"]=(a0,a1)=>(__PyConfig_FromDict=Module["__PyConfig_FromDict"]=wasmExports["_PyConfig_FromDict"])(a0,a1);var __Py_get_xoption=Module["__Py_get_xoption"]=(a0,a1)=>(__Py_get_xoption=Module["__Py_get_xoption"]=wasmExports["_Py_get_xoption"])(a0,a1);var _wcschr=Module["_wcschr"]=(a0,a1)=>(_wcschr=Module["_wcschr"]=wasmExports["wcschr"])(a0,a1);var _setvbuf=Module["_setvbuf"]=(a0,a1,a2,a3)=>(_setvbuf=Module["_setvbuf"]=wasmExports["setvbuf"])(a0,a1,a2,a3);var __PyArgv_AsWstrList=Module["__PyArgv_AsWstrList"]=(a0,a1,a2)=>(__PyArgv_AsWstrList=Module["__PyArgv_AsWstrList"]=wasmExports["_PyArgv_AsWstrList"])(a0,a1,a2);var _PyConfig_SetArgv=Module["_PyConfig_SetArgv"]=(a0,a1,a2,a3)=>(_PyConfig_SetArgv=Module["_PyConfig_SetArgv"]=wasmExports["PyConfig_SetArgv"])(a0,a1,a2,a3);var _PyConfig_SetWideStringList=Module["_PyConfig_SetWideStringList"]=(a0,a1,a2,a3,a4)=>(_PyConfig_SetWideStringList=Module["_PyConfig_SetWideStringList"]=wasmExports["PyConfig_SetWideStringList"])(a0,a1,a2,a3,a4);var _putchar=Module["_putchar"]=a0=>(_putchar=Module["_putchar"]=wasmExports["putchar"])(a0);var _iprintf=Module["_iprintf"]=(a0,a1)=>(_iprintf=Module["_iprintf"]=wasmExports["iprintf"])(a0,a1);var _wcstok=Module["_wcstok"]=(a0,a1,a2)=>(_wcstok=Module["_wcstok"]=wasmExports["wcstok"])(a0,a1,a2);var __Py_get_env_flag=Module["__Py_get_env_flag"]=(a0,a1,a2)=>(__Py_get_env_flag=Module["__Py_get_env_flag"]=wasmExports["_Py_get_env_flag"])(a0,a1,a2);var __Py_GetEnv=Module["__Py_GetEnv"]=(a0,a1)=>(__Py_GetEnv=Module["__Py_GetEnv"]=wasmExports["_Py_GetEnv"])(a0,a1);var _strtoul=Module["_strtoul"]=(a0,a1,a2)=>(_strtoul=Module["_strtoul"]=wasmExports["strtoul"])(a0,a1,a2);var __Py_str_to_int=Module["__Py_str_to_int"]=(a0,a1)=>(__Py_str_to_int=Module["__Py_str_to_int"]=wasmExports["_Py_str_to_int"])(a0,a1);var _wcstol=Module["_wcstol"]=(a0,a1,a2)=>(_wcstol=Module["_wcstol"]=wasmExports["wcstol"])(a0,a1,a2);var __Py_GetForceASCII=Module["__Py_GetForceASCII"]=()=>(__Py_GetForceASCII=Module["__Py_GetForceASCII"]=wasmExports["_Py_GetForceASCII"])();var _setlocale=Module["_setlocale"]=(a0,a1)=>(_setlocale=Module["_setlocale"]=wasmExports["setlocale"])(a0,a1);var __Py_IsLocaleCoercionTarget=Module["__Py_IsLocaleCoercionTarget"]=a0=>(__Py_IsLocaleCoercionTarget=Module["__Py_IsLocaleCoercionTarget"]=wasmExports["_Py_IsLocaleCoercionTarget"])(a0);var _PyConfig_Read=Module["_PyConfig_Read"]=(a0,a1)=>(_PyConfig_Read=Module["_PyConfig_Read"]=wasmExports["PyConfig_Read"])(a0,a1);var __Py_GetConfigsAsDict=Module["__Py_GetConfigsAsDict"]=()=>(__Py_GetConfigsAsDict=Module["__Py_GetConfigsAsDict"]=wasmExports["_Py_GetConfigsAsDict"])();var __Py_GetLocaleEncoding=Module["__Py_GetLocaleEncoding"]=()=>(__Py_GetLocaleEncoding=Module["__Py_GetLocaleEncoding"]=wasmExports["_Py_GetLocaleEncoding"])();var _PyMarshal_WriteLongToFile=Module["_PyMarshal_WriteLongToFile"]=(a0,a1,a2)=>(_PyMarshal_WriteLongToFile=Module["_PyMarshal_WriteLongToFile"]=wasmExports["PyMarshal_WriteLongToFile"])(a0,a1,a2);var _PyMarshal_WriteObjectToFile=Module["_PyMarshal_WriteObjectToFile"]=(a0,a1,a2)=>(_PyMarshal_WriteObjectToFile=Module["_PyMarshal_WriteObjectToFile"]=wasmExports["PyMarshal_WriteObjectToFile"])(a0,a1,a2);var _PyMarshal_ReadShortFromFile=Module["_PyMarshal_ReadShortFromFile"]=a0=>(_PyMarshal_ReadShortFromFile=Module["_PyMarshal_ReadShortFromFile"]=wasmExports["PyMarshal_ReadShortFromFile"])(a0);var _PyMarshal_ReadLongFromFile=Module["_PyMarshal_ReadLongFromFile"]=a0=>(_PyMarshal_ReadLongFromFile=Module["_PyMarshal_ReadLongFromFile"]=wasmExports["PyMarshal_ReadLongFromFile"])(a0);var _PyMarshal_ReadLastObjectFromFile=Module["_PyMarshal_ReadLastObjectFromFile"]=a0=>(_PyMarshal_ReadLastObjectFromFile=Module["_PyMarshal_ReadLastObjectFromFile"]=wasmExports["PyMarshal_ReadLastObjectFromFile"])(a0);var __Py_fstat_noraise=Module["__Py_fstat_noraise"]=(a0,a1)=>(__Py_fstat_noraise=Module["__Py_fstat_noraise"]=wasmExports["_Py_fstat_noraise"])(a0,a1);var _fread=Module["_fread"]=(a0,a1,a2,a3)=>(_fread=Module["_fread"]=wasmExports["fread"])(a0,a1,a2,a3);var _PyMarshal_ReadObjectFromFile=Module["_PyMarshal_ReadObjectFromFile"]=a0=>(_PyMarshal_ReadObjectFromFile=Module["_PyMarshal_ReadObjectFromFile"]=wasmExports["PyMarshal_ReadObjectFromFile"])(a0);var _PyMarshal_WriteObjectToString=Module["_PyMarshal_WriteObjectToString"]=(a0,a1)=>(_PyMarshal_WriteObjectToString=Module["_PyMarshal_WriteObjectToString"]=wasmExports["PyMarshal_WriteObjectToString"])(a0,a1);var _PyMarshal_Init=Module["_PyMarshal_Init"]=()=>(_PyMarshal_Init=Module["_PyMarshal_Init"]=wasmExports["PyMarshal_Init"])();var __Py_convert_optional_to_ssize_t=Module["__Py_convert_optional_to_ssize_t"]=(a0,a1)=>(__Py_convert_optional_to_ssize_t=Module["__Py_convert_optional_to_ssize_t"]=wasmExports["_Py_convert_optional_to_ssize_t"])(a0,a1);var _Py_VaBuildValue=Module["_Py_VaBuildValue"]=(a0,a1)=>(_Py_VaBuildValue=Module["_Py_VaBuildValue"]=wasmExports["Py_VaBuildValue"])(a0,a1);var __Py_VaBuildValue_SizeT=Module["__Py_VaBuildValue_SizeT"]=(a0,a1)=>(__Py_VaBuildValue_SizeT=Module["__Py_VaBuildValue_SizeT"]=wasmExports["_Py_VaBuildValue_SizeT"])(a0,a1);var __PyModule_Add=Module["__PyModule_Add"]=(a0,a1,a2)=>(__PyModule_Add=Module["__PyModule_Add"]=wasmExports["_PyModule_Add"])(a0,a1,a2);var _PyModule_AddStringConstant=Module["_PyModule_AddStringConstant"]=(a0,a1,a2)=>(_PyModule_AddStringConstant=Module["_PyModule_AddStringConstant"]=wasmExports["PyModule_AddStringConstant"])(a0,a1,a2);var _vsnprintf=Module["_vsnprintf"]=(a0,a1,a2,a3)=>(_vsnprintf=Module["_vsnprintf"]=wasmExports["vsnprintf"])(a0,a1,a2,a3);var _PyOS_vsnprintf=Module["_PyOS_vsnprintf"]=(a0,a1,a2,a3)=>(_PyOS_vsnprintf=Module["_PyOS_vsnprintf"]=wasmExports["PyOS_vsnprintf"])(a0,a1,a2,a3);var __PyPathConfig_ClearGlobal=Module["__PyPathConfig_ClearGlobal"]=()=>(__PyPathConfig_ClearGlobal=Module["__PyPathConfig_ClearGlobal"]=wasmExports["_PyPathConfig_ClearGlobal"])();var _wcscpy=Module["_wcscpy"]=(a0,a1)=>(_wcscpy=Module["_wcscpy"]=wasmExports["wcscpy"])(a0,a1);var _Py_SetPath=Module["_Py_SetPath"]=a0=>(_Py_SetPath=Module["_Py_SetPath"]=wasmExports["Py_SetPath"])(a0);var _Py_SetPythonHome=Module["_Py_SetPythonHome"]=a0=>(_Py_SetPythonHome=Module["_Py_SetPythonHome"]=wasmExports["Py_SetPythonHome"])(a0);var _Py_SetProgramName=Module["_Py_SetProgramName"]=a0=>(_Py_SetProgramName=Module["_Py_SetProgramName"]=wasmExports["Py_SetProgramName"])(a0);var __Py_SetProgramFullPath=Module["__Py_SetProgramFullPath"]=a0=>(__Py_SetProgramFullPath=Module["__Py_SetProgramFullPath"]=wasmExports["_Py_SetProgramFullPath"])(a0);var _Py_GetPath=Module["_Py_GetPath"]=()=>(_Py_GetPath=Module["_Py_GetPath"]=wasmExports["Py_GetPath"])();var _Py_GetPrefix=Module["_Py_GetPrefix"]=()=>(_Py_GetPrefix=Module["_Py_GetPrefix"]=wasmExports["Py_GetPrefix"])();var _Py_GetExecPrefix=Module["_Py_GetExecPrefix"]=()=>(_Py_GetExecPrefix=Module["_Py_GetExecPrefix"]=wasmExports["Py_GetExecPrefix"])();var _Py_GetProgramFullPath=Module["_Py_GetProgramFullPath"]=()=>(_Py_GetProgramFullPath=Module["_Py_GetProgramFullPath"]=wasmExports["Py_GetProgramFullPath"])();var _Py_GetPythonHome=Module["_Py_GetPythonHome"]=()=>(_Py_GetPythonHome=Module["_Py_GetPythonHome"]=wasmExports["Py_GetPythonHome"])();var _Py_GetProgramName=Module["_Py_GetProgramName"]=()=>(_Py_GetProgramName=Module["_Py_GetProgramName"]=wasmExports["Py_GetProgramName"])();var __Py_wgetcwd=Module["__Py_wgetcwd"]=(a0,a1)=>(__Py_wgetcwd=Module["__Py_wgetcwd"]=wasmExports["_Py_wgetcwd"])(a0,a1);var __Py_wreadlink=Module["__Py_wreadlink"]=(a0,a1,a2)=>(__Py_wreadlink=Module["__Py_wreadlink"]=wasmExports["_Py_wreadlink"])(a0,a1,a2);var _wcsrchr=Module["_wcsrchr"]=(a0,a1)=>(_wcsrchr=Module["_wcsrchr"]=wasmExports["wcsrchr"])(a0,a1);var _wcsncpy=Module["_wcsncpy"]=(a0,a1,a2)=>(_wcsncpy=Module["_wcsncpy"]=wasmExports["wcsncpy"])(a0,a1,a2);var __Py_wrealpath=Module["__Py_wrealpath"]=(a0,a1,a2)=>(__Py_wrealpath=Module["__Py_wrealpath"]=wasmExports["_Py_wrealpath"])(a0,a1,a2);var _wcsncmp=Module["_wcsncmp"]=(a0,a1,a2)=>(_wcsncmp=Module["_wcsncmp"]=wasmExports["wcsncmp"])(a0,a1,a2);var __PyPreConfig_InitCompatConfig=Module["__PyPreConfig_InitCompatConfig"]=a0=>(__PyPreConfig_InitCompatConfig=Module["__PyPreConfig_InitCompatConfig"]=wasmExports["_PyPreConfig_InitCompatConfig"])(a0);var _PyPreConfig_InitIsolatedConfig=Module["_PyPreConfig_InitIsolatedConfig"]=a0=>(_PyPreConfig_InitIsolatedConfig=Module["_PyPreConfig_InitIsolatedConfig"]=wasmExports["PyPreConfig_InitIsolatedConfig"])(a0);var __Py_SetLocaleFromEnv=Module["__Py_SetLocaleFromEnv"]=a0=>(__Py_SetLocaleFromEnv=Module["__Py_SetLocaleFromEnv"]=wasmExports["_Py_SetLocaleFromEnv"])(a0);var __Py_LegacyLocaleDetected=Module["__Py_LegacyLocaleDetected"]=a0=>(__Py_LegacyLocaleDetected=Module["__Py_LegacyLocaleDetected"]=wasmExports["_Py_LegacyLocaleDetected"])(a0);var __Py_CoerceLegacyLocale=Module["__Py_CoerceLegacyLocale"]=a0=>(__Py_CoerceLegacyLocale=Module["__Py_CoerceLegacyLocale"]=wasmExports["_Py_CoerceLegacyLocale"])(a0);var _PyHash_GetFuncDef=Module["_PyHash_GetFuncDef"]=()=>(_PyHash_GetFuncDef=Module["_PyHash_GetFuncDef"]=wasmExports["PyHash_GetFuncDef"])();var __PyRuntimeState_Init=Module["__PyRuntimeState_Init"]=(a0,a1)=>(__PyRuntimeState_Init=Module["__PyRuntimeState_Init"]=wasmExports["_PyRuntimeState_Init"])(a0,a1);var __PyRuntime_Finalize=Module["__PyRuntime_Finalize"]=()=>(__PyRuntime_Finalize=Module["__PyRuntime_Finalize"]=wasmExports["_PyRuntime_Finalize"])();var __PyRuntimeState_Fini=Module["__PyRuntimeState_Fini"]=a0=>(__PyRuntimeState_Fini=Module["__PyRuntimeState_Fini"]=wasmExports["_PyRuntimeState_Fini"])(a0);var __Py_IsFinalizing=Module["__Py_IsFinalizing"]=()=>(__Py_IsFinalizing=Module["__Py_IsFinalizing"]=wasmExports["_Py_IsFinalizing"])();var __Py_IsCoreInitialized=Module["__Py_IsCoreInitialized"]=()=>(__Py_IsCoreInitialized=Module["__Py_IsCoreInitialized"]=wasmExports["_Py_IsCoreInitialized"])();var _nl_langinfo=Module["_nl_langinfo"]=a0=>(_nl_langinfo=Module["_nl_langinfo"]=wasmExports["nl_langinfo"])(a0);var __Py_ResetForceASCII=Module["__Py_ResetForceASCII"]=()=>(__Py_ResetForceASCII=Module["__Py_ResetForceASCII"]=wasmExports["_Py_ResetForceASCII"])();var _setenv=Module["_setenv"]=(a0,a1,a2)=>(_setenv=Module["_setenv"]=wasmExports["setenv"])(a0,a1,a2);var __PyInterpreterState_SetConfig=Module["__PyInterpreterState_SetConfig"]=a0=>(__PyInterpreterState_SetConfig=Module["__PyInterpreterState_SetConfig"]=wasmExports["_PyInterpreterState_SetConfig"])(a0);var __Py_PreInitializeFromPyArgv=Module["__Py_PreInitializeFromPyArgv"]=(a0,a1,a2)=>(__Py_PreInitializeFromPyArgv=Module["__Py_PreInitializeFromPyArgv"]=wasmExports["_Py_PreInitializeFromPyArgv"])(a0,a1,a2);var _Py_PreInitializeFromArgs=Module["_Py_PreInitializeFromArgs"]=(a0,a1,a2,a3)=>(_Py_PreInitializeFromArgs=Module["_Py_PreInitializeFromArgs"]=wasmExports["Py_PreInitializeFromArgs"])(a0,a1,a2,a3);var _Py_PreInitialize=Module["_Py_PreInitialize"]=(a0,a1)=>(_Py_PreInitialize=Module["_Py_PreInitialize"]=wasmExports["Py_PreInitialize"])(a0,a1);var _Py_InitializeEx=Module["_Py_InitializeEx"]=a0=>(_Py_InitializeEx=Module["_Py_InitializeEx"]=wasmExports["Py_InitializeEx"])(a0);var _Py_FatalError=Module["_Py_FatalError"]=a0=>(_Py_FatalError=Module["_Py_FatalError"]=wasmExports["Py_FatalError"])(a0);var _Py_Initialize=Module["_Py_Initialize"]=()=>(_Py_Initialize=Module["_Py_Initialize"]=wasmExports["Py_Initialize"])();var __Py_InitializeMain=Module["__Py_InitializeMain"]=a0=>(__Py_InitializeMain=Module["__Py_InitializeMain"]=wasmExports["_Py_InitializeMain"])(a0);var _PyGC_Collect=Module["_PyGC_Collect"]=()=>(_PyGC_Collect=Module["_PyGC_Collect"]=wasmExports["PyGC_Collect"])();var _PyInterpreterState_Delete=Module["_PyInterpreterState_Delete"]=a0=>(_PyInterpreterState_Delete=Module["_PyInterpreterState_Delete"]=wasmExports["PyInterpreterState_Delete"])(a0);var _Py_Finalize=Module["_Py_Finalize"]=()=>(_Py_Finalize=Module["_Py_Finalize"]=wasmExports["Py_Finalize"])();var _Py_NewInterpreterFromConfig=Module["_Py_NewInterpreterFromConfig"]=(a0,a1,a2)=>(_Py_NewInterpreterFromConfig=Module["_Py_NewInterpreterFromConfig"]=wasmExports["Py_NewInterpreterFromConfig"])(a0,a1,a2);var _PyInterpreterState_New=Module["_PyInterpreterState_New"]=()=>(_PyInterpreterState_New=Module["_PyInterpreterState_New"]=wasmExports["PyInterpreterState_New"])();var __PyThreadState_New=Module["__PyThreadState_New"]=a0=>(__PyThreadState_New=Module["__PyThreadState_New"]=wasmExports["_PyThreadState_New"])(a0);var __PyThreadState_Bind=Module["__PyThreadState_Bind"]=a0=>(__PyThreadState_Bind=Module["__PyThreadState_Bind"]=wasmExports["_PyThreadState_Bind"])(a0);var _PyErr_PrintEx=Module["_PyErr_PrintEx"]=a0=>(_PyErr_PrintEx=Module["_PyErr_PrintEx"]=wasmExports["PyErr_PrintEx"])(a0);var _Py_NewInterpreter=Module["_Py_NewInterpreter"]=()=>(_Py_NewInterpreter=Module["_Py_NewInterpreter"]=wasmExports["Py_NewInterpreter"])();var _Py_EndInterpreter=Module["_Py_EndInterpreter"]=a0=>(_Py_EndInterpreter=Module["_Py_EndInterpreter"]=wasmExports["Py_EndInterpreter"])(a0);var __Py_DumpExtensionModules=Module["__Py_DumpExtensionModules"]=(a0,a1)=>(__Py_DumpExtensionModules=Module["__Py_DumpExtensionModules"]=wasmExports["_Py_DumpExtensionModules"])(a0,a1);var __Py_write_noraise=Module["__Py_write_noraise"]=(a0,a1,a2)=>(__Py_write_noraise=Module["__Py_write_noraise"]=wasmExports["_Py_write_noraise"])(a0,a1,a2);var __Py_DumpASCII=Module["__Py_DumpASCII"]=(a0,a1)=>(__Py_DumpASCII=Module["__Py_DumpASCII"]=wasmExports["_Py_DumpASCII"])(a0,a1);var __Py_DumpDecimal=Module["__Py_DumpDecimal"]=(a0,a1)=>(__Py_DumpDecimal=Module["__Py_DumpDecimal"]=wasmExports["_Py_DumpDecimal"])(a0,a1);var __Py_DumpHexadecimal=Module["__Py_DumpHexadecimal"]=(a0,a1,a2)=>(__Py_DumpHexadecimal=Module["__Py_DumpHexadecimal"]=wasmExports["_Py_DumpHexadecimal"])(a0,a1,a2);var __Py_DumpTracebackThreads=Module["__Py_DumpTracebackThreads"]=(a0,a1,a2)=>(__Py_DumpTracebackThreads=Module["__Py_DumpTracebackThreads"]=wasmExports["_Py_DumpTracebackThreads"])(a0,a1,a2);var _vfprintf=Module["_vfprintf"]=(a0,a1,a2)=>(_vfprintf=Module["_vfprintf"]=wasmExports["vfprintf"])(a0,a1,a2);var __Py_FatalRefcountErrorFunc=Module["__Py_FatalRefcountErrorFunc"]=(a0,a1)=>(__Py_FatalRefcountErrorFunc=Module["__Py_FatalRefcountErrorFunc"]=wasmExports["_Py_FatalRefcountErrorFunc"])(a0,a1);var _Py_AtExit=Module["_Py_AtExit"]=a0=>(_Py_AtExit=Module["_Py_AtExit"]=wasmExports["Py_AtExit"])(a0);var _Py_Exit=Module["_Py_Exit"]=a0=>(_Py_Exit=Module["_Py_Exit"]=wasmExports["Py_Exit"])(a0);var _Py_FdIsInteractive=Module["_Py_FdIsInteractive"]=(a0,a1)=>(_Py_FdIsInteractive=Module["_Py_FdIsInteractive"]=wasmExports["Py_FdIsInteractive"])(a0,a1);var __Py_FdIsInteractive=Module["__Py_FdIsInteractive"]=(a0,a1)=>(__Py_FdIsInteractive=Module["__Py_FdIsInteractive"]=wasmExports["_Py_FdIsInteractive"])(a0,a1);var _PyOS_getsig=Module["_PyOS_getsig"]=a0=>(_PyOS_getsig=Module["_PyOS_getsig"]=wasmExports["PyOS_getsig"])(a0);var _signal=Module["_signal"]=(a0,a1)=>(_signal=Module["_signal"]=wasmExports["signal"])(a0,a1);var _PyOS_setsig=Module["_PyOS_setsig"]=(a0,a1)=>(_PyOS_setsig=Module["_PyOS_setsig"]=wasmExports["PyOS_setsig"])(a0,a1);var _siginterrupt=Module["_siginterrupt"]=(a0,a1)=>(_siginterrupt=Module["_siginterrupt"]=wasmExports["siginterrupt"])(a0,a1);var __PyInterpreterState_Enable=Module["__PyInterpreterState_Enable"]=(a0,a1)=>(__PyInterpreterState_Enable=Module["__PyInterpreterState_Enable"]=wasmExports["_PyInterpreterState_Enable"])(a0,a1);var __PyTraceMalloc_Start=Module["__PyTraceMalloc_Start"]=a0=>(__PyTraceMalloc_Start=Module["__PyTraceMalloc_Start"]=wasmExports["_PyTraceMalloc_Start"])(a0);var _PySys_SetObject=Module["_PySys_SetObject"]=(a0,a1)=>(_PySys_SetObject=Module["_PySys_SetObject"]=wasmExports["PySys_SetObject"])(a0,a1);var _fcntl=Module["_fcntl"]=(a0,a1,a2)=>(_fcntl=Module["_fcntl"]=wasmExports["fcntl"])(a0,a1,a2);var _PyOS_mystrnicmp=Module["_PyOS_mystrnicmp"]=(a0,a1,a2)=>(_PyOS_mystrnicmp=Module["_PyOS_mystrnicmp"]=wasmExports["PyOS_mystrnicmp"])(a0,a1,a2);var __PyThreadState_GetCurrent=Module["__PyThreadState_GetCurrent"]=()=>(__PyThreadState_GetCurrent=Module["__PyThreadState_GetCurrent"]=wasmExports["_PyThreadState_GetCurrent"])();var _PyThread_tss_create=Module["_PyThread_tss_create"]=a0=>(_PyThread_tss_create=Module["_PyThread_tss_create"]=wasmExports["PyThread_tss_create"])(a0);var _PyThread_tss_delete=Module["_PyThread_tss_delete"]=a0=>(_PyThread_tss_delete=Module["_PyThread_tss_delete"]=wasmExports["PyThread_tss_delete"])(a0);var _PyInterpreterState_Clear=Module["_PyInterpreterState_Clear"]=a0=>(_PyInterpreterState_Clear=Module["_PyInterpreterState_Clear"]=wasmExports["PyInterpreterState_Clear"])(a0);var __PyThreadState_Swap=Module["__PyThreadState_Swap"]=(a0,a1)=>(__PyThreadState_Swap=Module["__PyThreadState_Swap"]=wasmExports["_PyThreadState_Swap"])(a0,a1);var __PyInterpreterState_SetRunningMain=Module["__PyInterpreterState_SetRunningMain"]=a0=>(__PyInterpreterState_SetRunningMain=Module["__PyInterpreterState_SetRunningMain"]=wasmExports["_PyInterpreterState_SetRunningMain"])(a0);var __PyInterpreterState_SetNotRunningMain=Module["__PyInterpreterState_SetNotRunningMain"]=a0=>(__PyInterpreterState_SetNotRunningMain=Module["__PyInterpreterState_SetNotRunningMain"]=wasmExports["_PyInterpreterState_SetNotRunningMain"])(a0);var __PyInterpreterState_IsRunningMain=Module["__PyInterpreterState_IsRunningMain"]=a0=>(__PyInterpreterState_IsRunningMain=Module["__PyInterpreterState_IsRunningMain"]=wasmExports["_PyInterpreterState_IsRunningMain"])(a0);var __PyInterpreterState_RequiresIDRef=Module["__PyInterpreterState_RequiresIDRef"]=a0=>(__PyInterpreterState_RequiresIDRef=Module["__PyInterpreterState_RequiresIDRef"]=wasmExports["_PyInterpreterState_RequiresIDRef"])(a0);var __PyInterpreterState_RequireIDRef=Module["__PyInterpreterState_RequireIDRef"]=(a0,a1)=>(__PyInterpreterState_RequireIDRef=Module["__PyInterpreterState_RequireIDRef"]=wasmExports["_PyInterpreterState_RequireIDRef"])(a0,a1);var __PyInterpreterState_GetMainModule=Module["__PyInterpreterState_GetMainModule"]=a0=>(__PyInterpreterState_GetMainModule=Module["__PyInterpreterState_GetMainModule"]=wasmExports["_PyInterpreterState_GetMainModule"])(a0);var _PyInterpreterState_GetDict=Module["_PyInterpreterState_GetDict"]=a0=>(_PyInterpreterState_GetDict=Module["_PyInterpreterState_GetDict"]=wasmExports["PyInterpreterState_GetDict"])(a0);var __PyThreadState_Prealloc=Module["__PyThreadState_Prealloc"]=a0=>(__PyThreadState_Prealloc=Module["__PyThreadState_Prealloc"]=wasmExports["_PyThreadState_Prealloc"])(a0);var __PyThreadState_Init=Module["__PyThreadState_Init"]=a0=>(__PyThreadState_Init=Module["__PyThreadState_Init"]=wasmExports["_PyThreadState_Init"])(a0);var __PyThreadState_DeleteCurrent=Module["__PyThreadState_DeleteCurrent"]=a0=>(__PyThreadState_DeleteCurrent=Module["__PyThreadState_DeleteCurrent"]=wasmExports["_PyThreadState_DeleteCurrent"])(a0);var _PyThreadState_DeleteCurrent=Module["_PyThreadState_DeleteCurrent"]=()=>(_PyThreadState_DeleteCurrent=Module["_PyThreadState_DeleteCurrent"]=wasmExports["PyThreadState_DeleteCurrent"])();var __PyThreadState_GetDict=Module["__PyThreadState_GetDict"]=a0=>(__PyThreadState_GetDict=Module["__PyThreadState_GetDict"]=wasmExports["_PyThreadState_GetDict"])(a0);var _PyThreadState_GetInterpreter=Module["_PyThreadState_GetInterpreter"]=a0=>(_PyThreadState_GetInterpreter=Module["_PyThreadState_GetInterpreter"]=wasmExports["PyThreadState_GetInterpreter"])(a0);var _PyThreadState_GetID=Module["_PyThreadState_GetID"]=a0=>(_PyThreadState_GetID=Module["_PyThreadState_GetID"]=wasmExports["PyThreadState_GetID"])(a0);var _PyThreadState_SetAsyncExc=Module["_PyThreadState_SetAsyncExc"]=(a0,a1)=>(_PyThreadState_SetAsyncExc=Module["_PyThreadState_SetAsyncExc"]=wasmExports["PyThreadState_SetAsyncExc"])(a0,a1);var _PyInterpreterState_Head=Module["_PyInterpreterState_Head"]=()=>(_PyInterpreterState_Head=Module["_PyInterpreterState_Head"]=wasmExports["PyInterpreterState_Head"])();var _PyInterpreterState_Main=Module["_PyInterpreterState_Main"]=()=>(_PyInterpreterState_Main=Module["_PyInterpreterState_Main"]=wasmExports["PyInterpreterState_Main"])();var _PyInterpreterState_Next=Module["_PyInterpreterState_Next"]=a0=>(_PyInterpreterState_Next=Module["_PyInterpreterState_Next"]=wasmExports["PyInterpreterState_Next"])(a0);var __PyThread_CurrentFrames=Module["__PyThread_CurrentFrames"]=()=>(__PyThread_CurrentFrames=Module["__PyThread_CurrentFrames"]=wasmExports["_PyThread_CurrentFrames"])();var __PyThread_CurrentExceptions=Module["__PyThread_CurrentExceptions"]=()=>(__PyThread_CurrentExceptions=Module["__PyThread_CurrentExceptions"]=wasmExports["_PyThread_CurrentExceptions"])();var __PyGILState_GetInterpreterStateUnsafe=Module["__PyGILState_GetInterpreterStateUnsafe"]=()=>(__PyGILState_GetInterpreterStateUnsafe=Module["__PyGILState_GetInterpreterStateUnsafe"]=wasmExports["_PyGILState_GetInterpreterStateUnsafe"])();var __PyCrossInterpreterData_Init=Module["__PyCrossInterpreterData_Init"]=(a0,a1,a2,a3,a4)=>(__PyCrossInterpreterData_Init=Module["__PyCrossInterpreterData_Init"]=wasmExports["_PyCrossInterpreterData_Init"])(a0,a1,a2,a3,a4);var __PyCrossInterpreterData_InitWithSize=Module["__PyCrossInterpreterData_InitWithSize"]=(a0,a1,a2,a3,a4)=>(__PyCrossInterpreterData_InitWithSize=Module["__PyCrossInterpreterData_InitWithSize"]=wasmExports["_PyCrossInterpreterData_InitWithSize"])(a0,a1,a2,a3,a4);var __PyCrossInterpreterData_Clear=Module["__PyCrossInterpreterData_Clear"]=(a0,a1)=>(__PyCrossInterpreterData_Clear=Module["__PyCrossInterpreterData_Clear"]=wasmExports["_PyCrossInterpreterData_Clear"])(a0,a1);var __PyObject_CheckCrossInterpreterData=Module["__PyObject_CheckCrossInterpreterData"]=a0=>(__PyObject_CheckCrossInterpreterData=Module["__PyObject_CheckCrossInterpreterData"]=wasmExports["_PyObject_CheckCrossInterpreterData"])(a0);var __PyObject_GetCrossInterpreterData=Module["__PyObject_GetCrossInterpreterData"]=(a0,a1)=>(__PyObject_GetCrossInterpreterData=Module["__PyObject_GetCrossInterpreterData"]=wasmExports["_PyObject_GetCrossInterpreterData"])(a0,a1);var __PyCrossInterpreterData_Release=Module["__PyCrossInterpreterData_Release"]=a0=>(__PyCrossInterpreterData_Release=Module["__PyCrossInterpreterData_Release"]=wasmExports["_PyCrossInterpreterData_Release"])(a0);var __PyCrossInterpreterData_NewObject=Module["__PyCrossInterpreterData_NewObject"]=a0=>(__PyCrossInterpreterData_NewObject=Module["__PyCrossInterpreterData_NewObject"]=wasmExports["_PyCrossInterpreterData_NewObject"])(a0);var __PyCrossInterpreterData_ReleaseAndRawFree=Module["__PyCrossInterpreterData_ReleaseAndRawFree"]=a0=>(__PyCrossInterpreterData_ReleaseAndRawFree=Module["__PyCrossInterpreterData_ReleaseAndRawFree"]=wasmExports["_PyCrossInterpreterData_ReleaseAndRawFree"])(a0);var __PyCrossInterpreterData_RegisterClass=Module["__PyCrossInterpreterData_RegisterClass"]=(a0,a1)=>(__PyCrossInterpreterData_RegisterClass=Module["__PyCrossInterpreterData_RegisterClass"]=wasmExports["_PyCrossInterpreterData_RegisterClass"])(a0,a1);var __PyCrossInterpreterData_UnregisterClass=Module["__PyCrossInterpreterData_UnregisterClass"]=a0=>(__PyCrossInterpreterData_UnregisterClass=Module["__PyCrossInterpreterData_UnregisterClass"]=wasmExports["_PyCrossInterpreterData_UnregisterClass"])(a0);var __PyCrossInterpreterData_Lookup=Module["__PyCrossInterpreterData_Lookup"]=a0=>(__PyCrossInterpreterData_Lookup=Module["__PyCrossInterpreterData_Lookup"]=wasmExports["_PyCrossInterpreterData_Lookup"])(a0);var __PyInterpreterState_GetEvalFrameFunc=Module["__PyInterpreterState_GetEvalFrameFunc"]=a0=>(__PyInterpreterState_GetEvalFrameFunc=Module["__PyInterpreterState_GetEvalFrameFunc"]=wasmExports["_PyInterpreterState_GetEvalFrameFunc"])(a0);var __PyInterpreterState_SetEvalFrameFunc=Module["__PyInterpreterState_SetEvalFrameFunc"]=(a0,a1)=>(__PyInterpreterState_SetEvalFrameFunc=Module["__PyInterpreterState_SetEvalFrameFunc"]=wasmExports["_PyInterpreterState_SetEvalFrameFunc"])(a0,a1);var __PyInterpreterState_GetConfigCopy=Module["__PyInterpreterState_GetConfigCopy"]=a0=>(__PyInterpreterState_GetConfigCopy=Module["__PyInterpreterState_GetConfigCopy"]=wasmExports["_PyInterpreterState_GetConfigCopy"])(a0);var __PyRun_AnyFileObject=Module["__PyRun_AnyFileObject"]=(a0,a1,a2,a3)=>(__PyRun_AnyFileObject=Module["__PyRun_AnyFileObject"]=wasmExports["_PyRun_AnyFileObject"])(a0,a1,a2,a3);var __PyRun_InteractiveLoopObject=Module["__PyRun_InteractiveLoopObject"]=(a0,a1,a2)=>(__PyRun_InteractiveLoopObject=Module["__PyRun_InteractiveLoopObject"]=wasmExports["_PyRun_InteractiveLoopObject"])(a0,a1,a2);var __PyRun_SimpleFileObject=Module["__PyRun_SimpleFileObject"]=(a0,a1,a2,a3)=>(__PyRun_SimpleFileObject=Module["__PyRun_SimpleFileObject"]=wasmExports["_PyRun_SimpleFileObject"])(a0,a1,a2,a3);var _rewind=Module["_rewind"]=a0=>(_rewind=Module["_rewind"]=wasmExports["rewind"])(a0);var _PyRun_InteractiveLoopFlags=Module["_PyRun_InteractiveLoopFlags"]=(a0,a1,a2)=>(_PyRun_InteractiveLoopFlags=Module["_PyRun_InteractiveLoopFlags"]=wasmExports["PyRun_InteractiveLoopFlags"])(a0,a1,a2);var _PyRun_InteractiveOneObject=Module["_PyRun_InteractiveOneObject"]=(a0,a1,a2)=>(_PyRun_InteractiveOneObject=Module["_PyRun_InteractiveOneObject"]=wasmExports["PyRun_InteractiveOneObject"])(a0,a1,a2);var _PyRun_InteractiveOneFlags=Module["_PyRun_InteractiveOneFlags"]=(a0,a1,a2)=>(_PyRun_InteractiveOneFlags=Module["_PyRun_InteractiveOneFlags"]=wasmExports["PyRun_InteractiveOneFlags"])(a0,a1,a2);var _PyRun_SimpleFileExFlags=Module["_PyRun_SimpleFileExFlags"]=(a0,a1,a2,a3)=>(_PyRun_SimpleFileExFlags=Module["_PyRun_SimpleFileExFlags"]=wasmExports["PyRun_SimpleFileExFlags"])(a0,a1,a2,a3);var _PyRun_SimpleStringFlags=Module["_PyRun_SimpleStringFlags"]=(a0,a1)=>(_PyRun_SimpleStringFlags=Module["_PyRun_SimpleStringFlags"]=wasmExports["PyRun_SimpleStringFlags"])(a0,a1);var __Py_HandleSystemExit=Module["__Py_HandleSystemExit"]=a0=>(__Py_HandleSystemExit=Module["__Py_HandleSystemExit"]=wasmExports["_Py_HandleSystemExit"])(a0);var _PyErr_Display=Module["_PyErr_Display"]=(a0,a1,a2)=>(_PyErr_Display=Module["_PyErr_Display"]=wasmExports["PyErr_Display"])(a0,a1,a2);var __PyErr_Display=Module["__PyErr_Display"]=(a0,a1,a2,a3)=>(__PyErr_Display=Module["__PyErr_Display"]=wasmExports["_PyErr_Display"])(a0,a1,a2,a3);var __Py_WriteIndentedMargin=Module["__Py_WriteIndentedMargin"]=(a0,a1,a2)=>(__Py_WriteIndentedMargin=Module["__Py_WriteIndentedMargin"]=wasmExports["_Py_WriteIndentedMargin"])(a0,a1,a2);var __Py_WriteIndent=Module["__Py_WriteIndent"]=(a0,a1)=>(__Py_WriteIndent=Module["__Py_WriteIndent"]=wasmExports["_Py_WriteIndent"])(a0,a1);var __PyErr_DisplayException=Module["__PyErr_DisplayException"]=(a0,a1)=>(__PyErr_DisplayException=Module["__PyErr_DisplayException"]=wasmExports["_PyErr_DisplayException"])(a0,a1);var _PyRun_FileExFlags=Module["_PyRun_FileExFlags"]=(a0,a1,a2,a3,a4,a5,a6)=>(_PyRun_FileExFlags=Module["_PyRun_FileExFlags"]=wasmExports["PyRun_FileExFlags"])(a0,a1,a2,a3,a4,a5,a6);var _Py_CompileStringExFlags=Module["_Py_CompileStringExFlags"]=(a0,a1,a2,a3,a4)=>(_Py_CompileStringExFlags=Module["_Py_CompileStringExFlags"]=wasmExports["Py_CompileStringExFlags"])(a0,a1,a2,a3,a4);var _PyRun_AnyFile=Module["_PyRun_AnyFile"]=(a0,a1)=>(_PyRun_AnyFile=Module["_PyRun_AnyFile"]=wasmExports["PyRun_AnyFile"])(a0,a1);var _PyRun_AnyFileEx=Module["_PyRun_AnyFileEx"]=(a0,a1,a2)=>(_PyRun_AnyFileEx=Module["_PyRun_AnyFileEx"]=wasmExports["PyRun_AnyFileEx"])(a0,a1,a2);var _PyRun_AnyFileFlags=Module["_PyRun_AnyFileFlags"]=(a0,a1,a2)=>(_PyRun_AnyFileFlags=Module["_PyRun_AnyFileFlags"]=wasmExports["PyRun_AnyFileFlags"])(a0,a1,a2);var _PyRun_File=Module["_PyRun_File"]=(a0,a1,a2,a3,a4)=>(_PyRun_File=Module["_PyRun_File"]=wasmExports["PyRun_File"])(a0,a1,a2,a3,a4);var _PyRun_FileEx=Module["_PyRun_FileEx"]=(a0,a1,a2,a3,a4,a5)=>(_PyRun_FileEx=Module["_PyRun_FileEx"]=wasmExports["PyRun_FileEx"])(a0,a1,a2,a3,a4,a5);var _PyRun_FileFlags=Module["_PyRun_FileFlags"]=(a0,a1,a2,a3,a4,a5)=>(_PyRun_FileFlags=Module["_PyRun_FileFlags"]=wasmExports["PyRun_FileFlags"])(a0,a1,a2,a3,a4,a5);var _PyRun_SimpleFile=Module["_PyRun_SimpleFile"]=(a0,a1)=>(_PyRun_SimpleFile=Module["_PyRun_SimpleFile"]=wasmExports["PyRun_SimpleFile"])(a0,a1);var _PyRun_SimpleFileEx=Module["_PyRun_SimpleFileEx"]=(a0,a1,a2)=>(_PyRun_SimpleFileEx=Module["_PyRun_SimpleFileEx"]=wasmExports["PyRun_SimpleFileEx"])(a0,a1,a2);var _PyRun_String=Module["_PyRun_String"]=(a0,a1,a2,a3)=>(_PyRun_String=Module["_PyRun_String"]=wasmExports["PyRun_String"])(a0,a1,a2,a3);var _PyRun_SimpleString=Module["_PyRun_SimpleString"]=a0=>(_PyRun_SimpleString=Module["_PyRun_SimpleString"]=wasmExports["PyRun_SimpleString"])(a0);var _Py_CompileString=Module["_Py_CompileString"]=(a0,a1,a2)=>(_Py_CompileString=Module["_Py_CompileString"]=wasmExports["Py_CompileString"])(a0,a1,a2);var _Py_CompileStringFlags=Module["_Py_CompileStringFlags"]=(a0,a1,a2,a3)=>(_Py_CompileStringFlags=Module["_Py_CompileStringFlags"]=wasmExports["Py_CompileStringFlags"])(a0,a1,a2,a3);var _PyRun_InteractiveOne=Module["_PyRun_InteractiveOne"]=(a0,a1)=>(_PyRun_InteractiveOne=Module["_PyRun_InteractiveOne"]=wasmExports["PyRun_InteractiveOne"])(a0,a1);var _PyRun_InteractiveLoop=Module["_PyRun_InteractiveLoop"]=(a0,a1)=>(_PyRun_InteractiveLoop=Module["_PyRun_InteractiveLoop"]=wasmExports["PyRun_InteractiveLoop"])(a0,a1);var __PyTraceBack_Print_Indented=Module["__PyTraceBack_Print_Indented"]=(a0,a1,a2,a3,a4,a5)=>(__PyTraceBack_Print_Indented=Module["__PyTraceBack_Print_Indented"]=wasmExports["_PyTraceBack_Print_Indented"])(a0,a1,a2,a3,a4,a5);var __PyTime_Add=Module["__PyTime_Add"]=(a0,a1)=>(__PyTime_Add=Module["__PyTime_Add"]=wasmExports["_PyTime_Add"])(a0,a1);var __PyTime_MulDiv=Module["__PyTime_MulDiv"]=(a0,a1,a2)=>(__PyTime_MulDiv=Module["__PyTime_MulDiv"]=wasmExports["_PyTime_MulDiv"])(a0,a1,a2);var __PyLong_AsTime_t=Module["__PyLong_AsTime_t"]=a0=>(__PyLong_AsTime_t=Module["__PyLong_AsTime_t"]=wasmExports["_PyLong_AsTime_t"])(a0);var __PyLong_FromTime_t=Module["__PyLong_FromTime_t"]=a0=>(__PyLong_FromTime_t=Module["__PyLong_FromTime_t"]=wasmExports["_PyLong_FromTime_t"])(a0);var __PyTime_ObjectToTime_t=Module["__PyTime_ObjectToTime_t"]=(a0,a1,a2)=>(__PyTime_ObjectToTime_t=Module["__PyTime_ObjectToTime_t"]=wasmExports["_PyTime_ObjectToTime_t"])(a0,a1,a2);var __PyTime_ObjectToTimespec=Module["__PyTime_ObjectToTimespec"]=(a0,a1,a2,a3)=>(__PyTime_ObjectToTimespec=Module["__PyTime_ObjectToTimespec"]=wasmExports["_PyTime_ObjectToTimespec"])(a0,a1,a2,a3);var __PyTime_ObjectToTimeval=Module["__PyTime_ObjectToTimeval"]=(a0,a1,a2,a3)=>(__PyTime_ObjectToTimeval=Module["__PyTime_ObjectToTimeval"]=wasmExports["_PyTime_ObjectToTimeval"])(a0,a1,a2,a3);var __PyTime_FromSeconds=Module["__PyTime_FromSeconds"]=a0=>(__PyTime_FromSeconds=Module["__PyTime_FromSeconds"]=wasmExports["_PyTime_FromSeconds"])(a0);var __PyTime_FromNanoseconds=Module["__PyTime_FromNanoseconds"]=a0=>(__PyTime_FromNanoseconds=Module["__PyTime_FromNanoseconds"]=wasmExports["_PyTime_FromNanoseconds"])(a0);var __PyTime_FromMicrosecondsClamp=Module["__PyTime_FromMicrosecondsClamp"]=a0=>(__PyTime_FromMicrosecondsClamp=Module["__PyTime_FromMicrosecondsClamp"]=wasmExports["_PyTime_FromMicrosecondsClamp"])(a0);var __PyTime_FromNanosecondsObject=Module["__PyTime_FromNanosecondsObject"]=(a0,a1)=>(__PyTime_FromNanosecondsObject=Module["__PyTime_FromNanosecondsObject"]=wasmExports["_PyTime_FromNanosecondsObject"])(a0,a1);var __PyTime_FromTimespec=Module["__PyTime_FromTimespec"]=(a0,a1)=>(__PyTime_FromTimespec=Module["__PyTime_FromTimespec"]=wasmExports["_PyTime_FromTimespec"])(a0,a1);var __PyTime_FromTimeval=Module["__PyTime_FromTimeval"]=(a0,a1)=>(__PyTime_FromTimeval=Module["__PyTime_FromTimeval"]=wasmExports["_PyTime_FromTimeval"])(a0,a1);var __PyTime_FromSecondsObject=Module["__PyTime_FromSecondsObject"]=(a0,a1,a2)=>(__PyTime_FromSecondsObject=Module["__PyTime_FromSecondsObject"]=wasmExports["_PyTime_FromSecondsObject"])(a0,a1,a2);var __PyTime_FromMillisecondsObject=Module["__PyTime_FromMillisecondsObject"]=(a0,a1,a2)=>(__PyTime_FromMillisecondsObject=Module["__PyTime_FromMillisecondsObject"]=wasmExports["_PyTime_FromMillisecondsObject"])(a0,a1,a2);var __PyTime_AsSecondsDouble=Module["__PyTime_AsSecondsDouble"]=a0=>(__PyTime_AsSecondsDouble=Module["__PyTime_AsSecondsDouble"]=wasmExports["_PyTime_AsSecondsDouble"])(a0);var __PyTime_AsNanosecondsObject=Module["__PyTime_AsNanosecondsObject"]=a0=>(__PyTime_AsNanosecondsObject=Module["__PyTime_AsNanosecondsObject"]=wasmExports["_PyTime_AsNanosecondsObject"])(a0);var __PyTime_AsNanoseconds=Module["__PyTime_AsNanoseconds"]=a0=>(__PyTime_AsNanoseconds=Module["__PyTime_AsNanoseconds"]=wasmExports["_PyTime_AsNanoseconds"])(a0);var __PyTime_AsMilliseconds=Module["__PyTime_AsMilliseconds"]=(a0,a1)=>(__PyTime_AsMilliseconds=Module["__PyTime_AsMilliseconds"]=wasmExports["_PyTime_AsMilliseconds"])(a0,a1);var __PyTime_AsTimeval=Module["__PyTime_AsTimeval"]=(a0,a1,a2)=>(__PyTime_AsTimeval=Module["__PyTime_AsTimeval"]=wasmExports["_PyTime_AsTimeval"])(a0,a1,a2);var __PyTime_AsTimeval_clamp=Module["__PyTime_AsTimeval_clamp"]=(a0,a1,a2)=>(__PyTime_AsTimeval_clamp=Module["__PyTime_AsTimeval_clamp"]=wasmExports["_PyTime_AsTimeval_clamp"])(a0,a1,a2);var __PyTime_AsTimevalTime_t=Module["__PyTime_AsTimevalTime_t"]=(a0,a1,a2,a3)=>(__PyTime_AsTimevalTime_t=Module["__PyTime_AsTimevalTime_t"]=wasmExports["_PyTime_AsTimevalTime_t"])(a0,a1,a2,a3);var __PyTime_AsTimespec_clamp=Module["__PyTime_AsTimespec_clamp"]=(a0,a1)=>(__PyTime_AsTimespec_clamp=Module["__PyTime_AsTimespec_clamp"]=wasmExports["_PyTime_AsTimespec_clamp"])(a0,a1);var __PyTime_AsTimespec=Module["__PyTime_AsTimespec"]=(a0,a1)=>(__PyTime_AsTimespec=Module["__PyTime_AsTimespec"]=wasmExports["_PyTime_AsTimespec"])(a0,a1);var __PyTime_GetSystemClock=Module["__PyTime_GetSystemClock"]=()=>(__PyTime_GetSystemClock=Module["__PyTime_GetSystemClock"]=wasmExports["_PyTime_GetSystemClock"])();var _clock_gettime=Module["_clock_gettime"]=(a0,a1)=>(_clock_gettime=Module["_clock_gettime"]=wasmExports["clock_gettime"])(a0,a1);var __PyTime_GetSystemClockWithInfo=Module["__PyTime_GetSystemClockWithInfo"]=(a0,a1)=>(__PyTime_GetSystemClockWithInfo=Module["__PyTime_GetSystemClockWithInfo"]=wasmExports["_PyTime_GetSystemClockWithInfo"])(a0,a1);var _clock_getres=Module["_clock_getres"]=(a0,a1)=>(_clock_getres=Module["_clock_getres"]=wasmExports["clock_getres"])(a0,a1);var __PyTime_GetMonotonicClock=Module["__PyTime_GetMonotonicClock"]=()=>(__PyTime_GetMonotonicClock=Module["__PyTime_GetMonotonicClock"]=wasmExports["_PyTime_GetMonotonicClock"])();var __PyTime_GetMonotonicClockWithInfo=Module["__PyTime_GetMonotonicClockWithInfo"]=(a0,a1)=>(__PyTime_GetMonotonicClockWithInfo=Module["__PyTime_GetMonotonicClockWithInfo"]=wasmExports["_PyTime_GetMonotonicClockWithInfo"])(a0,a1);var __PyTime_GetPerfCounterWithInfo=Module["__PyTime_GetPerfCounterWithInfo"]=(a0,a1)=>(__PyTime_GetPerfCounterWithInfo=Module["__PyTime_GetPerfCounterWithInfo"]=wasmExports["_PyTime_GetPerfCounterWithInfo"])(a0,a1);var __PyTime_localtime=Module["__PyTime_localtime"]=(a0,a1)=>(__PyTime_localtime=Module["__PyTime_localtime"]=wasmExports["_PyTime_localtime"])(a0,a1);var _localtime_r=Module["_localtime_r"]=(a0,a1)=>(_localtime_r=Module["_localtime_r"]=wasmExports["localtime_r"])(a0,a1);var __PyTime_gmtime=Module["__PyTime_gmtime"]=(a0,a1)=>(__PyTime_gmtime=Module["__PyTime_gmtime"]=wasmExports["_PyTime_gmtime"])(a0,a1);var _gmtime_r=Module["_gmtime_r"]=(a0,a1)=>(_gmtime_r=Module["_gmtime_r"]=wasmExports["gmtime_r"])(a0,a1);var __PyDeadline_Init=Module["__PyDeadline_Init"]=a0=>(__PyDeadline_Init=Module["__PyDeadline_Init"]=wasmExports["_PyDeadline_Init"])(a0);var __PyDeadline_Get=Module["__PyDeadline_Get"]=a0=>(__PyDeadline_Get=Module["__PyDeadline_Get"]=wasmExports["_PyDeadline_Get"])(a0);var __PyOS_URandom=Module["__PyOS_URandom"]=(a0,a1)=>(__PyOS_URandom=Module["__PyOS_URandom"]=wasmExports["_PyOS_URandom"])(a0,a1);var __Py_open=Module["__Py_open"]=(a0,a1)=>(__Py_open=Module["__Py_open"]=wasmExports["_Py_open"])(a0,a1);var _close=Module["_close"]=a0=>(_close=Module["_close"]=wasmExports["close"])(a0);var __Py_fstat=Module["__Py_fstat"]=(a0,a1)=>(__Py_fstat=Module["__Py_fstat"]=wasmExports["_Py_fstat"])(a0,a1);var __Py_read=Module["__Py_read"]=(a0,a1,a2)=>(__Py_read=Module["__Py_read"]=wasmExports["_Py_read"])(a0,a1,a2);var __Py_open_noraise=Module["__Py_open_noraise"]=(a0,a1)=>(__Py_open_noraise=Module["__Py_open_noraise"]=wasmExports["_Py_open_noraise"])(a0,a1);var _read=Module["_read"]=(a0,a1,a2)=>(_read=Module["_read"]=wasmExports["read"])(a0,a1,a2);var __PyOS_URandomNonblock=Module["__PyOS_URandomNonblock"]=(a0,a1)=>(__PyOS_URandomNonblock=Module["__PyOS_URandomNonblock"]=wasmExports["_PyOS_URandomNonblock"])(a0,a1);var _PySys_AddAuditHook=Module["_PySys_AddAuditHook"]=(a0,a1)=>(_PySys_AddAuditHook=Module["_PySys_AddAuditHook"]=wasmExports["PySys_AddAuditHook"])(a0,a1);var __PySys_GetSizeOf=Module["__PySys_GetSizeOf"]=a0=>(__PySys_GetSizeOf=Module["__PySys_GetSizeOf"]=wasmExports["_PySys_GetSizeOf"])(a0);var _PyUnstable_PerfMapState_Init=Module["_PyUnstable_PerfMapState_Init"]=()=>(_PyUnstable_PerfMapState_Init=Module["_PyUnstable_PerfMapState_Init"]=wasmExports["PyUnstable_PerfMapState_Init"])();var _getpid=Module["_getpid"]=()=>(_getpid=Module["_getpid"]=wasmExports["getpid"])();var _open=Module["_open"]=(a0,a1,a2)=>(_open=Module["_open"]=wasmExports["open"])(a0,a1,a2);var _PyUnstable_WritePerfMapEntry=Module["_PyUnstable_WritePerfMapEntry"]=(a0,a1,a2)=>(_PyUnstable_WritePerfMapEntry=Module["_PyUnstable_WritePerfMapEntry"]=wasmExports["PyUnstable_WritePerfMapEntry"])(a0,a1,a2);var _PyUnstable_PerfMapState_Fini=Module["_PyUnstable_PerfMapState_Fini"]=()=>(_PyUnstable_PerfMapState_Fini=Module["_PyUnstable_PerfMapState_Fini"]=wasmExports["PyUnstable_PerfMapState_Fini"])();var _PySys_ResetWarnOptions=Module["_PySys_ResetWarnOptions"]=()=>(_PySys_ResetWarnOptions=Module["_PySys_ResetWarnOptions"]=wasmExports["PySys_ResetWarnOptions"])();var _PySys_AddWarnOptionUnicode=Module["_PySys_AddWarnOptionUnicode"]=a0=>(_PySys_AddWarnOptionUnicode=Module["_PySys_AddWarnOptionUnicode"]=wasmExports["PySys_AddWarnOptionUnicode"])(a0);var _PySys_AddWarnOption=Module["_PySys_AddWarnOption"]=a0=>(_PySys_AddWarnOption=Module["_PySys_AddWarnOption"]=wasmExports["PySys_AddWarnOption"])(a0);var _PySys_HasWarnOptions=Module["_PySys_HasWarnOptions"]=()=>(_PySys_HasWarnOptions=Module["_PySys_HasWarnOptions"]=wasmExports["PySys_HasWarnOptions"])();var _PySys_AddXOption=Module["_PySys_AddXOption"]=a0=>(_PySys_AddXOption=Module["_PySys_AddXOption"]=wasmExports["PySys_AddXOption"])(a0);var _PySys_GetXOptions=Module["_PySys_GetXOptions"]=()=>(_PySys_GetXOptions=Module["_PySys_GetXOptions"]=wasmExports["PySys_GetXOptions"])();var _PyThread_GetInfo=Module["_PyThread_GetInfo"]=()=>(_PyThread_GetInfo=Module["_PyThread_GetInfo"]=wasmExports["PyThread_GetInfo"])();var _PySys_SetPath=Module["_PySys_SetPath"]=a0=>(_PySys_SetPath=Module["_PySys_SetPath"]=wasmExports["PySys_SetPath"])(a0);var _PySys_SetArgvEx=Module["_PySys_SetArgvEx"]=(a0,a1,a2)=>(_PySys_SetArgvEx=Module["_PySys_SetArgvEx"]=wasmExports["PySys_SetArgvEx"])(a0,a1,a2);var _PySys_SetArgv=Module["_PySys_SetArgv"]=(a0,a1)=>(_PySys_SetArgv=Module["_PySys_SetArgv"]=wasmExports["PySys_SetArgv"])(a0,a1);var _PySys_WriteStdout=Module["_PySys_WriteStdout"]=(a0,a1)=>(_PySys_WriteStdout=Module["_PySys_WriteStdout"]=wasmExports["PySys_WriteStdout"])(a0,a1);var _PySys_FormatStdout=Module["_PySys_FormatStdout"]=(a0,a1)=>(_PySys_FormatStdout=Module["_PySys_FormatStdout"]=wasmExports["PySys_FormatStdout"])(a0,a1);var _pthread_condattr_init=Module["_pthread_condattr_init"]=a0=>(_pthread_condattr_init=Module["_pthread_condattr_init"]=wasmExports["pthread_condattr_init"])(a0);var _pthread_condattr_setclock=Module["_pthread_condattr_setclock"]=(a0,a1)=>(_pthread_condattr_setclock=Module["_pthread_condattr_setclock"]=wasmExports["pthread_condattr_setclock"])(a0,a1);var _pthread_cond_init=Module["_pthread_cond_init"]=(a0,a1)=>(_pthread_cond_init=Module["_pthread_cond_init"]=wasmExports["pthread_cond_init"])(a0,a1);var _PyThread_start_new_thread=Module["_PyThread_start_new_thread"]=(a0,a1)=>(_PyThread_start_new_thread=Module["_PyThread_start_new_thread"]=wasmExports["PyThread_start_new_thread"])(a0,a1);var _pthread_attr_init=Module["_pthread_attr_init"]=a0=>(_pthread_attr_init=Module["_pthread_attr_init"]=wasmExports["pthread_attr_init"])(a0);var _pthread_attr_setstacksize=Module["_pthread_attr_setstacksize"]=(a0,a1)=>(_pthread_attr_setstacksize=Module["_pthread_attr_setstacksize"]=wasmExports["pthread_attr_setstacksize"])(a0,a1);var _pthread_attr_destroy=Module["_pthread_attr_destroy"]=a0=>(_pthread_attr_destroy=Module["_pthread_attr_destroy"]=wasmExports["pthread_attr_destroy"])(a0);var _pthread_create=Module["_pthread_create"]=(a0,a1,a2,a3)=>(_pthread_create=Module["_pthread_create"]=wasmExports["pthread_create"])(a0,a1,a2,a3);var _pthread_detach=Module["_pthread_detach"]=a0=>(_pthread_detach=Module["_pthread_detach"]=wasmExports["pthread_detach"])(a0);var _pthread_self=Module["_pthread_self"]=()=>(_pthread_self=Module["_pthread_self"]=wasmExports["pthread_self"])();var _pthread_exit=Module["_pthread_exit"]=a0=>(_pthread_exit=Module["_pthread_exit"]=wasmExports["pthread_exit"])(a0);var _PyThread_acquire_lock_timed=Module["_PyThread_acquire_lock_timed"]=(a0,a1,a2)=>(_PyThread_acquire_lock_timed=Module["_PyThread_acquire_lock_timed"]=wasmExports["PyThread_acquire_lock_timed"])(a0,a1,a2);var _pthread_mutex_trylock=Module["_pthread_mutex_trylock"]=a0=>(_pthread_mutex_trylock=Module["_pthread_mutex_trylock"]=wasmExports["pthread_mutex_trylock"])(a0);var _PyThread_create_key=Module["_PyThread_create_key"]=()=>(_PyThread_create_key=Module["_PyThread_create_key"]=wasmExports["PyThread_create_key"])();var _pthread_key_create=Module["_pthread_key_create"]=(a0,a1)=>(_pthread_key_create=Module["_pthread_key_create"]=wasmExports["pthread_key_create"])(a0,a1);var _pthread_key_delete=Module["_pthread_key_delete"]=a0=>(_pthread_key_delete=Module["_pthread_key_delete"]=wasmExports["pthread_key_delete"])(a0);var _PyThread_delete_key=Module["_PyThread_delete_key"]=a0=>(_PyThread_delete_key=Module["_PyThread_delete_key"]=wasmExports["PyThread_delete_key"])(a0);var _PyThread_delete_key_value=Module["_PyThread_delete_key_value"]=a0=>(_PyThread_delete_key_value=Module["_PyThread_delete_key_value"]=wasmExports["PyThread_delete_key_value"])(a0);var _pthread_setspecific=Module["_pthread_setspecific"]=(a0,a1)=>(_pthread_setspecific=Module["_pthread_setspecific"]=wasmExports["pthread_setspecific"])(a0,a1);var _PyThread_set_key_value=Module["_PyThread_set_key_value"]=(a0,a1)=>(_PyThread_set_key_value=Module["_PyThread_set_key_value"]=wasmExports["PyThread_set_key_value"])(a0,a1);var _PyThread_get_key_value=Module["_PyThread_get_key_value"]=a0=>(_PyThread_get_key_value=Module["_PyThread_get_key_value"]=wasmExports["PyThread_get_key_value"])(a0);var _pthread_getspecific=Module["_pthread_getspecific"]=a0=>(_pthread_getspecific=Module["_pthread_getspecific"]=wasmExports["pthread_getspecific"])(a0);var _PyThread_ReInitTLS=Module["_PyThread_ReInitTLS"]=()=>(_PyThread_ReInitTLS=Module["_PyThread_ReInitTLS"]=wasmExports["PyThread_ReInitTLS"])();var _PyThread_get_stacksize=Module["_PyThread_get_stacksize"]=()=>(_PyThread_get_stacksize=Module["_PyThread_get_stacksize"]=wasmExports["PyThread_get_stacksize"])();var _PyThread_set_stacksize=Module["_PyThread_set_stacksize"]=a0=>(_PyThread_set_stacksize=Module["_PyThread_set_stacksize"]=wasmExports["PyThread_set_stacksize"])(a0);var _PyThread_tss_alloc=Module["_PyThread_tss_alloc"]=()=>(_PyThread_tss_alloc=Module["_PyThread_tss_alloc"]=wasmExports["PyThread_tss_alloc"])();var _PyThread_tss_free=Module["_PyThread_tss_free"]=a0=>(_PyThread_tss_free=Module["_PyThread_tss_free"]=wasmExports["PyThread_tss_free"])(a0);var _confstr=Module["_confstr"]=(a0,a1,a2)=>(_confstr=Module["_confstr"]=wasmExports["confstr"])(a0,a1,a2);var __PyTraceback_Add=Module["__PyTraceback_Add"]=(a0,a1,a2)=>(__PyTraceback_Add=Module["__PyTraceback_Add"]=wasmExports["_PyTraceback_Add"])(a0,a1,a2);var __PyTraceMalloc_Init=Module["__PyTraceMalloc_Init"]=()=>(__PyTraceMalloc_Init=Module["__PyTraceMalloc_Init"]=wasmExports["_PyTraceMalloc_Init"])();var __PyTraceMalloc_Stop=Module["__PyTraceMalloc_Stop"]=()=>(__PyTraceMalloc_Stop=Module["__PyTraceMalloc_Stop"]=wasmExports["_PyTraceMalloc_Stop"])();var _PyTraceMalloc_Track=Module["_PyTraceMalloc_Track"]=(a0,a1,a2)=>(_PyTraceMalloc_Track=Module["_PyTraceMalloc_Track"]=wasmExports["PyTraceMalloc_Track"])(a0,a1,a2);var _PyTraceMalloc_Untrack=Module["_PyTraceMalloc_Untrack"]=(a0,a1)=>(_PyTraceMalloc_Untrack=Module["_PyTraceMalloc_Untrack"]=wasmExports["PyTraceMalloc_Untrack"])(a0,a1);var __PyTraceMalloc_GetTraceback=Module["__PyTraceMalloc_GetTraceback"]=(a0,a1)=>(__PyTraceMalloc_GetTraceback=Module["__PyTraceMalloc_GetTraceback"]=wasmExports["_PyTraceMalloc_GetTraceback"])(a0,a1);var __PyTraceMalloc_IsTracing=Module["__PyTraceMalloc_IsTracing"]=()=>(__PyTraceMalloc_IsTracing=Module["__PyTraceMalloc_IsTracing"]=wasmExports["_PyTraceMalloc_IsTracing"])();var __PyTraceMalloc_ClearTraces=Module["__PyTraceMalloc_ClearTraces"]=()=>(__PyTraceMalloc_ClearTraces=Module["__PyTraceMalloc_ClearTraces"]=wasmExports["_PyTraceMalloc_ClearTraces"])();var __PyTraceMalloc_GetTraces=Module["__PyTraceMalloc_GetTraces"]=()=>(__PyTraceMalloc_GetTraces=Module["__PyTraceMalloc_GetTraces"]=wasmExports["_PyTraceMalloc_GetTraces"])();var __PyTraceMalloc_GetObjectTraceback=Module["__PyTraceMalloc_GetObjectTraceback"]=a0=>(__PyTraceMalloc_GetObjectTraceback=Module["__PyTraceMalloc_GetObjectTraceback"]=wasmExports["_PyTraceMalloc_GetObjectTraceback"])(a0);var __PyTraceMalloc_GetTracebackLimit=Module["__PyTraceMalloc_GetTracebackLimit"]=()=>(__PyTraceMalloc_GetTracebackLimit=Module["__PyTraceMalloc_GetTracebackLimit"]=wasmExports["_PyTraceMalloc_GetTracebackLimit"])();var __PyTraceMalloc_GetMemory=Module["__PyTraceMalloc_GetMemory"]=()=>(__PyTraceMalloc_GetMemory=Module["__PyTraceMalloc_GetMemory"]=wasmExports["_PyTraceMalloc_GetMemory"])();var __PyTraceMalloc_GetTracedMemory=Module["__PyTraceMalloc_GetTracedMemory"]=()=>(__PyTraceMalloc_GetTracedMemory=Module["__PyTraceMalloc_GetTracedMemory"]=wasmExports["_PyTraceMalloc_GetTracedMemory"])();var __PyTraceMalloc_ResetPeak=Module["__PyTraceMalloc_ResetPeak"]=()=>(__PyTraceMalloc_ResetPeak=Module["__PyTraceMalloc_ResetPeak"]=wasmExports["_PyTraceMalloc_ResetPeak"])();var _PyOS_mystricmp=Module["_PyOS_mystricmp"]=(a0,a1)=>(_PyOS_mystricmp=Module["_PyOS_mystricmp"]=wasmExports["PyOS_mystricmp"])(a0,a1);var __Py_strhex=Module["__Py_strhex"]=(a0,a1)=>(__Py_strhex=Module["__Py_strhex"]=wasmExports["_Py_strhex"])(a0,a1);var __Py_strhex_bytes=Module["__Py_strhex_bytes"]=(a0,a1)=>(__Py_strhex_bytes=Module["__Py_strhex_bytes"]=wasmExports["_Py_strhex_bytes"])(a0,a1);var __Py_strhex_bytes_with_sep=Module["__Py_strhex_bytes_with_sep"]=(a0,a1,a2,a3)=>(__Py_strhex_bytes_with_sep=Module["__Py_strhex_bytes_with_sep"]=wasmExports["_Py_strhex_bytes_with_sep"])(a0,a1,a2,a3);var _localeconv=Module["_localeconv"]=()=>(_localeconv=Module["_localeconv"]=wasmExports["localeconv"])();var __Py_GetLocaleconvNumeric=Module["__Py_GetLocaleconvNumeric"]=(a0,a1,a2)=>(__Py_GetLocaleconvNumeric=Module["__Py_GetLocaleconvNumeric"]=wasmExports["_Py_GetLocaleconvNumeric"])(a0,a1,a2);var __Py_device_encoding=Module["__Py_device_encoding"]=a0=>(__Py_device_encoding=Module["__Py_device_encoding"]=wasmExports["_Py_device_encoding"])(a0);var __Py_GetLocaleEncodingObject=Module["__Py_GetLocaleEncodingObject"]=()=>(__Py_GetLocaleEncodingObject=Module["__Py_GetLocaleEncodingObject"]=wasmExports["_Py_GetLocaleEncodingObject"])();var _mbstowcs=Module["_mbstowcs"]=(a0,a1,a2)=>(_mbstowcs=Module["_mbstowcs"]=wasmExports["mbstowcs"])(a0,a1,a2);var _mbrtowc=Module["_mbrtowc"]=(a0,a1,a2,a3)=>(_mbrtowc=Module["_mbrtowc"]=wasmExports["mbrtowc"])(a0,a1,a2,a3);var _Py_EncodeLocale=Module["_Py_EncodeLocale"]=(a0,a1)=>(_Py_EncodeLocale=Module["_Py_EncodeLocale"]=wasmExports["Py_EncodeLocale"])(a0,a1);var __Py_EncodeLocaleRaw=Module["__Py_EncodeLocaleRaw"]=(a0,a1)=>(__Py_EncodeLocaleRaw=Module["__Py_EncodeLocaleRaw"]=wasmExports["_Py_EncodeLocaleRaw"])(a0,a1);var _fstat=Module["_fstat"]=(a0,a1)=>(_fstat=Module["_fstat"]=wasmExports["fstat"])(a0,a1);var _stat=Module["_stat"]=(a0,a1)=>(_stat=Module["_stat"]=wasmExports["stat"])(a0,a1);var __Py_stat=Module["__Py_stat"]=(a0,a1)=>(__Py_stat=Module["__Py_stat"]=wasmExports["_Py_stat"])(a0,a1);var __Py_get_inheritable=Module["__Py_get_inheritable"]=a0=>(__Py_get_inheritable=Module["__Py_get_inheritable"]=wasmExports["_Py_get_inheritable"])(a0);var __Py_set_inheritable=Module["__Py_set_inheritable"]=(a0,a1,a2)=>(__Py_set_inheritable=Module["__Py_set_inheritable"]=wasmExports["_Py_set_inheritable"])(a0,a1,a2);var __Py_set_inheritable_async_safe=Module["__Py_set_inheritable_async_safe"]=(a0,a1,a2)=>(__Py_set_inheritable_async_safe=Module["__Py_set_inheritable_async_safe"]=wasmExports["_Py_set_inheritable_async_safe"])(a0,a1,a2);var __Py_wfopen=Module["__Py_wfopen"]=(a0,a1)=>(__Py_wfopen=Module["__Py_wfopen"]=wasmExports["_Py_wfopen"])(a0,a1);var _wcstombs=Module["_wcstombs"]=(a0,a1,a2)=>(_wcstombs=Module["_wcstombs"]=wasmExports["wcstombs"])(a0,a1,a2);var _fopen=Module["_fopen"]=(a0,a1)=>(_fopen=Module["_fopen"]=wasmExports["fopen"])(a0,a1);var _write=Module["_write"]=(a0,a1,a2)=>(_write=Module["_write"]=wasmExports["write"])(a0,a1,a2);var _readlink=Module["_readlink"]=(a0,a1,a2)=>(_readlink=Module["_readlink"]=wasmExports["readlink"])(a0,a1,a2);var _realpath=Module["_realpath"]=(a0,a1)=>(_realpath=Module["_realpath"]=wasmExports["realpath"])(a0,a1);var _getcwd=Module["_getcwd"]=(a0,a1)=>(_getcwd=Module["_getcwd"]=wasmExports["getcwd"])(a0,a1);var __Py_normpath=Module["__Py_normpath"]=(a0,a1)=>(__Py_normpath=Module["__Py_normpath"]=wasmExports["_Py_normpath"])(a0,a1);var __Py_get_blocking=Module["__Py_get_blocking"]=a0=>(__Py_get_blocking=Module["__Py_get_blocking"]=wasmExports["_Py_get_blocking"])(a0);var __Py_set_blocking=Module["__Py_set_blocking"]=(a0,a1)=>(__Py_set_blocking=Module["__Py_set_blocking"]=wasmExports["_Py_set_blocking"])(a0,a1);var __Py_closerange=Module["__Py_closerange"]=(a0,a1)=>(__Py_closerange=Module["__Py_closerange"]=wasmExports["_Py_closerange"])(a0,a1);var __Py_UTF8_Edit_Cost=Module["__Py_UTF8_Edit_Cost"]=(a0,a1,a2)=>(__Py_UTF8_Edit_Cost=Module["__Py_UTF8_Edit_Cost"]=wasmExports["_Py_UTF8_Edit_Cost"])(a0,a1,a2);var _dlopen=Module["_dlopen"]=(a0,a1)=>(_dlopen=Module["_dlopen"]=wasmExports["dlopen"])(a0,a1);var _dlerror=Module["_dlerror"]=()=>(_dlerror=Module["_dlerror"]=wasmExports["dlerror"])();var _dlsym=Module["_dlsym"]=(a0,a1)=>(_dlsym=Module["_dlsym"]=wasmExports["dlsym"])(a0,a1);var _PyErr_SetInterruptEx=Module["_PyErr_SetInterruptEx"]=a0=>(_PyErr_SetInterruptEx=Module["_PyErr_SetInterruptEx"]=wasmExports["PyErr_SetInterruptEx"])(a0);var _PyInit__ctypes=Module["_PyInit__ctypes"]=()=>(_PyInit__ctypes=Module["_PyInit__ctypes"]=wasmExports["PyInit__ctypes"])();var _PyInit__posixsubprocess=Module["_PyInit__posixsubprocess"]=()=>(_PyInit__posixsubprocess=Module["_PyInit__posixsubprocess"]=wasmExports["PyInit__posixsubprocess"])();var _PyInit__bz2=Module["_PyInit__bz2"]=()=>(_PyInit__bz2=Module["_PyInit__bz2"]=wasmExports["PyInit__bz2"])();var _PyInit_zlib=Module["_PyInit_zlib"]=()=>(_PyInit_zlib=Module["_PyInit_zlib"]=wasmExports["PyInit_zlib"])();var _PyInit__xxsubinterpreters=Module["_PyInit__xxsubinterpreters"]=()=>(_PyInit__xxsubinterpreters=Module["_PyInit__xxsubinterpreters"]=wasmExports["PyInit__xxsubinterpreters"])();var _PyInit_array=Module["_PyInit_array"]=()=>(_PyInit_array=Module["_PyInit_array"]=wasmExports["PyInit_array"])();var _PyInit__asyncio=Module["_PyInit__asyncio"]=()=>(_PyInit__asyncio=Module["_PyInit__asyncio"]=wasmExports["PyInit__asyncio"])();var _PyInit__bisect=Module["_PyInit__bisect"]=()=>(_PyInit__bisect=Module["_PyInit__bisect"]=wasmExports["PyInit__bisect"])();var _PyInit__contextvars=Module["_PyInit__contextvars"]=()=>(_PyInit__contextvars=Module["_PyInit__contextvars"]=wasmExports["PyInit__contextvars"])();var _PyInit__csv=Module["_PyInit__csv"]=()=>(_PyInit__csv=Module["_PyInit__csv"]=wasmExports["PyInit__csv"])();var _PyInit__heapq=Module["_PyInit__heapq"]=()=>(_PyInit__heapq=Module["_PyInit__heapq"]=wasmExports["PyInit__heapq"])();var _PyInit__json=Module["_PyInit__json"]=()=>(_PyInit__json=Module["_PyInit__json"]=wasmExports["PyInit__json"])();var _PyInit__lsprof=Module["_PyInit__lsprof"]=()=>(_PyInit__lsprof=Module["_PyInit__lsprof"]=wasmExports["PyInit__lsprof"])();var _PyInit__opcode=Module["_PyInit__opcode"]=()=>(_PyInit__opcode=Module["_PyInit__opcode"]=wasmExports["PyInit__opcode"])();var _PyInit__pickle=Module["_PyInit__pickle"]=()=>(_PyInit__pickle=Module["_PyInit__pickle"]=wasmExports["PyInit__pickle"])();var _PyInit__queue=Module["_PyInit__queue"]=()=>(_PyInit__queue=Module["_PyInit__queue"]=wasmExports["PyInit__queue"])();var _PyInit__random=Module["_PyInit__random"]=()=>(_PyInit__random=Module["_PyInit__random"]=wasmExports["PyInit__random"])();var _PyInit__struct=Module["_PyInit__struct"]=()=>(_PyInit__struct=Module["_PyInit__struct"]=wasmExports["PyInit__struct"])();var _PyInit__zoneinfo=Module["_PyInit__zoneinfo"]=()=>(_PyInit__zoneinfo=Module["_PyInit__zoneinfo"]=wasmExports["PyInit__zoneinfo"])();var _PyInit_audioop=Module["_PyInit_audioop"]=()=>(_PyInit_audioop=Module["_PyInit_audioop"]=wasmExports["PyInit_audioop"])();var _PyInit_math=Module["_PyInit_math"]=()=>(_PyInit_math=Module["_PyInit_math"]=wasmExports["PyInit_math"])();var _PyInit_cmath=Module["_PyInit_cmath"]=()=>(_PyInit_cmath=Module["_PyInit_cmath"]=wasmExports["PyInit_cmath"])();var _PyInit__statistics=Module["_PyInit__statistics"]=()=>(_PyInit__statistics=Module["_PyInit__statistics"]=wasmExports["PyInit__statistics"])();var _PyInit__datetime=Module["_PyInit__datetime"]=()=>(_PyInit__datetime=Module["_PyInit__datetime"]=wasmExports["PyInit__datetime"])();var _PyInit__decimal=Module["_PyInit__decimal"]=()=>(_PyInit__decimal=Module["_PyInit__decimal"]=wasmExports["PyInit__decimal"])();var _PyInit_binascii=Module["_PyInit_binascii"]=()=>(_PyInit_binascii=Module["_PyInit_binascii"]=wasmExports["PyInit_binascii"])();var _PyInit__md5=Module["_PyInit__md5"]=()=>(_PyInit__md5=Module["_PyInit__md5"]=wasmExports["PyInit__md5"])();var _PyInit__sha1=Module["_PyInit__sha1"]=()=>(_PyInit__sha1=Module["_PyInit__sha1"]=wasmExports["PyInit__sha1"])();var _PyInit__sha2=Module["_PyInit__sha2"]=()=>(_PyInit__sha2=Module["_PyInit__sha2"]=wasmExports["PyInit__sha2"])();var _PyInit__sha3=Module["_PyInit__sha3"]=()=>(_PyInit__sha3=Module["_PyInit__sha3"]=wasmExports["PyInit__sha3"])();var _PyInit__blake2=Module["_PyInit__blake2"]=()=>(_PyInit__blake2=Module["_PyInit__blake2"]=wasmExports["PyInit__blake2"])();var _PyInit_pyexpat=Module["_PyInit_pyexpat"]=()=>(_PyInit_pyexpat=Module["_PyInit_pyexpat"]=wasmExports["PyInit_pyexpat"])();var _PyInit__elementtree=Module["_PyInit__elementtree"]=()=>(_PyInit__elementtree=Module["_PyInit__elementtree"]=wasmExports["PyInit__elementtree"])();var _PyInit__codecs_cn=Module["_PyInit__codecs_cn"]=()=>(_PyInit__codecs_cn=Module["_PyInit__codecs_cn"]=wasmExports["PyInit__codecs_cn"])();var _PyInit__codecs_hk=Module["_PyInit__codecs_hk"]=()=>(_PyInit__codecs_hk=Module["_PyInit__codecs_hk"]=wasmExports["PyInit__codecs_hk"])();var _PyInit__codecs_iso2022=Module["_PyInit__codecs_iso2022"]=()=>(_PyInit__codecs_iso2022=Module["_PyInit__codecs_iso2022"]=wasmExports["PyInit__codecs_iso2022"])();var _PyInit__codecs_jp=Module["_PyInit__codecs_jp"]=()=>(_PyInit__codecs_jp=Module["_PyInit__codecs_jp"]=wasmExports["PyInit__codecs_jp"])();var _PyInit__codecs_kr=Module["_PyInit__codecs_kr"]=()=>(_PyInit__codecs_kr=Module["_PyInit__codecs_kr"]=wasmExports["PyInit__codecs_kr"])();var _PyInit__codecs_tw=Module["_PyInit__codecs_tw"]=()=>(_PyInit__codecs_tw=Module["_PyInit__codecs_tw"]=wasmExports["PyInit__codecs_tw"])();var _PyInit__multibytecodec=Module["_PyInit__multibytecodec"]=()=>(_PyInit__multibytecodec=Module["_PyInit__multibytecodec"]=wasmExports["PyInit__multibytecodec"])();var _PyInit_unicodedata=Module["_PyInit_unicodedata"]=()=>(_PyInit_unicodedata=Module["_PyInit_unicodedata"]=wasmExports["PyInit_unicodedata"])();var _PyInit__crypt=Module["_PyInit__crypt"]=()=>(_PyInit__crypt=Module["_PyInit__crypt"]=wasmExports["PyInit__crypt"])();var _PyInit_mmap=Module["_PyInit_mmap"]=()=>(_PyInit_mmap=Module["_PyInit_mmap"]=wasmExports["PyInit_mmap"])();var _PyInit_select=Module["_PyInit_select"]=()=>(_PyInit_select=Module["_PyInit_select"]=wasmExports["PyInit_select"])();var _PyInit__socket=Module["_PyInit__socket"]=()=>(_PyInit__socket=Module["_PyInit__socket"]=wasmExports["PyInit__socket"])();var _PyInit_atexit=Module["_PyInit_atexit"]=()=>(_PyInit_atexit=Module["_PyInit_atexit"]=wasmExports["PyInit_atexit"])();var _PyInit_faulthandler=Module["_PyInit_faulthandler"]=()=>(_PyInit_faulthandler=Module["_PyInit_faulthandler"]=wasmExports["PyInit_faulthandler"])();var _PyInit_posix=Module["_PyInit_posix"]=()=>(_PyInit_posix=Module["_PyInit_posix"]=wasmExports["PyInit_posix"])();var _PyInit__signal=Module["_PyInit__signal"]=()=>(_PyInit__signal=Module["_PyInit__signal"]=wasmExports["PyInit__signal"])();var _PyInit__tracemalloc=Module["_PyInit__tracemalloc"]=()=>(_PyInit__tracemalloc=Module["_PyInit__tracemalloc"]=wasmExports["PyInit__tracemalloc"])();var _PyInit__codecs=Module["_PyInit__codecs"]=()=>(_PyInit__codecs=Module["_PyInit__codecs"]=wasmExports["PyInit__codecs"])();var _PyInit__collections=Module["_PyInit__collections"]=()=>(_PyInit__collections=Module["_PyInit__collections"]=wasmExports["PyInit__collections"])();var _PyInit_errno=Module["_PyInit_errno"]=()=>(_PyInit_errno=Module["_PyInit_errno"]=wasmExports["PyInit_errno"])();var _PyInit__io=Module["_PyInit__io"]=()=>(_PyInit__io=Module["_PyInit__io"]=wasmExports["PyInit__io"])();var _PyInit_itertools=Module["_PyInit_itertools"]=()=>(_PyInit_itertools=Module["_PyInit_itertools"]=wasmExports["PyInit_itertools"])();var _PyInit__sre=Module["_PyInit__sre"]=()=>(_PyInit__sre=Module["_PyInit__sre"]=wasmExports["PyInit__sre"])();var _PyInit__thread=Module["_PyInit__thread"]=()=>(_PyInit__thread=Module["_PyInit__thread"]=wasmExports["PyInit__thread"])();var _PyInit_time=Module["_PyInit_time"]=()=>(_PyInit_time=Module["_PyInit_time"]=wasmExports["PyInit_time"])();var _PyInit__typing=Module["_PyInit__typing"]=()=>(_PyInit__typing=Module["_PyInit__typing"]=wasmExports["PyInit__typing"])();var _PyInit__weakref=Module["_PyInit__weakref"]=()=>(_PyInit__weakref=Module["_PyInit__weakref"]=wasmExports["PyInit__weakref"])();var _PyInit__abc=Module["_PyInit__abc"]=()=>(_PyInit__abc=Module["_PyInit__abc"]=wasmExports["PyInit__abc"])();var _PyInit__functools=Module["_PyInit__functools"]=()=>(_PyInit__functools=Module["_PyInit__functools"]=wasmExports["PyInit__functools"])();var _PyInit__locale=Module["_PyInit__locale"]=()=>(_PyInit__locale=Module["_PyInit__locale"]=wasmExports["PyInit__locale"])();var _PyInit__operator=Module["_PyInit__operator"]=()=>(_PyInit__operator=Module["_PyInit__operator"]=wasmExports["PyInit__operator"])();var _PyInit__stat=Module["_PyInit__stat"]=()=>(_PyInit__stat=Module["_PyInit__stat"]=wasmExports["PyInit__stat"])();var _PyInit__symtable=Module["_PyInit__symtable"]=()=>(_PyInit__symtable=Module["_PyInit__symtable"]=wasmExports["PyInit__symtable"])();var _PyInit_gc=Module["_PyInit_gc"]=()=>(_PyInit_gc=Module["_PyInit_gc"]=wasmExports["PyInit_gc"])();var _Py_RunMain=Module["_Py_RunMain"]=()=>(_Py_RunMain=Module["_Py_RunMain"]=wasmExports["Py_RunMain"])();var _perror=Module["_perror"]=a0=>(_perror=Module["_perror"]=wasmExports["perror"])(a0);var _kill=Module["_kill"]=(a0,a1)=>(_kill=Module["_kill"]=wasmExports["kill"])(a0,a1);var _Py_Main=Module["_Py_Main"]=(a0,a1)=>(_Py_Main=Module["_Py_Main"]=wasmExports["Py_Main"])(a0,a1);var _Py_BytesMain=Module["_Py_BytesMain"]=(a0,a1)=>(_Py_BytesMain=Module["_Py_BytesMain"]=wasmExports["Py_BytesMain"])(a0,a1);var _PyGC_Enable=Module["_PyGC_Enable"]=()=>(_PyGC_Enable=Module["_PyGC_Enable"]=wasmExports["PyGC_Enable"])();var _PyGC_Disable=Module["_PyGC_Disable"]=()=>(_PyGC_Disable=Module["_PyGC_Disable"]=wasmExports["PyGC_Disable"])();var _PyGC_IsEnabled=Module["_PyGC_IsEnabled"]=()=>(_PyGC_IsEnabled=Module["_PyGC_IsEnabled"]=wasmExports["PyGC_IsEnabled"])();var _PyUnstable_Object_GC_NewWithExtraData=Module["_PyUnstable_Object_GC_NewWithExtraData"]=(a0,a1)=>(_PyUnstable_Object_GC_NewWithExtraData=Module["_PyUnstable_Object_GC_NewWithExtraData"]=wasmExports["PyUnstable_Object_GC_NewWithExtraData"])(a0,a1);var _PyObject_GC_IsTracked=Module["_PyObject_GC_IsTracked"]=a0=>(_PyObject_GC_IsTracked=Module["_PyObject_GC_IsTracked"]=wasmExports["PyObject_GC_IsTracked"])(a0);var _PyObject_GC_IsFinalized=Module["_PyObject_GC_IsFinalized"]=a0=>(_PyObject_GC_IsFinalized=Module["_PyObject_GC_IsFinalized"]=wasmExports["PyObject_GC_IsFinalized"])(a0);var _PyUnstable_GC_VisitObjects=Module["_PyUnstable_GC_VisitObjects"]=(a0,a1)=>(_PyUnstable_GC_VisitObjects=Module["_PyUnstable_GC_VisitObjects"]=wasmExports["PyUnstable_GC_VisitObjects"])(a0,a1);var _strcat=Module["_strcat"]=(a0,a1)=>(_strcat=Module["_strcat"]=wasmExports["strcat"])(a0,a1);var _ffi_closure_alloc=Module["_ffi_closure_alloc"]=(a0,a1)=>(_ffi_closure_alloc=Module["_ffi_closure_alloc"]=wasmExports["ffi_closure_alloc"])(a0,a1);var _ffi_prep_cif=Module["_ffi_prep_cif"]=(a0,a1,a2,a3,a4)=>(_ffi_prep_cif=Module["_ffi_prep_cif"]=wasmExports["ffi_prep_cif"])(a0,a1,a2,a3,a4);var _ffi_prep_closure_loc=Module["_ffi_prep_closure_loc"]=(a0,a1,a2,a3,a4)=>(_ffi_prep_closure_loc=Module["_ffi_prep_closure_loc"]=wasmExports["ffi_prep_closure_loc"])(a0,a1,a2,a3,a4);var _ffi_closure_free=Module["_ffi_closure_free"]=a0=>(_ffi_closure_free=Module["_ffi_closure_free"]=wasmExports["ffi_closure_free"])(a0);var _ffi_prep_cif_var=Module["_ffi_prep_cif_var"]=(a0,a1,a2,a3,a4,a5)=>(_ffi_prep_cif_var=Module["_ffi_prep_cif_var"]=wasmExports["ffi_prep_cif_var"])(a0,a1,a2,a3,a4,a5);var _ffi_call=Module["_ffi_call"]=(a0,a1,a2,a3)=>(_ffi_call=Module["_ffi_call"]=wasmExports["ffi_call"])(a0,a1,a2,a3);var _dlclose=Module["_dlclose"]=a0=>(_dlclose=Module["_dlclose"]=wasmExports["dlclose"])(a0);var ___extenddftf2=Module["___extenddftf2"]=(a0,a1)=>(___extenddftf2=Module["___extenddftf2"]=wasmExports["__extenddftf2"])(a0,a1);var ___trunctfdf2=Module["___trunctfdf2"]=(a0,a1)=>(___trunctfdf2=Module["___trunctfdf2"]=wasmExports["__trunctfdf2"])(a0,a1);var __Py_Gid_Converter=Module["__Py_Gid_Converter"]=(a0,a1)=>(__Py_Gid_Converter=Module["__Py_Gid_Converter"]=wasmExports["_Py_Gid_Converter"])(a0,a1);var __Py_Uid_Converter=Module["__Py_Uid_Converter"]=(a0,a1)=>(__Py_Uid_Converter=Module["__Py_Uid_Converter"]=wasmExports["_Py_Uid_Converter"])(a0,a1);var _PyOS_BeforeFork=Module["_PyOS_BeforeFork"]=()=>(_PyOS_BeforeFork=Module["_PyOS_BeforeFork"]=wasmExports["PyOS_BeforeFork"])();var _PyOS_AfterFork_Parent=Module["_PyOS_AfterFork_Parent"]=()=>(_PyOS_AfterFork_Parent=Module["_PyOS_AfterFork_Parent"]=wasmExports["PyOS_AfterFork_Parent"])();var _fork=Module["_fork"]=()=>(_fork=Module["_fork"]=wasmExports["fork"])();var _PyOS_AfterFork_Child=Module["_PyOS_AfterFork_Child"]=()=>(_PyOS_AfterFork_Child=Module["_PyOS_AfterFork_Child"]=wasmExports["PyOS_AfterFork_Child"])();var __exit=Module["__exit"]=a0=>(__exit=Module["__exit"]=wasmExports["_exit"])(a0);var _dup=Module["_dup"]=a0=>(_dup=Module["_dup"]=wasmExports["dup"])(a0);var _dup2=Module["_dup2"]=(a0,a1)=>(_dup2=Module["_dup2"]=wasmExports["dup2"])(a0,a1);var _chdir=Module["_chdir"]=a0=>(_chdir=Module["_chdir"]=wasmExports["chdir"])(a0);var _umask=Module["_umask"]=a0=>(_umask=Module["_umask"]=wasmExports["umask"])(a0);var __Py_RestoreSignals=Module["__Py_RestoreSignals"]=()=>(__Py_RestoreSignals=Module["__Py_RestoreSignals"]=wasmExports["_Py_RestoreSignals"])();var _setsid=Module["_setsid"]=()=>(_setsid=Module["_setsid"]=wasmExports["setsid"])();var _setpgid=Module["_setpgid"]=(a0,a1)=>(_setpgid=Module["_setpgid"]=wasmExports["setpgid"])(a0,a1);var _setregid=Module["_setregid"]=(a0,a1)=>(_setregid=Module["_setregid"]=wasmExports["setregid"])(a0,a1);var _setreuid=Module["_setreuid"]=(a0,a1)=>(_setreuid=Module["_setreuid"]=wasmExports["setreuid"])(a0,a1);var _execve=Module["_execve"]=(a0,a1,a2)=>(_execve=Module["_execve"]=wasmExports["execve"])(a0,a1,a2);var _execv=Module["_execv"]=(a0,a1)=>(_execv=Module["_execv"]=wasmExports["execv"])(a0,a1);var _opendir=Module["_opendir"]=a0=>(_opendir=Module["_opendir"]=wasmExports["opendir"])(a0);var _sysconf=Module["_sysconf"]=a0=>(_sysconf=Module["_sysconf"]=wasmExports["sysconf"])(a0);var _dirfd=Module["_dirfd"]=a0=>(_dirfd=Module["_dirfd"]=wasmExports["dirfd"])(a0);var _readdir=Module["_readdir"]=a0=>(_readdir=Module["_readdir"]=wasmExports["readdir"])(a0);var _closedir=Module["_closedir"]=a0=>(_closedir=Module["_closedir"]=wasmExports["closedir"])(a0);var _BZ2_bzCompressEnd=Module["_BZ2_bzCompressEnd"]=a0=>(_BZ2_bzCompressEnd=Module["_BZ2_bzCompressEnd"]=wasmExports["BZ2_bzCompressEnd"])(a0);var _BZ2_bzCompressInit=Module["_BZ2_bzCompressInit"]=(a0,a1,a2,a3)=>(_BZ2_bzCompressInit=Module["_BZ2_bzCompressInit"]=wasmExports["BZ2_bzCompressInit"])(a0,a1,a2,a3);var _BZ2_bzCompress=Module["_BZ2_bzCompress"]=(a0,a1)=>(_BZ2_bzCompress=Module["_BZ2_bzCompress"]=wasmExports["BZ2_bzCompress"])(a0,a1);var _BZ2_bzDecompressEnd=Module["_BZ2_bzDecompressEnd"]=a0=>(_BZ2_bzDecompressEnd=Module["_BZ2_bzDecompressEnd"]=wasmExports["BZ2_bzDecompressEnd"])(a0);var _BZ2_bzDecompressInit=Module["_BZ2_bzDecompressInit"]=(a0,a1,a2)=>(_BZ2_bzDecompressInit=Module["_BZ2_bzDecompressInit"]=wasmExports["BZ2_bzDecompressInit"])(a0,a1,a2);var _BZ2_bzDecompress=Module["_BZ2_bzDecompress"]=a0=>(_BZ2_bzDecompress=Module["_BZ2_bzDecompress"]=wasmExports["BZ2_bzDecompress"])(a0);var _adler32=Module["_adler32"]=(a0,a1,a2)=>(_adler32=Module["_adler32"]=wasmExports["adler32"])(a0,a1,a2);var _deflateInit2_=Module["_deflateInit2_"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_deflateInit2_=Module["_deflateInit2_"]=wasmExports["deflateInit2_"])(a0,a1,a2,a3,a4,a5,a6,a7);var _deflateEnd=Module["_deflateEnd"]=a0=>(_deflateEnd=Module["_deflateEnd"]=wasmExports["deflateEnd"])(a0);var _deflate=Module["_deflate"]=(a0,a1)=>(_deflate=Module["_deflate"]=wasmExports["deflate"])(a0,a1);var _deflateSetDictionary=Module["_deflateSetDictionary"]=(a0,a1,a2)=>(_deflateSetDictionary=Module["_deflateSetDictionary"]=wasmExports["deflateSetDictionary"])(a0,a1,a2);var _crc32=Module["_crc32"]=(a0,a1,a2)=>(_crc32=Module["_crc32"]=wasmExports["crc32"])(a0,a1,a2);var _inflateInit2_=Module["_inflateInit2_"]=(a0,a1,a2,a3)=>(_inflateInit2_=Module["_inflateInit2_"]=wasmExports["inflateInit2_"])(a0,a1,a2,a3);var _inflateEnd=Module["_inflateEnd"]=a0=>(_inflateEnd=Module["_inflateEnd"]=wasmExports["inflateEnd"])(a0);var _inflate=Module["_inflate"]=(a0,a1)=>(_inflate=Module["_inflate"]=wasmExports["inflate"])(a0,a1);var _inflateSetDictionary=Module["_inflateSetDictionary"]=(a0,a1,a2)=>(_inflateSetDictionary=Module["_inflateSetDictionary"]=wasmExports["inflateSetDictionary"])(a0,a1,a2);var _zlibVersion=Module["_zlibVersion"]=()=>(_zlibVersion=Module["_zlibVersion"]=wasmExports["zlibVersion"])();var _deflateCopy=Module["_deflateCopy"]=(a0,a1)=>(_deflateCopy=Module["_deflateCopy"]=wasmExports["deflateCopy"])(a0,a1);var _inflateCopy=Module["_inflateCopy"]=(a0,a1)=>(_inflateCopy=Module["_inflateCopy"]=wasmExports["inflateCopy"])(a0,a1);var _acos=Module["_acos"]=a0=>(_acos=Module["_acos"]=wasmExports["acos"])(a0);var _acosh=Module["_acosh"]=a0=>(_acosh=Module["_acosh"]=wasmExports["acosh"])(a0);var _asin=Module["_asin"]=a0=>(_asin=Module["_asin"]=wasmExports["asin"])(a0);var _asinh=Module["_asinh"]=a0=>(_asinh=Module["_asinh"]=wasmExports["asinh"])(a0);var _atan=Module["_atan"]=a0=>(_atan=Module["_atan"]=wasmExports["atan"])(a0);var _atanh=Module["_atanh"]=a0=>(_atanh=Module["_atanh"]=wasmExports["atanh"])(a0);var _cbrt=Module["_cbrt"]=a0=>(_cbrt=Module["_cbrt"]=wasmExports["cbrt"])(a0);var _copysign=Module["_copysign"]=(a0,a1)=>(_copysign=Module["_copysign"]=wasmExports["copysign"])(a0,a1);var _cosh=Module["_cosh"]=a0=>(_cosh=Module["_cosh"]=wasmExports["cosh"])(a0);var _erf=Module["_erf"]=a0=>(_erf=Module["_erf"]=wasmExports["erf"])(a0);var _erfc=Module["_erfc"]=a0=>(_erfc=Module["_erfc"]=wasmExports["erfc"])(a0);var _exp2=Module["_exp2"]=a0=>(_exp2=Module["_exp2"]=wasmExports["exp2"])(a0);var _expm1=Module["_expm1"]=a0=>(_expm1=Module["_expm1"]=wasmExports["expm1"])(a0);var _fabs=Module["_fabs"]=a0=>(_fabs=Module["_fabs"]=wasmExports["fabs"])(a0);var _sinh=Module["_sinh"]=a0=>(_sinh=Module["_sinh"]=wasmExports["sinh"])(a0);var _sqrt=Module["_sqrt"]=a0=>(_sqrt=Module["_sqrt"]=wasmExports["sqrt"])(a0);var _tan=Module["_tan"]=a0=>(_tan=Module["_tan"]=wasmExports["tan"])(a0);var _tanh=Module["_tanh"]=a0=>(_tanh=Module["_tanh"]=wasmExports["tanh"])(a0);var _fma=Module["_fma"]=(a0,a1,a2)=>(_fma=Module["_fma"]=wasmExports["fma"])(a0,a1,a2);var _nextafter=Module["_nextafter"]=(a0,a1)=>(_nextafter=Module["_nextafter"]=wasmExports["nextafter"])(a0,a1);var _log1p=Module["_log1p"]=a0=>(_log1p=Module["_log1p"]=wasmExports["log1p"])(a0);var _log10=Module["_log10"]=a0=>(_log10=Module["_log10"]=wasmExports["log10"])(a0);var _log2=Module["_log2"]=a0=>(_log2=Module["_log2"]=wasmExports["log2"])(a0);var _explicit_bzero=Module["_explicit_bzero"]=(a0,a1)=>(_explicit_bzero=Module["_explicit_bzero"]=wasmExports["explicit_bzero"])(a0,a1);var _strncat=Module["_strncat"]=(a0,a1,a2)=>(_strncat=Module["_strncat"]=wasmExports["strncat"])(a0,a1,a2);var _crypt_r=Module["_crypt_r"]=(a0,a1,a2)=>(_crypt_r=Module["_crypt_r"]=wasmExports["crypt_r"])(a0,a1,a2);var _mmap=Module["_mmap"]=(a0,a1,a2,a3,a4,a5)=>(_mmap=Module["_mmap"]=wasmExports["mmap"])(a0,a1,a2,a3,a4,a5);var _munmap=Module["_munmap"]=(a0,a1)=>(_munmap=Module["_munmap"]=wasmExports["munmap"])(a0,a1);var _msync=Module["_msync"]=(a0,a1,a2)=>(_msync=Module["_msync"]=wasmExports["msync"])(a0,a1,a2);var _madvise=Module["_madvise"]=(a0,a1,a2)=>(_madvise=Module["_madvise"]=wasmExports["madvise"])(a0,a1,a2);var _ftruncate=Module["_ftruncate"]=(a0,a1)=>(_ftruncate=Module["_ftruncate"]=wasmExports["ftruncate"])(a0,a1);var _mremap=Module["_mremap"]=(a0,a1,a2,a3,a4)=>(_mremap=Module["_mremap"]=wasmExports["mremap"])(a0,a1,a2,a3,a4);var _poll=Module["_poll"]=(a0,a1,a2)=>(_poll=Module["_poll"]=wasmExports["poll"])(a0,a1,a2);var _select=Module["_select"]=(a0,a1,a2,a3,a4)=>(_select=Module["_select"]=wasmExports["select"])(a0,a1,a2,a3,a4);var _inet_ntop=Module["_inet_ntop"]=(a0,a1,a2,a3)=>(_inet_ntop=Module["_inet_ntop"]=wasmExports["inet_ntop"])(a0,a1,a2,a3);var _gethostbyname=Module["_gethostbyname"]=a0=>(_gethostbyname=Module["_gethostbyname"]=wasmExports["gethostbyname"])(a0);var _gethostbyaddr=Module["_gethostbyaddr"]=(a0,a1,a2)=>(_gethostbyaddr=Module["_gethostbyaddr"]=wasmExports["gethostbyaddr"])(a0,a1,a2);var _gethostname=Module["_gethostname"]=(a0,a1)=>(_gethostname=Module["_gethostname"]=wasmExports["gethostname"])(a0,a1);var _getservbyname=Module["_getservbyname"]=(a0,a1)=>(_getservbyname=Module["_getservbyname"]=wasmExports["getservbyname"])(a0,a1);var _ntohs=a0=>(_ntohs=wasmExports["ntohs"])(a0);var _htons=a0=>(_htons=wasmExports["htons"])(a0);var _getservbyport=Module["_getservbyport"]=(a0,a1)=>(_getservbyport=Module["_getservbyport"]=wasmExports["getservbyport"])(a0,a1);var _ntohl=Module["_ntohl"]=a0=>(_ntohl=Module["_ntohl"]=wasmExports["ntohl"])(a0);var _htonl=a0=>(_htonl=wasmExports["htonl"])(a0);var _inet_aton=Module["_inet_aton"]=(a0,a1)=>(_inet_aton=Module["_inet_aton"]=wasmExports["inet_aton"])(a0,a1);var _inet_ntoa=Module["_inet_ntoa"]=a0=>(_inet_ntoa=Module["_inet_ntoa"]=wasmExports["inet_ntoa"])(a0);var _inet_pton=Module["_inet_pton"]=(a0,a1,a2)=>(_inet_pton=Module["_inet_pton"]=wasmExports["inet_pton"])(a0,a1,a2);var _gai_strerror=Module["_gai_strerror"]=a0=>(_gai_strerror=Module["_gai_strerror"]=wasmExports["gai_strerror"])(a0);var _freeaddrinfo=Module["_freeaddrinfo"]=a0=>(_freeaddrinfo=Module["_freeaddrinfo"]=wasmExports["freeaddrinfo"])(a0);var _if_nameindex=Module["_if_nameindex"]=()=>(_if_nameindex=Module["_if_nameindex"]=wasmExports["if_nameindex"])();var _if_freenameindex=Module["_if_freenameindex"]=a0=>(_if_freenameindex=Module["_if_freenameindex"]=wasmExports["if_freenameindex"])(a0);var _if_nametoindex=Module["_if_nametoindex"]=a0=>(_if_nametoindex=Module["_if_nametoindex"]=wasmExports["if_nametoindex"])(a0);var _if_indextoname=Module["_if_indextoname"]=(a0,a1)=>(_if_indextoname=Module["_if_indextoname"]=wasmExports["if_indextoname"])(a0,a1);var ___h_errno_location=Module["___h_errno_location"]=()=>(___h_errno_location=Module["___h_errno_location"]=wasmExports["__h_errno_location"])();var _hstrerror=Module["_hstrerror"]=a0=>(_hstrerror=Module["_hstrerror"]=wasmExports["hstrerror"])(a0);var _getsockname=Module["_getsockname"]=(a0,a1,a2)=>(_getsockname=Module["_getsockname"]=wasmExports["getsockname"])(a0,a1,a2);var _socket=Module["_socket"]=(a0,a1,a2)=>(_socket=Module["_socket"]=wasmExports["socket"])(a0,a1,a2);var _getsockopt=Module["_getsockopt"]=(a0,a1,a2,a3,a4)=>(_getsockopt=Module["_getsockopt"]=wasmExports["getsockopt"])(a0,a1,a2,a3,a4);var _bind=Module["_bind"]=(a0,a1,a2)=>(_bind=Module["_bind"]=wasmExports["bind"])(a0,a1,a2);var _getpeername=Module["_getpeername"]=(a0,a1,a2)=>(_getpeername=Module["_getpeername"]=wasmExports["getpeername"])(a0,a1,a2);var _listen=Module["_listen"]=(a0,a1)=>(_listen=Module["_listen"]=wasmExports["listen"])(a0,a1);var _setsockopt=Module["_setsockopt"]=(a0,a1,a2,a3,a4)=>(_setsockopt=Module["_setsockopt"]=wasmExports["setsockopt"])(a0,a1,a2,a3,a4);var _accept4=Module["_accept4"]=(a0,a1,a2,a3)=>(_accept4=Module["_accept4"]=wasmExports["accept4"])(a0,a1,a2,a3);var _accept=Module["_accept"]=(a0,a1,a2)=>(_accept=Module["_accept"]=wasmExports["accept"])(a0,a1,a2);var _connect=Module["_connect"]=(a0,a1,a2)=>(_connect=Module["_connect"]=wasmExports["connect"])(a0,a1,a2);var _recv=Module["_recv"]=(a0,a1,a2,a3)=>(_recv=Module["_recv"]=wasmExports["recv"])(a0,a1,a2,a3);var _recvfrom=Module["_recvfrom"]=(a0,a1,a2,a3,a4,a5)=>(_recvfrom=Module["_recvfrom"]=wasmExports["recvfrom"])(a0,a1,a2,a3,a4,a5);var _send=Module["_send"]=(a0,a1,a2,a3)=>(_send=Module["_send"]=wasmExports["send"])(a0,a1,a2,a3);var _sendto=Module["_sendto"]=(a0,a1,a2,a3,a4,a5)=>(_sendto=Module["_sendto"]=wasmExports["sendto"])(a0,a1,a2,a3,a4,a5);var _recvmsg=Module["_recvmsg"]=(a0,a1,a2)=>(_recvmsg=Module["_recvmsg"]=wasmExports["recvmsg"])(a0,a1,a2);var _sendmsg=Module["_sendmsg"]=(a0,a1,a2)=>(_sendmsg=Module["_sendmsg"]=wasmExports["sendmsg"])(a0,a1,a2);var __Py_AtExit=Module["__Py_AtExit"]=(a0,a1,a2)=>(__Py_AtExit=Module["__Py_AtExit"]=wasmExports["_Py_AtExit"])(a0,a1,a2);var _getrlimit=Module["_getrlimit"]=(a0,a1)=>(_getrlimit=Module["_getrlimit"]=wasmExports["getrlimit"])(a0,a1);var _setrlimit=Module["_setrlimit"]=(a0,a1)=>(_setrlimit=Module["_setrlimit"]=wasmExports["setrlimit"])(a0,a1);var _raise=Module["_raise"]=a0=>(_raise=Module["_raise"]=wasmExports["raise"])(a0);var _sigfillset=Module["_sigfillset"]=a0=>(_sigfillset=Module["_sigfillset"]=wasmExports["sigfillset"])(a0);var _pthread_sigmask=Module["_pthread_sigmask"]=(a0,a1,a2)=>(_pthread_sigmask=Module["_pthread_sigmask"]=wasmExports["pthread_sigmask"])(a0,a1,a2);var _PyOS_AfterFork=Module["_PyOS_AfterFork"]=()=>(_PyOS_AfterFork=Module["_PyOS_AfterFork"]=wasmExports["PyOS_AfterFork"])();var __PyLong_FromUid=Module["__PyLong_FromUid"]=a0=>(__PyLong_FromUid=Module["__PyLong_FromUid"]=wasmExports["_PyLong_FromUid"])(a0);var __PyLong_FromGid=Module["__PyLong_FromGid"]=a0=>(__PyLong_FromGid=Module["__PyLong_FromGid"]=wasmExports["_PyLong_FromGid"])(a0);var __Py_Sigset_Converter=Module["__Py_Sigset_Converter"]=(a0,a1)=>(__Py_Sigset_Converter=Module["__Py_Sigset_Converter"]=wasmExports["_Py_Sigset_Converter"])(a0,a1);var _sigemptyset=Module["_sigemptyset"]=a0=>(_sigemptyset=Module["_sigemptyset"]=wasmExports["sigemptyset"])(a0);var _sigaddset=Module["_sigaddset"]=(a0,a1)=>(_sigaddset=Module["_sigaddset"]=wasmExports["sigaddset"])(a0,a1);var _access=Module["_access"]=(a0,a1)=>(_access=Module["_access"]=wasmExports["access"])(a0,a1);var _ttyname_r=Module["_ttyname_r"]=(a0,a1,a2)=>(_ttyname_r=Module["_ttyname_r"]=wasmExports["ttyname_r"])(a0,a1,a2);var _fchdir=Module["_fchdir"]=a0=>(_fchdir=Module["_fchdir"]=wasmExports["fchdir"])(a0);var _fchmod=Module["_fchmod"]=(a0,a1)=>(_fchmod=Module["_fchmod"]=wasmExports["fchmod"])(a0,a1);var _fchmodat=Module["_fchmodat"]=(a0,a1,a2,a3)=>(_fchmodat=Module["_fchmodat"]=wasmExports["fchmodat"])(a0,a1,a2,a3);var _chmod=Module["_chmod"]=(a0,a1)=>(_chmod=Module["_chmod"]=wasmExports["chmod"])(a0,a1);var _fchown=Module["_fchown"]=(a0,a1,a2)=>(_fchown=Module["_fchown"]=wasmExports["fchown"])(a0,a1,a2);var _fchownat=Module["_fchownat"]=(a0,a1,a2,a3,a4)=>(_fchownat=Module["_fchownat"]=wasmExports["fchownat"])(a0,a1,a2,a3,a4);var _chown=Module["_chown"]=(a0,a1,a2)=>(_chown=Module["_chown"]=wasmExports["chown"])(a0,a1,a2);var _chroot=Module["_chroot"]=a0=>(_chroot=Module["_chroot"]=wasmExports["chroot"])(a0);var _ctermid=Module["_ctermid"]=a0=>(_ctermid=Module["_ctermid"]=wasmExports["ctermid"])(a0);var _fdopendir=Module["_fdopendir"]=a0=>(_fdopendir=Module["_fdopendir"]=wasmExports["fdopendir"])(a0);var _rewinddir=Module["_rewinddir"]=a0=>(_rewinddir=Module["_rewinddir"]=wasmExports["rewinddir"])(a0);var _mkdirat=Module["_mkdirat"]=(a0,a1,a2)=>(_mkdirat=Module["_mkdirat"]=wasmExports["mkdirat"])(a0,a1,a2);var _mkdir=Module["_mkdir"]=(a0,a1)=>(_mkdir=Module["_mkdir"]=wasmExports["mkdir"])(a0,a1);var _getpriority=Module["_getpriority"]=(a0,a1)=>(_getpriority=Module["_getpriority"]=wasmExports["getpriority"])(a0,a1);var _readlinkat=Module["_readlinkat"]=(a0,a1,a2,a3)=>(_readlinkat=Module["_readlinkat"]=wasmExports["readlinkat"])(a0,a1,a2,a3);var _unlinkat=Module["_unlinkat"]=(a0,a1,a2)=>(_unlinkat=Module["_unlinkat"]=wasmExports["unlinkat"])(a0,a1,a2);var _rmdir=Module["_rmdir"]=a0=>(_rmdir=Module["_rmdir"]=wasmExports["rmdir"])(a0);var _symlink=Module["_symlink"]=(a0,a1)=>(_symlink=Module["_symlink"]=wasmExports["symlink"])(a0,a1);var _system=Module["_system"]=a0=>(_system=Module["_system"]=wasmExports["system"])(a0);var _uname=Module["_uname"]=a0=>(_uname=Module["_uname"]=wasmExports["uname"])(a0);var _futimesat=Module["_futimesat"]=(a0,a1,a2)=>(_futimesat=Module["_futimesat"]=wasmExports["futimesat"])(a0,a1,a2);var _futimens=Module["_futimens"]=(a0,a1)=>(_futimens=Module["_futimens"]=wasmExports["futimens"])(a0,a1);var _times=Module["_times"]=a0=>(_times=Module["_times"]=wasmExports["times"])(a0);var _fexecve=Module["_fexecve"]=(a0,a1,a2)=>(_fexecve=Module["_fexecve"]=wasmExports["fexecve"])(a0,a1,a2);var _sched_yield=Module["_sched_yield"]=()=>(_sched_yield=Module["_sched_yield"]=wasmExports["sched_yield"])();var _login_tty=Module["_login_tty"]=a0=>(_login_tty=Module["_login_tty"]=wasmExports["login_tty"])(a0);var _getgid=Module["_getgid"]=()=>(_getgid=Module["_getgid"]=wasmExports["getgid"])();var _getpgrp=Module["_getpgrp"]=()=>(_getpgrp=Module["_getpgrp"]=wasmExports["getpgrp"])();var _getppid=Module["_getppid"]=()=>(_getppid=Module["_getppid"]=wasmExports["getppid"])();var _getuid=Module["_getuid"]=()=>(_getuid=Module["_getuid"]=wasmExports["getuid"])();var _getlogin=Module["_getlogin"]=()=>(_getlogin=Module["_getlogin"]=wasmExports["getlogin"])();var _killpg=Module["_killpg"]=(a0,a1)=>(_killpg=Module["_killpg"]=wasmExports["killpg"])(a0,a1);var _setuid=Module["_setuid"]=a0=>(_setuid=Module["_setuid"]=wasmExports["setuid"])(a0);var _setgid=Module["_setgid"]=a0=>(_setgid=Module["_setgid"]=wasmExports["setgid"])(a0);var _getpgid=Module["_getpgid"]=a0=>(_getpgid=Module["_getpgid"]=wasmExports["getpgid"])(a0);var _setpgrp=Module["_setpgrp"]=()=>(_setpgrp=Module["_setpgrp"]=wasmExports["setpgrp"])();var _wait=Module["_wait"]=a0=>(_wait=Module["_wait"]=wasmExports["wait"])(a0);var _waitid=Module["_waitid"]=(a0,a1,a2,a3)=>(_waitid=Module["_waitid"]=wasmExports["waitid"])(a0,a1,a2,a3);var _waitpid=Module["_waitpid"]=(a0,a1,a2)=>(_waitpid=Module["_waitpid"]=wasmExports["waitpid"])(a0,a1,a2);var _getsid=Module["_getsid"]=a0=>(_getsid=Module["_getsid"]=wasmExports["getsid"])(a0);var _tcgetpgrp=Module["_tcgetpgrp"]=a0=>(_tcgetpgrp=Module["_tcgetpgrp"]=wasmExports["tcgetpgrp"])(a0);var _tcsetpgrp=Module["_tcsetpgrp"]=(a0,a1)=>(_tcsetpgrp=Module["_tcsetpgrp"]=wasmExports["tcsetpgrp"])(a0,a1);var _openat=Module["_openat"]=(a0,a1,a2,a3)=>(_openat=Module["_openat"]=wasmExports["openat"])(a0,a1,a2,a3);var _dup3=Module["_dup3"]=(a0,a1,a2)=>(_dup3=Module["_dup3"]=wasmExports["dup3"])(a0,a1,a2);var _lockf=Module["_lockf"]=(a0,a1,a2)=>(_lockf=Module["_lockf"]=wasmExports["lockf"])(a0,a1,a2);var _readv=Module["_readv"]=(a0,a1,a2)=>(_readv=Module["_readv"]=wasmExports["readv"])(a0,a1,a2);var _pread=Module["_pread"]=(a0,a1,a2,a3)=>(_pread=Module["_pread"]=wasmExports["pread"])(a0,a1,a2,a3);var _writev=Module["_writev"]=(a0,a1,a2)=>(_writev=Module["_writev"]=wasmExports["writev"])(a0,a1,a2);var _pwrite=Module["_pwrite"]=(a0,a1,a2,a3)=>(_pwrite=Module["_pwrite"]=wasmExports["pwrite"])(a0,a1,a2,a3);var _pipe=Module["_pipe"]=a0=>(_pipe=Module["_pipe"]=wasmExports["pipe"])(a0);var _truncate=Module["_truncate"]=(a0,a1)=>(_truncate=Module["_truncate"]=wasmExports["truncate"])(a0,a1);var _posix_fadvise=Module["_posix_fadvise"]=(a0,a1,a2,a3)=>(_posix_fadvise=Module["_posix_fadvise"]=wasmExports["posix_fadvise"])(a0,a1,a2,a3);var _unsetenv=Module["_unsetenv"]=a0=>(_unsetenv=Module["_unsetenv"]=wasmExports["unsetenv"])(a0);var _fsync=Module["_fsync"]=a0=>(_fsync=Module["_fsync"]=wasmExports["fsync"])(a0);var _sync=Module["_sync"]=()=>(_sync=Module["_sync"]=wasmExports["sync"])();var _fdatasync=Module["_fdatasync"]=a0=>(_fdatasync=Module["_fdatasync"]=wasmExports["fdatasync"])(a0);var _fstatvfs=Module["_fstatvfs"]=(a0,a1)=>(_fstatvfs=Module["_fstatvfs"]=wasmExports["fstatvfs"])(a0,a1);var _statvfs=Module["_statvfs"]=(a0,a1)=>(_statvfs=Module["_statvfs"]=wasmExports["statvfs"])(a0,a1);var _fpathconf=Module["_fpathconf"]=(a0,a1)=>(_fpathconf=Module["_fpathconf"]=wasmExports["fpathconf"])(a0,a1);var _pathconf=Module["_pathconf"]=(a0,a1)=>(_pathconf=Module["_pathconf"]=wasmExports["pathconf"])(a0,a1);var _getloadavg=Module["_getloadavg"]=(a0,a1)=>(_getloadavg=Module["_getloadavg"]=wasmExports["getloadavg"])(a0,a1);var _lstat=Module["_lstat"]=(a0,a1)=>(_lstat=Module["_lstat"]=wasmExports["lstat"])(a0,a1);var _fstatat=Module["_fstatat"]=(a0,a1,a2,a3)=>(_fstatat=Module["_fstatat"]=wasmExports["fstatat"])(a0,a1,a2,a3);var _renameat=Module["_renameat"]=(a0,a1,a2,a3)=>(_renameat=Module["_renameat"]=wasmExports["renameat"])(a0,a1,a2,a3);var _rename=Module["_rename"]=(a0,a1)=>(_rename=Module["_rename"]=wasmExports["rename"])(a0,a1);var _unlink=Module["_unlink"]=a0=>(_unlink=Module["_unlink"]=wasmExports["unlink"])(a0);var _utimes=Module["_utimes"]=(a0,a1)=>(_utimes=Module["_utimes"]=wasmExports["utimes"])(a0,a1);var _qsort=Module["_qsort"]=(a0,a1,a2,a3)=>(_qsort=Module["_qsort"]=wasmExports["qsort"])(a0,a1,a2,a3);var __PyErr_CheckSignals=Module["__PyErr_CheckSignals"]=()=>(__PyErr_CheckSignals=Module["__PyErr_CheckSignals"]=wasmExports["_PyErr_CheckSignals"])();var _PyErr_SetInterrupt=Module["_PyErr_SetInterrupt"]=()=>(_PyErr_SetInterrupt=Module["_PyErr_SetInterrupt"]=wasmExports["PyErr_SetInterrupt"])();var _PyOS_InterruptOccurred=Module["_PyOS_InterruptOccurred"]=()=>(_PyOS_InterruptOccurred=Module["_PyOS_InterruptOccurred"]=wasmExports["PyOS_InterruptOccurred"])();var __PyOS_IsMainThread=Module["__PyOS_IsMainThread"]=()=>(__PyOS_IsMainThread=Module["__PyOS_IsMainThread"]=wasmExports["_PyOS_IsMainThread"])();var _getitimer=Module["_getitimer"]=(a0,a1)=>(_getitimer=Module["_getitimer"]=wasmExports["getitimer"])(a0,a1);var _strsignal=Module["_strsignal"]=a0=>(_strsignal=Module["_strsignal"]=wasmExports["strsignal"])(a0);var _strstr=Module["_strstr"]=(a0,a1)=>(_strstr=Module["_strstr"]=wasmExports["strstr"])(a0,a1);var _pause=Module["_pause"]=()=>(_pause=Module["_pause"]=wasmExports["pause"])();var _sigpending=Module["_sigpending"]=a0=>(_sigpending=Module["_sigpending"]=wasmExports["sigpending"])(a0);var _sigwait=Module["_sigwait"]=(a0,a1)=>(_sigwait=Module["_sigwait"]=wasmExports["sigwait"])(a0,a1);var _sigwaitinfo=Module["_sigwaitinfo"]=(a0,a1)=>(_sigwaitinfo=Module["_sigwaitinfo"]=wasmExports["sigwaitinfo"])(a0,a1);var _sigtimedwait=Module["_sigtimedwait"]=(a0,a1,a2)=>(_sigtimedwait=Module["_sigtimedwait"]=wasmExports["sigtimedwait"])(a0,a1,a2);var _sigismember=Module["_sigismember"]=(a0,a1)=>(_sigismember=Module["_sigismember"]=wasmExports["sigismember"])(a0,a1);var ___libc_current_sigrtmin=Module["___libc_current_sigrtmin"]=()=>(___libc_current_sigrtmin=Module["___libc_current_sigrtmin"]=wasmExports["__libc_current_sigrtmin"])();var ___libc_current_sigrtmax=Module["___libc_current_sigrtmax"]=()=>(___libc_current_sigrtmax=Module["___libc_current_sigrtmax"]=wasmExports["__libc_current_sigrtmax"])();var _isalnum=Module["_isalnum"]=a0=>(_isalnum=Module["_isalnum"]=wasmExports["isalnum"])(a0);var _toupper=Module["_toupper"]=a0=>(_toupper=Module["_toupper"]=wasmExports["toupper"])(a0);var _clock_settime=Module["_clock_settime"]=(a0,a1)=>(_clock_settime=Module["_clock_settime"]=wasmExports["clock_settime"])(a0,a1);var _pthread_getcpuclockid=Module["_pthread_getcpuclockid"]=(a0,a1)=>(_pthread_getcpuclockid=Module["_pthread_getcpuclockid"]=wasmExports["pthread_getcpuclockid"])(a0,a1);var _clock_nanosleep=Module["_clock_nanosleep"]=(a0,a1,a2,a3)=>(_clock_nanosleep=Module["_clock_nanosleep"]=wasmExports["clock_nanosleep"])(a0,a1,a2,a3);var _time=Module["_time"]=a0=>(_time=Module["_time"]=wasmExports["time"])(a0);var _mktime=Module["_mktime"]=a0=>(_mktime=Module["_mktime"]=wasmExports["mktime"])(a0);var _clock=Module["_clock"]=()=>(_clock=Module["_clock"]=wasmExports["clock"])();var _wcscoll=Module["_wcscoll"]=(a0,a1)=>(_wcscoll=Module["_wcscoll"]=wasmExports["wcscoll"])(a0,a1);var _wcsxfrm=Module["_wcsxfrm"]=(a0,a1,a2)=>(_wcsxfrm=Module["_wcsxfrm"]=wasmExports["wcsxfrm"])(a0,a1,a2);var _gettext=Module["_gettext"]=a0=>(_gettext=Module["_gettext"]=wasmExports["gettext"])(a0);var _dgettext=Module["_dgettext"]=(a0,a1)=>(_dgettext=Module["_dgettext"]=wasmExports["dgettext"])(a0,a1);var _dcgettext=Module["_dcgettext"]=(a0,a1,a2)=>(_dcgettext=Module["_dcgettext"]=wasmExports["dcgettext"])(a0,a1,a2);var _textdomain=Module["_textdomain"]=a0=>(_textdomain=Module["_textdomain"]=wasmExports["textdomain"])(a0);var _bindtextdomain=Module["_bindtextdomain"]=(a0,a1)=>(_bindtextdomain=Module["_bindtextdomain"]=wasmExports["bindtextdomain"])(a0,a1);var _bind_textdomain_codeset=Module["_bind_textdomain_codeset"]=(a0,a1)=>(_bind_textdomain_codeset=Module["_bind_textdomain_codeset"]=wasmExports["bind_textdomain_codeset"])(a0,a1);var _gettimeofday=Module["_gettimeofday"]=(a0,a1)=>(_gettimeofday=Module["_gettimeofday"]=wasmExports["gettimeofday"])(a0,a1);var ___small_fprintf=Module["___small_fprintf"]=(a0,a1,a2)=>(___small_fprintf=Module["___small_fprintf"]=wasmExports["__small_fprintf"])(a0,a1,a2);var __Py_Get_Getpath_CodeObject=Module["__Py_Get_Getpath_CodeObject"]=()=>(__Py_Get_Getpath_CodeObject=Module["__Py_Get_Getpath_CodeObject"]=wasmExports["_Py_Get_Getpath_CodeObject"])();var _ffi_prep_closure=Module["_ffi_prep_closure"]=(a0,a1,a2,a3)=>(_ffi_prep_closure=Module["_ffi_prep_closure"]=wasmExports["ffi_prep_closure"])(a0,a1,a2,a3);var _ffi_get_struct_offsets=Module["_ffi_get_struct_offsets"]=(a0,a1,a2)=>(_ffi_get_struct_offsets=Module["_ffi_get_struct_offsets"]=wasmExports["ffi_get_struct_offsets"])(a0,a1,a2);var _ffi_java_raw_size=Module["_ffi_java_raw_size"]=a0=>(_ffi_java_raw_size=Module["_ffi_java_raw_size"]=wasmExports["ffi_java_raw_size"])(a0);var _ffi_java_raw_to_ptrarray=Module["_ffi_java_raw_to_ptrarray"]=(a0,a1,a2)=>(_ffi_java_raw_to_ptrarray=Module["_ffi_java_raw_to_ptrarray"]=wasmExports["ffi_java_raw_to_ptrarray"])(a0,a1,a2);var _ffi_java_ptrarray_to_raw=Module["_ffi_java_ptrarray_to_raw"]=(a0,a1,a2)=>(_ffi_java_ptrarray_to_raw=Module["_ffi_java_ptrarray_to_raw"]=wasmExports["ffi_java_ptrarray_to_raw"])(a0,a1,a2);var _ffi_java_raw_call=Module["_ffi_java_raw_call"]=(a0,a1,a2,a3)=>(_ffi_java_raw_call=Module["_ffi_java_raw_call"]=wasmExports["ffi_java_raw_call"])(a0,a1,a2,a3);var _ffi_prep_java_raw_closure_loc=Module["_ffi_prep_java_raw_closure_loc"]=(a0,a1,a2,a3,a4)=>(_ffi_prep_java_raw_closure_loc=Module["_ffi_prep_java_raw_closure_loc"]=wasmExports["ffi_prep_java_raw_closure_loc"])(a0,a1,a2,a3,a4);var _ffi_prep_java_raw_closure=Module["_ffi_prep_java_raw_closure"]=(a0,a1,a2,a3)=>(_ffi_prep_java_raw_closure=Module["_ffi_prep_java_raw_closure"]=wasmExports["ffi_prep_java_raw_closure"])(a0,a1,a2,a3);var _ffi_tramp_is_supported=Module["_ffi_tramp_is_supported"]=()=>(_ffi_tramp_is_supported=Module["_ffi_tramp_is_supported"]=wasmExports["ffi_tramp_is_supported"])();var _ffi_tramp_alloc=Module["_ffi_tramp_alloc"]=a0=>(_ffi_tramp_alloc=Module["_ffi_tramp_alloc"]=wasmExports["ffi_tramp_alloc"])(a0);var _ffi_tramp_set_parms=Module["_ffi_tramp_set_parms"]=(a0,a1,a2)=>(_ffi_tramp_set_parms=Module["_ffi_tramp_set_parms"]=wasmExports["ffi_tramp_set_parms"])(a0,a1,a2);var _ffi_tramp_get_addr=Module["_ffi_tramp_get_addr"]=a0=>(_ffi_tramp_get_addr=Module["_ffi_tramp_get_addr"]=wasmExports["ffi_tramp_get_addr"])(a0);var _ffi_tramp_free=Module["_ffi_tramp_free"]=a0=>(_ffi_tramp_free=Module["_ffi_tramp_free"]=wasmExports["ffi_tramp_free"])(a0);var __hiwire_immortal_get=Module["__hiwire_immortal_get"]=a0=>(__hiwire_immortal_get=Module["__hiwire_immortal_get"]=wasmExports["_hiwire_immortal_get"])(a0);var __hiwire_get=Module["__hiwire_get"]=a0=>(__hiwire_get=Module["__hiwire_get"]=wasmExports["_hiwire_get"])(a0);var __hiwire_immortal_add=Module["__hiwire_immortal_add"]=a0=>(__hiwire_immortal_add=Module["__hiwire_immortal_add"]=wasmExports["_hiwire_immortal_add"])(a0);var __hiwire_table_init=Module["__hiwire_table_init"]=()=>(__hiwire_table_init=Module["__hiwire_table_init"]=wasmExports["_hiwire_table_init"])();var __hiwire_set=Module["__hiwire_set"]=(a0,a1)=>(__hiwire_set=Module["__hiwire_set"]=wasmExports["_hiwire_set"])(a0,a1);var _hiwire_num_refs=Module["_hiwire_num_refs"]=()=>(_hiwire_num_refs=Module["_hiwire_num_refs"]=wasmExports["hiwire_num_refs"])();var __hiwire_slot_info=Module["__hiwire_slot_info"]=a0=>(__hiwire_slot_info=Module["__hiwire_slot_info"]=wasmExports["_hiwire_slot_info"])(a0);var __hiwire_delete=Module["__hiwire_delete"]=a0=>(__hiwire_delete=Module["__hiwire_delete"]=wasmExports["_hiwire_delete"])(a0);var __hiwire_immortal_table_init=Module["__hiwire_immortal_table_init"]=()=>(__hiwire_immortal_table_init=Module["__hiwire_immortal_table_init"]=wasmExports["_hiwire_immortal_table_init"])();var _emscripten_GetProcAddress=Module["_emscripten_GetProcAddress"]=a0=>(_emscripten_GetProcAddress=Module["_emscripten_GetProcAddress"]=wasmExports["emscripten_GetProcAddress"])(a0);var _emscripten_webgl1_get_proc_address=Module["_emscripten_webgl1_get_proc_address"]=a0=>(_emscripten_webgl1_get_proc_address=Module["_emscripten_webgl1_get_proc_address"]=wasmExports["emscripten_webgl1_get_proc_address"])(a0);var __webgl1_match_ext_proc_address_without_suffix=Module["__webgl1_match_ext_proc_address_without_suffix"]=a0=>(__webgl1_match_ext_proc_address_without_suffix=Module["__webgl1_match_ext_proc_address_without_suffix"]=wasmExports["_webgl1_match_ext_proc_address_without_suffix"])(a0);var _emscripten_webgl_get_proc_address=Module["_emscripten_webgl_get_proc_address"]=a0=>(_emscripten_webgl_get_proc_address=Module["_emscripten_webgl_get_proc_address"]=wasmExports["emscripten_webgl_get_proc_address"])(a0);var _SDL_GL_GetProcAddress=Module["_SDL_GL_GetProcAddress"]=a0=>(_SDL_GL_GetProcAddress=Module["_SDL_GL_GetProcAddress"]=wasmExports["SDL_GL_GetProcAddress"])(a0);var _eglGetProcAddress=Module["_eglGetProcAddress"]=a0=>(_eglGetProcAddress=Module["_eglGetProcAddress"]=wasmExports["eglGetProcAddress"])(a0);var _glfwGetProcAddress=Module["_glfwGetProcAddress"]=a0=>(_glfwGetProcAddress=Module["_glfwGetProcAddress"]=wasmExports["glfwGetProcAddress"])(a0);var _emscripten_webgl_init_context_attributes=Module["_emscripten_webgl_init_context_attributes"]=a0=>(_emscripten_webgl_init_context_attributes=Module["_emscripten_webgl_init_context_attributes"]=wasmExports["emscripten_webgl_init_context_attributes"])(a0);var _emscripten_is_main_runtime_thread=Module["_emscripten_is_main_runtime_thread"]=()=>(_emscripten_is_main_runtime_thread=Module["_emscripten_is_main_runtime_thread"]=wasmExports["emscripten_is_main_runtime_thread"])();var _adler32_z=Module["_adler32_z"]=(a0,a1,a2)=>(_adler32_z=Module["_adler32_z"]=wasmExports["adler32_z"])(a0,a1,a2);var _adler32_combine=Module["_adler32_combine"]=(a0,a1,a2)=>(_adler32_combine=Module["_adler32_combine"]=wasmExports["adler32_combine"])(a0,a1,a2);var _adler32_combine64=Module["_adler32_combine64"]=(a0,a1,a2)=>(_adler32_combine64=Module["_adler32_combine64"]=wasmExports["adler32_combine64"])(a0,a1,a2);var _compress2=Module["_compress2"]=(a0,a1,a2,a3,a4)=>(_compress2=Module["_compress2"]=wasmExports["compress2"])(a0,a1,a2,a3,a4);var _deflateInit_=Module["_deflateInit_"]=(a0,a1,a2,a3)=>(_deflateInit_=Module["_deflateInit_"]=wasmExports["deflateInit_"])(a0,a1,a2,a3);var _compress=Module["_compress"]=(a0,a1,a2,a3)=>(_compress=Module["_compress"]=wasmExports["compress"])(a0,a1,a2,a3);var _compressBound=Module["_compressBound"]=a0=>(_compressBound=Module["_compressBound"]=wasmExports["compressBound"])(a0);var _get_crc_table=Module["_get_crc_table"]=()=>(_get_crc_table=Module["_get_crc_table"]=wasmExports["get_crc_table"])();var _crc32_z=Module["_crc32_z"]=(a0,a1,a2)=>(_crc32_z=Module["_crc32_z"]=wasmExports["crc32_z"])(a0,a1,a2);var _crc32_combine64=Module["_crc32_combine64"]=(a0,a1,a2)=>(_crc32_combine64=Module["_crc32_combine64"]=wasmExports["crc32_combine64"])(a0,a1,a2);var _crc32_combine=Module["_crc32_combine"]=(a0,a1,a2)=>(_crc32_combine=Module["_crc32_combine"]=wasmExports["crc32_combine"])(a0,a1,a2);var _crc32_combine_gen64=Module["_crc32_combine_gen64"]=a0=>(_crc32_combine_gen64=Module["_crc32_combine_gen64"]=wasmExports["crc32_combine_gen64"])(a0);var _crc32_combine_gen=Module["_crc32_combine_gen"]=a0=>(_crc32_combine_gen=Module["_crc32_combine_gen"]=wasmExports["crc32_combine_gen"])(a0);var _crc32_combine_op=Module["_crc32_combine_op"]=(a0,a1,a2)=>(_crc32_combine_op=Module["_crc32_combine_op"]=wasmExports["crc32_combine_op"])(a0,a1,a2);var _zcalloc=Module["_zcalloc"]=(a0,a1,a2)=>(_zcalloc=Module["_zcalloc"]=wasmExports["zcalloc"])(a0,a1,a2);var _zcfree=Module["_zcfree"]=(a0,a1)=>(_zcfree=Module["_zcfree"]=wasmExports["zcfree"])(a0,a1);var _deflateReset=Module["_deflateReset"]=a0=>(_deflateReset=Module["_deflateReset"]=wasmExports["deflateReset"])(a0);var _deflateResetKeep=Module["_deflateResetKeep"]=a0=>(_deflateResetKeep=Module["_deflateResetKeep"]=wasmExports["deflateResetKeep"])(a0);var _deflateGetDictionary=Module["_deflateGetDictionary"]=(a0,a1,a2)=>(_deflateGetDictionary=Module["_deflateGetDictionary"]=wasmExports["deflateGetDictionary"])(a0,a1,a2);var __tr_init=Module["__tr_init"]=a0=>(__tr_init=Module["__tr_init"]=wasmExports["_tr_init"])(a0);var _deflateSetHeader=Module["_deflateSetHeader"]=(a0,a1)=>(_deflateSetHeader=Module["_deflateSetHeader"]=wasmExports["deflateSetHeader"])(a0,a1);var _deflatePending=Module["_deflatePending"]=(a0,a1,a2)=>(_deflatePending=Module["_deflatePending"]=wasmExports["deflatePending"])(a0,a1,a2);var _deflatePrime=Module["_deflatePrime"]=(a0,a1,a2)=>(_deflatePrime=Module["_deflatePrime"]=wasmExports["deflatePrime"])(a0,a1,a2);var __tr_flush_bits=Module["__tr_flush_bits"]=a0=>(__tr_flush_bits=Module["__tr_flush_bits"]=wasmExports["_tr_flush_bits"])(a0);var _deflateParams=Module["_deflateParams"]=(a0,a1,a2)=>(_deflateParams=Module["_deflateParams"]=wasmExports["deflateParams"])(a0,a1,a2);var __tr_align=Module["__tr_align"]=a0=>(__tr_align=Module["__tr_align"]=wasmExports["_tr_align"])(a0);var __tr_stored_block=Module["__tr_stored_block"]=(a0,a1,a2,a3)=>(__tr_stored_block=Module["__tr_stored_block"]=wasmExports["_tr_stored_block"])(a0,a1,a2,a3);var _deflateTune=Module["_deflateTune"]=(a0,a1,a2,a3,a4)=>(_deflateTune=Module["_deflateTune"]=wasmExports["deflateTune"])(a0,a1,a2,a3,a4);var _deflateBound=Module["_deflateBound"]=(a0,a1)=>(_deflateBound=Module["_deflateBound"]=wasmExports["deflateBound"])(a0,a1);var __tr_flush_block=Module["__tr_flush_block"]=(a0,a1,a2,a3)=>(__tr_flush_block=Module["__tr_flush_block"]=wasmExports["_tr_flush_block"])(a0,a1,a2,a3);var _gzclose=Module["_gzclose"]=a0=>(_gzclose=Module["_gzclose"]=wasmExports["gzclose"])(a0);var _gzclose_r=Module["_gzclose_r"]=a0=>(_gzclose_r=Module["_gzclose_r"]=wasmExports["gzclose_r"])(a0);var _gzclose_w=Module["_gzclose_w"]=a0=>(_gzclose_w=Module["_gzclose_w"]=wasmExports["gzclose_w"])(a0);var _gzopen=Module["_gzopen"]=(a0,a1)=>(_gzopen=Module["_gzopen"]=wasmExports["gzopen"])(a0,a1);var _gzopen64=Module["_gzopen64"]=(a0,a1)=>(_gzopen64=Module["_gzopen64"]=wasmExports["gzopen64"])(a0,a1);var _gzdopen=Module["_gzdopen"]=(a0,a1)=>(_gzdopen=Module["_gzdopen"]=wasmExports["gzdopen"])(a0,a1);var _gzbuffer=Module["_gzbuffer"]=(a0,a1)=>(_gzbuffer=Module["_gzbuffer"]=wasmExports["gzbuffer"])(a0,a1);var _gzrewind=Module["_gzrewind"]=a0=>(_gzrewind=Module["_gzrewind"]=wasmExports["gzrewind"])(a0);var _gzseek64=Module["_gzseek64"]=(a0,a1,a2)=>(_gzseek64=Module["_gzseek64"]=wasmExports["gzseek64"])(a0,a1,a2);var _gz_error=Module["_gz_error"]=(a0,a1,a2)=>(_gz_error=Module["_gz_error"]=wasmExports["gz_error"])(a0,a1,a2);var _gzseek=Module["_gzseek"]=(a0,a1,a2)=>(_gzseek=Module["_gzseek"]=wasmExports["gzseek"])(a0,a1,a2);var _gztell64=Module["_gztell64"]=a0=>(_gztell64=Module["_gztell64"]=wasmExports["gztell64"])(a0);var _gztell=Module["_gztell"]=a0=>(_gztell=Module["_gztell"]=wasmExports["gztell"])(a0);var _gzoffset64=Module["_gzoffset64"]=a0=>(_gzoffset64=Module["_gzoffset64"]=wasmExports["gzoffset64"])(a0);var _gzoffset=Module["_gzoffset"]=a0=>(_gzoffset=Module["_gzoffset"]=wasmExports["gzoffset"])(a0);var _gzeof=Module["_gzeof"]=a0=>(_gzeof=Module["_gzeof"]=wasmExports["gzeof"])(a0);var _gzerror=Module["_gzerror"]=(a0,a1)=>(_gzerror=Module["_gzerror"]=wasmExports["gzerror"])(a0,a1);var _gzclearerr=Module["_gzclearerr"]=a0=>(_gzclearerr=Module["_gzclearerr"]=wasmExports["gzclearerr"])(a0);var _gzread=Module["_gzread"]=(a0,a1,a2)=>(_gzread=Module["_gzread"]=wasmExports["gzread"])(a0,a1,a2);var _gzfread=Module["_gzfread"]=(a0,a1,a2,a3)=>(_gzfread=Module["_gzfread"]=wasmExports["gzfread"])(a0,a1,a2,a3);var _gzgetc=Module["_gzgetc"]=a0=>(_gzgetc=Module["_gzgetc"]=wasmExports["gzgetc"])(a0);var _gzgetc_=Module["_gzgetc_"]=a0=>(_gzgetc_=Module["_gzgetc_"]=wasmExports["gzgetc_"])(a0);var _gzungetc=Module["_gzungetc"]=(a0,a1)=>(_gzungetc=Module["_gzungetc"]=wasmExports["gzungetc"])(a0,a1);var _gzgets=Module["_gzgets"]=(a0,a1,a2)=>(_gzgets=Module["_gzgets"]=wasmExports["gzgets"])(a0,a1,a2);var _gzdirect=Module["_gzdirect"]=a0=>(_gzdirect=Module["_gzdirect"]=wasmExports["gzdirect"])(a0);var _inflateReset=Module["_inflateReset"]=a0=>(_inflateReset=Module["_inflateReset"]=wasmExports["inflateReset"])(a0);var _gzwrite=Module["_gzwrite"]=(a0,a1,a2)=>(_gzwrite=Module["_gzwrite"]=wasmExports["gzwrite"])(a0,a1,a2);var _gzfwrite=Module["_gzfwrite"]=(a0,a1,a2,a3)=>(_gzfwrite=Module["_gzfwrite"]=wasmExports["gzfwrite"])(a0,a1,a2,a3);var _gzputc=Module["_gzputc"]=(a0,a1)=>(_gzputc=Module["_gzputc"]=wasmExports["gzputc"])(a0,a1);var _gzputs=Module["_gzputs"]=(a0,a1)=>(_gzputs=Module["_gzputs"]=wasmExports["gzputs"])(a0,a1);var _gzvprintf=Module["_gzvprintf"]=(a0,a1,a2)=>(_gzvprintf=Module["_gzvprintf"]=wasmExports["gzvprintf"])(a0,a1,a2);var _gzprintf=Module["_gzprintf"]=(a0,a1,a2)=>(_gzprintf=Module["_gzprintf"]=wasmExports["gzprintf"])(a0,a1,a2);var _gzflush=Module["_gzflush"]=(a0,a1)=>(_gzflush=Module["_gzflush"]=wasmExports["gzflush"])(a0,a1);var _gzsetparams=Module["_gzsetparams"]=(a0,a1,a2)=>(_gzsetparams=Module["_gzsetparams"]=wasmExports["gzsetparams"])(a0,a1,a2);var _inflateBackInit_=Module["_inflateBackInit_"]=(a0,a1,a2,a3,a4)=>(_inflateBackInit_=Module["_inflateBackInit_"]=wasmExports["inflateBackInit_"])(a0,a1,a2,a3,a4);var _inflateBack=Module["_inflateBack"]=(a0,a1,a2,a3,a4)=>(_inflateBack=Module["_inflateBack"]=wasmExports["inflateBack"])(a0,a1,a2,a3,a4);var _inflate_table=Module["_inflate_table"]=(a0,a1,a2,a3,a4,a5)=>(_inflate_table=Module["_inflate_table"]=wasmExports["inflate_table"])(a0,a1,a2,a3,a4,a5);var _inflate_fast=Module["_inflate_fast"]=(a0,a1)=>(_inflate_fast=Module["_inflate_fast"]=wasmExports["inflate_fast"])(a0,a1);var _inflateBackEnd=Module["_inflateBackEnd"]=a0=>(_inflateBackEnd=Module["_inflateBackEnd"]=wasmExports["inflateBackEnd"])(a0);var _inflateResetKeep=Module["_inflateResetKeep"]=a0=>(_inflateResetKeep=Module["_inflateResetKeep"]=wasmExports["inflateResetKeep"])(a0);var _inflateReset2=Module["_inflateReset2"]=(a0,a1)=>(_inflateReset2=Module["_inflateReset2"]=wasmExports["inflateReset2"])(a0,a1);var _inflateInit_=Module["_inflateInit_"]=(a0,a1,a2)=>(_inflateInit_=Module["_inflateInit_"]=wasmExports["inflateInit_"])(a0,a1,a2);var _inflatePrime=Module["_inflatePrime"]=(a0,a1,a2)=>(_inflatePrime=Module["_inflatePrime"]=wasmExports["inflatePrime"])(a0,a1,a2);var _inflateGetDictionary=Module["_inflateGetDictionary"]=(a0,a1,a2)=>(_inflateGetDictionary=Module["_inflateGetDictionary"]=wasmExports["inflateGetDictionary"])(a0,a1,a2);var _inflateGetHeader=Module["_inflateGetHeader"]=(a0,a1)=>(_inflateGetHeader=Module["_inflateGetHeader"]=wasmExports["inflateGetHeader"])(a0,a1);var _inflateSync=Module["_inflateSync"]=a0=>(_inflateSync=Module["_inflateSync"]=wasmExports["inflateSync"])(a0);var _inflateSyncPoint=Module["_inflateSyncPoint"]=a0=>(_inflateSyncPoint=Module["_inflateSyncPoint"]=wasmExports["inflateSyncPoint"])(a0);var _inflateUndermine=Module["_inflateUndermine"]=(a0,a1)=>(_inflateUndermine=Module["_inflateUndermine"]=wasmExports["inflateUndermine"])(a0,a1);var _inflateValidate=Module["_inflateValidate"]=(a0,a1)=>(_inflateValidate=Module["_inflateValidate"]=wasmExports["inflateValidate"])(a0,a1);var _inflateMark=Module["_inflateMark"]=a0=>(_inflateMark=Module["_inflateMark"]=wasmExports["inflateMark"])(a0);var _inflateCodesUsed=Module["_inflateCodesUsed"]=a0=>(_inflateCodesUsed=Module["_inflateCodesUsed"]=wasmExports["inflateCodesUsed"])(a0);var __tr_tally=Module["__tr_tally"]=(a0,a1,a2)=>(__tr_tally=Module["__tr_tally"]=wasmExports["_tr_tally"])(a0,a1,a2);var _uncompress2=Module["_uncompress2"]=(a0,a1,a2,a3)=>(_uncompress2=Module["_uncompress2"]=wasmExports["uncompress2"])(a0,a1,a2,a3);var _uncompress=Module["_uncompress"]=(a0,a1,a2,a3)=>(_uncompress=Module["_uncompress"]=wasmExports["uncompress"])(a0,a1,a2,a3);var _zlibCompileFlags=Module["_zlibCompileFlags"]=()=>(_zlibCompileFlags=Module["_zlibCompileFlags"]=wasmExports["zlibCompileFlags"])();var _zError=Module["_zError"]=a0=>(_zError=Module["_zError"]=wasmExports["zError"])(a0);var _BZ2_blockSort=Module["_BZ2_blockSort"]=a0=>(_BZ2_blockSort=Module["_BZ2_blockSort"]=wasmExports["BZ2_blockSort"])(a0);var _BZ2_bz__AssertH__fail=Module["_BZ2_bz__AssertH__fail"]=a0=>(_BZ2_bz__AssertH__fail=Module["_BZ2_bz__AssertH__fail"]=wasmExports["BZ2_bz__AssertH__fail"])(a0);var _BZ2_bzlibVersion=Module["_BZ2_bzlibVersion"]=()=>(_BZ2_bzlibVersion=Module["_BZ2_bzlibVersion"]=wasmExports["BZ2_bzlibVersion"])();var _BZ2_compressBlock=Module["_BZ2_compressBlock"]=(a0,a1)=>(_BZ2_compressBlock=Module["_BZ2_compressBlock"]=wasmExports["BZ2_compressBlock"])(a0,a1);var _BZ2_indexIntoF=Module["_BZ2_indexIntoF"]=(a0,a1)=>(_BZ2_indexIntoF=Module["_BZ2_indexIntoF"]=wasmExports["BZ2_indexIntoF"])(a0,a1);var _BZ2_decompress=Module["_BZ2_decompress"]=a0=>(_BZ2_decompress=Module["_BZ2_decompress"]=wasmExports["BZ2_decompress"])(a0);var _BZ2_bzWriteOpen=Module["_BZ2_bzWriteOpen"]=(a0,a1,a2,a3,a4)=>(_BZ2_bzWriteOpen=Module["_BZ2_bzWriteOpen"]=wasmExports["BZ2_bzWriteOpen"])(a0,a1,a2,a3,a4);var _BZ2_bzWrite=Module["_BZ2_bzWrite"]=(a0,a1,a2,a3)=>(_BZ2_bzWrite=Module["_BZ2_bzWrite"]=wasmExports["BZ2_bzWrite"])(a0,a1,a2,a3);var _BZ2_bzWriteClose=Module["_BZ2_bzWriteClose"]=(a0,a1,a2,a3,a4)=>(_BZ2_bzWriteClose=Module["_BZ2_bzWriteClose"]=wasmExports["BZ2_bzWriteClose"])(a0,a1,a2,a3,a4);var _BZ2_bzWriteClose64=Module["_BZ2_bzWriteClose64"]=(a0,a1,a2,a3,a4,a5,a6)=>(_BZ2_bzWriteClose64=Module["_BZ2_bzWriteClose64"]=wasmExports["BZ2_bzWriteClose64"])(a0,a1,a2,a3,a4,a5,a6);var _BZ2_bzReadOpen=Module["_BZ2_bzReadOpen"]=(a0,a1,a2,a3,a4,a5)=>(_BZ2_bzReadOpen=Module["_BZ2_bzReadOpen"]=wasmExports["BZ2_bzReadOpen"])(a0,a1,a2,a3,a4,a5);var _BZ2_bzReadClose=Module["_BZ2_bzReadClose"]=(a0,a1)=>(_BZ2_bzReadClose=Module["_BZ2_bzReadClose"]=wasmExports["BZ2_bzReadClose"])(a0,a1);var _BZ2_bzRead=Module["_BZ2_bzRead"]=(a0,a1,a2,a3)=>(_BZ2_bzRead=Module["_BZ2_bzRead"]=wasmExports["BZ2_bzRead"])(a0,a1,a2,a3);var _fgetc=Module["_fgetc"]=a0=>(_fgetc=Module["_fgetc"]=wasmExports["fgetc"])(a0);var _BZ2_bzReadGetUnused=Module["_BZ2_bzReadGetUnused"]=(a0,a1,a2,a3)=>(_BZ2_bzReadGetUnused=Module["_BZ2_bzReadGetUnused"]=wasmExports["BZ2_bzReadGetUnused"])(a0,a1,a2,a3);var _BZ2_bzBuffToBuffCompress=Module["_BZ2_bzBuffToBuffCompress"]=(a0,a1,a2,a3,a4,a5,a6)=>(_BZ2_bzBuffToBuffCompress=Module["_BZ2_bzBuffToBuffCompress"]=wasmExports["BZ2_bzBuffToBuffCompress"])(a0,a1,a2,a3,a4,a5,a6);var _BZ2_bzBuffToBuffDecompress=Module["_BZ2_bzBuffToBuffDecompress"]=(a0,a1,a2,a3,a4,a5)=>(_BZ2_bzBuffToBuffDecompress=Module["_BZ2_bzBuffToBuffDecompress"]=wasmExports["BZ2_bzBuffToBuffDecompress"])(a0,a1,a2,a3,a4,a5);var _BZ2_bzopen=Module["_BZ2_bzopen"]=(a0,a1)=>(_BZ2_bzopen=Module["_BZ2_bzopen"]=wasmExports["BZ2_bzopen"])(a0,a1);var _BZ2_bzdopen=Module["_BZ2_bzdopen"]=(a0,a1)=>(_BZ2_bzdopen=Module["_BZ2_bzdopen"]=wasmExports["BZ2_bzdopen"])(a0,a1);var _BZ2_bzread=Module["_BZ2_bzread"]=(a0,a1,a2)=>(_BZ2_bzread=Module["_BZ2_bzread"]=wasmExports["BZ2_bzread"])(a0,a1,a2);var _BZ2_bzwrite=Module["_BZ2_bzwrite"]=(a0,a1,a2)=>(_BZ2_bzwrite=Module["_BZ2_bzwrite"]=wasmExports["BZ2_bzwrite"])(a0,a1,a2);var _BZ2_bzflush=Module["_BZ2_bzflush"]=a0=>(_BZ2_bzflush=Module["_BZ2_bzflush"]=wasmExports["BZ2_bzflush"])(a0);var _BZ2_bzclose=Module["_BZ2_bzclose"]=a0=>(_BZ2_bzclose=Module["_BZ2_bzclose"]=wasmExports["BZ2_bzclose"])(a0);var _BZ2_bzerror=Module["_BZ2_bzerror"]=(a0,a1)=>(_BZ2_bzerror=Module["_BZ2_bzerror"]=wasmExports["BZ2_bzerror"])(a0,a1);var _BZ2_bsInitWrite=Module["_BZ2_bsInitWrite"]=a0=>(_BZ2_bsInitWrite=Module["_BZ2_bsInitWrite"]=wasmExports["BZ2_bsInitWrite"])(a0);var _BZ2_hbMakeCodeLengths=Module["_BZ2_hbMakeCodeLengths"]=(a0,a1,a2,a3)=>(_BZ2_hbMakeCodeLengths=Module["_BZ2_hbMakeCodeLengths"]=wasmExports["BZ2_hbMakeCodeLengths"])(a0,a1,a2,a3);var _BZ2_hbAssignCodes=Module["_BZ2_hbAssignCodes"]=(a0,a1,a2,a3,a4)=>(_BZ2_hbAssignCodes=Module["_BZ2_hbAssignCodes"]=wasmExports["BZ2_hbAssignCodes"])(a0,a1,a2,a3,a4);var _BZ2_hbCreateDecodeTables=Module["_BZ2_hbCreateDecodeTables"]=(a0,a1,a2,a3,a4,a5,a6)=>(_BZ2_hbCreateDecodeTables=Module["_BZ2_hbCreateDecodeTables"]=wasmExports["BZ2_hbCreateDecodeTables"])(a0,a1,a2,a3,a4,a5,a6);var __emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=(a0,a1,a2)=>(__emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=wasmExports["_emscripten_memcpy_bulkmem"])(a0,a1,a2);var _emscripten_builtin_memcpy=Module["_emscripten_builtin_memcpy"]=(a0,a1,a2)=>(_emscripten_builtin_memcpy=Module["_emscripten_builtin_memcpy"]=wasmExports["emscripten_builtin_memcpy"])(a0,a1,a2);var ___memset=Module["___memset"]=(a0,a1,a2)=>(___memset=Module["___memset"]=wasmExports["__memset"])(a0,a1,a2);var __emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=(a0,a1,a2)=>(__emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=wasmExports["_emscripten_memset_bulkmem"])(a0,a1,a2);var _emscripten_builtin_memset=Module["_emscripten_builtin_memset"]=(a0,a1,a2)=>(_emscripten_builtin_memset=Module["_emscripten_builtin_memset"]=wasmExports["emscripten_builtin_memset"])(a0,a1,a2);var _getdate=Module["_getdate"]=a0=>(_getdate=Module["_getdate"]=wasmExports["getdate"])(a0);var _stime=Module["_stime"]=a0=>(_stime=Module["_stime"]=wasmExports["stime"])(a0);var _clock_getcpuclockid=Module["_clock_getcpuclockid"]=(a0,a1)=>(_clock_getcpuclockid=Module["_clock_getcpuclockid"]=wasmExports["clock_getcpuclockid"])(a0,a1);var _getpwnam=Module["_getpwnam"]=a0=>(_getpwnam=Module["_getpwnam"]=wasmExports["getpwnam"])(a0);var _getpwuid=Module["_getpwuid"]=a0=>(_getpwuid=Module["_getpwuid"]=wasmExports["getpwuid"])(a0);var _getpwnam_r=Module["_getpwnam_r"]=(a0,a1,a2,a3,a4)=>(_getpwnam_r=Module["_getpwnam_r"]=wasmExports["getpwnam_r"])(a0,a1,a2,a3,a4);var _getpwuid_r=Module["_getpwuid_r"]=(a0,a1,a2,a3,a4)=>(_getpwuid_r=Module["_getpwuid_r"]=wasmExports["getpwuid_r"])(a0,a1,a2,a3,a4);var _setpwent=Module["_setpwent"]=()=>(_setpwent=Module["_setpwent"]=wasmExports["setpwent"])();var _endpwent=Module["_endpwent"]=()=>(_endpwent=Module["_endpwent"]=wasmExports["endpwent"])();var _getpwent=Module["_getpwent"]=()=>(_getpwent=Module["_getpwent"]=wasmExports["getpwent"])();var _getgrnam=Module["_getgrnam"]=a0=>(_getgrnam=Module["_getgrnam"]=wasmExports["getgrnam"])(a0);var _getgrgid=Module["_getgrgid"]=a0=>(_getgrgid=Module["_getgrgid"]=wasmExports["getgrgid"])(a0);var _getgrnam_r=Module["_getgrnam_r"]=(a0,a1,a2,a3,a4)=>(_getgrnam_r=Module["_getgrnam_r"]=wasmExports["getgrnam_r"])(a0,a1,a2,a3,a4);var _getgrgid_r=Module["_getgrgid_r"]=(a0,a1,a2,a3,a4)=>(_getgrgid_r=Module["_getgrgid_r"]=wasmExports["getgrgid_r"])(a0,a1,a2,a3,a4);var _getgrent=Module["_getgrent"]=()=>(_getgrent=Module["_getgrent"]=wasmExports["getgrent"])();var _endgrent=Module["_endgrent"]=()=>(_endgrent=Module["_endgrent"]=wasmExports["endgrent"])();var _setgrent=Module["_setgrent"]=()=>(_setgrent=Module["_setgrent"]=wasmExports["setgrent"])();var _flock=Module["_flock"]=(a0,a1)=>(_flock=Module["_flock"]=wasmExports["flock"])(a0,a1);var _vfork=Module["_vfork"]=()=>(_vfork=Module["_vfork"]=wasmExports["vfork"])();var _posix_spawn=Module["_posix_spawn"]=(a0,a1,a2,a3,a4,a5)=>(_posix_spawn=Module["_posix_spawn"]=wasmExports["posix_spawn"])(a0,a1,a2,a3,a4,a5);var _popen=Module["_popen"]=(a0,a1)=>(_popen=Module["_popen"]=wasmExports["popen"])(a0,a1);var _pclose=Module["_pclose"]=a0=>(_pclose=Module["_pclose"]=wasmExports["pclose"])(a0);var _setgroups=Module["_setgroups"]=(a0,a1)=>(_setgroups=Module["_setgroups"]=wasmExports["setgroups"])(a0,a1);var _sigaltstack=Module["_sigaltstack"]=(a0,a1)=>(_sigaltstack=Module["_sigaltstack"]=wasmExports["sigaltstack"])(a0,a1);var ___syscall_uname=Module["___syscall_uname"]=a0=>(___syscall_uname=Module["___syscall_uname"]=wasmExports["__syscall_uname"])(a0);var ___syscall_setpgid=Module["___syscall_setpgid"]=(a0,a1)=>(___syscall_setpgid=Module["___syscall_setpgid"]=wasmExports["__syscall_setpgid"])(a0,a1);var ___syscall_sync=Module["___syscall_sync"]=()=>(___syscall_sync=Module["___syscall_sync"]=wasmExports["__syscall_sync"])();var ___syscall_getsid=Module["___syscall_getsid"]=a0=>(___syscall_getsid=Module["___syscall_getsid"]=wasmExports["__syscall_getsid"])(a0);var ___syscall_getpgid=Module["___syscall_getpgid"]=a0=>(___syscall_getpgid=Module["___syscall_getpgid"]=wasmExports["__syscall_getpgid"])(a0);var ___syscall_getpid=Module["___syscall_getpid"]=()=>(___syscall_getpid=Module["___syscall_getpid"]=wasmExports["__syscall_getpid"])();var ___syscall_getppid=Module["___syscall_getppid"]=()=>(___syscall_getppid=Module["___syscall_getppid"]=wasmExports["__syscall_getppid"])();var ___syscall_linkat=Module["___syscall_linkat"]=(a0,a1,a2,a3,a4)=>(___syscall_linkat=Module["___syscall_linkat"]=wasmExports["__syscall_linkat"])(a0,a1,a2,a3,a4);var ___syscall_getgroups32=Module["___syscall_getgroups32"]=(a0,a1)=>(___syscall_getgroups32=Module["___syscall_getgroups32"]=wasmExports["__syscall_getgroups32"])(a0,a1);var ___syscall_setsid=Module["___syscall_setsid"]=()=>(___syscall_setsid=Module["___syscall_setsid"]=wasmExports["__syscall_setsid"])();var ___syscall_umask=Module["___syscall_umask"]=a0=>(___syscall_umask=Module["___syscall_umask"]=wasmExports["__syscall_umask"])(a0);var ___syscall_setrlimit=Module["___syscall_setrlimit"]=(a0,a1)=>(___syscall_setrlimit=Module["___syscall_setrlimit"]=wasmExports["__syscall_setrlimit"])(a0,a1);var ___syscall_getrusage=Module["___syscall_getrusage"]=(a0,a1)=>(___syscall_getrusage=Module["___syscall_getrusage"]=wasmExports["__syscall_getrusage"])(a0,a1);var ___syscall_getpriority=Module["___syscall_getpriority"]=(a0,a1)=>(___syscall_getpriority=Module["___syscall_getpriority"]=wasmExports["__syscall_getpriority"])(a0,a1);var ___syscall_setpriority=Module["___syscall_setpriority"]=(a0,a1,a2)=>(___syscall_setpriority=Module["___syscall_setpriority"]=wasmExports["__syscall_setpriority"])(a0,a1,a2);var ___syscall_setdomainname=Module["___syscall_setdomainname"]=(a0,a1)=>(___syscall_setdomainname=Module["___syscall_setdomainname"]=wasmExports["__syscall_setdomainname"])(a0,a1);var ___syscall_getuid32=Module["___syscall_getuid32"]=()=>(___syscall_getuid32=Module["___syscall_getuid32"]=wasmExports["__syscall_getuid32"])();var ___syscall_getgid32=Module["___syscall_getgid32"]=()=>(___syscall_getgid32=Module["___syscall_getgid32"]=wasmExports["__syscall_getgid32"])();var ___syscall_geteuid32=Module["___syscall_geteuid32"]=()=>(___syscall_geteuid32=Module["___syscall_geteuid32"]=wasmExports["__syscall_geteuid32"])();var ___syscall_getegid32=Module["___syscall_getegid32"]=()=>(___syscall_getegid32=Module["___syscall_getegid32"]=wasmExports["__syscall_getegid32"])();var ___syscall_getresuid32=Module["___syscall_getresuid32"]=(a0,a1,a2)=>(___syscall_getresuid32=Module["___syscall_getresuid32"]=wasmExports["__syscall_getresuid32"])(a0,a1,a2);var ___syscall_getresgid32=Module["___syscall_getresgid32"]=(a0,a1,a2)=>(___syscall_getresgid32=Module["___syscall_getresgid32"]=wasmExports["__syscall_getresgid32"])(a0,a1,a2);var ___syscall_pause=Module["___syscall_pause"]=()=>(___syscall_pause=Module["___syscall_pause"]=wasmExports["__syscall_pause"])();var ___syscall_madvise=Module["___syscall_madvise"]=(a0,a1,a2)=>(___syscall_madvise=Module["___syscall_madvise"]=wasmExports["__syscall_madvise"])(a0,a1,a2);var ___syscall_mlock=Module["___syscall_mlock"]=(a0,a1)=>(___syscall_mlock=Module["___syscall_mlock"]=wasmExports["__syscall_mlock"])(a0,a1);var ___syscall_munlock=Module["___syscall_munlock"]=(a0,a1)=>(___syscall_munlock=Module["___syscall_munlock"]=wasmExports["__syscall_munlock"])(a0,a1);var ___syscall_mprotect=Module["___syscall_mprotect"]=(a0,a1,a2)=>(___syscall_mprotect=Module["___syscall_mprotect"]=wasmExports["__syscall_mprotect"])(a0,a1,a2);var ___syscall_mremap=Module["___syscall_mremap"]=(a0,a1,a2,a3,a4)=>(___syscall_mremap=Module["___syscall_mremap"]=wasmExports["__syscall_mremap"])(a0,a1,a2,a3,a4);var ___syscall_mlockall=Module["___syscall_mlockall"]=a0=>(___syscall_mlockall=Module["___syscall_mlockall"]=wasmExports["__syscall_mlockall"])(a0);var ___syscall_munlockall=Module["___syscall_munlockall"]=()=>(___syscall_munlockall=Module["___syscall_munlockall"]=wasmExports["__syscall_munlockall"])();var ___syscall_prlimit64=Module["___syscall_prlimit64"]=(a0,a1,a2,a3)=>(___syscall_prlimit64=Module["___syscall_prlimit64"]=wasmExports["__syscall_prlimit64"])(a0,a1,a2,a3);var ___syscall_ugetrlimit=Module["___syscall_ugetrlimit"]=(a0,a1)=>(___syscall_ugetrlimit=Module["___syscall_ugetrlimit"]=wasmExports["__syscall_ugetrlimit"])(a0,a1);var ___syscall_setsockopt=Module["___syscall_setsockopt"]=(a0,a1,a2,a3,a4,a5)=>(___syscall_setsockopt=Module["___syscall_setsockopt"]=wasmExports["__syscall_setsockopt"])(a0,a1,a2,a3,a4,a5);var ___syscall_acct=Module["___syscall_acct"]=a0=>(___syscall_acct=Module["___syscall_acct"]=wasmExports["__syscall_acct"])(a0);var ___syscall_mincore=Module["___syscall_mincore"]=(a0,a1,a2)=>(___syscall_mincore=Module["___syscall_mincore"]=wasmExports["__syscall_mincore"])(a0,a1,a2);var ___syscall_pipe2=Module["___syscall_pipe2"]=(a0,a1)=>(___syscall_pipe2=Module["___syscall_pipe2"]=wasmExports["__syscall_pipe2"])(a0,a1);var ___syscall_pselect6=Module["___syscall_pselect6"]=(a0,a1,a2,a3,a4,a5)=>(___syscall_pselect6=Module["___syscall_pselect6"]=wasmExports["__syscall_pselect6"])(a0,a1,a2,a3,a4,a5);var ___syscall_recvmmsg=Module["___syscall_recvmmsg"]=(a0,a1,a2,a3,a4)=>(___syscall_recvmmsg=Module["___syscall_recvmmsg"]=wasmExports["__syscall_recvmmsg"])(a0,a1,a2,a3,a4);var ___syscall_sendmmsg=Module["___syscall_sendmmsg"]=(a0,a1,a2,a3,a4)=>(___syscall_sendmmsg=Module["___syscall_sendmmsg"]=wasmExports["__syscall_sendmmsg"])(a0,a1,a2,a3,a4);var ___syscall_shutdown=Module["___syscall_shutdown"]=(a0,a1,a2,a3,a4,a5)=>(___syscall_shutdown=Module["___syscall_shutdown"]=wasmExports["__syscall_shutdown"])(a0,a1,a2,a3,a4,a5);var ___syscall_socketpair=Module["___syscall_socketpair"]=(a0,a1,a2,a3,a4,a5)=>(___syscall_socketpair=Module["___syscall_socketpair"]=wasmExports["__syscall_socketpair"])(a0,a1,a2,a3,a4,a5);var ___syscall_wait4=Module["___syscall_wait4"]=(a0,a1,a2,a3)=>(___syscall_wait4=Module["___syscall_wait4"]=wasmExports["__syscall_wait4"])(a0,a1,a2,a3);var _atexit=Module["_atexit"]=a0=>(_atexit=Module["_atexit"]=wasmExports["atexit"])(a0);var ___cxa_atexit=Module["___cxa_atexit"]=(a0,a1,a2)=>(___cxa_atexit=Module["___cxa_atexit"]=wasmExports["__cxa_atexit"])(a0,a1,a2);var ___cxa_finalize=Module["___cxa_finalize"]=a0=>(___cxa_finalize=Module["___cxa_finalize"]=wasmExports["__cxa_finalize"])(a0);var __Exit=Module["__Exit"]=a0=>(__Exit=Module["__Exit"]=wasmExports["_Exit"])(a0);var _cosf=Module["_cosf"]=a0=>(_cosf=Module["_cosf"]=wasmExports["cosf"])(a0);var _sinf=Module["_sinf"]=a0=>(_sinf=Module["_sinf"]=wasmExports["sinf"])(a0);var _expf=Module["_expf"]=a0=>(_expf=Module["_expf"]=wasmExports["expf"])(a0);var ___multf3=Module["___multf3"]=(a0,a1,a2,a3,a4)=>(___multf3=Module["___multf3"]=wasmExports["__multf3"])(a0,a1,a2,a3,a4);var ___addtf3=Module["___addtf3"]=(a0,a1,a2,a3,a4)=>(___addtf3=Module["___addtf3"]=wasmExports["__addtf3"])(a0,a1,a2,a3,a4);var ___subtf3=Module["___subtf3"]=(a0,a1,a2,a3,a4)=>(___subtf3=Module["___subtf3"]=wasmExports["__subtf3"])(a0,a1,a2,a3,a4);var ___ctype_b_loc=Module["___ctype_b_loc"]=()=>(___ctype_b_loc=Module["___ctype_b_loc"]=wasmExports["__ctype_b_loc"])();var ___ctype_get_mb_cur_max=Module["___ctype_get_mb_cur_max"]=()=>(___ctype_get_mb_cur_max=Module["___ctype_get_mb_cur_max"]=wasmExports["__ctype_get_mb_cur_max"])();var ___get_tp=Module["___get_tp"]=()=>(___get_tp=Module["___get_tp"]=wasmExports["__get_tp"])();var ___ctype_tolower_loc=Module["___ctype_tolower_loc"]=()=>(___ctype_tolower_loc=Module["___ctype_tolower_loc"]=wasmExports["__ctype_tolower_loc"])();var ___ctype_toupper_loc=Module["___ctype_toupper_loc"]=()=>(___ctype_toupper_loc=Module["___ctype_toupper_loc"]=wasmExports["__ctype_toupper_loc"])();var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=()=>(___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=wasmExports["__emscripten_environ_constructor"])();var _emscripten_builtin_malloc=Module["_emscripten_builtin_malloc"]=a0=>(_emscripten_builtin_malloc=Module["_emscripten_builtin_malloc"]=wasmExports["emscripten_builtin_malloc"])(a0);var ___flt_rounds=Module["___flt_rounds"]=()=>(___flt_rounds=Module["___flt_rounds"]=wasmExports["__flt_rounds"])();var _fegetround=Module["_fegetround"]=()=>(_fegetround=Module["_fegetround"]=wasmExports["fegetround"])();var ___fmodeflags=Module["___fmodeflags"]=a0=>(___fmodeflags=Module["___fmodeflags"]=wasmExports["__fmodeflags"])(a0);var ___fpclassify=Module["___fpclassify"]=a0=>(___fpclassify=Module["___fpclassify"]=wasmExports["__fpclassify"])(a0);var ___fpclassifyf=Module["___fpclassifyf"]=a0=>(___fpclassifyf=Module["___fpclassifyf"]=wasmExports["__fpclassifyf"])(a0);var ___fpclassifyl=Module["___fpclassifyl"]=(a0,a1)=>(___fpclassifyl=Module["___fpclassifyl"]=wasmExports["__fpclassifyl"])(a0,a1);var ___divtf3=Module["___divtf3"]=(a0,a1,a2,a3,a4)=>(___divtf3=Module["___divtf3"]=wasmExports["__divtf3"])(a0,a1,a2,a3,a4);var ___mo_lookup=Module["___mo_lookup"]=(a0,a1,a2)=>(___mo_lookup=Module["___mo_lookup"]=wasmExports["__mo_lookup"])(a0,a1,a2);var ___overflow=Module["___overflow"]=(a0,a1)=>(___overflow=Module["___overflow"]=wasmExports["__overflow"])(a0,a1);var _scalbn=Module["_scalbn"]=(a0,a1)=>(_scalbn=Module["_scalbn"]=wasmExports["scalbn"])(a0,a1);var _floor=Module["_floor"]=a0=>(_floor=Module["_floor"]=wasmExports["floor"])(a0);var ___lttf2=Module["___lttf2"]=(a0,a1,a2,a3)=>(___lttf2=Module["___lttf2"]=wasmExports["__lttf2"])(a0,a1,a2,a3);var ___fixtfdi=Module["___fixtfdi"]=(a0,a1)=>(___fixtfdi=Module["___fixtfdi"]=wasmExports["__fixtfdi"])(a0,a1);var ___gttf2=Module["___gttf2"]=(a0,a1,a2,a3)=>(___gttf2=Module["___gttf2"]=wasmExports["__gttf2"])(a0,a1,a2,a3);var ___fixtfsi=Module["___fixtfsi"]=(a0,a1)=>(___fixtfsi=Module["___fixtfsi"]=wasmExports["__fixtfsi"])(a0,a1);var ___floatsitf=Module["___floatsitf"]=(a0,a1)=>(___floatsitf=Module["___floatsitf"]=wasmExports["__floatsitf"])(a0,a1);var ___signbit=Module["___signbit"]=a0=>(___signbit=Module["___signbit"]=wasmExports["__signbit"])(a0);var ___signbitf=Module["___signbitf"]=a0=>(___signbitf=Module["___signbitf"]=wasmExports["__signbitf"])(a0);var ___signbitl=Module["___signbitl"]=(a0,a1)=>(___signbitl=Module["___signbitl"]=wasmExports["__signbitl"])(a0,a1);var ___wasi_syscall_ret=Module["___wasi_syscall_ret"]=a0=>(___wasi_syscall_ret=Module["___wasi_syscall_ret"]=wasmExports["__wasi_syscall_ret"])(a0);var ___synccall=Module["___synccall"]=(a0,a1)=>(___synccall=Module["___synccall"]=wasmExports["__synccall"])(a0,a1);var _fabsl=Module["_fabsl"]=(a0,a1,a2)=>(_fabsl=Module["_fabsl"]=wasmExports["fabsl"])(a0,a1,a2);var ___getf2=Module["___getf2"]=(a0,a1,a2,a3)=>(___getf2=Module["___getf2"]=wasmExports["__getf2"])(a0,a1,a2,a3);var ___uflow=Module["___uflow"]=a0=>(___uflow=Module["___uflow"]=wasmExports["__uflow"])(a0);var ___fxstat=Module["___fxstat"]=(a0,a1,a2)=>(___fxstat=Module["___fxstat"]=wasmExports["__fxstat"])(a0,a1,a2);var ___fxstatat=Module["___fxstatat"]=(a0,a1,a2,a3,a4)=>(___fxstatat=Module["___fxstatat"]=wasmExports["__fxstatat"])(a0,a1,a2,a3,a4);var ___lxstat=Module["___lxstat"]=(a0,a1,a2)=>(___lxstat=Module["___lxstat"]=wasmExports["__lxstat"])(a0,a1,a2);var ___xstat=Module["___xstat"]=(a0,a1,a2)=>(___xstat=Module["___xstat"]=wasmExports["__xstat"])(a0,a1,a2);var ___xmknod=Module["___xmknod"]=(a0,a1,a2,a3)=>(___xmknod=Module["___xmknod"]=wasmExports["__xmknod"])(a0,a1,a2,a3);var _mknod=Module["_mknod"]=(a0,a1,a2)=>(_mknod=Module["_mknod"]=wasmExports["mknod"])(a0,a1,a2);var ___xmknodat=Module["___xmknodat"]=(a0,a1,a2,a3,a4)=>(___xmknodat=Module["___xmknodat"]=wasmExports["__xmknodat"])(a0,a1,a2,a3,a4);var _mknodat=Module["_mknodat"]=(a0,a1,a2,a3)=>(_mknodat=Module["_mknodat"]=wasmExports["mknodat"])(a0,a1,a2,a3);var _a64l=Module["_a64l"]=a0=>(_a64l=Module["_a64l"]=wasmExports["a64l"])(a0);var _l64a=Module["_l64a"]=a0=>(_l64a=Module["_l64a"]=wasmExports["l64a"])(a0);var _abs=Module["_abs"]=a0=>(_abs=Module["_abs"]=wasmExports["abs"])(a0);var _acct=Module["_acct"]=a0=>(_acct=Module["_acct"]=wasmExports["acct"])(a0);var _acosf=Module["_acosf"]=a0=>(_acosf=Module["_acosf"]=wasmExports["acosf"])(a0);var _sqrtf=Module["_sqrtf"]=a0=>(_sqrtf=Module["_sqrtf"]=wasmExports["sqrtf"])(a0);var _acoshf=Module["_acoshf"]=a0=>(_acoshf=Module["_acoshf"]=wasmExports["acoshf"])(a0);var _log1pf=Module["_log1pf"]=a0=>(_log1pf=Module["_log1pf"]=wasmExports["log1pf"])(a0);var _logf=Module["_logf"]=a0=>(_logf=Module["_logf"]=wasmExports["logf"])(a0);var _acoshl=Module["_acoshl"]=(a0,a1,a2)=>(_acoshl=Module["_acoshl"]=wasmExports["acoshl"])(a0,a1,a2);var _acosl=Module["_acosl"]=(a0,a1,a2)=>(_acosl=Module["_acosl"]=wasmExports["acosl"])(a0,a1,a2);var ___eqtf2=Module["___eqtf2"]=(a0,a1,a2,a3)=>(___eqtf2=Module["___eqtf2"]=wasmExports["__eqtf2"])(a0,a1,a2,a3);var ___netf2=Module["___netf2"]=(a0,a1,a2,a3)=>(___netf2=Module["___netf2"]=wasmExports["__netf2"])(a0,a1,a2,a3);var _sqrtl=Module["_sqrtl"]=(a0,a1,a2)=>(_sqrtl=Module["_sqrtl"]=wasmExports["sqrtl"])(a0,a1,a2);var _alarm=Module["_alarm"]=a0=>(_alarm=Module["_alarm"]=wasmExports["alarm"])(a0);var _setitimer=Module["_setitimer"]=(a0,a1,a2)=>(_setitimer=Module["_setitimer"]=wasmExports["setitimer"])(a0,a1,a2);var _aligned_alloc=Module["_aligned_alloc"]=(a0,a1)=>(_aligned_alloc=Module["_aligned_alloc"]=wasmExports["aligned_alloc"])(a0,a1);var _posix_memalign=Module["_posix_memalign"]=(a0,a1,a2)=>(_posix_memalign=Module["_posix_memalign"]=wasmExports["posix_memalign"])(a0,a1,a2);var _alphasort=Module["_alphasort"]=(a0,a1)=>(_alphasort=Module["_alphasort"]=wasmExports["alphasort"])(a0,a1);var _strcoll=Module["_strcoll"]=(a0,a1)=>(_strcoll=Module["_strcoll"]=wasmExports["strcoll"])(a0,a1);var _asctime=Module["_asctime"]=a0=>(_asctime=Module["_asctime"]=wasmExports["asctime"])(a0);var ___nl_langinfo_l=Module["___nl_langinfo_l"]=(a0,a1)=>(___nl_langinfo_l=Module["___nl_langinfo_l"]=wasmExports["__nl_langinfo_l"])(a0,a1);var _asctime_r=Module["_asctime_r"]=(a0,a1)=>(_asctime_r=Module["_asctime_r"]=wasmExports["asctime_r"])(a0,a1);var _asinf=Module["_asinf"]=a0=>(_asinf=Module["_asinf"]=wasmExports["asinf"])(a0);var _fabsf=Module["_fabsf"]=a0=>(_fabsf=Module["_fabsf"]=wasmExports["fabsf"])(a0);var _asinhf=Module["_asinhf"]=a0=>(_asinhf=Module["_asinhf"]=wasmExports["asinhf"])(a0);var _asinhl=Module["_asinhl"]=(a0,a1,a2)=>(_asinhl=Module["_asinhl"]=wasmExports["asinhl"])(a0,a1,a2);var _asinl=Module["_asinl"]=(a0,a1,a2)=>(_asinl=Module["_asinl"]=wasmExports["asinl"])(a0,a1,a2);var _asprintf=Module["_asprintf"]=(a0,a1,a2)=>(_asprintf=Module["_asprintf"]=wasmExports["asprintf"])(a0,a1,a2);var _vasprintf=Module["_vasprintf"]=(a0,a1,a2)=>(_vasprintf=Module["_vasprintf"]=wasmExports["vasprintf"])(a0,a1,a2);var ___lock=Module["___lock"]=a0=>(___lock=Module["___lock"]=wasmExports["__lock"])(a0);var ___unlock=Module["___unlock"]=a0=>(___unlock=Module["___unlock"]=wasmExports["__unlock"])(a0);var _at_quick_exit=Module["_at_quick_exit"]=a0=>(_at_quick_exit=Module["_at_quick_exit"]=wasmExports["at_quick_exit"])(a0);var _atan2f=Module["_atan2f"]=(a0,a1)=>(_atan2f=Module["_atan2f"]=wasmExports["atan2f"])(a0,a1);var _atanf=Module["_atanf"]=a0=>(_atanf=Module["_atanf"]=wasmExports["atanf"])(a0);var _atan2l=Module["_atan2l"]=(a0,a1,a2,a3,a4)=>(_atan2l=Module["_atan2l"]=wasmExports["atan2l"])(a0,a1,a2,a3,a4);var _atanl=Module["_atanl"]=(a0,a1,a2)=>(_atanl=Module["_atanl"]=wasmExports["atanl"])(a0,a1,a2);var _atanhf=Module["_atanhf"]=a0=>(_atanhf=Module["_atanhf"]=wasmExports["atanhf"])(a0);var _atanhl=Module["_atanhl"]=(a0,a1,a2)=>(_atanhl=Module["_atanhl"]=wasmExports["atanhl"])(a0,a1,a2);var _log1pl=Module["_log1pl"]=(a0,a1,a2)=>(_log1pl=Module["_log1pl"]=wasmExports["log1pl"])(a0,a1,a2);var ____cxa_finalize=Module["____cxa_finalize"]=a0=>(____cxa_finalize=Module["____cxa_finalize"]=wasmExports["___cxa_finalize"])(a0);var ____cxa_atexit=Module["____cxa_atexit"]=(a0,a1,a2)=>(____cxa_atexit=Module["____cxa_atexit"]=wasmExports["___cxa_atexit"])(a0,a1,a2);var ___libc_calloc=Module["___libc_calloc"]=(a0,a1)=>(___libc_calloc=Module["___libc_calloc"]=wasmExports["__libc_calloc"])(a0,a1);var ___atexit=Module["___atexit"]=a0=>(___atexit=Module["___atexit"]=wasmExports["__atexit"])(a0);var _atof=Module["_atof"]=a0=>(_atof=Module["_atof"]=wasmExports["atof"])(a0);var _strtod=Module["_strtod"]=(a0,a1)=>(_strtod=Module["_strtod"]=wasmExports["strtod"])(a0,a1);var _atoi=Module["_atoi"]=a0=>(_atoi=Module["_atoi"]=wasmExports["atoi"])(a0);var _atol=Module["_atol"]=a0=>(_atol=Module["_atol"]=wasmExports["atol"])(a0);var _atoll=Module["_atoll"]=a0=>(_atoll=Module["_atoll"]=wasmExports["atoll"])(a0);var _basename=Module["_basename"]=a0=>(_basename=Module["_basename"]=wasmExports["basename"])(a0);var ___xpg_basename=Module["___xpg_basename"]=a0=>(___xpg_basename=Module["___xpg_basename"]=wasmExports["__xpg_basename"])(a0);var _bcmp=Module["_bcmp"]=(a0,a1,a2)=>(_bcmp=Module["_bcmp"]=wasmExports["bcmp"])(a0,a1,a2);var _bcopy=Module["_bcopy"]=(a0,a1,a2)=>(_bcopy=Module["_bcopy"]=wasmExports["bcopy"])(a0,a1,a2);var _strcasecmp=Module["_strcasecmp"]=(a0,a1)=>(_strcasecmp=Module["_strcasecmp"]=wasmExports["strcasecmp"])(a0,a1);var _bsearch=Module["_bsearch"]=(a0,a1,a2,a3,a4)=>(_bsearch=Module["_bsearch"]=wasmExports["bsearch"])(a0,a1,a2,a3,a4);var _btowc=Module["_btowc"]=a0=>(_btowc=Module["_btowc"]=wasmExports["btowc"])(a0);var _bzero=Module["_bzero"]=(a0,a1)=>(_bzero=Module["_bzero"]=wasmExports["bzero"])(a0,a1);var _c16rtomb=Module["_c16rtomb"]=(a0,a1,a2)=>(_c16rtomb=Module["_c16rtomb"]=wasmExports["c16rtomb"])(a0,a1,a2);var _wcrtomb=Module["_wcrtomb"]=(a0,a1,a2)=>(_wcrtomb=Module["_wcrtomb"]=wasmExports["wcrtomb"])(a0,a1,a2);var _c32rtomb=Module["_c32rtomb"]=(a0,a1,a2)=>(_c32rtomb=Module["_c32rtomb"]=wasmExports["c32rtomb"])(a0,a1,a2);var _cabs=Module["_cabs"]=a0=>(_cabs=Module["_cabs"]=wasmExports["cabs"])(a0);var _cabsf=Module["_cabsf"]=a0=>(_cabsf=Module["_cabsf"]=wasmExports["cabsf"])(a0);var _hypotf=Module["_hypotf"]=(a0,a1)=>(_hypotf=Module["_hypotf"]=wasmExports["hypotf"])(a0,a1);var _cabsl=Module["_cabsl"]=(a0,a1)=>(_cabsl=Module["_cabsl"]=wasmExports["cabsl"])(a0,a1);var _hypotl=Module["_hypotl"]=(a0,a1,a2,a3,a4)=>(_hypotl=Module["_hypotl"]=wasmExports["hypotl"])(a0,a1,a2,a3,a4);var _cacos=Module["_cacos"]=(a0,a1)=>(_cacos=Module["_cacos"]=wasmExports["cacos"])(a0,a1);var _casin=Module["_casin"]=(a0,a1)=>(_casin=Module["_casin"]=wasmExports["casin"])(a0,a1);var _cacosf=Module["_cacosf"]=(a0,a1)=>(_cacosf=Module["_cacosf"]=wasmExports["cacosf"])(a0,a1);var _casinf=Module["_casinf"]=(a0,a1)=>(_casinf=Module["_casinf"]=wasmExports["casinf"])(a0,a1);var _cacosh=Module["_cacosh"]=(a0,a1)=>(_cacosh=Module["_cacosh"]=wasmExports["cacosh"])(a0,a1);var _cacoshf=Module["_cacoshf"]=(a0,a1)=>(_cacoshf=Module["_cacoshf"]=wasmExports["cacoshf"])(a0,a1);var _cacoshl=Module["_cacoshl"]=(a0,a1)=>(_cacoshl=Module["_cacoshl"]=wasmExports["cacoshl"])(a0,a1);var _cacosl=Module["_cacosl"]=(a0,a1)=>(_cacosl=Module["_cacosl"]=wasmExports["cacosl"])(a0,a1);var _casinl=Module["_casinl"]=(a0,a1)=>(_casinl=Module["_casinl"]=wasmExports["casinl"])(a0,a1);var _call_once=Module["_call_once"]=(a0,a1)=>(_call_once=Module["_call_once"]=wasmExports["call_once"])(a0,a1);var _carg=Module["_carg"]=a0=>(_carg=Module["_carg"]=wasmExports["carg"])(a0);var _cargf=Module["_cargf"]=a0=>(_cargf=Module["_cargf"]=wasmExports["cargf"])(a0);var _cargl=Module["_cargl"]=(a0,a1)=>(_cargl=Module["_cargl"]=wasmExports["cargl"])(a0,a1);var _csqrt=Module["_csqrt"]=(a0,a1)=>(_csqrt=Module["_csqrt"]=wasmExports["csqrt"])(a0,a1);var _clog=Module["_clog"]=(a0,a1)=>(_clog=Module["_clog"]=wasmExports["clog"])(a0,a1);var _csqrtf=Module["_csqrtf"]=(a0,a1)=>(_csqrtf=Module["_csqrtf"]=wasmExports["csqrtf"])(a0,a1);var _clogf=Module["_clogf"]=(a0,a1)=>(_clogf=Module["_clogf"]=wasmExports["clogf"])(a0,a1);var _casinh=Module["_casinh"]=(a0,a1)=>(_casinh=Module["_casinh"]=wasmExports["casinh"])(a0,a1);var _casinhf=Module["_casinhf"]=(a0,a1)=>(_casinhf=Module["_casinhf"]=wasmExports["casinhf"])(a0,a1);var _casinhl=Module["_casinhl"]=(a0,a1)=>(_casinhl=Module["_casinhl"]=wasmExports["casinhl"])(a0,a1);var _csqrtl=Module["_csqrtl"]=(a0,a1)=>(_csqrtl=Module["_csqrtl"]=wasmExports["csqrtl"])(a0,a1);var _clogl=Module["_clogl"]=(a0,a1)=>(_clogl=Module["_clogl"]=wasmExports["clogl"])(a0,a1);var _catan=Module["_catan"]=(a0,a1)=>(_catan=Module["_catan"]=wasmExports["catan"])(a0,a1);var _catanf=Module["_catanf"]=(a0,a1)=>(_catanf=Module["_catanf"]=wasmExports["catanf"])(a0,a1);var _catanh=Module["_catanh"]=(a0,a1)=>(_catanh=Module["_catanh"]=wasmExports["catanh"])(a0,a1);var _catanhf=Module["_catanhf"]=(a0,a1)=>(_catanhf=Module["_catanhf"]=wasmExports["catanhf"])(a0,a1);var _catanhl=Module["_catanhl"]=(a0,a1)=>(_catanhl=Module["_catanhl"]=wasmExports["catanhl"])(a0,a1);var _catanl=Module["_catanl"]=(a0,a1)=>(_catanl=Module["_catanl"]=wasmExports["catanl"])(a0,a1);var _logl=Module["_logl"]=(a0,a1,a2)=>(_logl=Module["_logl"]=wasmExports["logl"])(a0,a1,a2);var ___trunctfsf2=Module["___trunctfsf2"]=(a0,a1)=>(___trunctfsf2=Module["___trunctfsf2"]=wasmExports["__trunctfsf2"])(a0,a1);var ___extendsftf2=Module["___extendsftf2"]=(a0,a1)=>(___extendsftf2=Module["___extendsftf2"]=wasmExports["__extendsftf2"])(a0,a1);var _catclose=Module["_catclose"]=a0=>(_catclose=Module["_catclose"]=wasmExports["catclose"])(a0);var _catgets=Module["_catgets"]=(a0,a1,a2,a3)=>(_catgets=Module["_catgets"]=wasmExports["catgets"])(a0,a1,a2,a3);var _catopen=Module["_catopen"]=(a0,a1)=>(_catopen=Module["_catopen"]=wasmExports["catopen"])(a0,a1);var _cbrtf=Module["_cbrtf"]=a0=>(_cbrtf=Module["_cbrtf"]=wasmExports["cbrtf"])(a0);var _cbrtl=Module["_cbrtl"]=(a0,a1,a2)=>(_cbrtl=Module["_cbrtl"]=wasmExports["cbrtl"])(a0,a1,a2);var _ccos=Module["_ccos"]=(a0,a1)=>(_ccos=Module["_ccos"]=wasmExports["ccos"])(a0,a1);var _ccosh=Module["_ccosh"]=(a0,a1)=>(_ccosh=Module["_ccosh"]=wasmExports["ccosh"])(a0,a1);var _ccosf=Module["_ccosf"]=(a0,a1)=>(_ccosf=Module["_ccosf"]=wasmExports["ccosf"])(a0,a1);var _ccoshf=Module["_ccoshf"]=(a0,a1)=>(_ccoshf=Module["_ccoshf"]=wasmExports["ccoshf"])(a0,a1);var _coshf=Module["_coshf"]=a0=>(_coshf=Module["_coshf"]=wasmExports["coshf"])(a0);var _sinhf=Module["_sinhf"]=a0=>(_sinhf=Module["_sinhf"]=wasmExports["sinhf"])(a0);var _copysignf=Module["_copysignf"]=(a0,a1)=>(_copysignf=Module["_copysignf"]=wasmExports["copysignf"])(a0,a1);var _ccoshl=Module["_ccoshl"]=(a0,a1)=>(_ccoshl=Module["_ccoshl"]=wasmExports["ccoshl"])(a0,a1);var _ccosl=Module["_ccosl"]=(a0,a1)=>(_ccosl=Module["_ccosl"]=wasmExports["ccosl"])(a0,a1);var _ceil=Module["_ceil"]=a0=>(_ceil=Module["_ceil"]=wasmExports["ceil"])(a0);var _ceilf=Module["_ceilf"]=a0=>(_ceilf=Module["_ceilf"]=wasmExports["ceilf"])(a0);var _ceill=Module["_ceill"]=(a0,a1,a2)=>(_ceill=Module["_ceill"]=wasmExports["ceill"])(a0,a1,a2);var _cexp=Module["_cexp"]=(a0,a1)=>(_cexp=Module["_cexp"]=wasmExports["cexp"])(a0,a1);var _cexpf=Module["_cexpf"]=(a0,a1)=>(_cexpf=Module["_cexpf"]=wasmExports["cexpf"])(a0,a1);var _cexpl=Module["_cexpl"]=(a0,a1)=>(_cexpl=Module["_cexpl"]=wasmExports["cexpl"])(a0,a1);var _cfgetospeed=Module["_cfgetospeed"]=a0=>(_cfgetospeed=Module["_cfgetospeed"]=wasmExports["cfgetospeed"])(a0);var _cfgetispeed=Module["_cfgetispeed"]=a0=>(_cfgetispeed=Module["_cfgetispeed"]=wasmExports["cfgetispeed"])(a0);var _cfmakeraw=Module["_cfmakeraw"]=a0=>(_cfmakeraw=Module["_cfmakeraw"]=wasmExports["cfmakeraw"])(a0);var _cfsetospeed=Module["_cfsetospeed"]=(a0,a1)=>(_cfsetospeed=Module["_cfsetospeed"]=wasmExports["cfsetospeed"])(a0,a1);var _cfsetispeed=Module["_cfsetispeed"]=(a0,a1)=>(_cfsetispeed=Module["_cfsetispeed"]=wasmExports["cfsetispeed"])(a0,a1);var _cfsetspeed=Module["_cfsetspeed"]=(a0,a1)=>(_cfsetspeed=Module["_cfsetspeed"]=wasmExports["cfsetspeed"])(a0,a1);var _cimag=Module["_cimag"]=a0=>(_cimag=Module["_cimag"]=wasmExports["cimag"])(a0);var _cimagf=Module["_cimagf"]=a0=>(_cimagf=Module["_cimagf"]=wasmExports["cimagf"])(a0);var _cimagl=Module["_cimagl"]=(a0,a1)=>(_cimagl=Module["_cimagl"]=wasmExports["cimagl"])(a0,a1);var _clearenv=Module["_clearenv"]=()=>(_clearenv=Module["_clearenv"]=wasmExports["clearenv"])();var _clearerr_unlocked=Module["_clearerr_unlocked"]=a0=>(_clearerr_unlocked=Module["_clearerr_unlocked"]=wasmExports["clearerr_unlocked"])(a0);var _emscripten_thread_sleep=Module["_emscripten_thread_sleep"]=a0=>(_emscripten_thread_sleep=Module["_emscripten_thread_sleep"]=wasmExports["emscripten_thread_sleep"])(a0);var _cnd_broadcast=Module["_cnd_broadcast"]=a0=>(_cnd_broadcast=Module["_cnd_broadcast"]=wasmExports["cnd_broadcast"])(a0);var _cnd_destroy=Module["_cnd_destroy"]=a0=>(_cnd_destroy=Module["_cnd_destroy"]=wasmExports["cnd_destroy"])(a0);var _cnd_init=Module["_cnd_init"]=a0=>(_cnd_init=Module["_cnd_init"]=wasmExports["cnd_init"])(a0);var _cnd_signal=Module["_cnd_signal"]=a0=>(_cnd_signal=Module["_cnd_signal"]=wasmExports["cnd_signal"])(a0);var _cnd_timedwait=Module["_cnd_timedwait"]=(a0,a1,a2)=>(_cnd_timedwait=Module["_cnd_timedwait"]=wasmExports["cnd_timedwait"])(a0,a1,a2);var _cnd_wait=Module["_cnd_wait"]=(a0,a1)=>(_cnd_wait=Module["_cnd_wait"]=wasmExports["cnd_wait"])(a0,a1);var _conj=Module["_conj"]=(a0,a1)=>(_conj=Module["_conj"]=wasmExports["conj"])(a0,a1);var _conjf=Module["_conjf"]=(a0,a1)=>(_conjf=Module["_conjf"]=wasmExports["conjf"])(a0,a1);var _conjl=Module["_conjl"]=(a0,a1)=>(_conjl=Module["_conjl"]=wasmExports["conjl"])(a0,a1);var _copysignl=Module["_copysignl"]=(a0,a1,a2,a3,a4)=>(_copysignl=Module["_copysignl"]=wasmExports["copysignl"])(a0,a1,a2,a3,a4);var _expm1f=Module["_expm1f"]=a0=>(_expm1f=Module["_expm1f"]=wasmExports["expm1f"])(a0);var _coshl=Module["_coshl"]=(a0,a1,a2)=>(_coshl=Module["_coshl"]=wasmExports["coshl"])(a0,a1,a2);var _cosl=Module["_cosl"]=(a0,a1,a2)=>(_cosl=Module["_cosl"]=wasmExports["cosl"])(a0,a1,a2);var _cpow=Module["_cpow"]=(a0,a1,a2)=>(_cpow=Module["_cpow"]=wasmExports["cpow"])(a0,a1,a2);var ___muldc3=Module["___muldc3"]=(a0,a1,a2,a3,a4)=>(___muldc3=Module["___muldc3"]=wasmExports["__muldc3"])(a0,a1,a2,a3,a4);var _cpowf=Module["_cpowf"]=(a0,a1,a2)=>(_cpowf=Module["_cpowf"]=wasmExports["cpowf"])(a0,a1,a2);var ___mulsc3=Module["___mulsc3"]=(a0,a1,a2,a3,a4)=>(___mulsc3=Module["___mulsc3"]=wasmExports["__mulsc3"])(a0,a1,a2,a3,a4);var _cpowl=Module["_cpowl"]=(a0,a1,a2)=>(_cpowl=Module["_cpowl"]=wasmExports["cpowl"])(a0,a1,a2);var ___unordtf2=Module["___unordtf2"]=(a0,a1,a2,a3)=>(___unordtf2=Module["___unordtf2"]=wasmExports["__unordtf2"])(a0,a1,a2,a3);var ___multc3=Module["___multc3"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(___multc3=Module["___multc3"]=wasmExports["__multc3"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _cproj=Module["_cproj"]=(a0,a1)=>(_cproj=Module["_cproj"]=wasmExports["cproj"])(a0,a1);var _cprojf=Module["_cprojf"]=(a0,a1)=>(_cprojf=Module["_cprojf"]=wasmExports["cprojf"])(a0,a1);var _cprojl=Module["_cprojl"]=(a0,a1)=>(_cprojl=Module["_cprojl"]=wasmExports["cprojl"])(a0,a1);var _creal=Module["_creal"]=a0=>(_creal=Module["_creal"]=wasmExports["creal"])(a0);var _crealf=Module["_crealf"]=a0=>(_crealf=Module["_crealf"]=wasmExports["crealf"])(a0);var _creall=Module["_creall"]=(a0,a1)=>(_creall=Module["_creall"]=wasmExports["creall"])(a0,a1);var _creat=Module["_creat"]=(a0,a1)=>(_creat=Module["_creat"]=wasmExports["creat"])(a0,a1);var _crypt=Module["_crypt"]=(a0,a1)=>(_crypt=Module["_crypt"]=wasmExports["crypt"])(a0,a1);var ___crypt_blowfish=Module["___crypt_blowfish"]=(a0,a1,a2)=>(___crypt_blowfish=Module["___crypt_blowfish"]=wasmExports["__crypt_blowfish"])(a0,a1,a2);var ___crypt_des=Module["___crypt_des"]=(a0,a1,a2)=>(___crypt_des=Module["___crypt_des"]=wasmExports["__crypt_des"])(a0,a1,a2);var ___crypt_md5=Module["___crypt_md5"]=(a0,a1,a2)=>(___crypt_md5=Module["___crypt_md5"]=wasmExports["__crypt_md5"])(a0,a1,a2);var _strnlen=Module["_strnlen"]=(a0,a1)=>(_strnlen=Module["_strnlen"]=wasmExports["strnlen"])(a0,a1);var ___crypt_sha256=Module["___crypt_sha256"]=(a0,a1,a2)=>(___crypt_sha256=Module["___crypt_sha256"]=wasmExports["__crypt_sha256"])(a0,a1,a2);var ___crypt_sha512=Module["___crypt_sha512"]=(a0,a1,a2)=>(___crypt_sha512=Module["___crypt_sha512"]=wasmExports["__crypt_sha512"])(a0,a1,a2);var _sprintf=Module["_sprintf"]=(a0,a1,a2)=>(_sprintf=Module["_sprintf"]=wasmExports["sprintf"])(a0,a1,a2);var _csin=Module["_csin"]=(a0,a1)=>(_csin=Module["_csin"]=wasmExports["csin"])(a0,a1);var _csinh=Module["_csinh"]=(a0,a1)=>(_csinh=Module["_csinh"]=wasmExports["csinh"])(a0,a1);var _csinf=Module["_csinf"]=(a0,a1)=>(_csinf=Module["_csinf"]=wasmExports["csinf"])(a0,a1);var _csinhf=Module["_csinhf"]=(a0,a1)=>(_csinhf=Module["_csinhf"]=wasmExports["csinhf"])(a0,a1);var _csinhl=Module["_csinhl"]=(a0,a1)=>(_csinhl=Module["_csinhl"]=wasmExports["csinhl"])(a0,a1);var _csinl=Module["_csinl"]=(a0,a1)=>(_csinl=Module["_csinl"]=wasmExports["csinl"])(a0,a1);var _ctan=Module["_ctan"]=(a0,a1)=>(_ctan=Module["_ctan"]=wasmExports["ctan"])(a0,a1);var _ctanh=Module["_ctanh"]=(a0,a1)=>(_ctanh=Module["_ctanh"]=wasmExports["ctanh"])(a0,a1);var _ctanf=Module["_ctanf"]=(a0,a1)=>(_ctanf=Module["_ctanf"]=wasmExports["ctanf"])(a0,a1);var _ctanhf=Module["_ctanhf"]=(a0,a1)=>(_ctanhf=Module["_ctanhf"]=wasmExports["ctanhf"])(a0,a1);var _tanf=Module["_tanf"]=a0=>(_tanf=Module["_tanf"]=wasmExports["tanf"])(a0);var _ctanhl=Module["_ctanhl"]=(a0,a1)=>(_ctanhl=Module["_ctanhl"]=wasmExports["ctanhl"])(a0,a1);var _ctanl=Module["_ctanl"]=(a0,a1)=>(_ctanl=Module["_ctanl"]=wasmExports["ctanl"])(a0,a1);var _ctime=Module["_ctime"]=a0=>(_ctime=Module["_ctime"]=wasmExports["ctime"])(a0);var _localtime=Module["_localtime"]=a0=>(_localtime=Module["_localtime"]=wasmExports["localtime"])(a0);var _ctime_r=Module["_ctime_r"]=(a0,a1)=>(_ctime_r=Module["_ctime_r"]=wasmExports["ctime_r"])(a0,a1);var _dcngettext=Module["_dcngettext"]=(a0,a1,a2,a3,a4)=>(_dcngettext=Module["_dcngettext"]=wasmExports["dcngettext"])(a0,a1,a2,a3,a4);var ___gettextdomain=Module["___gettextdomain"]=()=>(___gettextdomain=Module["___gettextdomain"]=wasmExports["__gettextdomain"])();var _dngettext=Module["_dngettext"]=(a0,a1,a2,a3)=>(_dngettext=Module["_dngettext"]=wasmExports["dngettext"])(a0,a1,a2,a3);var _difftime=Module["_difftime"]=(a0,a1)=>(_difftime=Module["_difftime"]=wasmExports["difftime"])(a0,a1);var _dirname=Module["_dirname"]=a0=>(_dirname=Module["_dirname"]=wasmExports["dirname"])(a0);var _div=Module["_div"]=(a0,a1,a2)=>(_div=Module["_div"]=wasmExports["div"])(a0,a1,a2);var _dladdr=Module["_dladdr"]=(a0,a1)=>(_dladdr=Module["_dladdr"]=wasmExports["dladdr"])(a0,a1);var ___libc_free=Module["___libc_free"]=a0=>(___libc_free=Module["___libc_free"]=wasmExports["__libc_free"])(a0);var ___libc_malloc=Module["___libc_malloc"]=a0=>(___libc_malloc=Module["___libc_malloc"]=wasmExports["__libc_malloc"])(a0);var ___dl_seterr=(a0,a1)=>(___dl_seterr=wasmExports["__dl_seterr"])(a0,a1);var _dn_comp=Module["_dn_comp"]=(a0,a1,a2,a3,a4)=>(_dn_comp=Module["_dn_comp"]=wasmExports["dn_comp"])(a0,a1,a2,a3,a4);var _dn_expand=Module["_dn_expand"]=(a0,a1,a2,a3,a4)=>(_dn_expand=Module["_dn_expand"]=wasmExports["dn_expand"])(a0,a1,a2,a3,a4);var _dn_skipname=Module["_dn_skipname"]=(a0,a1)=>(_dn_skipname=Module["_dn_skipname"]=wasmExports["dn_skipname"])(a0,a1);var _dprintf=Module["_dprintf"]=(a0,a1,a2)=>(_dprintf=Module["_dprintf"]=wasmExports["dprintf"])(a0,a1,a2);var _vdprintf=Module["_vdprintf"]=(a0,a1,a2)=>(_vdprintf=Module["_vdprintf"]=wasmExports["vdprintf"])(a0,a1,a2);var _erand48=Module["_erand48"]=a0=>(_erand48=Module["_erand48"]=wasmExports["erand48"])(a0);var _drand48=Module["_drand48"]=()=>(_drand48=Module["_drand48"]=wasmExports["drand48"])();var ___wasi_fd_is_valid=Module["___wasi_fd_is_valid"]=a0=>(___wasi_fd_is_valid=Module["___wasi_fd_is_valid"]=wasmExports["__wasi_fd_is_valid"])(a0);var ___duplocale=Module["___duplocale"]=a0=>(___duplocale=Module["___duplocale"]=wasmExports["__duplocale"])(a0);var _duplocale=Module["_duplocale"]=a0=>(_duplocale=Module["_duplocale"]=wasmExports["duplocale"])(a0);var _new_dlevent=Module["_new_dlevent"]=(a0,a1)=>(_new_dlevent=Module["_new_dlevent"]=wasmExports["new_dlevent"])(a0,a1);var _pthread_setcancelstate=Module["_pthread_setcancelstate"]=(a0,a1)=>(_pthread_setcancelstate=Module["_pthread_setcancelstate"]=wasmExports["pthread_setcancelstate"])(a0,a1);var _emscripten_dlopen=Module["_emscripten_dlopen"]=(a0,a1,a2,a3,a4)=>(_emscripten_dlopen=Module["_emscripten_dlopen"]=wasmExports["emscripten_dlopen"])(a0,a1,a2,a3,a4);var _emscripten_dlopen_promise=Module["_emscripten_dlopen_promise"]=(a0,a1)=>(_emscripten_dlopen_promise=Module["_emscripten_dlopen_promise"]=wasmExports["emscripten_dlopen_promise"])(a0,a1);var _strspn=Module["_strspn"]=(a0,a1)=>(_strspn=Module["_strspn"]=wasmExports["strspn"])(a0,a1);var _ecvt=Module["_ecvt"]=(a0,a1,a2,a3)=>(_ecvt=Module["_ecvt"]=wasmExports["ecvt"])(a0,a1,a2,a3);var _emscripten_console_logf=Module["_emscripten_console_logf"]=(a0,a1)=>(_emscripten_console_logf=Module["_emscripten_console_logf"]=wasmExports["emscripten_console_logf"])(a0,a1);var _emscripten_console_errorf=Module["_emscripten_console_errorf"]=(a0,a1)=>(_emscripten_console_errorf=Module["_emscripten_console_errorf"]=wasmExports["emscripten_console_errorf"])(a0,a1);var _emscripten_console_warnf=Module["_emscripten_console_warnf"]=(a0,a1)=>(_emscripten_console_warnf=Module["_emscripten_console_warnf"]=wasmExports["emscripten_console_warnf"])(a0,a1);var _emscripten_outf=Module["_emscripten_outf"]=(a0,a1)=>(_emscripten_outf=Module["_emscripten_outf"]=wasmExports["emscripten_outf"])(a0,a1);var _emscripten_errf=Module["_emscripten_errf"]=(a0,a1)=>(_emscripten_errf=Module["_emscripten_errf"]=wasmExports["emscripten_errf"])(a0,a1);var _emscripten_fiber_init=Module["_emscripten_fiber_init"]=(a0,a1,a2,a3,a4,a5,a6)=>(_emscripten_fiber_init=Module["_emscripten_fiber_init"]=wasmExports["emscripten_fiber_init"])(a0,a1,a2,a3,a4,a5,a6);var _emscripten_fiber_init_from_current_context=Module["_emscripten_fiber_init_from_current_context"]=(a0,a1,a2)=>(_emscripten_fiber_init_from_current_context=Module["_emscripten_fiber_init_from_current_context"]=wasmExports["emscripten_fiber_init_from_current_context"])(a0,a1,a2);var _emscripten_stack_get_base=Module["_emscripten_stack_get_base"]=()=>(_emscripten_stack_get_base=Module["_emscripten_stack_get_base"]=wasmExports["emscripten_stack_get_base"])();var _emscripten_stack_get_end=Module["_emscripten_stack_get_end"]=()=>(_emscripten_stack_get_end=Module["_emscripten_stack_get_end"]=wasmExports["emscripten_stack_get_end"])();var _emscripten_get_heap_size=Module["_emscripten_get_heap_size"]=()=>(_emscripten_get_heap_size=Module["_emscripten_get_heap_size"]=wasmExports["emscripten_get_heap_size"])();var ___syscall_munmap=Module["___syscall_munmap"]=(a0,a1)=>(___syscall_munmap=Module["___syscall_munmap"]=wasmExports["__syscall_munmap"])(a0,a1);var _emscripten_builtin_free=Module["_emscripten_builtin_free"]=a0=>(_emscripten_builtin_free=Module["_emscripten_builtin_free"]=wasmExports["emscripten_builtin_free"])(a0);var ___syscall_msync=Module["___syscall_msync"]=(a0,a1,a2)=>(___syscall_msync=Module["___syscall_msync"]=wasmExports["__syscall_msync"])(a0,a1,a2);var ___syscall_mmap2=Module["___syscall_mmap2"]=(a0,a1,a2,a3,a4,a5)=>(___syscall_mmap2=Module["___syscall_mmap2"]=wasmExports["__syscall_mmap2"])(a0,a1,a2,a3,a4,a5);var _emscripten_builtin_memalign=(a0,a1)=>(_emscripten_builtin_memalign=wasmExports["emscripten_builtin_memalign"])(a0,a1);var _emscripten_scan_stack=Module["_emscripten_scan_stack"]=a0=>(_emscripten_scan_stack=Module["_emscripten_scan_stack"]=wasmExports["emscripten_scan_stack"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"])();var ___clock=Module["___clock"]=()=>(___clock=Module["___clock"]=wasmExports["__clock"])();var ___time=Module["___time"]=a0=>(___time=Module["___time"]=wasmExports["__time"])(a0);var ___clock_getres=Module["___clock_getres"]=(a0,a1)=>(___clock_getres=Module["___clock_getres"]=wasmExports["__clock_getres"])(a0,a1);var ___gettimeofday=Module["___gettimeofday"]=(a0,a1)=>(___gettimeofday=Module["___gettimeofday"]=wasmExports["__gettimeofday"])(a0,a1);var _dysize=Module["_dysize"]=a0=>(_dysize=Module["_dysize"]=wasmExports["dysize"])(a0);var _setkey=Module["_setkey"]=a0=>(_setkey=Module["_setkey"]=wasmExports["setkey"])(a0);var _encrypt=Module["_encrypt"]=(a0,a1)=>(_encrypt=Module["_encrypt"]=wasmExports["encrypt"])(a0,a1);var _sethostent=Module["_sethostent"]=a0=>(_sethostent=Module["_sethostent"]=wasmExports["sethostent"])(a0);var _gethostent=Module["_gethostent"]=()=>(_gethostent=Module["_gethostent"]=wasmExports["gethostent"])();var _getnetent=Module["_getnetent"]=()=>(_getnetent=Module["_getnetent"]=wasmExports["getnetent"])();var _endhostent=Module["_endhostent"]=()=>(_endhostent=Module["_endhostent"]=wasmExports["endhostent"])();var _setnetent=Module["_setnetent"]=a0=>(_setnetent=Module["_setnetent"]=wasmExports["setnetent"])(a0);var _endnetent=Module["_endnetent"]=()=>(_endnetent=Module["_endnetent"]=wasmExports["endnetent"])();var _erff=Module["_erff"]=a0=>(_erff=Module["_erff"]=wasmExports["erff"])(a0);var _erfcf=Module["_erfcf"]=a0=>(_erfcf=Module["_erfcf"]=wasmExports["erfcf"])(a0);var _erfl=Module["_erfl"]=(a0,a1,a2)=>(_erfl=Module["_erfl"]=wasmExports["erfl"])(a0,a1,a2);var _erfcl=Module["_erfcl"]=(a0,a1,a2)=>(_erfcl=Module["_erfcl"]=wasmExports["erfcl"])(a0,a1,a2);var _vwarn=Module["_vwarn"]=(a0,a1)=>(_vwarn=Module["_vwarn"]=wasmExports["vwarn"])(a0,a1);var _fprintf=Module["_fprintf"]=(a0,a1,a2)=>(_fprintf=Module["_fprintf"]=wasmExports["fprintf"])(a0,a1,a2);var _vwarnx=Module["_vwarnx"]=(a0,a1)=>(_vwarnx=Module["_vwarnx"]=wasmExports["vwarnx"])(a0,a1);var _putc=Module["_putc"]=(a0,a1)=>(_putc=Module["_putc"]=wasmExports["putc"])(a0,a1);var _verr=Module["_verr"]=(a0,a1,a2)=>(_verr=Module["_verr"]=wasmExports["verr"])(a0,a1,a2);var _verrx=Module["_verrx"]=(a0,a1,a2)=>(_verrx=Module["_verrx"]=wasmExports["verrx"])(a0,a1,a2);var _warn=Module["_warn"]=(a0,a1)=>(_warn=Module["_warn"]=wasmExports["warn"])(a0,a1);var _warnx=Module["_warnx"]=(a0,a1)=>(_warnx=Module["_warnx"]=wasmExports["warnx"])(a0,a1);var _err=Module["_err"]=(a0,a1,a2)=>(_err=Module["_err"]=wasmExports["err"])(a0,a1,a2);var _errx=Module["_errx"]=(a0,a1,a2)=>(_errx=Module["_errx"]=wasmExports["errx"])(a0,a1,a2);var _ether_aton_r=Module["_ether_aton_r"]=(a0,a1)=>(_ether_aton_r=Module["_ether_aton_r"]=wasmExports["ether_aton_r"])(a0,a1);var _ether_aton=Module["_ether_aton"]=a0=>(_ether_aton=Module["_ether_aton"]=wasmExports["ether_aton"])(a0);var _ether_ntoa_r=Module["_ether_ntoa_r"]=(a0,a1)=>(_ether_ntoa_r=Module["_ether_ntoa_r"]=wasmExports["ether_ntoa_r"])(a0,a1);var _ether_ntoa=Module["_ether_ntoa"]=a0=>(_ether_ntoa=Module["_ether_ntoa"]=wasmExports["ether_ntoa"])(a0);var _ether_line=Module["_ether_line"]=(a0,a1,a2)=>(_ether_line=Module["_ether_line"]=wasmExports["ether_line"])(a0,a1,a2);var _ether_ntohost=Module["_ether_ntohost"]=(a0,a1)=>(_ether_ntohost=Module["_ether_ntohost"]=wasmExports["ether_ntohost"])(a0,a1);var _ether_hostton=Module["_ether_hostton"]=(a0,a1)=>(_ether_hostton=Module["_ether_hostton"]=wasmExports["ether_hostton"])(a0,a1);var _execl=Module["_execl"]=(a0,a1,a2)=>(_execl=Module["_execl"]=wasmExports["execl"])(a0,a1,a2);var _execle=Module["_execle"]=(a0,a1,a2)=>(_execle=Module["_execle"]=wasmExports["execle"])(a0,a1,a2);var _execlp=Module["_execlp"]=(a0,a1,a2)=>(_execlp=Module["_execlp"]=wasmExports["execlp"])(a0,a1,a2);var _execvp=Module["_execvp"]=(a0,a1)=>(_execvp=Module["_execvp"]=wasmExports["execvp"])(a0,a1);var _execvpe=Module["_execvpe"]=(a0,a1,a2)=>(_execvpe=Module["_execvpe"]=wasmExports["execvpe"])(a0,a1,a2);var _exp10=Module["_exp10"]=a0=>(_exp10=Module["_exp10"]=wasmExports["exp10"])(a0);var _pow10=Module["_pow10"]=a0=>(_pow10=Module["_pow10"]=wasmExports["pow10"])(a0);var _exp10f=Module["_exp10f"]=a0=>(_exp10f=Module["_exp10f"]=wasmExports["exp10f"])(a0);var _modff=Module["_modff"]=(a0,a1)=>(_modff=Module["_modff"]=wasmExports["modff"])(a0,a1);var _exp2f=Module["_exp2f"]=a0=>(_exp2f=Module["_exp2f"]=wasmExports["exp2f"])(a0);var _pow10f=Module["_pow10f"]=a0=>(_pow10f=Module["_pow10f"]=wasmExports["pow10f"])(a0);var _exp10l=Module["_exp10l"]=(a0,a1,a2)=>(_exp10l=Module["_exp10l"]=wasmExports["exp10l"])(a0,a1,a2);var _modfl=Module["_modfl"]=(a0,a1,a2,a3)=>(_modfl=Module["_modfl"]=wasmExports["modfl"])(a0,a1,a2,a3);var _exp2l=Module["_exp2l"]=(a0,a1,a2)=>(_exp2l=Module["_exp2l"]=wasmExports["exp2l"])(a0,a1,a2);var _powl=Module["_powl"]=(a0,a1,a2,a3,a4)=>(_powl=Module["_powl"]=wasmExports["powl"])(a0,a1,a2,a3,a4);var _pow10l=Module["_pow10l"]=(a0,a1,a2)=>(_pow10l=Module["_pow10l"]=wasmExports["pow10l"])(a0,a1,a2);var ___letf2=Module["___letf2"]=(a0,a1,a2,a3)=>(___letf2=Module["___letf2"]=wasmExports["__letf2"])(a0,a1,a2,a3);var _scalbnl=Module["_scalbnl"]=(a0,a1,a2,a3)=>(_scalbnl=Module["_scalbnl"]=wasmExports["scalbnl"])(a0,a1,a2,a3);var _expl=Module["_expl"]=(a0,a1,a2)=>(_expl=Module["_expl"]=wasmExports["expl"])(a0,a1,a2);var _expm1l=Module["_expm1l"]=(a0,a1,a2)=>(_expm1l=Module["_expm1l"]=wasmExports["expm1l"])(a0,a1,a2);var __flushlbf=Module["__flushlbf"]=()=>(__flushlbf=Module["__flushlbf"]=wasmExports["_flushlbf"])();var ___fsetlocking=Module["___fsetlocking"]=(a0,a1)=>(___fsetlocking=Module["___fsetlocking"]=wasmExports["__fsetlocking"])(a0,a1);var ___fwriting=Module["___fwriting"]=a0=>(___fwriting=Module["___fwriting"]=wasmExports["__fwriting"])(a0);var ___freading=Module["___freading"]=a0=>(___freading=Module["___freading"]=wasmExports["__freading"])(a0);var ___freadable=Module["___freadable"]=a0=>(___freadable=Module["___freadable"]=wasmExports["__freadable"])(a0);var ___fwritable=Module["___fwritable"]=a0=>(___fwritable=Module["___fwritable"]=wasmExports["__fwritable"])(a0);var ___flbf=Module["___flbf"]=a0=>(___flbf=Module["___flbf"]=wasmExports["__flbf"])(a0);var ___fbufsize=Module["___fbufsize"]=a0=>(___fbufsize=Module["___fbufsize"]=wasmExports["__fbufsize"])(a0);var ___fpending=Module["___fpending"]=a0=>(___fpending=Module["___fpending"]=wasmExports["__fpending"])(a0);var ___fpurge=Module["___fpurge"]=a0=>(___fpurge=Module["___fpurge"]=wasmExports["__fpurge"])(a0);var _fpurge=Module["_fpurge"]=a0=>(_fpurge=Module["_fpurge"]=wasmExports["fpurge"])(a0);var ___freadahead=Module["___freadahead"]=a0=>(___freadahead=Module["___freadahead"]=wasmExports["__freadahead"])(a0);var ___freadptr=Module["___freadptr"]=(a0,a1)=>(___freadptr=Module["___freadptr"]=wasmExports["__freadptr"])(a0,a1);var ___freadptrinc=Module["___freadptrinc"]=(a0,a1)=>(___freadptrinc=Module["___freadptrinc"]=wasmExports["__freadptrinc"])(a0,a1);var ___fseterr=Module["___fseterr"]=a0=>(___fseterr=Module["___fseterr"]=wasmExports["__fseterr"])(a0);var _faccessat=Module["_faccessat"]=(a0,a1,a2,a3)=>(_faccessat=Module["_faccessat"]=wasmExports["faccessat"])(a0,a1,a2,a3);var _fcvt=Module["_fcvt"]=(a0,a1,a2,a3)=>(_fcvt=Module["_fcvt"]=wasmExports["fcvt"])(a0,a1,a2,a3);var _fdim=Module["_fdim"]=(a0,a1)=>(_fdim=Module["_fdim"]=wasmExports["fdim"])(a0,a1);var _fdimf=Module["_fdimf"]=(a0,a1)=>(_fdimf=Module["_fdimf"]=wasmExports["fdimf"])(a0,a1);var _fdiml=Module["_fdiml"]=(a0,a1,a2,a3,a4)=>(_fdiml=Module["_fdiml"]=wasmExports["fdiml"])(a0,a1,a2,a3,a4);var _fegetexceptflag=Module["_fegetexceptflag"]=(a0,a1)=>(_fegetexceptflag=Module["_fegetexceptflag"]=wasmExports["fegetexceptflag"])(a0,a1);var _fetestexcept=Module["_fetestexcept"]=a0=>(_fetestexcept=Module["_fetestexcept"]=wasmExports["fetestexcept"])(a0);var _feholdexcept=Module["_feholdexcept"]=a0=>(_feholdexcept=Module["_feholdexcept"]=wasmExports["feholdexcept"])(a0);var _fegetenv=Module["_fegetenv"]=a0=>(_fegetenv=Module["_fegetenv"]=wasmExports["fegetenv"])(a0);var _feclearexcept=Module["_feclearexcept"]=a0=>(_feclearexcept=Module["_feclearexcept"]=wasmExports["feclearexcept"])(a0);var _feraiseexcept=Module["_feraiseexcept"]=a0=>(_feraiseexcept=Module["_feraiseexcept"]=wasmExports["feraiseexcept"])(a0);var ___fesetround=Module["___fesetround"]=a0=>(___fesetround=Module["___fesetround"]=wasmExports["__fesetround"])(a0);var _fesetenv=Module["_fesetenv"]=a0=>(_fesetenv=Module["_fesetenv"]=wasmExports["fesetenv"])(a0);var _feof_unlocked=Module["_feof_unlocked"]=a0=>(_feof_unlocked=Module["_feof_unlocked"]=wasmExports["feof_unlocked"])(a0);var __IO_feof_unlocked=Module["__IO_feof_unlocked"]=a0=>(__IO_feof_unlocked=Module["__IO_feof_unlocked"]=wasmExports["_IO_feof_unlocked"])(a0);var _ferror_unlocked=Module["_ferror_unlocked"]=a0=>(_ferror_unlocked=Module["_ferror_unlocked"]=wasmExports["ferror_unlocked"])(a0);var __IO_ferror_unlocked=Module["__IO_ferror_unlocked"]=a0=>(__IO_ferror_unlocked=Module["__IO_ferror_unlocked"]=wasmExports["_IO_ferror_unlocked"])(a0);var _fesetexceptflag=Module["_fesetexceptflag"]=(a0,a1)=>(_fesetexceptflag=Module["_fesetexceptflag"]=wasmExports["fesetexceptflag"])(a0,a1);var _fesetround=Module["_fesetround"]=a0=>(_fesetround=Module["_fesetround"]=wasmExports["fesetround"])(a0);var _feupdateenv=Module["_feupdateenv"]=a0=>(_feupdateenv=Module["_feupdateenv"]=wasmExports["feupdateenv"])(a0);var _fflush_unlocked=Module["_fflush_unlocked"]=a0=>(_fflush_unlocked=Module["_fflush_unlocked"]=wasmExports["fflush_unlocked"])(a0);var _ffs=Module["_ffs"]=a0=>(_ffs=Module["_ffs"]=wasmExports["ffs"])(a0);var _ffsl=Module["_ffsl"]=a0=>(_ffsl=Module["_ffsl"]=wasmExports["ffsl"])(a0);var _ffsll=Module["_ffsll"]=a0=>(_ffsll=Module["_ffsll"]=wasmExports["ffsll"])(a0);var _emscripten_futex_wake=Module["_emscripten_futex_wake"]=(a0,a1)=>(_emscripten_futex_wake=Module["_emscripten_futex_wake"]=wasmExports["emscripten_futex_wake"])(a0,a1);var _fgetln=Module["_fgetln"]=(a0,a1)=>(_fgetln=Module["_fgetln"]=wasmExports["fgetln"])(a0,a1);var _getline=Module["_getline"]=(a0,a1,a2)=>(_getline=Module["_getline"]=wasmExports["getline"])(a0,a1,a2);var _fgetpos=Module["_fgetpos"]=(a0,a1)=>(_fgetpos=Module["_fgetpos"]=wasmExports["fgetpos"])(a0,a1);var _fgets_unlocked=Module["_fgets_unlocked"]=(a0,a1,a2)=>(_fgets_unlocked=Module["_fgets_unlocked"]=wasmExports["fgets_unlocked"])(a0,a1,a2);var ___fgetwc_unlocked=Module["___fgetwc_unlocked"]=a0=>(___fgetwc_unlocked=Module["___fgetwc_unlocked"]=wasmExports["__fgetwc_unlocked"])(a0);var _fwide=Module["_fwide"]=(a0,a1)=>(_fwide=Module["_fwide"]=wasmExports["fwide"])(a0,a1);var _mbtowc=Module["_mbtowc"]=(a0,a1,a2)=>(_mbtowc=Module["_mbtowc"]=wasmExports["mbtowc"])(a0,a1,a2);var _fgetwc=Module["_fgetwc"]=a0=>(_fgetwc=Module["_fgetwc"]=wasmExports["fgetwc"])(a0);var _fgetwc_unlocked=Module["_fgetwc_unlocked"]=a0=>(_fgetwc_unlocked=Module["_fgetwc_unlocked"]=wasmExports["fgetwc_unlocked"])(a0);var _getwc_unlocked=Module["_getwc_unlocked"]=a0=>(_getwc_unlocked=Module["_getwc_unlocked"]=wasmExports["getwc_unlocked"])(a0);var _fgetws=Module["_fgetws"]=(a0,a1,a2)=>(_fgetws=Module["_fgetws"]=wasmExports["fgetws"])(a0,a1,a2);var _fgetws_unlocked=Module["_fgetws_unlocked"]=(a0,a1,a2)=>(_fgetws_unlocked=Module["_fgetws_unlocked"]=wasmExports["fgetws_unlocked"])(a0,a1,a2);var _fileno_unlocked=Module["_fileno_unlocked"]=a0=>(_fileno_unlocked=Module["_fileno_unlocked"]=wasmExports["fileno_unlocked"])(a0);var _finite=Module["_finite"]=a0=>(_finite=Module["_finite"]=wasmExports["finite"])(a0);var _finitef=Module["_finitef"]=a0=>(_finitef=Module["_finitef"]=wasmExports["finitef"])(a0);var ___floatunsitf=Module["___floatunsitf"]=(a0,a1)=>(___floatunsitf=Module["___floatunsitf"]=wasmExports["__floatunsitf"])(a0,a1);var _fmodl=Module["_fmodl"]=(a0,a1,a2,a3,a4)=>(_fmodl=Module["_fmodl"]=wasmExports["fmodl"])(a0,a1,a2,a3,a4);var _ftrylockfile=Module["_ftrylockfile"]=a0=>(_ftrylockfile=Module["_ftrylockfile"]=wasmExports["ftrylockfile"])(a0);var _floorf=Module["_floorf"]=a0=>(_floorf=Module["_floorf"]=wasmExports["floorf"])(a0);var _floorl=Module["_floorl"]=(a0,a1,a2)=>(_floorl=Module["_floorl"]=wasmExports["floorl"])(a0,a1,a2);var _fmaf=Module["_fmaf"]=(a0,a1,a2)=>(_fmaf=Module["_fmaf"]=wasmExports["fmaf"])(a0,a1,a2);var _fmal=Module["_fmal"]=(a0,a1,a2,a3,a4,a5,a6)=>(_fmal=Module["_fmal"]=wasmExports["fmal"])(a0,a1,a2,a3,a4,a5,a6);var _frexpl=Module["_frexpl"]=(a0,a1,a2,a3)=>(_frexpl=Module["_frexpl"]=wasmExports["frexpl"])(a0,a1,a2,a3);var _nextafterl=Module["_nextafterl"]=(a0,a1,a2,a3,a4)=>(_nextafterl=Module["_nextafterl"]=wasmExports["nextafterl"])(a0,a1,a2,a3,a4);var _ilogbl=Module["_ilogbl"]=(a0,a1)=>(_ilogbl=Module["_ilogbl"]=wasmExports["ilogbl"])(a0,a1);var _fmax=Module["_fmax"]=(a0,a1)=>(_fmax=Module["_fmax"]=wasmExports["fmax"])(a0,a1);var _fmaxf=Module["_fmaxf"]=(a0,a1)=>(_fmaxf=Module["_fmaxf"]=wasmExports["fmaxf"])(a0,a1);var _fmaxl=Module["_fmaxl"]=(a0,a1,a2,a3,a4)=>(_fmaxl=Module["_fmaxl"]=wasmExports["fmaxl"])(a0,a1,a2,a3,a4);var _fmemopen=Module["_fmemopen"]=(a0,a1,a2)=>(_fmemopen=Module["_fmemopen"]=wasmExports["fmemopen"])(a0,a1,a2);var _fmin=Module["_fmin"]=(a0,a1)=>(_fmin=Module["_fmin"]=wasmExports["fmin"])(a0,a1);var _fminf=Module["_fminf"]=(a0,a1)=>(_fminf=Module["_fminf"]=wasmExports["fminf"])(a0,a1);var _fminl=Module["_fminl"]=(a0,a1,a2,a3,a4)=>(_fminl=Module["_fminl"]=wasmExports["fminl"])(a0,a1,a2,a3,a4);var _fmodf=Module["_fmodf"]=(a0,a1)=>(_fmodf=Module["_fmodf"]=wasmExports["fmodf"])(a0,a1);var _fmtmsg=Module["_fmtmsg"]=(a0,a1,a2,a3,a4,a5)=>(_fmtmsg=Module["_fmtmsg"]=wasmExports["fmtmsg"])(a0,a1,a2,a3,a4,a5);var _fnmatch=Module["_fnmatch"]=(a0,a1,a2)=>(_fnmatch=Module["_fnmatch"]=wasmExports["fnmatch"])(a0,a1,a2);var _towupper=Module["_towupper"]=a0=>(_towupper=Module["_towupper"]=wasmExports["towupper"])(a0);var _towlower=Module["_towlower"]=a0=>(_towlower=Module["_towlower"]=wasmExports["towlower"])(a0);var _wctype=Module["_wctype"]=a0=>(_wctype=Module["_wctype"]=wasmExports["wctype"])(a0);var _iswctype=Module["_iswctype"]=(a0,a1)=>(_iswctype=Module["_iswctype"]=wasmExports["iswctype"])(a0,a1);var _fopencookie=Module["_fopencookie"]=(a0,a1,a2)=>(_fopencookie=Module["_fopencookie"]=wasmExports["fopencookie"])(a0,a1,a2);var _forkpty=Module["_forkpty"]=(a0,a1,a2,a3)=>(_forkpty=Module["_forkpty"]=wasmExports["forkpty"])(a0,a1,a2,a3);var _openpty=Module["_openpty"]=(a0,a1,a2,a3,a4)=>(_openpty=Module["_openpty"]=wasmExports["openpty"])(a0,a1,a2,a3,a4);var _pipe2=Module["_pipe2"]=(a0,a1)=>(_pipe2=Module["_pipe2"]=wasmExports["pipe2"])(a0,a1);var _vfiprintf=Module["_vfiprintf"]=(a0,a1,a2)=>(_vfiprintf=Module["_vfiprintf"]=wasmExports["vfiprintf"])(a0,a1,a2);var ___small_vfprintf=Module["___small_vfprintf"]=(a0,a1,a2)=>(___small_vfprintf=Module["___small_vfprintf"]=wasmExports["__small_vfprintf"])(a0,a1,a2);var _fputs_unlocked=Module["_fputs_unlocked"]=(a0,a1)=>(_fputs_unlocked=Module["_fputs_unlocked"]=wasmExports["fputs_unlocked"])(a0,a1);var ___fputwc_unlocked=Module["___fputwc_unlocked"]=(a0,a1)=>(___fputwc_unlocked=Module["___fputwc_unlocked"]=wasmExports["__fputwc_unlocked"])(a0,a1);var _wctomb=Module["_wctomb"]=(a0,a1)=>(_wctomb=Module["_wctomb"]=wasmExports["wctomb"])(a0,a1);var _fputwc=Module["_fputwc"]=(a0,a1)=>(_fputwc=Module["_fputwc"]=wasmExports["fputwc"])(a0,a1);var _fputwc_unlocked=Module["_fputwc_unlocked"]=(a0,a1)=>(_fputwc_unlocked=Module["_fputwc_unlocked"]=wasmExports["fputwc_unlocked"])(a0,a1);var _putwc_unlocked=Module["_putwc_unlocked"]=(a0,a1)=>(_putwc_unlocked=Module["_putwc_unlocked"]=wasmExports["putwc_unlocked"])(a0,a1);var _fputws=Module["_fputws"]=(a0,a1)=>(_fputws=Module["_fputws"]=wasmExports["fputws"])(a0,a1);var _wcsrtombs=Module["_wcsrtombs"]=(a0,a1,a2,a3)=>(_wcsrtombs=Module["_wcsrtombs"]=wasmExports["wcsrtombs"])(a0,a1,a2,a3);var _fputws_unlocked=Module["_fputws_unlocked"]=(a0,a1)=>(_fputws_unlocked=Module["_fputws_unlocked"]=wasmExports["fputws_unlocked"])(a0,a1);var _fread_unlocked=Module["_fread_unlocked"]=(a0,a1,a2,a3)=>(_fread_unlocked=Module["_fread_unlocked"]=wasmExports["fread_unlocked"])(a0,a1,a2,a3);var _freelocale=Module["_freelocale"]=a0=>(_freelocale=Module["_freelocale"]=wasmExports["freelocale"])(a0);var ___freelocale=Module["___freelocale"]=a0=>(___freelocale=Module["___freelocale"]=wasmExports["__freelocale"])(a0);var _freopen=Module["_freopen"]=(a0,a1,a2)=>(_freopen=Module["_freopen"]=wasmExports["freopen"])(a0,a1,a2);var _frexpf=Module["_frexpf"]=(a0,a1)=>(_frexpf=Module["_frexpf"]=wasmExports["frexpf"])(a0,a1);var _fscanf=Module["_fscanf"]=(a0,a1,a2)=>(_fscanf=Module["_fscanf"]=wasmExports["fscanf"])(a0,a1,a2);var _vfscanf=Module["_vfscanf"]=(a0,a1,a2)=>(_vfscanf=Module["_vfscanf"]=wasmExports["vfscanf"])(a0,a1,a2);var ___isoc99_fscanf=Module["___isoc99_fscanf"]=(a0,a1,a2)=>(___isoc99_fscanf=Module["___isoc99_fscanf"]=wasmExports["__isoc99_fscanf"])(a0,a1,a2);var _fseek=Module["_fseek"]=(a0,a1,a2)=>(_fseek=Module["_fseek"]=wasmExports["fseek"])(a0,a1,a2);var _fseeko=Module["_fseeko"]=(a0,a1,a2)=>(_fseeko=Module["_fseeko"]=wasmExports["fseeko"])(a0,a1,a2);var _fsetpos=Module["_fsetpos"]=(a0,a1)=>(_fsetpos=Module["_fsetpos"]=wasmExports["fsetpos"])(a0,a1);var _ftello=Module["_ftello"]=a0=>(_ftello=Module["_ftello"]=wasmExports["ftello"])(a0);var _ftime=Module["_ftime"]=a0=>(_ftime=Module["_ftime"]=wasmExports["ftime"])(a0);var _utimensat=Module["_utimensat"]=(a0,a1,a2,a3)=>(_utimensat=Module["_utimensat"]=wasmExports["utimensat"])(a0,a1,a2,a3);var _fwprintf=Module["_fwprintf"]=(a0,a1,a2)=>(_fwprintf=Module["_fwprintf"]=wasmExports["fwprintf"])(a0,a1,a2);var _vfwprintf=Module["_vfwprintf"]=(a0,a1,a2)=>(_vfwprintf=Module["_vfwprintf"]=wasmExports["vfwprintf"])(a0,a1,a2);var _fwrite_unlocked=Module["_fwrite_unlocked"]=(a0,a1,a2,a3)=>(_fwrite_unlocked=Module["_fwrite_unlocked"]=wasmExports["fwrite_unlocked"])(a0,a1,a2,a3);var _fwscanf=Module["_fwscanf"]=(a0,a1,a2)=>(_fwscanf=Module["_fwscanf"]=wasmExports["fwscanf"])(a0,a1,a2);var _vfwscanf=Module["_vfwscanf"]=(a0,a1,a2)=>(_vfwscanf=Module["_vfwscanf"]=wasmExports["vfwscanf"])(a0,a1,a2);var ___isoc99_fwscanf=Module["___isoc99_fwscanf"]=(a0,a1,a2)=>(___isoc99_fwscanf=Module["___isoc99_fwscanf"]=wasmExports["__isoc99_fwscanf"])(a0,a1,a2);var _gcvt=Module["_gcvt"]=(a0,a1,a2)=>(_gcvt=Module["_gcvt"]=wasmExports["gcvt"])(a0,a1,a2);var _get_current_dir_name=Module["_get_current_dir_name"]=()=>(_get_current_dir_name=Module["_get_current_dir_name"]=wasmExports["get_current_dir_name"])();var _strdup=Module["_strdup"]=a0=>(_strdup=Module["_strdup"]=wasmExports["strdup"])(a0);var __IO_getc=Module["__IO_getc"]=a0=>(__IO_getc=Module["__IO_getc"]=wasmExports["_IO_getc"])(a0);var _fgetc_unlocked=Module["_fgetc_unlocked"]=a0=>(_fgetc_unlocked=Module["_fgetc_unlocked"]=wasmExports["fgetc_unlocked"])(a0);var __IO_getc_unlocked=Module["__IO_getc_unlocked"]=a0=>(__IO_getc_unlocked=Module["__IO_getc_unlocked"]=wasmExports["_IO_getc_unlocked"])(a0);var _getchar=Module["_getchar"]=()=>(_getchar=Module["_getchar"]=wasmExports["getchar"])();var _getchar_unlocked=Module["_getchar_unlocked"]=()=>(_getchar_unlocked=Module["_getchar_unlocked"]=wasmExports["getchar_unlocked"])();var _getdelim=Module["_getdelim"]=(a0,a1,a2,a3)=>(_getdelim=Module["_getdelim"]=wasmExports["getdelim"])(a0,a1,a2,a3);var ___getdelim=Module["___getdelim"]=(a0,a1,a2,a3)=>(___getdelim=Module["___getdelim"]=wasmExports["__getdelim"])(a0,a1,a2,a3);var _getdents=Module["_getdents"]=(a0,a1,a2)=>(_getdents=Module["_getdents"]=wasmExports["getdents"])(a0,a1,a2);var _getdomainname=Module["_getdomainname"]=(a0,a1)=>(_getdomainname=Module["_getdomainname"]=wasmExports["getdomainname"])(a0,a1);var _getegid=Module["_getegid"]=()=>(_getegid=Module["_getegid"]=wasmExports["getegid"])();var _geteuid=Module["_geteuid"]=()=>(_geteuid=Module["_geteuid"]=wasmExports["geteuid"])();var _getgroups=Module["_getgroups"]=(a0,a1)=>(_getgroups=Module["_getgroups"]=wasmExports["getgroups"])(a0,a1);var _gethostid=Module["_gethostid"]=()=>(_gethostid=Module["_gethostid"]=wasmExports["gethostid"])();var _freeifaddrs=Module["_freeifaddrs"]=a0=>(_freeifaddrs=Module["_freeifaddrs"]=wasmExports["freeifaddrs"])(a0);var _getifaddrs=Module["_getifaddrs"]=a0=>(_getifaddrs=Module["_getifaddrs"]=wasmExports["getifaddrs"])(a0);var ___getitimer=Module["___getitimer"]=(a0,a1,a2)=>(___getitimer=Module["___getitimer"]=wasmExports["__getitimer"])(a0,a1,a2);var _getlogin_r=Module["_getlogin_r"]=(a0,a1)=>(_getlogin_r=Module["_getlogin_r"]=wasmExports["getlogin_r"])(a0,a1);var _getopt=Module["_getopt"]=(a0,a1,a2)=>(_getopt=Module["_getopt"]=wasmExports["getopt"])(a0,a1,a2);var ___posix_getopt=Module["___posix_getopt"]=(a0,a1,a2)=>(___posix_getopt=Module["___posix_getopt"]=wasmExports["__posix_getopt"])(a0,a1,a2);var _getopt_long=Module["_getopt_long"]=(a0,a1,a2,a3,a4)=>(_getopt_long=Module["_getopt_long"]=wasmExports["getopt_long"])(a0,a1,a2,a3,a4);var _getopt_long_only=Module["_getopt_long_only"]=(a0,a1,a2,a3,a4)=>(_getopt_long_only=Module["_getopt_long_only"]=wasmExports["getopt_long_only"])(a0,a1,a2,a3,a4);var _mblen=Module["_mblen"]=(a0,a1)=>(_mblen=Module["_mblen"]=wasmExports["mblen"])(a0,a1);var _getpagesize=Module["_getpagesize"]=()=>(_getpagesize=Module["_getpagesize"]=wasmExports["getpagesize"])();var _getresgid=Module["_getresgid"]=(a0,a1,a2)=>(_getresgid=Module["_getresgid"]=wasmExports["getresgid"])(a0,a1,a2);var _getresuid=Module["_getresuid"]=(a0,a1,a2)=>(_getresuid=Module["_getresuid"]=wasmExports["getresuid"])(a0,a1,a2);var _getrusage=Module["_getrusage"]=(a0,a1)=>(_getrusage=Module["_getrusage"]=wasmExports["getrusage"])(a0,a1);var _gets=Module["_gets"]=a0=>(_gets=Module["_gets"]=wasmExports["gets"])(a0);var _getservbyname_r=Module["_getservbyname_r"]=(a0,a1,a2,a3,a4,a5)=>(_getservbyname_r=Module["_getservbyname_r"]=wasmExports["getservbyname_r"])(a0,a1,a2,a3,a4,a5);var _getservbyport_r=Module["_getservbyport_r"]=(a0,a1,a2,a3,a4,a5)=>(_getservbyport_r=Module["_getservbyport_r"]=wasmExports["getservbyport_r"])(a0,a1,a2,a3,a4,a5);var _getsubopt=Module["_getsubopt"]=(a0,a1,a2)=>(_getsubopt=Module["_getsubopt"]=wasmExports["getsubopt"])(a0,a1,a2);var _gettid=Module["_gettid"]=()=>(_gettid=Module["_gettid"]=wasmExports["gettid"])();var _getw=Module["_getw"]=a0=>(_getw=Module["_getw"]=wasmExports["getw"])(a0);var _getwc=Module["_getwc"]=a0=>(_getwc=Module["_getwc"]=wasmExports["getwc"])(a0);var _getwchar=Module["_getwchar"]=()=>(_getwchar=Module["_getwchar"]=wasmExports["getwchar"])();var _getwchar_unlocked=Module["_getwchar_unlocked"]=()=>(_getwchar_unlocked=Module["_getwchar_unlocked"]=wasmExports["getwchar_unlocked"])();var _glob=Module["_glob"]=(a0,a1,a2,a3)=>(_glob=Module["_glob"]=wasmExports["glob"])(a0,a1,a2,a3);var _globfree=Module["_globfree"]=a0=>(_globfree=Module["_globfree"]=wasmExports["globfree"])(a0);var _gmtime=Module["_gmtime"]=a0=>(_gmtime=Module["_gmtime"]=wasmExports["gmtime"])(a0);var _herror=Module["_herror"]=a0=>(_herror=Module["_herror"]=wasmExports["herror"])(a0);var _hcreate=Module["_hcreate"]=a0=>(_hcreate=Module["_hcreate"]=wasmExports["hcreate"])(a0);var _hdestroy=Module["_hdestroy"]=()=>(_hdestroy=Module["_hdestroy"]=wasmExports["hdestroy"])();var _hsearch=Module["_hsearch"]=(a0,a1)=>(_hsearch=Module["_hsearch"]=wasmExports["hsearch"])(a0,a1);var _hcreate_r=Module["_hcreate_r"]=(a0,a1)=>(_hcreate_r=Module["_hcreate_r"]=wasmExports["hcreate_r"])(a0,a1);var _hdestroy_r=Module["_hdestroy_r"]=a0=>(_hdestroy_r=Module["_hdestroy_r"]=wasmExports["hdestroy_r"])(a0);var _hsearch_r=Module["_hsearch_r"]=(a0,a1,a2,a3)=>(_hsearch_r=Module["_hsearch_r"]=wasmExports["hsearch_r"])(a0,a1,a2,a3);var _iconv_open=Module["_iconv_open"]=(a0,a1)=>(_iconv_open=Module["_iconv_open"]=wasmExports["iconv_open"])(a0,a1);var _iconv=Module["_iconv"]=(a0,a1,a2,a3,a4)=>(_iconv=Module["_iconv"]=wasmExports["iconv"])(a0,a1,a2,a3,a4);var _iconv_close=Module["_iconv_close"]=a0=>(_iconv_close=Module["_iconv_close"]=wasmExports["iconv_close"])(a0);var _ioctl=Module["_ioctl"]=(a0,a1,a2)=>(_ioctl=Module["_ioctl"]=wasmExports["ioctl"])(a0,a1,a2);var _ilogb=Module["_ilogb"]=a0=>(_ilogb=Module["_ilogb"]=wasmExports["ilogb"])(a0);var _ilogbf=Module["_ilogbf"]=a0=>(_ilogbf=Module["_ilogbf"]=wasmExports["ilogbf"])(a0);var _imaxabs=Module["_imaxabs"]=a0=>(_imaxabs=Module["_imaxabs"]=wasmExports["imaxabs"])(a0);var _imaxdiv=Module["_imaxdiv"]=(a0,a1,a2)=>(_imaxdiv=Module["_imaxdiv"]=wasmExports["imaxdiv"])(a0,a1,a2);var _index=Module["_index"]=(a0,a1)=>(_index=Module["_index"]=wasmExports["index"])(a0,a1);var _inet_addr=Module["_inet_addr"]=a0=>(_inet_addr=Module["_inet_addr"]=wasmExports["inet_addr"])(a0);var _inet_network=Module["_inet_network"]=a0=>(_inet_network=Module["_inet_network"]=wasmExports["inet_network"])(a0);var _inet_makeaddr=Module["_inet_makeaddr"]=(a0,a1)=>(_inet_makeaddr=Module["_inet_makeaddr"]=wasmExports["inet_makeaddr"])(a0,a1);var _inet_lnaof=Module["_inet_lnaof"]=a0=>(_inet_lnaof=Module["_inet_lnaof"]=wasmExports["inet_lnaof"])(a0);var _inet_netof=Module["_inet_netof"]=a0=>(_inet_netof=Module["_inet_netof"]=wasmExports["inet_netof"])(a0);var _insque=Module["_insque"]=(a0,a1)=>(_insque=Module["_insque"]=wasmExports["insque"])(a0,a1);var _remque=Module["_remque"]=a0=>(_remque=Module["_remque"]=wasmExports["remque"])(a0);var ___intscan=Module["___intscan"]=(a0,a1,a2,a3)=>(___intscan=Module["___intscan"]=wasmExports["__intscan"])(a0,a1,a2,a3);var ___multi3=Module["___multi3"]=(a0,a1,a2,a3,a4)=>(___multi3=Module["___multi3"]=wasmExports["__multi3"])(a0,a1,a2,a3,a4);var ___isalnum_l=Module["___isalnum_l"]=(a0,a1)=>(___isalnum_l=Module["___isalnum_l"]=wasmExports["__isalnum_l"])(a0,a1);var _isalnum_l=Module["_isalnum_l"]=(a0,a1)=>(_isalnum_l=Module["_isalnum_l"]=wasmExports["isalnum_l"])(a0,a1);var _isalpha=Module["_isalpha"]=a0=>(_isalpha=Module["_isalpha"]=wasmExports["isalpha"])(a0);var ___isalpha_l=Module["___isalpha_l"]=(a0,a1)=>(___isalpha_l=Module["___isalpha_l"]=wasmExports["__isalpha_l"])(a0,a1);var _isalpha_l=Module["_isalpha_l"]=(a0,a1)=>(_isalpha_l=Module["_isalpha_l"]=wasmExports["isalpha_l"])(a0,a1);var _isascii=Module["_isascii"]=a0=>(_isascii=Module["_isascii"]=wasmExports["isascii"])(a0);var _isblank=Module["_isblank"]=a0=>(_isblank=Module["_isblank"]=wasmExports["isblank"])(a0);var ___isblank_l=Module["___isblank_l"]=(a0,a1)=>(___isblank_l=Module["___isblank_l"]=wasmExports["__isblank_l"])(a0,a1);var _isblank_l=Module["_isblank_l"]=(a0,a1)=>(_isblank_l=Module["_isblank_l"]=wasmExports["isblank_l"])(a0,a1);var _iscntrl=Module["_iscntrl"]=a0=>(_iscntrl=Module["_iscntrl"]=wasmExports["iscntrl"])(a0);var ___iscntrl_l=Module["___iscntrl_l"]=(a0,a1)=>(___iscntrl_l=Module["___iscntrl_l"]=wasmExports["__iscntrl_l"])(a0,a1);var _iscntrl_l=Module["_iscntrl_l"]=(a0,a1)=>(_iscntrl_l=Module["_iscntrl_l"]=wasmExports["iscntrl_l"])(a0,a1);var _isdigit=Module["_isdigit"]=a0=>(_isdigit=Module["_isdigit"]=wasmExports["isdigit"])(a0);var ___isdigit_l=Module["___isdigit_l"]=(a0,a1)=>(___isdigit_l=Module["___isdigit_l"]=wasmExports["__isdigit_l"])(a0,a1);var _isdigit_l=Module["_isdigit_l"]=(a0,a1)=>(_isdigit_l=Module["_isdigit_l"]=wasmExports["isdigit_l"])(a0,a1);var _isgraph=Module["_isgraph"]=a0=>(_isgraph=Module["_isgraph"]=wasmExports["isgraph"])(a0);var ___isgraph_l=Module["___isgraph_l"]=(a0,a1)=>(___isgraph_l=Module["___isgraph_l"]=wasmExports["__isgraph_l"])(a0,a1);var _isgraph_l=Module["_isgraph_l"]=(a0,a1)=>(_isgraph_l=Module["_isgraph_l"]=wasmExports["isgraph_l"])(a0,a1);var _islower=Module["_islower"]=a0=>(_islower=Module["_islower"]=wasmExports["islower"])(a0);var ___islower_l=Module["___islower_l"]=(a0,a1)=>(___islower_l=Module["___islower_l"]=wasmExports["__islower_l"])(a0,a1);var _islower_l=Module["_islower_l"]=(a0,a1)=>(_islower_l=Module["_islower_l"]=wasmExports["islower_l"])(a0,a1);var _isprint=Module["_isprint"]=a0=>(_isprint=Module["_isprint"]=wasmExports["isprint"])(a0);var ___isprint_l=Module["___isprint_l"]=(a0,a1)=>(___isprint_l=Module["___isprint_l"]=wasmExports["__isprint_l"])(a0,a1);var _isprint_l=Module["_isprint_l"]=(a0,a1)=>(_isprint_l=Module["_isprint_l"]=wasmExports["isprint_l"])(a0,a1);var _ispunct=Module["_ispunct"]=a0=>(_ispunct=Module["_ispunct"]=wasmExports["ispunct"])(a0);var ___ispunct_l=Module["___ispunct_l"]=(a0,a1)=>(___ispunct_l=Module["___ispunct_l"]=wasmExports["__ispunct_l"])(a0,a1);var _ispunct_l=Module["_ispunct_l"]=(a0,a1)=>(_ispunct_l=Module["_ispunct_l"]=wasmExports["ispunct_l"])(a0,a1);var _issetugid=Module["_issetugid"]=()=>(_issetugid=Module["_issetugid"]=wasmExports["issetugid"])();var _isspace=Module["_isspace"]=a0=>(_isspace=Module["_isspace"]=wasmExports["isspace"])(a0);var ___isspace_l=Module["___isspace_l"]=(a0,a1)=>(___isspace_l=Module["___isspace_l"]=wasmExports["__isspace_l"])(a0,a1);var _isspace_l=Module["_isspace_l"]=(a0,a1)=>(_isspace_l=Module["_isspace_l"]=wasmExports["isspace_l"])(a0,a1);var _isupper=Module["_isupper"]=a0=>(_isupper=Module["_isupper"]=wasmExports["isupper"])(a0);var ___isupper_l=Module["___isupper_l"]=(a0,a1)=>(___isupper_l=Module["___isupper_l"]=wasmExports["__isupper_l"])(a0,a1);var _isupper_l=Module["_isupper_l"]=(a0,a1)=>(_isupper_l=Module["_isupper_l"]=wasmExports["isupper_l"])(a0,a1);var _iswalnum=Module["_iswalnum"]=a0=>(_iswalnum=Module["_iswalnum"]=wasmExports["iswalnum"])(a0);var _iswalpha=Module["_iswalpha"]=a0=>(_iswalpha=Module["_iswalpha"]=wasmExports["iswalpha"])(a0);var ___iswalnum_l=Module["___iswalnum_l"]=(a0,a1)=>(___iswalnum_l=Module["___iswalnum_l"]=wasmExports["__iswalnum_l"])(a0,a1);var _iswalnum_l=Module["_iswalnum_l"]=(a0,a1)=>(_iswalnum_l=Module["_iswalnum_l"]=wasmExports["iswalnum_l"])(a0,a1);var ___iswalpha_l=Module["___iswalpha_l"]=(a0,a1)=>(___iswalpha_l=Module["___iswalpha_l"]=wasmExports["__iswalpha_l"])(a0,a1);var _iswalpha_l=Module["_iswalpha_l"]=(a0,a1)=>(_iswalpha_l=Module["_iswalpha_l"]=wasmExports["iswalpha_l"])(a0,a1);var _iswblank=Module["_iswblank"]=a0=>(_iswblank=Module["_iswblank"]=wasmExports["iswblank"])(a0);var ___iswblank_l=Module["___iswblank_l"]=(a0,a1)=>(___iswblank_l=Module["___iswblank_l"]=wasmExports["__iswblank_l"])(a0,a1);var _iswblank_l=Module["_iswblank_l"]=(a0,a1)=>(_iswblank_l=Module["_iswblank_l"]=wasmExports["iswblank_l"])(a0,a1);var _iswcntrl=Module["_iswcntrl"]=a0=>(_iswcntrl=Module["_iswcntrl"]=wasmExports["iswcntrl"])(a0);var ___iswcntrl_l=Module["___iswcntrl_l"]=(a0,a1)=>(___iswcntrl_l=Module["___iswcntrl_l"]=wasmExports["__iswcntrl_l"])(a0,a1);var _iswcntrl_l=Module["_iswcntrl_l"]=(a0,a1)=>(_iswcntrl_l=Module["_iswcntrl_l"]=wasmExports["iswcntrl_l"])(a0,a1);var _iswgraph=Module["_iswgraph"]=a0=>(_iswgraph=Module["_iswgraph"]=wasmExports["iswgraph"])(a0);var _iswlower=Module["_iswlower"]=a0=>(_iswlower=Module["_iswlower"]=wasmExports["iswlower"])(a0);var _iswprint=Module["_iswprint"]=a0=>(_iswprint=Module["_iswprint"]=wasmExports["iswprint"])(a0);var _iswpunct=Module["_iswpunct"]=a0=>(_iswpunct=Module["_iswpunct"]=wasmExports["iswpunct"])(a0);var _iswspace=Module["_iswspace"]=a0=>(_iswspace=Module["_iswspace"]=wasmExports["iswspace"])(a0);var _iswupper=Module["_iswupper"]=a0=>(_iswupper=Module["_iswupper"]=wasmExports["iswupper"])(a0);var _iswxdigit=Module["_iswxdigit"]=a0=>(_iswxdigit=Module["_iswxdigit"]=wasmExports["iswxdigit"])(a0);var ___iswctype_l=Module["___iswctype_l"]=(a0,a1,a2)=>(___iswctype_l=Module["___iswctype_l"]=wasmExports["__iswctype_l"])(a0,a1,a2);var ___wctype_l=Module["___wctype_l"]=(a0,a1)=>(___wctype_l=Module["___wctype_l"]=wasmExports["__wctype_l"])(a0,a1);var _iswctype_l=Module["_iswctype_l"]=(a0,a1,a2)=>(_iswctype_l=Module["_iswctype_l"]=wasmExports["iswctype_l"])(a0,a1,a2);var _wctype_l=Module["_wctype_l"]=(a0,a1)=>(_wctype_l=Module["_wctype_l"]=wasmExports["wctype_l"])(a0,a1);var _iswdigit=Module["_iswdigit"]=a0=>(_iswdigit=Module["_iswdigit"]=wasmExports["iswdigit"])(a0);var ___iswdigit_l=Module["___iswdigit_l"]=(a0,a1)=>(___iswdigit_l=Module["___iswdigit_l"]=wasmExports["__iswdigit_l"])(a0,a1);var _iswdigit_l=Module["_iswdigit_l"]=(a0,a1)=>(_iswdigit_l=Module["_iswdigit_l"]=wasmExports["iswdigit_l"])(a0,a1);var ___iswgraph_l=Module["___iswgraph_l"]=(a0,a1)=>(___iswgraph_l=Module["___iswgraph_l"]=wasmExports["__iswgraph_l"])(a0,a1);var _iswgraph_l=Module["_iswgraph_l"]=(a0,a1)=>(_iswgraph_l=Module["_iswgraph_l"]=wasmExports["iswgraph_l"])(a0,a1);var ___iswlower_l=Module["___iswlower_l"]=(a0,a1)=>(___iswlower_l=Module["___iswlower_l"]=wasmExports["__iswlower_l"])(a0,a1);var _iswlower_l=Module["_iswlower_l"]=(a0,a1)=>(_iswlower_l=Module["_iswlower_l"]=wasmExports["iswlower_l"])(a0,a1);var ___iswprint_l=Module["___iswprint_l"]=(a0,a1)=>(___iswprint_l=Module["___iswprint_l"]=wasmExports["__iswprint_l"])(a0,a1);var _iswprint_l=Module["_iswprint_l"]=(a0,a1)=>(_iswprint_l=Module["_iswprint_l"]=wasmExports["iswprint_l"])(a0,a1);var ___iswpunct_l=Module["___iswpunct_l"]=(a0,a1)=>(___iswpunct_l=Module["___iswpunct_l"]=wasmExports["__iswpunct_l"])(a0,a1);var _iswpunct_l=Module["_iswpunct_l"]=(a0,a1)=>(_iswpunct_l=Module["_iswpunct_l"]=wasmExports["iswpunct_l"])(a0,a1);var ___iswspace_l=Module["___iswspace_l"]=(a0,a1)=>(___iswspace_l=Module["___iswspace_l"]=wasmExports["__iswspace_l"])(a0,a1);var _iswspace_l=Module["_iswspace_l"]=(a0,a1)=>(_iswspace_l=Module["_iswspace_l"]=wasmExports["iswspace_l"])(a0,a1);var ___iswupper_l=Module["___iswupper_l"]=(a0,a1)=>(___iswupper_l=Module["___iswupper_l"]=wasmExports["__iswupper_l"])(a0,a1);var _iswupper_l=Module["_iswupper_l"]=(a0,a1)=>(_iswupper_l=Module["_iswupper_l"]=wasmExports["iswupper_l"])(a0,a1);var ___iswxdigit_l=Module["___iswxdigit_l"]=(a0,a1)=>(___iswxdigit_l=Module["___iswxdigit_l"]=wasmExports["__iswxdigit_l"])(a0,a1);var _iswxdigit_l=Module["_iswxdigit_l"]=(a0,a1)=>(_iswxdigit_l=Module["_iswxdigit_l"]=wasmExports["iswxdigit_l"])(a0,a1);var ___isxdigit_l=Module["___isxdigit_l"]=(a0,a1)=>(___isxdigit_l=Module["___isxdigit_l"]=wasmExports["__isxdigit_l"])(a0,a1);var _isxdigit_l=Module["_isxdigit_l"]=(a0,a1)=>(_isxdigit_l=Module["_isxdigit_l"]=wasmExports["isxdigit_l"])(a0,a1);var _j0=Module["_j0"]=a0=>(_j0=Module["_j0"]=wasmExports["j0"])(a0);var _y0=Module["_y0"]=a0=>(_y0=Module["_y0"]=wasmExports["y0"])(a0);var _j0f=Module["_j0f"]=a0=>(_j0f=Module["_j0f"]=wasmExports["j0f"])(a0);var _y0f=Module["_y0f"]=a0=>(_y0f=Module["_y0f"]=wasmExports["y0f"])(a0);var _j1=Module["_j1"]=a0=>(_j1=Module["_j1"]=wasmExports["j1"])(a0);var _y1=Module["_y1"]=a0=>(_y1=Module["_y1"]=wasmExports["y1"])(a0);var _j1f=Module["_j1f"]=a0=>(_j1f=Module["_j1f"]=wasmExports["j1f"])(a0);var _y1f=Module["_y1f"]=a0=>(_y1f=Module["_y1f"]=wasmExports["y1f"])(a0);var _jn=Module["_jn"]=(a0,a1)=>(_jn=Module["_jn"]=wasmExports["jn"])(a0,a1);var _yn=Module["_yn"]=(a0,a1)=>(_yn=Module["_yn"]=wasmExports["yn"])(a0,a1);var _jnf=Module["_jnf"]=(a0,a1)=>(_jnf=Module["_jnf"]=wasmExports["jnf"])(a0,a1);var _ynf=Module["_ynf"]=(a0,a1)=>(_ynf=Module["_ynf"]=wasmExports["ynf"])(a0,a1);var _labs=Module["_labs"]=a0=>(_labs=Module["_labs"]=wasmExports["labs"])(a0);var ___nl_langinfo=Module["___nl_langinfo"]=a0=>(___nl_langinfo=Module["___nl_langinfo"]=wasmExports["__nl_langinfo"])(a0);var _nl_langinfo_l=Module["_nl_langinfo_l"]=(a0,a1)=>(_nl_langinfo_l=Module["_nl_langinfo_l"]=wasmExports["nl_langinfo_l"])(a0,a1);var _lchmod=Module["_lchmod"]=(a0,a1)=>(_lchmod=Module["_lchmod"]=wasmExports["lchmod"])(a0,a1);var _lchown=Module["_lchown"]=(a0,a1,a2)=>(_lchown=Module["_lchown"]=wasmExports["lchown"])(a0,a1,a2);var _lcong48=Module["_lcong48"]=a0=>(_lcong48=Module["_lcong48"]=wasmExports["lcong48"])(a0);var _ldexpf=Module["_ldexpf"]=(a0,a1)=>(_ldexpf=Module["_ldexpf"]=wasmExports["ldexpf"])(a0,a1);var _scalbnf=Module["_scalbnf"]=(a0,a1)=>(_scalbnf=Module["_scalbnf"]=wasmExports["scalbnf"])(a0,a1);var _ldexpl=Module["_ldexpl"]=(a0,a1,a2,a3)=>(_ldexpl=Module["_ldexpl"]=wasmExports["ldexpl"])(a0,a1,a2,a3);var _ldiv=Module["_ldiv"]=(a0,a1,a2)=>(_ldiv=Module["_ldiv"]=wasmExports["ldiv"])(a0,a1,a2);var _get_nprocs_conf=Module["_get_nprocs_conf"]=()=>(_get_nprocs_conf=Module["_get_nprocs_conf"]=wasmExports["get_nprocs_conf"])();var _get_nprocs=Module["_get_nprocs"]=()=>(_get_nprocs=Module["_get_nprocs"]=wasmExports["get_nprocs"])();var _get_phys_pages=Module["_get_phys_pages"]=()=>(_get_phys_pages=Module["_get_phys_pages"]=wasmExports["get_phys_pages"])();var _get_avphys_pages=Module["_get_avphys_pages"]=()=>(_get_avphys_pages=Module["_get_avphys_pages"]=wasmExports["get_avphys_pages"])();var _lgamma=Module["_lgamma"]=a0=>(_lgamma=Module["_lgamma"]=wasmExports["lgamma"])(a0);var _lgamma_r=Module["_lgamma_r"]=(a0,a1)=>(_lgamma_r=Module["_lgamma_r"]=wasmExports["lgamma_r"])(a0,a1);var _lgammaf=Module["_lgammaf"]=a0=>(_lgammaf=Module["_lgammaf"]=wasmExports["lgammaf"])(a0);var _lgammaf_r=Module["_lgammaf_r"]=(a0,a1)=>(_lgammaf_r=Module["_lgammaf_r"]=wasmExports["lgammaf_r"])(a0,a1);var ___lgammal_r=Module["___lgammal_r"]=(a0,a1,a2,a3)=>(___lgammal_r=Module["___lgammal_r"]=wasmExports["__lgammal_r"])(a0,a1,a2,a3);var _lgammal=Module["_lgammal"]=(a0,a1,a2)=>(_lgammal=Module["_lgammal"]=wasmExports["lgammal"])(a0,a1,a2);var _lgammal_r=Module["_lgammal_r"]=(a0,a1,a2,a3)=>(_lgammal_r=Module["_lgammal_r"]=wasmExports["lgammal_r"])(a0,a1,a2,a3);var _emscripten_has_threading_support=Module["_emscripten_has_threading_support"]=()=>(_emscripten_has_threading_support=Module["_emscripten_has_threading_support"]=wasmExports["emscripten_has_threading_support"])();var _emscripten_num_logical_cores=Module["_emscripten_num_logical_cores"]=()=>(_emscripten_num_logical_cores=Module["_emscripten_num_logical_cores"]=wasmExports["emscripten_num_logical_cores"])();var _emscripten_force_num_logical_cores=Module["_emscripten_force_num_logical_cores"]=a0=>(_emscripten_force_num_logical_cores=Module["_emscripten_force_num_logical_cores"]=wasmExports["emscripten_force_num_logical_cores"])(a0);var _emscripten_futex_wait=Module["_emscripten_futex_wait"]=(a0,a1,a2)=>(_emscripten_futex_wait=Module["_emscripten_futex_wait"]=wasmExports["emscripten_futex_wait"])(a0,a1,a2);var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=()=>(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=wasmExports["emscripten_main_thread_process_queued_calls"])();var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=()=>(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=wasmExports["emscripten_current_thread_process_queued_calls"])();var __emscripten_yield=Module["__emscripten_yield"]=a0=>(__emscripten_yield=Module["__emscripten_yield"]=wasmExports["_emscripten_yield"])(a0);var __emscripten_check_timers=Module["__emscripten_check_timers"]=a0=>(__emscripten_check_timers=Module["__emscripten_check_timers"]=wasmExports["_emscripten_check_timers"])(a0);var _pthread_mutex_consistent=Module["_pthread_mutex_consistent"]=a0=>(_pthread_mutex_consistent=Module["_pthread_mutex_consistent"]=wasmExports["pthread_mutex_consistent"])(a0);var _pthread_barrier_init=Module["_pthread_barrier_init"]=(a0,a1,a2)=>(_pthread_barrier_init=Module["_pthread_barrier_init"]=wasmExports["pthread_barrier_init"])(a0,a1,a2);var _pthread_barrier_destroy=Module["_pthread_barrier_destroy"]=a0=>(_pthread_barrier_destroy=Module["_pthread_barrier_destroy"]=wasmExports["pthread_barrier_destroy"])(a0);var _pthread_barrier_wait=Module["_pthread_barrier_wait"]=a0=>(_pthread_barrier_wait=Module["_pthread_barrier_wait"]=wasmExports["pthread_barrier_wait"])(a0);var _pthread_cond_broadcast=Module["_pthread_cond_broadcast"]=a0=>(_pthread_cond_broadcast=Module["_pthread_cond_broadcast"]=wasmExports["pthread_cond_broadcast"])(a0);var _pthread_atfork=Module["_pthread_atfork"]=(a0,a1,a2)=>(_pthread_atfork=Module["_pthread_atfork"]=wasmExports["pthread_atfork"])(a0,a1,a2);var _pthread_cancel=Module["_pthread_cancel"]=a0=>(_pthread_cancel=Module["_pthread_cancel"]=wasmExports["pthread_cancel"])(a0);var _pthread_testcancel=Module["_pthread_testcancel"]=()=>(_pthread_testcancel=Module["_pthread_testcancel"]=wasmExports["pthread_testcancel"])();var ___pthread_detach=Module["___pthread_detach"]=a0=>(___pthread_detach=Module["___pthread_detach"]=wasmExports["__pthread_detach"])(a0);var _pthread_equal=Module["_pthread_equal"]=(a0,a1)=>(_pthread_equal=Module["_pthread_equal"]=wasmExports["pthread_equal"])(a0,a1);var _pthread_mutexattr_init=Module["_pthread_mutexattr_init"]=a0=>(_pthread_mutexattr_init=Module["_pthread_mutexattr_init"]=wasmExports["pthread_mutexattr_init"])(a0);var _pthread_mutexattr_setprotocol=Module["_pthread_mutexattr_setprotocol"]=(a0,a1)=>(_pthread_mutexattr_setprotocol=Module["_pthread_mutexattr_setprotocol"]=wasmExports["pthread_mutexattr_setprotocol"])(a0,a1);var _pthread_mutexattr_settype=Module["_pthread_mutexattr_settype"]=(a0,a1)=>(_pthread_mutexattr_settype=Module["_pthread_mutexattr_settype"]=wasmExports["pthread_mutexattr_settype"])(a0,a1);var _pthread_mutexattr_destroy=Module["_pthread_mutexattr_destroy"]=a0=>(_pthread_mutexattr_destroy=Module["_pthread_mutexattr_destroy"]=wasmExports["pthread_mutexattr_destroy"])(a0);var _pthread_mutexattr_setpshared=Module["_pthread_mutexattr_setpshared"]=(a0,a1)=>(_pthread_mutexattr_setpshared=Module["_pthread_mutexattr_setpshared"]=wasmExports["pthread_mutexattr_setpshared"])(a0,a1);var _pthread_condattr_destroy=Module["_pthread_condattr_destroy"]=a0=>(_pthread_condattr_destroy=Module["_pthread_condattr_destroy"]=wasmExports["pthread_condattr_destroy"])(a0);var _pthread_condattr_setpshared=Module["_pthread_condattr_setpshared"]=(a0,a1)=>(_pthread_condattr_setpshared=Module["_pthread_condattr_setpshared"]=wasmExports["pthread_condattr_setpshared"])(a0,a1);var _pthread_getattr_np=Module["_pthread_getattr_np"]=(a0,a1)=>(_pthread_getattr_np=Module["_pthread_getattr_np"]=wasmExports["pthread_getattr_np"])(a0,a1);var _pthread_setcanceltype=Module["_pthread_setcanceltype"]=(a0,a1)=>(_pthread_setcanceltype=Module["_pthread_setcanceltype"]=wasmExports["pthread_setcanceltype"])(a0,a1);var _pthread_rwlock_init=Module["_pthread_rwlock_init"]=(a0,a1)=>(_pthread_rwlock_init=Module["_pthread_rwlock_init"]=wasmExports["pthread_rwlock_init"])(a0,a1);var _pthread_rwlock_destroy=Module["_pthread_rwlock_destroy"]=a0=>(_pthread_rwlock_destroy=Module["_pthread_rwlock_destroy"]=wasmExports["pthread_rwlock_destroy"])(a0);var _pthread_rwlock_rdlock=Module["_pthread_rwlock_rdlock"]=a0=>(_pthread_rwlock_rdlock=Module["_pthread_rwlock_rdlock"]=wasmExports["pthread_rwlock_rdlock"])(a0);var _pthread_rwlock_tryrdlock=Module["_pthread_rwlock_tryrdlock"]=a0=>(_pthread_rwlock_tryrdlock=Module["_pthread_rwlock_tryrdlock"]=wasmExports["pthread_rwlock_tryrdlock"])(a0);var _pthread_rwlock_timedrdlock=Module["_pthread_rwlock_timedrdlock"]=(a0,a1)=>(_pthread_rwlock_timedrdlock=Module["_pthread_rwlock_timedrdlock"]=wasmExports["pthread_rwlock_timedrdlock"])(a0,a1);var _pthread_rwlock_wrlock=Module["_pthread_rwlock_wrlock"]=a0=>(_pthread_rwlock_wrlock=Module["_pthread_rwlock_wrlock"]=wasmExports["pthread_rwlock_wrlock"])(a0);var _pthread_rwlock_trywrlock=Module["_pthread_rwlock_trywrlock"]=a0=>(_pthread_rwlock_trywrlock=Module["_pthread_rwlock_trywrlock"]=wasmExports["pthread_rwlock_trywrlock"])(a0);var _pthread_rwlock_timedwrlock=Module["_pthread_rwlock_timedwrlock"]=(a0,a1)=>(_pthread_rwlock_timedwrlock=Module["_pthread_rwlock_timedwrlock"]=wasmExports["pthread_rwlock_timedwrlock"])(a0,a1);var _pthread_rwlock_unlock=Module["_pthread_rwlock_unlock"]=a0=>(_pthread_rwlock_unlock=Module["_pthread_rwlock_unlock"]=wasmExports["pthread_rwlock_unlock"])(a0);var _pthread_rwlockattr_init=Module["_pthread_rwlockattr_init"]=a0=>(_pthread_rwlockattr_init=Module["_pthread_rwlockattr_init"]=wasmExports["pthread_rwlockattr_init"])(a0);var _pthread_rwlockattr_destroy=Module["_pthread_rwlockattr_destroy"]=a0=>(_pthread_rwlockattr_destroy=Module["_pthread_rwlockattr_destroy"]=wasmExports["pthread_rwlockattr_destroy"])(a0);var _pthread_rwlockattr_setpshared=Module["_pthread_rwlockattr_setpshared"]=(a0,a1)=>(_pthread_rwlockattr_setpshared=Module["_pthread_rwlockattr_setpshared"]=wasmExports["pthread_rwlockattr_setpshared"])(a0,a1);var _pthread_spin_init=Module["_pthread_spin_init"]=(a0,a1)=>(_pthread_spin_init=Module["_pthread_spin_init"]=wasmExports["pthread_spin_init"])(a0,a1);var _pthread_spin_destroy=Module["_pthread_spin_destroy"]=a0=>(_pthread_spin_destroy=Module["_pthread_spin_destroy"]=wasmExports["pthread_spin_destroy"])(a0);var _pthread_spin_lock=Module["_pthread_spin_lock"]=a0=>(_pthread_spin_lock=Module["_pthread_spin_lock"]=wasmExports["pthread_spin_lock"])(a0);var _pthread_spin_trylock=Module["_pthread_spin_trylock"]=a0=>(_pthread_spin_trylock=Module["_pthread_spin_trylock"]=wasmExports["pthread_spin_trylock"])(a0);var _pthread_spin_unlock=Module["_pthread_spin_unlock"]=a0=>(_pthread_spin_unlock=Module["_pthread_spin_unlock"]=wasmExports["pthread_spin_unlock"])(a0);var _sem_init=Module["_sem_init"]=(a0,a1,a2)=>(_sem_init=Module["_sem_init"]=wasmExports["sem_init"])(a0,a1,a2);var _sem_post=Module["_sem_post"]=a0=>(_sem_post=Module["_sem_post"]=wasmExports["sem_post"])(a0);var _sem_wait=Module["_sem_wait"]=a0=>(_sem_wait=Module["_sem_wait"]=wasmExports["sem_wait"])(a0);var _sem_trywait=Module["_sem_trywait"]=a0=>(_sem_trywait=Module["_sem_trywait"]=wasmExports["sem_trywait"])(a0);var _sem_destroy=Module["_sem_destroy"]=a0=>(_sem_destroy=Module["_sem_destroy"]=wasmExports["sem_destroy"])(a0);var _pthread_mutex_timedlock=Module["_pthread_mutex_timedlock"]=(a0,a1)=>(_pthread_mutex_timedlock=Module["_pthread_mutex_timedlock"]=wasmExports["pthread_mutex_timedlock"])(a0,a1);var _emscripten_builtin_pthread_create=Module["_emscripten_builtin_pthread_create"]=(a0,a1,a2,a3)=>(_emscripten_builtin_pthread_create=Module["_emscripten_builtin_pthread_create"]=wasmExports["emscripten_builtin_pthread_create"])(a0,a1,a2,a3);var _emscripten_builtin_pthread_join=Module["_emscripten_builtin_pthread_join"]=(a0,a1)=>(_emscripten_builtin_pthread_join=Module["_emscripten_builtin_pthread_join"]=wasmExports["emscripten_builtin_pthread_join"])(a0,a1);var _pthread_join=Module["_pthread_join"]=(a0,a1)=>(_pthread_join=Module["_pthread_join"]=wasmExports["pthread_join"])(a0,a1);var _pthread_once=Module["_pthread_once"]=(a0,a1)=>(_pthread_once=Module["_pthread_once"]=wasmExports["pthread_once"])(a0,a1);var _emscripten_builtin_pthread_exit=Module["_emscripten_builtin_pthread_exit"]=a0=>(_emscripten_builtin_pthread_exit=Module["_emscripten_builtin_pthread_exit"]=wasmExports["emscripten_builtin_pthread_exit"])(a0);var _emscripten_builtin_pthread_detach=Module["_emscripten_builtin_pthread_detach"]=a0=>(_emscripten_builtin_pthread_detach=Module["_emscripten_builtin_pthread_detach"]=wasmExports["emscripten_builtin_pthread_detach"])(a0);var _thrd_detach=Module["_thrd_detach"]=a0=>(_thrd_detach=Module["_thrd_detach"]=wasmExports["thrd_detach"])(a0);var _link=Module["_link"]=(a0,a1)=>(_link=Module["_link"]=wasmExports["link"])(a0,a1);var _linkat=Module["_linkat"]=(a0,a1,a2,a3,a4)=>(_linkat=Module["_linkat"]=wasmExports["linkat"])(a0,a1,a2,a3,a4);var _llabs=Module["_llabs"]=a0=>(_llabs=Module["_llabs"]=wasmExports["llabs"])(a0);var _lldiv=Module["_lldiv"]=(a0,a1,a2)=>(_lldiv=Module["_lldiv"]=wasmExports["lldiv"])(a0,a1,a2);var _llrint=Module["_llrint"]=a0=>(_llrint=Module["_llrint"]=wasmExports["llrint"])(a0);var _rint=Module["_rint"]=a0=>(_rint=Module["_rint"]=wasmExports["rint"])(a0);var _llrintf=Module["_llrintf"]=a0=>(_llrintf=Module["_llrintf"]=wasmExports["llrintf"])(a0);var _rintf=Module["_rintf"]=a0=>(_rintf=Module["_rintf"]=wasmExports["rintf"])(a0);var _llrintl=Module["_llrintl"]=(a0,a1)=>(_llrintl=Module["_llrintl"]=wasmExports["llrintl"])(a0,a1);var _rintl=Module["_rintl"]=(a0,a1,a2)=>(_rintl=Module["_rintl"]=wasmExports["rintl"])(a0,a1,a2);var _llround=Module["_llround"]=a0=>(_llround=Module["_llround"]=wasmExports["llround"])(a0);var _llroundf=Module["_llroundf"]=a0=>(_llroundf=Module["_llroundf"]=wasmExports["llroundf"])(a0);var _roundf=Module["_roundf"]=a0=>(_roundf=Module["_roundf"]=wasmExports["roundf"])(a0);var _llroundl=Module["_llroundl"]=(a0,a1)=>(_llroundl=Module["_llroundl"]=wasmExports["llroundl"])(a0,a1);var _roundl=Module["_roundl"]=(a0,a1,a2)=>(_roundl=Module["_roundl"]=wasmExports["roundl"])(a0,a1,a2);var _log10f=Module["_log10f"]=a0=>(_log10f=Module["_log10f"]=wasmExports["log10f"])(a0);var _log10l=Module["_log10l"]=(a0,a1,a2)=>(_log10l=Module["_log10l"]=wasmExports["log10l"])(a0,a1,a2);var _log2f=Module["_log2f"]=a0=>(_log2f=Module["_log2f"]=wasmExports["log2f"])(a0);var _log2l=Module["_log2l"]=(a0,a1,a2)=>(_log2l=Module["_log2l"]=wasmExports["log2l"])(a0,a1,a2);var _logb=Module["_logb"]=a0=>(_logb=Module["_logb"]=wasmExports["logb"])(a0);var _logbf=Module["_logbf"]=a0=>(_logbf=Module["_logbf"]=wasmExports["logbf"])(a0);var _logbl=Module["_logbl"]=(a0,a1,a2)=>(_logbl=Module["_logbl"]=wasmExports["logbl"])(a0,a1,a2);var _strtoull=Module["_strtoull"]=(a0,a1,a2)=>(_strtoull=Module["_strtoull"]=wasmExports["strtoull"])(a0,a1,a2);var _nrand48=Module["_nrand48"]=a0=>(_nrand48=Module["_nrand48"]=wasmExports["nrand48"])(a0);var _lrand48=Module["_lrand48"]=()=>(_lrand48=Module["_lrand48"]=wasmExports["lrand48"])();var _lrint=Module["_lrint"]=a0=>(_lrint=Module["_lrint"]=wasmExports["lrint"])(a0);var _lrintf=Module["_lrintf"]=a0=>(_lrintf=Module["_lrintf"]=wasmExports["lrintf"])(a0);var _lrintl=Module["_lrintl"]=(a0,a1)=>(_lrintl=Module["_lrintl"]=wasmExports["lrintl"])(a0,a1);var _lround=Module["_lround"]=a0=>(_lround=Module["_lround"]=wasmExports["lround"])(a0);var _lroundf=Module["_lroundf"]=a0=>(_lroundf=Module["_lroundf"]=wasmExports["lroundf"])(a0);var _lroundl=Module["_lroundl"]=(a0,a1)=>(_lroundl=Module["_lroundl"]=wasmExports["lroundl"])(a0,a1);var _lsearch=Module["_lsearch"]=(a0,a1,a2,a3,a4)=>(_lsearch=Module["_lsearch"]=wasmExports["lsearch"])(a0,a1,a2,a3,a4);var _lfind=Module["_lfind"]=(a0,a1,a2,a3,a4)=>(_lfind=Module["_lfind"]=wasmExports["lfind"])(a0,a1,a2,a3,a4);var _mbrlen=Module["_mbrlen"]=(a0,a1,a2)=>(_mbrlen=Module["_mbrlen"]=wasmExports["mbrlen"])(a0,a1,a2);var _mbrtoc16=Module["_mbrtoc16"]=(a0,a1,a2,a3)=>(_mbrtoc16=Module["_mbrtoc16"]=wasmExports["mbrtoc16"])(a0,a1,a2,a3);var _mbrtoc32=Module["_mbrtoc32"]=(a0,a1,a2,a3)=>(_mbrtoc32=Module["_mbrtoc32"]=wasmExports["mbrtoc32"])(a0,a1,a2,a3);var _mbsinit=Module["_mbsinit"]=a0=>(_mbsinit=Module["_mbsinit"]=wasmExports["mbsinit"])(a0);var _mbsnrtowcs=Module["_mbsnrtowcs"]=(a0,a1,a2,a3,a4)=>(_mbsnrtowcs=Module["_mbsnrtowcs"]=wasmExports["mbsnrtowcs"])(a0,a1,a2,a3,a4);var _mbsrtowcs=Module["_mbsrtowcs"]=(a0,a1,a2,a3)=>(_mbsrtowcs=Module["_mbsrtowcs"]=wasmExports["mbsrtowcs"])(a0,a1,a2,a3);var _memccpy=Module["_memccpy"]=(a0,a1,a2,a3)=>(_memccpy=Module["_memccpy"]=wasmExports["memccpy"])(a0,a1,a2,a3);var _memmem=Module["_memmem"]=(a0,a1,a2,a3)=>(_memmem=Module["_memmem"]=wasmExports["memmem"])(a0,a1,a2,a3);var _mempcpy=Module["_mempcpy"]=(a0,a1,a2)=>(_mempcpy=Module["_mempcpy"]=wasmExports["mempcpy"])(a0,a1,a2);var _mincore=Module["_mincore"]=(a0,a1,a2)=>(_mincore=Module["_mincore"]=wasmExports["mincore"])(a0,a1,a2);var _mkdtemp=Module["_mkdtemp"]=a0=>(_mkdtemp=Module["_mkdtemp"]=wasmExports["mkdtemp"])(a0);var _mkfifo=Module["_mkfifo"]=(a0,a1)=>(_mkfifo=Module["_mkfifo"]=wasmExports["mkfifo"])(a0,a1);var _mkfifoat=Module["_mkfifoat"]=(a0,a1,a2)=>(_mkfifoat=Module["_mkfifoat"]=wasmExports["mkfifoat"])(a0,a1,a2);var _mkostemp=Module["_mkostemp"]=(a0,a1)=>(_mkostemp=Module["_mkostemp"]=wasmExports["mkostemp"])(a0,a1);var _mkostemps=Module["_mkostemps"]=(a0,a1,a2)=>(_mkostemps=Module["_mkostemps"]=wasmExports["mkostemps"])(a0,a1,a2);var _mkstemp=Module["_mkstemp"]=a0=>(_mkstemp=Module["_mkstemp"]=wasmExports["mkstemp"])(a0);var _mkstemps=Module["_mkstemps"]=(a0,a1)=>(_mkstemps=Module["_mkstemps"]=wasmExports["mkstemps"])(a0,a1);var _mktemp=Module["_mktemp"]=a0=>(_mktemp=Module["_mktemp"]=wasmExports["mktemp"])(a0);var _timegm=Module["_timegm"]=a0=>(_timegm=Module["_timegm"]=wasmExports["timegm"])(a0);var _tzset=Module["_tzset"]=()=>(_tzset=Module["_tzset"]=wasmExports["tzset"])();var _mlock=Module["_mlock"]=(a0,a1)=>(_mlock=Module["_mlock"]=wasmExports["mlock"])(a0,a1);var _mlockall=Module["_mlockall"]=a0=>(_mlockall=Module["_mlockall"]=wasmExports["mlockall"])(a0);var _emscripten_builtin_mmap=Module["_emscripten_builtin_mmap"]=(a0,a1,a2,a3,a4,a5)=>(_emscripten_builtin_mmap=Module["_emscripten_builtin_mmap"]=wasmExports["emscripten_builtin_mmap"])(a0,a1,a2,a3,a4,a5);var _setmntent=Module["_setmntent"]=(a0,a1)=>(_setmntent=Module["_setmntent"]=wasmExports["setmntent"])(a0,a1);var _endmntent=Module["_endmntent"]=a0=>(_endmntent=Module["_endmntent"]=wasmExports["endmntent"])(a0);var _getmntent_r=Module["_getmntent_r"]=(a0,a1,a2,a3)=>(_getmntent_r=Module["_getmntent_r"]=wasmExports["getmntent_r"])(a0,a1,a2,a3);var _sscanf=Module["_sscanf"]=(a0,a1,a2)=>(_sscanf=Module["_sscanf"]=wasmExports["sscanf"])(a0,a1,a2);var _getmntent=Module["_getmntent"]=a0=>(_getmntent=Module["_getmntent"]=wasmExports["getmntent"])(a0);var _addmntent=Module["_addmntent"]=(a0,a1)=>(_addmntent=Module["_addmntent"]=wasmExports["addmntent"])(a0,a1);var _hasmntopt=Module["_hasmntopt"]=(a0,a1)=>(_hasmntopt=Module["_hasmntopt"]=wasmExports["hasmntopt"])(a0,a1);var _mprotect=Module["_mprotect"]=(a0,a1,a2)=>(_mprotect=Module["_mprotect"]=wasmExports["mprotect"])(a0,a1,a2);var _jrand48=Module["_jrand48"]=a0=>(_jrand48=Module["_jrand48"]=wasmExports["jrand48"])(a0);var _mrand48=Module["_mrand48"]=()=>(_mrand48=Module["_mrand48"]=wasmExports["mrand48"])();var _mtx_destroy=Module["_mtx_destroy"]=a0=>(_mtx_destroy=Module["_mtx_destroy"]=wasmExports["mtx_destroy"])(a0);var _mtx_init=Module["_mtx_init"]=(a0,a1)=>(_mtx_init=Module["_mtx_init"]=wasmExports["mtx_init"])(a0,a1);var _mtx_lock=Module["_mtx_lock"]=a0=>(_mtx_lock=Module["_mtx_lock"]=wasmExports["mtx_lock"])(a0);var _mtx_timedlock=Module["_mtx_timedlock"]=(a0,a1)=>(_mtx_timedlock=Module["_mtx_timedlock"]=wasmExports["mtx_timedlock"])(a0,a1);var _mtx_trylock=Module["_mtx_trylock"]=a0=>(_mtx_trylock=Module["_mtx_trylock"]=wasmExports["mtx_trylock"])(a0);var _mtx_unlock=Module["_mtx_unlock"]=a0=>(_mtx_unlock=Module["_mtx_unlock"]=wasmExports["mtx_unlock"])(a0);var _munlock=Module["_munlock"]=(a0,a1)=>(_munlock=Module["_munlock"]=wasmExports["munlock"])(a0,a1);var _munlockall=Module["_munlockall"]=()=>(_munlockall=Module["_munlockall"]=wasmExports["munlockall"])();var _emscripten_builtin_munmap=Module["_emscripten_builtin_munmap"]=(a0,a1)=>(_emscripten_builtin_munmap=Module["_emscripten_builtin_munmap"]=wasmExports["emscripten_builtin_munmap"])(a0,a1);var _nan=Module["_nan"]=a0=>(_nan=Module["_nan"]=wasmExports["nan"])(a0);var _nanf=Module["_nanf"]=a0=>(_nanf=Module["_nanf"]=wasmExports["nanf"])(a0);var _nanl=Module["_nanl"]=(a0,a1)=>(_nanl=Module["_nanl"]=wasmExports["nanl"])(a0,a1);var _nanosleep=Module["_nanosleep"]=(a0,a1)=>(_nanosleep=Module["_nanosleep"]=wasmExports["nanosleep"])(a0,a1);var _nearbyint=Module["_nearbyint"]=a0=>(_nearbyint=Module["_nearbyint"]=wasmExports["nearbyint"])(a0);var _nearbyintf=Module["_nearbyintf"]=a0=>(_nearbyintf=Module["_nearbyintf"]=wasmExports["nearbyintf"])(a0);var _nearbyintl=Module["_nearbyintl"]=(a0,a1,a2)=>(_nearbyintl=Module["_nearbyintl"]=wasmExports["nearbyintl"])(a0,a1,a2);var _getnetbyaddr=Module["_getnetbyaddr"]=(a0,a1)=>(_getnetbyaddr=Module["_getnetbyaddr"]=wasmExports["getnetbyaddr"])(a0,a1);var _getnetbyname=Module["_getnetbyname"]=a0=>(_getnetbyname=Module["_getnetbyname"]=wasmExports["getnetbyname"])(a0);var ___newlocale=Module["___newlocale"]=(a0,a1,a2)=>(___newlocale=Module["___newlocale"]=wasmExports["__newlocale"])(a0,a1,a2);var _newlocale=Module["_newlocale"]=(a0,a1,a2)=>(_newlocale=Module["_newlocale"]=wasmExports["newlocale"])(a0,a1,a2);var _nextafterf=Module["_nextafterf"]=(a0,a1)=>(_nextafterf=Module["_nextafterf"]=wasmExports["nextafterf"])(a0,a1);var _nexttoward=Module["_nexttoward"]=(a0,a1,a2)=>(_nexttoward=Module["_nexttoward"]=wasmExports["nexttoward"])(a0,a1,a2);var _nexttowardf=Module["_nexttowardf"]=(a0,a1,a2)=>(_nexttowardf=Module["_nexttowardf"]=wasmExports["nexttowardf"])(a0,a1,a2);var _nexttowardl=Module["_nexttowardl"]=(a0,a1,a2,a3,a4)=>(_nexttowardl=Module["_nexttowardl"]=wasmExports["nexttowardl"])(a0,a1,a2,a3,a4);var _nftw=Module["_nftw"]=(a0,a1,a2,a3)=>(_nftw=Module["_nftw"]=wasmExports["nftw"])(a0,a1,a2,a3);var _nice=Module["_nice"]=a0=>(_nice=Module["_nice"]=wasmExports["nice"])(a0);var _setpriority=Module["_setpriority"]=(a0,a1,a2)=>(_setpriority=Module["_setpriority"]=wasmExports["setpriority"])(a0,a1,a2);var _ns_get16=Module["_ns_get16"]=a0=>(_ns_get16=Module["_ns_get16"]=wasmExports["ns_get16"])(a0);var _ns_get32=Module["_ns_get32"]=a0=>(_ns_get32=Module["_ns_get32"]=wasmExports["ns_get32"])(a0);var _ns_put16=Module["_ns_put16"]=(a0,a1)=>(_ns_put16=Module["_ns_put16"]=wasmExports["ns_put16"])(a0,a1);var _ns_put32=Module["_ns_put32"]=(a0,a1)=>(_ns_put32=Module["_ns_put32"]=wasmExports["ns_put32"])(a0,a1);var _ns_skiprr=Module["_ns_skiprr"]=(a0,a1,a2,a3)=>(_ns_skiprr=Module["_ns_skiprr"]=wasmExports["ns_skiprr"])(a0,a1,a2,a3);var _ns_initparse=Module["_ns_initparse"]=(a0,a1,a2)=>(_ns_initparse=Module["_ns_initparse"]=wasmExports["ns_initparse"])(a0,a1,a2);var _ns_name_uncompress=Module["_ns_name_uncompress"]=(a0,a1,a2,a3,a4)=>(_ns_name_uncompress=Module["_ns_name_uncompress"]=wasmExports["ns_name_uncompress"])(a0,a1,a2,a3,a4);var _ns_parserr=Module["_ns_parserr"]=(a0,a1,a2,a3)=>(_ns_parserr=Module["_ns_parserr"]=wasmExports["ns_parserr"])(a0,a1,a2,a3);var _open_memstream=Module["_open_memstream"]=(a0,a1)=>(_open_memstream=Module["_open_memstream"]=wasmExports["open_memstream"])(a0,a1);var _open_wmemstream=Module["_open_wmemstream"]=(a0,a1)=>(_open_wmemstream=Module["_open_wmemstream"]=wasmExports["open_wmemstream"])(a0,a1);var _tcsetattr=Module["_tcsetattr"]=(a0,a1,a2)=>(_tcsetattr=Module["_tcsetattr"]=wasmExports["tcsetattr"])(a0,a1,a2);var _posix_close=Module["_posix_close"]=(a0,a1)=>(_posix_close=Module["_posix_close"]=wasmExports["posix_close"])(a0,a1);var _posix_fallocate=Module["_posix_fallocate"]=(a0,a1,a2)=>(_posix_fallocate=Module["_posix_fallocate"]=wasmExports["posix_fallocate"])(a0,a1,a2);var _posix_madvise=Module["_posix_madvise"]=(a0,a1,a2)=>(_posix_madvise=Module["_posix_madvise"]=wasmExports["posix_madvise"])(a0,a1,a2);var _posix_spawn_file_actions_addchdir_np=Module["_posix_spawn_file_actions_addchdir_np"]=(a0,a1)=>(_posix_spawn_file_actions_addchdir_np=Module["_posix_spawn_file_actions_addchdir_np"]=wasmExports["posix_spawn_file_actions_addchdir_np"])(a0,a1);var _posix_spawn_file_actions_addclose=Module["_posix_spawn_file_actions_addclose"]=(a0,a1)=>(_posix_spawn_file_actions_addclose=Module["_posix_spawn_file_actions_addclose"]=wasmExports["posix_spawn_file_actions_addclose"])(a0,a1);var _posix_spawn_file_actions_adddup2=Module["_posix_spawn_file_actions_adddup2"]=(a0,a1,a2)=>(_posix_spawn_file_actions_adddup2=Module["_posix_spawn_file_actions_adddup2"]=wasmExports["posix_spawn_file_actions_adddup2"])(a0,a1,a2);var _posix_spawn_file_actions_addfchdir_np=Module["_posix_spawn_file_actions_addfchdir_np"]=(a0,a1)=>(_posix_spawn_file_actions_addfchdir_np=Module["_posix_spawn_file_actions_addfchdir_np"]=wasmExports["posix_spawn_file_actions_addfchdir_np"])(a0,a1);var _posix_spawn_file_actions_addopen=Module["_posix_spawn_file_actions_addopen"]=(a0,a1,a2,a3,a4)=>(_posix_spawn_file_actions_addopen=Module["_posix_spawn_file_actions_addopen"]=wasmExports["posix_spawn_file_actions_addopen"])(a0,a1,a2,a3,a4);var _posix_spawn_file_actions_destroy=Module["_posix_spawn_file_actions_destroy"]=a0=>(_posix_spawn_file_actions_destroy=Module["_posix_spawn_file_actions_destroy"]=wasmExports["posix_spawn_file_actions_destroy"])(a0);var _posix_spawn_file_actions_init=Module["_posix_spawn_file_actions_init"]=a0=>(_posix_spawn_file_actions_init=Module["_posix_spawn_file_actions_init"]=wasmExports["posix_spawn_file_actions_init"])(a0);var _posix_spawnattr_destroy=Module["_posix_spawnattr_destroy"]=a0=>(_posix_spawnattr_destroy=Module["_posix_spawnattr_destroy"]=wasmExports["posix_spawnattr_destroy"])(a0);var _posix_spawnattr_getflags=Module["_posix_spawnattr_getflags"]=(a0,a1)=>(_posix_spawnattr_getflags=Module["_posix_spawnattr_getflags"]=wasmExports["posix_spawnattr_getflags"])(a0,a1);var _posix_spawnattr_getpgroup=Module["_posix_spawnattr_getpgroup"]=(a0,a1)=>(_posix_spawnattr_getpgroup=Module["_posix_spawnattr_getpgroup"]=wasmExports["posix_spawnattr_getpgroup"])(a0,a1);var _posix_spawnattr_getsigdefault=Module["_posix_spawnattr_getsigdefault"]=(a0,a1)=>(_posix_spawnattr_getsigdefault=Module["_posix_spawnattr_getsigdefault"]=wasmExports["posix_spawnattr_getsigdefault"])(a0,a1);var _posix_spawnattr_getsigmask=Module["_posix_spawnattr_getsigmask"]=(a0,a1)=>(_posix_spawnattr_getsigmask=Module["_posix_spawnattr_getsigmask"]=wasmExports["posix_spawnattr_getsigmask"])(a0,a1);var _posix_spawnattr_init=Module["_posix_spawnattr_init"]=a0=>(_posix_spawnattr_init=Module["_posix_spawnattr_init"]=wasmExports["posix_spawnattr_init"])(a0);var _posix_spawnattr_getschedparam=Module["_posix_spawnattr_getschedparam"]=(a0,a1)=>(_posix_spawnattr_getschedparam=Module["_posix_spawnattr_getschedparam"]=wasmExports["posix_spawnattr_getschedparam"])(a0,a1);var _posix_spawnattr_setschedparam=Module["_posix_spawnattr_setschedparam"]=(a0,a1)=>(_posix_spawnattr_setschedparam=Module["_posix_spawnattr_setschedparam"]=wasmExports["posix_spawnattr_setschedparam"])(a0,a1);var _posix_spawnattr_getschedpolicy=Module["_posix_spawnattr_getschedpolicy"]=(a0,a1)=>(_posix_spawnattr_getschedpolicy=Module["_posix_spawnattr_getschedpolicy"]=wasmExports["posix_spawnattr_getschedpolicy"])(a0,a1);var _posix_spawnattr_setschedpolicy=Module["_posix_spawnattr_setschedpolicy"]=(a0,a1)=>(_posix_spawnattr_setschedpolicy=Module["_posix_spawnattr_setschedpolicy"]=wasmExports["posix_spawnattr_setschedpolicy"])(a0,a1);var _posix_spawnattr_setflags=Module["_posix_spawnattr_setflags"]=(a0,a1)=>(_posix_spawnattr_setflags=Module["_posix_spawnattr_setflags"]=wasmExports["posix_spawnattr_setflags"])(a0,a1);var _posix_spawnattr_setpgroup=Module["_posix_spawnattr_setpgroup"]=(a0,a1)=>(_posix_spawnattr_setpgroup=Module["_posix_spawnattr_setpgroup"]=wasmExports["posix_spawnattr_setpgroup"])(a0,a1);var _posix_spawnattr_setsigdefault=Module["_posix_spawnattr_setsigdefault"]=(a0,a1)=>(_posix_spawnattr_setsigdefault=Module["_posix_spawnattr_setsigdefault"]=wasmExports["posix_spawnattr_setsigdefault"])(a0,a1);var _posix_spawnattr_setsigmask=Module["_posix_spawnattr_setsigmask"]=(a0,a1)=>(_posix_spawnattr_setsigmask=Module["_posix_spawnattr_setsigmask"]=wasmExports["posix_spawnattr_setsigmask"])(a0,a1);var _powf=Module["_powf"]=(a0,a1)=>(_powf=Module["_powf"]=wasmExports["powf"])(a0,a1);var _preadv=Module["_preadv"]=(a0,a1,a2,a3)=>(_preadv=Module["_preadv"]=wasmExports["preadv"])(a0,a1,a2,a3);var _printf=Module["_printf"]=(a0,a1)=>(_printf=Module["_printf"]=wasmExports["printf"])(a0,a1);var ___small_printf=Module["___small_printf"]=(a0,a1)=>(___small_printf=Module["___small_printf"]=wasmExports["__small_printf"])(a0,a1);var _em_proxying_queue_create=Module["_em_proxying_queue_create"]=()=>(_em_proxying_queue_create=Module["_em_proxying_queue_create"]=wasmExports["em_proxying_queue_create"])();var _em_proxying_queue_destroy=Module["_em_proxying_queue_destroy"]=a0=>(_em_proxying_queue_destroy=Module["_em_proxying_queue_destroy"]=wasmExports["em_proxying_queue_destroy"])(a0);var _emscripten_proxy_get_system_queue=Module["_emscripten_proxy_get_system_queue"]=()=>(_emscripten_proxy_get_system_queue=Module["_emscripten_proxy_get_system_queue"]=wasmExports["emscripten_proxy_get_system_queue"])();var _emscripten_proxy_execute_queue=Module["_emscripten_proxy_execute_queue"]=a0=>(_emscripten_proxy_execute_queue=Module["_emscripten_proxy_execute_queue"]=wasmExports["emscripten_proxy_execute_queue"])(a0);var _emscripten_proxy_finish=Module["_emscripten_proxy_finish"]=a0=>(_emscripten_proxy_finish=Module["_emscripten_proxy_finish"]=wasmExports["emscripten_proxy_finish"])(a0);var _emscripten_proxy_async=Module["_emscripten_proxy_async"]=(a0,a1,a2,a3)=>(_emscripten_proxy_async=Module["_emscripten_proxy_async"]=wasmExports["emscripten_proxy_async"])(a0,a1,a2,a3);var _emscripten_proxy_sync=Module["_emscripten_proxy_sync"]=(a0,a1,a2,a3)=>(_emscripten_proxy_sync=Module["_emscripten_proxy_sync"]=wasmExports["emscripten_proxy_sync"])(a0,a1,a2,a3);var _emscripten_proxy_sync_with_ctx=Module["_emscripten_proxy_sync_with_ctx"]=(a0,a1,a2,a3)=>(_emscripten_proxy_sync_with_ctx=Module["_emscripten_proxy_sync_with_ctx"]=wasmExports["emscripten_proxy_sync_with_ctx"])(a0,a1,a2,a3);var _pselect=Module["_pselect"]=(a0,a1,a2,a3,a4,a5)=>(_pselect=Module["_pselect"]=wasmExports["pselect"])(a0,a1,a2,a3,a4,a5);var _pthread_attr_getdetachstate=Module["_pthread_attr_getdetachstate"]=(a0,a1)=>(_pthread_attr_getdetachstate=Module["_pthread_attr_getdetachstate"]=wasmExports["pthread_attr_getdetachstate"])(a0,a1);var _pthread_attr_getguardsize=Module["_pthread_attr_getguardsize"]=(a0,a1)=>(_pthread_attr_getguardsize=Module["_pthread_attr_getguardsize"]=wasmExports["pthread_attr_getguardsize"])(a0,a1);var _pthread_attr_getinheritsched=Module["_pthread_attr_getinheritsched"]=(a0,a1)=>(_pthread_attr_getinheritsched=Module["_pthread_attr_getinheritsched"]=wasmExports["pthread_attr_getinheritsched"])(a0,a1);var _pthread_attr_getschedparam=Module["_pthread_attr_getschedparam"]=(a0,a1)=>(_pthread_attr_getschedparam=Module["_pthread_attr_getschedparam"]=wasmExports["pthread_attr_getschedparam"])(a0,a1);var _pthread_attr_getschedpolicy=Module["_pthread_attr_getschedpolicy"]=(a0,a1)=>(_pthread_attr_getschedpolicy=Module["_pthread_attr_getschedpolicy"]=wasmExports["pthread_attr_getschedpolicy"])(a0,a1);var _pthread_attr_getscope=Module["_pthread_attr_getscope"]=(a0,a1)=>(_pthread_attr_getscope=Module["_pthread_attr_getscope"]=wasmExports["pthread_attr_getscope"])(a0,a1);var _pthread_attr_getstack=Module["_pthread_attr_getstack"]=(a0,a1,a2)=>(_pthread_attr_getstack=Module["_pthread_attr_getstack"]=wasmExports["pthread_attr_getstack"])(a0,a1,a2);var _pthread_attr_getstacksize=Module["_pthread_attr_getstacksize"]=(a0,a1)=>(_pthread_attr_getstacksize=Module["_pthread_attr_getstacksize"]=wasmExports["pthread_attr_getstacksize"])(a0,a1);var _pthread_barrierattr_getpshared=Module["_pthread_barrierattr_getpshared"]=(a0,a1)=>(_pthread_barrierattr_getpshared=Module["_pthread_barrierattr_getpshared"]=wasmExports["pthread_barrierattr_getpshared"])(a0,a1);var _pthread_condattr_getclock=Module["_pthread_condattr_getclock"]=(a0,a1)=>(_pthread_condattr_getclock=Module["_pthread_condattr_getclock"]=wasmExports["pthread_condattr_getclock"])(a0,a1);var _pthread_condattr_getpshared=Module["_pthread_condattr_getpshared"]=(a0,a1)=>(_pthread_condattr_getpshared=Module["_pthread_condattr_getpshared"]=wasmExports["pthread_condattr_getpshared"])(a0,a1);var _pthread_mutexattr_getprotocol=Module["_pthread_mutexattr_getprotocol"]=(a0,a1)=>(_pthread_mutexattr_getprotocol=Module["_pthread_mutexattr_getprotocol"]=wasmExports["pthread_mutexattr_getprotocol"])(a0,a1);var _pthread_mutexattr_getpshared=Module["_pthread_mutexattr_getpshared"]=(a0,a1)=>(_pthread_mutexattr_getpshared=Module["_pthread_mutexattr_getpshared"]=wasmExports["pthread_mutexattr_getpshared"])(a0,a1);var _pthread_mutexattr_getrobust=Module["_pthread_mutexattr_getrobust"]=(a0,a1)=>(_pthread_mutexattr_getrobust=Module["_pthread_mutexattr_getrobust"]=wasmExports["pthread_mutexattr_getrobust"])(a0,a1);var _pthread_mutexattr_gettype=Module["_pthread_mutexattr_gettype"]=(a0,a1)=>(_pthread_mutexattr_gettype=Module["_pthread_mutexattr_gettype"]=wasmExports["pthread_mutexattr_gettype"])(a0,a1);var _pthread_rwlockattr_getpshared=Module["_pthread_rwlockattr_getpshared"]=(a0,a1)=>(_pthread_rwlockattr_getpshared=Module["_pthread_rwlockattr_getpshared"]=wasmExports["pthread_rwlockattr_getpshared"])(a0,a1);var _pthread_attr_setdetachstate=Module["_pthread_attr_setdetachstate"]=(a0,a1)=>(_pthread_attr_setdetachstate=Module["_pthread_attr_setdetachstate"]=wasmExports["pthread_attr_setdetachstate"])(a0,a1);var _pthread_attr_setguardsize=Module["_pthread_attr_setguardsize"]=(a0,a1)=>(_pthread_attr_setguardsize=Module["_pthread_attr_setguardsize"]=wasmExports["pthread_attr_setguardsize"])(a0,a1);var _pthread_attr_setinheritsched=Module["_pthread_attr_setinheritsched"]=(a0,a1)=>(_pthread_attr_setinheritsched=Module["_pthread_attr_setinheritsched"]=wasmExports["pthread_attr_setinheritsched"])(a0,a1);var _pthread_attr_setschedparam=Module["_pthread_attr_setschedparam"]=(a0,a1)=>(_pthread_attr_setschedparam=Module["_pthread_attr_setschedparam"]=wasmExports["pthread_attr_setschedparam"])(a0,a1);var _pthread_attr_setschedpolicy=Module["_pthread_attr_setschedpolicy"]=(a0,a1)=>(_pthread_attr_setschedpolicy=Module["_pthread_attr_setschedpolicy"]=wasmExports["pthread_attr_setschedpolicy"])(a0,a1);var _pthread_attr_setscope=Module["_pthread_attr_setscope"]=(a0,a1)=>(_pthread_attr_setscope=Module["_pthread_attr_setscope"]=wasmExports["pthread_attr_setscope"])(a0,a1);var _pthread_attr_setstack=Module["_pthread_attr_setstack"]=(a0,a1,a2)=>(_pthread_attr_setstack=Module["_pthread_attr_setstack"]=wasmExports["pthread_attr_setstack"])(a0,a1,a2);var __pthread_cleanup_push=Module["__pthread_cleanup_push"]=(a0,a1,a2)=>(__pthread_cleanup_push=Module["__pthread_cleanup_push"]=wasmExports["_pthread_cleanup_push"])(a0,a1,a2);var __pthread_cleanup_pop=Module["__pthread_cleanup_pop"]=(a0,a1)=>(__pthread_cleanup_pop=Module["__pthread_cleanup_pop"]=wasmExports["_pthread_cleanup_pop"])(a0,a1);var _pthread_getconcurrency=Module["_pthread_getconcurrency"]=()=>(_pthread_getconcurrency=Module["_pthread_getconcurrency"]=wasmExports["pthread_getconcurrency"])();var _pthread_getschedparam=Module["_pthread_getschedparam"]=(a0,a1,a2)=>(_pthread_getschedparam=Module["_pthread_getschedparam"]=wasmExports["pthread_getschedparam"])(a0,a1,a2);var _thrd_current=Module["_thrd_current"]=()=>(_thrd_current=Module["_thrd_current"]=wasmExports["thrd_current"])();var _emscripten_main_runtime_thread_id=Module["_emscripten_main_runtime_thread_id"]=()=>(_emscripten_main_runtime_thread_id=Module["_emscripten_main_runtime_thread_id"]=wasmExports["emscripten_main_runtime_thread_id"])();var _pthread_setconcurrency=Module["_pthread_setconcurrency"]=a0=>(_pthread_setconcurrency=Module["_pthread_setconcurrency"]=wasmExports["pthread_setconcurrency"])(a0);var _pthread_setschedprio=Module["_pthread_setschedprio"]=(a0,a1)=>(_pthread_setschedprio=Module["_pthread_setschedprio"]=wasmExports["pthread_setschedprio"])(a0,a1);var ___sig_is_blocked=Module["___sig_is_blocked"]=a0=>(___sig_is_blocked=Module["___sig_is_blocked"]=wasmExports["__sig_is_blocked"])(a0);var _sigorset=Module["_sigorset"]=(a0,a1,a2)=>(_sigorset=Module["_sigorset"]=wasmExports["sigorset"])(a0,a1,a2);var _sigandset=Module["_sigandset"]=(a0,a1,a2)=>(_sigandset=Module["_sigandset"]=wasmExports["sigandset"])(a0,a1,a2);var _sigdelset=Module["_sigdelset"]=(a0,a1)=>(_sigdelset=Module["_sigdelset"]=wasmExports["sigdelset"])(a0,a1);var _ptsname=Module["_ptsname"]=a0=>(_ptsname=Module["_ptsname"]=wasmExports["ptsname"])(a0);var _posix_openpt=Module["_posix_openpt"]=a0=>(_posix_openpt=Module["_posix_openpt"]=wasmExports["posix_openpt"])(a0);var _grantpt=Module["_grantpt"]=a0=>(_grantpt=Module["_grantpt"]=wasmExports["grantpt"])(a0);var _unlockpt=Module["_unlockpt"]=a0=>(_unlockpt=Module["_unlockpt"]=wasmExports["unlockpt"])(a0);var _ptsname_r=Module["_ptsname_r"]=(a0,a1,a2)=>(_ptsname_r=Module["_ptsname_r"]=wasmExports["ptsname_r"])(a0,a1,a2);var __IO_putc=Module["__IO_putc"]=(a0,a1)=>(__IO_putc=Module["__IO_putc"]=wasmExports["_IO_putc"])(a0,a1);var _putc_unlocked=Module["_putc_unlocked"]=(a0,a1)=>(_putc_unlocked=Module["_putc_unlocked"]=wasmExports["putc_unlocked"])(a0,a1);var _fputc_unlocked=Module["_fputc_unlocked"]=(a0,a1)=>(_fputc_unlocked=Module["_fputc_unlocked"]=wasmExports["fputc_unlocked"])(a0,a1);var __IO_putc_unlocked=Module["__IO_putc_unlocked"]=(a0,a1)=>(__IO_putc_unlocked=Module["__IO_putc_unlocked"]=wasmExports["_IO_putc_unlocked"])(a0,a1);var _putchar_unlocked=Module["_putchar_unlocked"]=a0=>(_putchar_unlocked=Module["_putchar_unlocked"]=wasmExports["putchar_unlocked"])(a0);var _putenv=Module["_putenv"]=a0=>(_putenv=Module["_putenv"]=wasmExports["putenv"])(a0);var _putw=Module["_putw"]=(a0,a1)=>(_putw=Module["_putw"]=wasmExports["putw"])(a0,a1);var _putwc=Module["_putwc"]=(a0,a1)=>(_putwc=Module["_putwc"]=wasmExports["putwc"])(a0,a1);var _putwchar=Module["_putwchar"]=a0=>(_putwchar=Module["_putwchar"]=wasmExports["putwchar"])(a0);var _putwchar_unlocked=Module["_putwchar_unlocked"]=a0=>(_putwchar_unlocked=Module["_putwchar_unlocked"]=wasmExports["putwchar_unlocked"])(a0);var _pwritev=Module["_pwritev"]=(a0,a1,a2,a3)=>(_pwritev=Module["_pwritev"]=wasmExports["pwritev"])(a0,a1,a2,a3);var _qsort_r=Module["_qsort_r"]=(a0,a1,a2,a3,a4)=>(_qsort_r=Module["_qsort_r"]=wasmExports["qsort_r"])(a0,a1,a2,a3,a4);var _quick_exit=Module["_quick_exit"]=a0=>(_quick_exit=Module["_quick_exit"]=wasmExports["quick_exit"])(a0);var _action_abort=Module["_action_abort"]=a0=>(_action_abort=Module["_action_abort"]=wasmExports["action_abort"])(a0);var _action_terminate=Module["_action_terminate"]=a0=>(_action_terminate=Module["_action_terminate"]=wasmExports["action_terminate"])(a0);var _srand=Module["_srand"]=a0=>(_srand=Module["_srand"]=wasmExports["srand"])(a0);var _rand=Module["_rand"]=()=>(_rand=Module["_rand"]=wasmExports["rand"])();var _rand_r=Module["_rand_r"]=a0=>(_rand_r=Module["_rand_r"]=wasmExports["rand_r"])(a0);var _srandom=Module["_srandom"]=a0=>(_srandom=Module["_srandom"]=wasmExports["srandom"])(a0);var _initstate=Module["_initstate"]=(a0,a1,a2)=>(_initstate=Module["_initstate"]=wasmExports["initstate"])(a0,a1,a2);var _setstate=Module["_setstate"]=a0=>(_setstate=Module["_setstate"]=wasmExports["setstate"])(a0);var _random=Module["_random"]=()=>(_random=Module["_random"]=wasmExports["random"])();var _readdir_r=Module["_readdir_r"]=(a0,a1,a2)=>(_readdir_r=Module["_readdir_r"]=wasmExports["readdir_r"])(a0,a1,a2);var _recvmmsg=Module["_recvmmsg"]=(a0,a1,a2,a3,a4)=>(_recvmmsg=Module["_recvmmsg"]=wasmExports["recvmmsg"])(a0,a1,a2,a3,a4);var _regcomp=Module["_regcomp"]=(a0,a1,a2)=>(_regcomp=Module["_regcomp"]=wasmExports["regcomp"])(a0,a1,a2);var _regfree=Module["_regfree"]=a0=>(_regfree=Module["_regfree"]=wasmExports["regfree"])(a0);var _regerror=Module["_regerror"]=(a0,a1,a2,a3)=>(_regerror=Module["_regerror"]=wasmExports["regerror"])(a0,a1,a2,a3);var _regexec=Module["_regexec"]=(a0,a1,a2,a3,a4)=>(_regexec=Module["_regexec"]=wasmExports["regexec"])(a0,a1,a2,a3,a4);var _remainder=Module["_remainder"]=(a0,a1)=>(_remainder=Module["_remainder"]=wasmExports["remainder"])(a0,a1);var _remquo=Module["_remquo"]=(a0,a1,a2)=>(_remquo=Module["_remquo"]=wasmExports["remquo"])(a0,a1,a2);var _drem=Module["_drem"]=(a0,a1)=>(_drem=Module["_drem"]=wasmExports["drem"])(a0,a1);var _remainderf=Module["_remainderf"]=(a0,a1)=>(_remainderf=Module["_remainderf"]=wasmExports["remainderf"])(a0,a1);var _remquof=Module["_remquof"]=(a0,a1,a2)=>(_remquof=Module["_remquof"]=wasmExports["remquof"])(a0,a1,a2);var _dremf=Module["_dremf"]=(a0,a1)=>(_dremf=Module["_dremf"]=wasmExports["dremf"])(a0,a1);var _remainderl=Module["_remainderl"]=(a0,a1,a2,a3,a4)=>(_remainderl=Module["_remainderl"]=wasmExports["remainderl"])(a0,a1,a2,a3,a4);var _remquol=Module["_remquol"]=(a0,a1,a2,a3,a4,a5)=>(_remquol=Module["_remquol"]=wasmExports["remquol"])(a0,a1,a2,a3,a4,a5);var _remove=Module["_remove"]=a0=>(_remove=Module["_remove"]=wasmExports["remove"])(a0);var _res_init=Module["_res_init"]=()=>(_res_init=Module["_res_init"]=wasmExports["res_init"])();var _res_mkquery=Module["_res_mkquery"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_res_mkquery=Module["_res_mkquery"]=wasmExports["res_mkquery"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var ___res_msend=Module["___res_msend"]=(a0,a1,a2,a3,a4,a5)=>(___res_msend=Module["___res_msend"]=wasmExports["__res_msend"])(a0,a1,a2,a3,a4,a5);var _res_send=Module["_res_send"]=(a0,a1,a2,a3)=>(_res_send=Module["_res_send"]=wasmExports["res_send"])(a0,a1,a2,a3);var ___res_state=Module["___res_state"]=()=>(___res_state=Module["___res_state"]=wasmExports["__res_state"])();var _rindex=Module["_rindex"]=(a0,a1)=>(_rindex=Module["_rindex"]=wasmExports["rindex"])(a0,a1);var _emscripten_get_sbrk_ptr=Module["_emscripten_get_sbrk_ptr"]=()=>(_emscripten_get_sbrk_ptr=Module["_emscripten_get_sbrk_ptr"]=wasmExports["emscripten_get_sbrk_ptr"])();var _sbrk=Module["_sbrk"]=a0=>(_sbrk=Module["_sbrk"]=wasmExports["sbrk"])(a0);var _brk=Module["_brk"]=a0=>(_brk=Module["_brk"]=wasmExports["brk"])(a0);var _scalb=Module["_scalb"]=(a0,a1)=>(_scalb=Module["_scalb"]=wasmExports["scalb"])(a0,a1);var _scalbf=Module["_scalbf"]=(a0,a1)=>(_scalbf=Module["_scalbf"]=wasmExports["scalbf"])(a0,a1);var _scalbln=Module["_scalbln"]=(a0,a1)=>(_scalbln=Module["_scalbln"]=wasmExports["scalbln"])(a0,a1);var _scalblnf=Module["_scalblnf"]=(a0,a1)=>(_scalblnf=Module["_scalblnf"]=wasmExports["scalblnf"])(a0,a1);var _scalblnl=Module["_scalblnl"]=(a0,a1,a2,a3)=>(_scalblnl=Module["_scalblnl"]=wasmExports["scalblnl"])(a0,a1,a2,a3);var _scandir=Module["_scandir"]=(a0,a1,a2,a3)=>(_scandir=Module["_scandir"]=wasmExports["scandir"])(a0,a1,a2,a3);var _scanf=Module["_scanf"]=(a0,a1)=>(_scanf=Module["_scanf"]=wasmExports["scanf"])(a0,a1);var _vscanf=Module["_vscanf"]=(a0,a1)=>(_vscanf=Module["_vscanf"]=wasmExports["vscanf"])(a0,a1);var ___isoc99_scanf=Module["___isoc99_scanf"]=(a0,a1)=>(___isoc99_scanf=Module["___isoc99_scanf"]=wasmExports["__isoc99_scanf"])(a0,a1);var _secure_getenv=Module["_secure_getenv"]=a0=>(_secure_getenv=Module["_secure_getenv"]=wasmExports["secure_getenv"])(a0);var _seed48=Module["_seed48"]=a0=>(_seed48=Module["_seed48"]=wasmExports["seed48"])(a0);var _seekdir=Module["_seekdir"]=(a0,a1)=>(_seekdir=Module["_seekdir"]=wasmExports["seekdir"])(a0,a1);var _sendmmsg=Module["_sendmmsg"]=(a0,a1,a2,a3)=>(_sendmmsg=Module["_sendmmsg"]=wasmExports["sendmmsg"])(a0,a1,a2,a3);var _endservent=Module["_endservent"]=()=>(_endservent=Module["_endservent"]=wasmExports["endservent"])();var _setservent=Module["_setservent"]=a0=>(_setservent=Module["_setservent"]=wasmExports["setservent"])(a0);var _getservent=Module["_getservent"]=()=>(_getservent=Module["_getservent"]=wasmExports["getservent"])();var _setbuf=Module["_setbuf"]=(a0,a1)=>(_setbuf=Module["_setbuf"]=wasmExports["setbuf"])(a0,a1);var _setbuffer=Module["_setbuffer"]=(a0,a1,a2)=>(_setbuffer=Module["_setbuffer"]=wasmExports["setbuffer"])(a0,a1,a2);var _setdomainname=Module["_setdomainname"]=(a0,a1)=>(_setdomainname=Module["_setdomainname"]=wasmExports["setdomainname"])(a0,a1);var _setegid=Module["_setegid"]=a0=>(_setegid=Module["_setegid"]=wasmExports["setegid"])(a0);var _seteuid=Module["_seteuid"]=a0=>(_seteuid=Module["_seteuid"]=wasmExports["seteuid"])(a0);var __emscripten_timeout=(a0,a1)=>(__emscripten_timeout=wasmExports["_emscripten_timeout"])(a0,a1);var _setlinebuf=Module["_setlinebuf"]=a0=>(_setlinebuf=Module["_setlinebuf"]=wasmExports["setlinebuf"])(a0);var _setresgid=Module["_setresgid"]=(a0,a1,a2)=>(_setresgid=Module["_setresgid"]=wasmExports["setresgid"])(a0,a1,a2);var _setresuid=Module["_setresuid"]=(a0,a1,a2)=>(_setresuid=Module["_setresuid"]=wasmExports["setresuid"])(a0,a1,a2);var _shm_open=Module["_shm_open"]=(a0,a1,a2)=>(_shm_open=Module["_shm_open"]=wasmExports["shm_open"])(a0,a1,a2);var _shm_unlink=Module["_shm_unlink"]=a0=>(_shm_unlink=Module["_shm_unlink"]=wasmExports["shm_unlink"])(a0);var _sigaction=Module["_sigaction"]=(a0,a1,a2)=>(_sigaction=Module["_sigaction"]=wasmExports["sigaction"])(a0,a1,a2);var _sigisemptyset=Module["_sigisemptyset"]=a0=>(_sigisemptyset=Module["_sigisemptyset"]=wasmExports["sigisemptyset"])(a0);var _bsd_signal=Module["_bsd_signal"]=(a0,a1)=>(_bsd_signal=Module["_bsd_signal"]=wasmExports["bsd_signal"])(a0,a1);var ___sysv_signal=Module["___sysv_signal"]=(a0,a1)=>(___sysv_signal=Module["___sysv_signal"]=wasmExports["__sysv_signal"])(a0,a1);var _significand=Module["_significand"]=a0=>(_significand=Module["_significand"]=wasmExports["significand"])(a0);var _significandf=Module["_significandf"]=a0=>(_significandf=Module["_significandf"]=wasmExports["significandf"])(a0);var _sigprocmask=Module["_sigprocmask"]=(a0,a1,a2)=>(_sigprocmask=Module["_sigprocmask"]=wasmExports["sigprocmask"])(a0,a1,a2);var _sincos=Module["_sincos"]=(a0,a1,a2)=>(_sincos=Module["_sincos"]=wasmExports["sincos"])(a0,a1,a2);var _sincosf=Module["_sincosf"]=(a0,a1,a2)=>(_sincosf=Module["_sincosf"]=wasmExports["sincosf"])(a0,a1,a2);var _sincosl=Module["_sincosl"]=(a0,a1,a2,a3)=>(_sincosl=Module["_sincosl"]=wasmExports["sincosl"])(a0,a1,a2,a3);var _sinhl=Module["_sinhl"]=(a0,a1,a2)=>(_sinhl=Module["_sinhl"]=wasmExports["sinhl"])(a0,a1,a2);var _sinl=Module["_sinl"]=(a0,a1,a2)=>(_sinl=Module["_sinl"]=wasmExports["sinl"])(a0,a1,a2);var _sleep=Module["_sleep"]=a0=>(_sleep=Module["_sleep"]=wasmExports["sleep"])(a0);var _sockatmark=Module["_sockatmark"]=a0=>(_sockatmark=Module["_sockatmark"]=wasmExports["sockatmark"])(a0);var _vsprintf=Module["_vsprintf"]=(a0,a1,a2)=>(_vsprintf=Module["_vsprintf"]=wasmExports["vsprintf"])(a0,a1,a2);var _vsiprintf=Module["_vsiprintf"]=(a0,a1,a2)=>(_vsiprintf=Module["_vsiprintf"]=wasmExports["vsiprintf"])(a0,a1,a2);var ___small_sprintf=Module["___small_sprintf"]=(a0,a1,a2)=>(___small_sprintf=Module["___small_sprintf"]=wasmExports["__small_sprintf"])(a0,a1,a2);var ___small_vsprintf=Module["___small_vsprintf"]=(a0,a1,a2)=>(___small_vsprintf=Module["___small_vsprintf"]=wasmExports["__small_vsprintf"])(a0,a1,a2);var _srand48=Module["_srand48"]=a0=>(_srand48=Module["_srand48"]=wasmExports["srand48"])(a0);var _vsscanf=Module["_vsscanf"]=(a0,a1,a2)=>(_vsscanf=Module["_vsscanf"]=wasmExports["vsscanf"])(a0,a1,a2);var ___isoc99_sscanf=Module["___isoc99_sscanf"]=(a0,a1,a2)=>(___isoc99_sscanf=Module["___isoc99_sscanf"]=wasmExports["__isoc99_sscanf"])(a0,a1,a2);var _statfs=Module["_statfs"]=(a0,a1)=>(_statfs=Module["_statfs"]=wasmExports["statfs"])(a0,a1);var _fstatfs=Module["_fstatfs"]=(a0,a1)=>(_fstatfs=Module["_fstatfs"]=wasmExports["fstatfs"])(a0,a1);var _statx=Module["_statx"]=(a0,a1,a2,a3,a4)=>(_statx=Module["_statx"]=wasmExports["statx"])(a0,a1,a2,a3,a4);var _stpcpy=Module["_stpcpy"]=(a0,a1)=>(_stpcpy=Module["_stpcpy"]=wasmExports["stpcpy"])(a0,a1);var _stpncpy=Module["_stpncpy"]=(a0,a1,a2)=>(_stpncpy=Module["_stpncpy"]=wasmExports["stpncpy"])(a0,a1,a2);var ___strcasecmp_l=Module["___strcasecmp_l"]=(a0,a1,a2)=>(___strcasecmp_l=Module["___strcasecmp_l"]=wasmExports["__strcasecmp_l"])(a0,a1,a2);var _strcasecmp_l=Module["_strcasecmp_l"]=(a0,a1,a2)=>(_strcasecmp_l=Module["_strcasecmp_l"]=wasmExports["strcasecmp_l"])(a0,a1,a2);var _strcasestr=Module["_strcasestr"]=(a0,a1)=>(_strcasestr=Module["_strcasestr"]=wasmExports["strcasestr"])(a0,a1);var _strncasecmp=Module["_strncasecmp"]=(a0,a1,a2)=>(_strncasecmp=Module["_strncasecmp"]=wasmExports["strncasecmp"])(a0,a1,a2);var _strchrnul=Module["_strchrnul"]=(a0,a1)=>(_strchrnul=Module["_strchrnul"]=wasmExports["strchrnul"])(a0,a1);var ___strcoll_l=Module["___strcoll_l"]=(a0,a1,a2)=>(___strcoll_l=Module["___strcoll_l"]=wasmExports["__strcoll_l"])(a0,a1,a2);var _strcoll_l=Module["_strcoll_l"]=(a0,a1,a2)=>(_strcoll_l=Module["_strcoll_l"]=wasmExports["strcoll_l"])(a0,a1,a2);var ___strerror_l=Module["___strerror_l"]=(a0,a1)=>(___strerror_l=Module["___strerror_l"]=wasmExports["__strerror_l"])(a0,a1);var _strerror_l=Module["_strerror_l"]=(a0,a1)=>(_strerror_l=Module["_strerror_l"]=wasmExports["strerror_l"])(a0,a1);var _strerror_r=Module["_strerror_r"]=(a0,a1,a2)=>(_strerror_r=Module["_strerror_r"]=wasmExports["strerror_r"])(a0,a1,a2);var ___xpg_strerror_r=Module["___xpg_strerror_r"]=(a0,a1,a2)=>(___xpg_strerror_r=Module["___xpg_strerror_r"]=wasmExports["__xpg_strerror_r"])(a0,a1,a2);var _strfmon_l=Module["_strfmon_l"]=(a0,a1,a2,a3,a4)=>(_strfmon_l=Module["_strfmon_l"]=wasmExports["strfmon_l"])(a0,a1,a2,a3,a4);var _strfmon=Module["_strfmon"]=(a0,a1,a2,a3)=>(_strfmon=Module["_strfmon"]=wasmExports["strfmon"])(a0,a1,a2,a3);var _strlcat=Module["_strlcat"]=(a0,a1,a2)=>(_strlcat=Module["_strlcat"]=wasmExports["strlcat"])(a0,a1,a2);var _strlcpy=Module["_strlcpy"]=(a0,a1,a2)=>(_strlcpy=Module["_strlcpy"]=wasmExports["strlcpy"])(a0,a1,a2);var _strlwr=Module["_strlwr"]=a0=>(_strlwr=Module["_strlwr"]=wasmExports["strlwr"])(a0);var ___strncasecmp_l=Module["___strncasecmp_l"]=(a0,a1,a2,a3)=>(___strncasecmp_l=Module["___strncasecmp_l"]=wasmExports["__strncasecmp_l"])(a0,a1,a2,a3);var _strncasecmp_l=Module["_strncasecmp_l"]=(a0,a1,a2,a3)=>(_strncasecmp_l=Module["_strncasecmp_l"]=wasmExports["strncasecmp_l"])(a0,a1,a2,a3);var _strndup=Module["_strndup"]=(a0,a1)=>(_strndup=Module["_strndup"]=wasmExports["strndup"])(a0,a1);var _strsep=Module["_strsep"]=(a0,a1)=>(_strsep=Module["_strsep"]=wasmExports["strsep"])(a0,a1);var _strtof=Module["_strtof"]=(a0,a1)=>(_strtof=Module["_strtof"]=wasmExports["strtof"])(a0,a1);var _strtold=Module["_strtold"]=(a0,a1,a2)=>(_strtold=Module["_strtold"]=wasmExports["strtold"])(a0,a1,a2);var _strtof_l=Module["_strtof_l"]=(a0,a1,a2)=>(_strtof_l=Module["_strtof_l"]=wasmExports["strtof_l"])(a0,a1,a2);var _strtod_l=Module["_strtod_l"]=(a0,a1,a2)=>(_strtod_l=Module["_strtod_l"]=wasmExports["strtod_l"])(a0,a1,a2);var _strtold_l=Module["_strtold_l"]=(a0,a1,a2,a3)=>(_strtold_l=Module["_strtold_l"]=wasmExports["strtold_l"])(a0,a1,a2,a3);var ___strtof_l=Module["___strtof_l"]=(a0,a1,a2)=>(___strtof_l=Module["___strtof_l"]=wasmExports["__strtof_l"])(a0,a1,a2);var ___strtod_l=Module["___strtod_l"]=(a0,a1,a2)=>(___strtod_l=Module["___strtod_l"]=wasmExports["__strtod_l"])(a0,a1,a2);var ___strtold_l=Module["___strtold_l"]=(a0,a1,a2,a3)=>(___strtold_l=Module["___strtold_l"]=wasmExports["__strtold_l"])(a0,a1,a2,a3);var _strtok=Module["_strtok"]=(a0,a1)=>(_strtok=Module["_strtok"]=wasmExports["strtok"])(a0,a1);var _strtok_r=Module["_strtok_r"]=(a0,a1,a2)=>(_strtok_r=Module["_strtok_r"]=wasmExports["strtok_r"])(a0,a1,a2);var _strtoll=Module["_strtoll"]=(a0,a1,a2)=>(_strtoll=Module["_strtoll"]=wasmExports["strtoll"])(a0,a1,a2);var _strtoimax=Module["_strtoimax"]=(a0,a1,a2)=>(_strtoimax=Module["_strtoimax"]=wasmExports["strtoimax"])(a0,a1,a2);var _strtoumax=Module["_strtoumax"]=(a0,a1,a2)=>(_strtoumax=Module["_strtoumax"]=wasmExports["strtoumax"])(a0,a1,a2);var ___strtol_internal=Module["___strtol_internal"]=(a0,a1,a2)=>(___strtol_internal=Module["___strtol_internal"]=wasmExports["__strtol_internal"])(a0,a1,a2);var ___strtoul_internal=Module["___strtoul_internal"]=(a0,a1,a2)=>(___strtoul_internal=Module["___strtoul_internal"]=wasmExports["__strtoul_internal"])(a0,a1,a2);var ___strtoll_internal=Module["___strtoll_internal"]=(a0,a1,a2)=>(___strtoll_internal=Module["___strtoll_internal"]=wasmExports["__strtoll_internal"])(a0,a1,a2);var ___strtoull_internal=Module["___strtoull_internal"]=(a0,a1,a2)=>(___strtoull_internal=Module["___strtoull_internal"]=wasmExports["__strtoull_internal"])(a0,a1,a2);var ___strtoimax_internal=Module["___strtoimax_internal"]=(a0,a1,a2)=>(___strtoimax_internal=Module["___strtoimax_internal"]=wasmExports["__strtoimax_internal"])(a0,a1,a2);var ___strtoumax_internal=Module["___strtoumax_internal"]=(a0,a1,a2)=>(___strtoumax_internal=Module["___strtoumax_internal"]=wasmExports["__strtoumax_internal"])(a0,a1,a2);var _strtoull_l=Module["_strtoull_l"]=(a0,a1,a2,a3)=>(_strtoull_l=Module["_strtoull_l"]=wasmExports["strtoull_l"])(a0,a1,a2,a3);var _strtoll_l=Module["_strtoll_l"]=(a0,a1,a2,a3)=>(_strtoll_l=Module["_strtoll_l"]=wasmExports["strtoll_l"])(a0,a1,a2,a3);var _strtoul_l=Module["_strtoul_l"]=(a0,a1,a2,a3)=>(_strtoul_l=Module["_strtoul_l"]=wasmExports["strtoul_l"])(a0,a1,a2,a3);var _strtol_l=Module["_strtol_l"]=(a0,a1,a2,a3)=>(_strtol_l=Module["_strtol_l"]=wasmExports["strtol_l"])(a0,a1,a2,a3);var _strupr=Module["_strupr"]=a0=>(_strupr=Module["_strupr"]=wasmExports["strupr"])(a0);var _strverscmp=Module["_strverscmp"]=(a0,a1)=>(_strverscmp=Module["_strverscmp"]=wasmExports["strverscmp"])(a0,a1);var ___strxfrm_l=Module["___strxfrm_l"]=(a0,a1,a2,a3)=>(___strxfrm_l=Module["___strxfrm_l"]=wasmExports["__strxfrm_l"])(a0,a1,a2,a3);var _strxfrm=Module["_strxfrm"]=(a0,a1,a2)=>(_strxfrm=Module["_strxfrm"]=wasmExports["strxfrm"])(a0,a1,a2);var _strxfrm_l=Module["_strxfrm_l"]=(a0,a1,a2,a3)=>(_strxfrm_l=Module["_strxfrm_l"]=wasmExports["strxfrm_l"])(a0,a1,a2,a3);var _swab=Module["_swab"]=(a0,a1,a2)=>(_swab=Module["_swab"]=wasmExports["swab"])(a0,a1,a2);var _swprintf=Module["_swprintf"]=(a0,a1,a2,a3)=>(_swprintf=Module["_swprintf"]=wasmExports["swprintf"])(a0,a1,a2,a3);var _vswprintf=Module["_vswprintf"]=(a0,a1,a2,a3)=>(_vswprintf=Module["_vswprintf"]=wasmExports["vswprintf"])(a0,a1,a2,a3);var _swscanf=Module["_swscanf"]=(a0,a1,a2)=>(_swscanf=Module["_swscanf"]=wasmExports["swscanf"])(a0,a1,a2);var _vswscanf=Module["_vswscanf"]=(a0,a1,a2)=>(_vswscanf=Module["_vswscanf"]=wasmExports["vswscanf"])(a0,a1,a2);var ___isoc99_swscanf=Module["___isoc99_swscanf"]=(a0,a1,a2)=>(___isoc99_swscanf=Module["___isoc99_swscanf"]=wasmExports["__isoc99_swscanf"])(a0,a1,a2);var _symlinkat=Module["_symlinkat"]=(a0,a1,a2)=>(_symlinkat=Module["_symlinkat"]=wasmExports["symlinkat"])(a0,a1,a2);var _setlogmask=Module["_setlogmask"]=a0=>(_setlogmask=Module["_setlogmask"]=wasmExports["setlogmask"])(a0);var _closelog=Module["_closelog"]=()=>(_closelog=Module["_closelog"]=wasmExports["closelog"])();var _openlog=Module["_openlog"]=(a0,a1,a2)=>(_openlog=Module["_openlog"]=wasmExports["openlog"])(a0,a1,a2);var _syslog=Module["_syslog"]=(a0,a1,a2)=>(_syslog=Module["_syslog"]=wasmExports["syslog"])(a0,a1,a2);var _vsyslog=Module["_vsyslog"]=(a0,a1,a2)=>(_vsyslog=Module["_vsyslog"]=wasmExports["vsyslog"])(a0,a1,a2);var _tanhf=Module["_tanhf"]=a0=>(_tanhf=Module["_tanhf"]=wasmExports["tanhf"])(a0);var _tanhl=Module["_tanhl"]=(a0,a1,a2)=>(_tanhl=Module["_tanhl"]=wasmExports["tanhl"])(a0,a1,a2);var _tanl=Module["_tanl"]=(a0,a1,a2)=>(_tanl=Module["_tanl"]=wasmExports["tanl"])(a0,a1,a2);var _tcdrain=Module["_tcdrain"]=a0=>(_tcdrain=Module["_tcdrain"]=wasmExports["tcdrain"])(a0);var _tcflow=Module["_tcflow"]=(a0,a1)=>(_tcflow=Module["_tcflow"]=wasmExports["tcflow"])(a0,a1);var _tcflush=Module["_tcflush"]=(a0,a1)=>(_tcflush=Module["_tcflush"]=wasmExports["tcflush"])(a0,a1);var _tcgetattr=Module["_tcgetattr"]=(a0,a1)=>(_tcgetattr=Module["_tcgetattr"]=wasmExports["tcgetattr"])(a0,a1);var _tcgetsid=Module["_tcgetsid"]=a0=>(_tcgetsid=Module["_tcgetsid"]=wasmExports["tcgetsid"])(a0);var _tcgetwinsize=Module["_tcgetwinsize"]=(a0,a1)=>(_tcgetwinsize=Module["_tcgetwinsize"]=wasmExports["tcgetwinsize"])(a0,a1);var _tcsendbreak=Module["_tcsendbreak"]=(a0,a1)=>(_tcsendbreak=Module["_tcsendbreak"]=wasmExports["tcsendbreak"])(a0,a1);var _tcsetwinsize=Module["_tcsetwinsize"]=(a0,a1)=>(_tcsetwinsize=Module["_tcsetwinsize"]=wasmExports["tcsetwinsize"])(a0,a1);var _tdelete=Module["_tdelete"]=(a0,a1,a2)=>(_tdelete=Module["_tdelete"]=wasmExports["tdelete"])(a0,a1,a2);var _tdestroy=Module["_tdestroy"]=(a0,a1)=>(_tdestroy=Module["_tdestroy"]=wasmExports["tdestroy"])(a0,a1);var _telldir=Module["_telldir"]=a0=>(_telldir=Module["_telldir"]=wasmExports["telldir"])(a0);var _tempnam=Module["_tempnam"]=(a0,a1)=>(_tempnam=Module["_tempnam"]=wasmExports["tempnam"])(a0,a1);var _ngettext=Module["_ngettext"]=(a0,a1,a2)=>(_ngettext=Module["_ngettext"]=wasmExports["ngettext"])(a0,a1,a2);var _tfind=Module["_tfind"]=(a0,a1,a2)=>(_tfind=Module["_tfind"]=wasmExports["tfind"])(a0,a1,a2);var _tgamma=Module["_tgamma"]=a0=>(_tgamma=Module["_tgamma"]=wasmExports["tgamma"])(a0);var _tgammaf=Module["_tgammaf"]=a0=>(_tgammaf=Module["_tgammaf"]=wasmExports["tgammaf"])(a0);var _tgammal=Module["_tgammal"]=(a0,a1,a2)=>(_tgammal=Module["_tgammal"]=wasmExports["tgammal"])(a0,a1,a2);var _thrd_create=Module["_thrd_create"]=(a0,a1,a2)=>(_thrd_create=Module["_thrd_create"]=wasmExports["thrd_create"])(a0,a1,a2);var _thrd_exit=Module["_thrd_exit"]=a0=>(_thrd_exit=Module["_thrd_exit"]=wasmExports["thrd_exit"])(a0);var _thrd_join=Module["_thrd_join"]=(a0,a1)=>(_thrd_join=Module["_thrd_join"]=wasmExports["thrd_join"])(a0,a1);var _thrd_sleep=Module["_thrd_sleep"]=(a0,a1)=>(_thrd_sleep=Module["_thrd_sleep"]=wasmExports["thrd_sleep"])(a0,a1);var _thrd_yield=Module["_thrd_yield"]=()=>(_thrd_yield=Module["_thrd_yield"]=wasmExports["thrd_yield"])();var _emscripten_set_thread_name=Module["_emscripten_set_thread_name"]=(a0,a1)=>(_emscripten_set_thread_name=Module["_emscripten_set_thread_name"]=wasmExports["emscripten_set_thread_name"])(a0,a1);var _timespec_get=Module["_timespec_get"]=(a0,a1)=>(_timespec_get=Module["_timespec_get"]=wasmExports["timespec_get"])(a0,a1);var _tmpfile=Module["_tmpfile"]=()=>(_tmpfile=Module["_tmpfile"]=wasmExports["tmpfile"])();var _tmpnam=Module["_tmpnam"]=a0=>(_tmpnam=Module["_tmpnam"]=wasmExports["tmpnam"])(a0);var _toascii=Module["_toascii"]=a0=>(_toascii=Module["_toascii"]=wasmExports["toascii"])(a0);var ___tolower_l=Module["___tolower_l"]=(a0,a1)=>(___tolower_l=Module["___tolower_l"]=wasmExports["__tolower_l"])(a0,a1);var _tolower_l=Module["_tolower_l"]=(a0,a1)=>(_tolower_l=Module["_tolower_l"]=wasmExports["tolower_l"])(a0,a1);var ___toupper_l=Module["___toupper_l"]=(a0,a1)=>(___toupper_l=Module["___toupper_l"]=wasmExports["__toupper_l"])(a0,a1);var _toupper_l=Module["_toupper_l"]=(a0,a1)=>(_toupper_l=Module["_toupper_l"]=wasmExports["toupper_l"])(a0,a1);var ___towupper_l=Module["___towupper_l"]=(a0,a1)=>(___towupper_l=Module["___towupper_l"]=wasmExports["__towupper_l"])(a0,a1);var ___towlower_l=Module["___towlower_l"]=(a0,a1)=>(___towlower_l=Module["___towlower_l"]=wasmExports["__towlower_l"])(a0,a1);var _towupper_l=Module["_towupper_l"]=(a0,a1)=>(_towupper_l=Module["_towupper_l"]=wasmExports["towupper_l"])(a0,a1);var _towlower_l=Module["_towlower_l"]=(a0,a1)=>(_towlower_l=Module["_towlower_l"]=wasmExports["towlower_l"])(a0,a1);var _trunc=Module["_trunc"]=a0=>(_trunc=Module["_trunc"]=wasmExports["trunc"])(a0);var _truncf=Module["_truncf"]=a0=>(_truncf=Module["_truncf"]=wasmExports["truncf"])(a0);var _truncl=Module["_truncl"]=(a0,a1,a2)=>(_truncl=Module["_truncl"]=wasmExports["truncl"])(a0,a1,a2);var _tsearch=Module["_tsearch"]=(a0,a1,a2)=>(_tsearch=Module["_tsearch"]=wasmExports["tsearch"])(a0,a1,a2);var _tss_create=Module["_tss_create"]=(a0,a1)=>(_tss_create=Module["_tss_create"]=wasmExports["tss_create"])(a0,a1);var _tss_delete=Module["_tss_delete"]=a0=>(_tss_delete=Module["_tss_delete"]=wasmExports["tss_delete"])(a0);var _tss_set=Module["_tss_set"]=(a0,a1)=>(_tss_set=Module["_tss_set"]=wasmExports["tss_set"])(a0,a1);var _ttyname=Module["_ttyname"]=a0=>(_ttyname=Module["_ttyname"]=wasmExports["ttyname"])(a0);var _twalk=Module["_twalk"]=(a0,a1)=>(_twalk=Module["_twalk"]=wasmExports["twalk"])(a0,a1);var _ualarm=Module["_ualarm"]=(a0,a1)=>(_ualarm=Module["_ualarm"]=wasmExports["ualarm"])(a0,a1);var _ungetwc=Module["_ungetwc"]=(a0,a1)=>(_ungetwc=Module["_ungetwc"]=wasmExports["ungetwc"])(a0,a1);var ___uselocale=Module["___uselocale"]=a0=>(___uselocale=Module["___uselocale"]=wasmExports["__uselocale"])(a0);var _uselocale=Module["_uselocale"]=a0=>(_uselocale=Module["_uselocale"]=wasmExports["uselocale"])(a0);var _usleep=Module["_usleep"]=a0=>(_usleep=Module["_usleep"]=wasmExports["usleep"])(a0);var _utime=Module["_utime"]=(a0,a1)=>(_utime=Module["_utime"]=wasmExports["utime"])(a0,a1);var _versionsort=Module["_versionsort"]=(a0,a1)=>(_versionsort=Module["_versionsort"]=wasmExports["versionsort"])(a0,a1);var ___vfprintf_internal=Module["___vfprintf_internal"]=(a0,a1,a2,a3,a4)=>(___vfprintf_internal=Module["___vfprintf_internal"]=wasmExports["__vfprintf_internal"])(a0,a1,a2,a3,a4);var ___isoc99_vfscanf=Module["___isoc99_vfscanf"]=(a0,a1,a2)=>(___isoc99_vfscanf=Module["___isoc99_vfscanf"]=wasmExports["__isoc99_vfscanf"])(a0,a1,a2);var _wcsnlen=Module["_wcsnlen"]=(a0,a1)=>(_wcsnlen=Module["_wcsnlen"]=wasmExports["wcsnlen"])(a0,a1);var ___isoc99_vfwscanf=Module["___isoc99_vfwscanf"]=(a0,a1,a2)=>(___isoc99_vfwscanf=Module["___isoc99_vfwscanf"]=wasmExports["__isoc99_vfwscanf"])(a0,a1,a2);var _vprintf=Module["_vprintf"]=(a0,a1)=>(_vprintf=Module["_vprintf"]=wasmExports["vprintf"])(a0,a1);var ___isoc99_vscanf=Module["___isoc99_vscanf"]=(a0,a1)=>(___isoc99_vscanf=Module["___isoc99_vscanf"]=wasmExports["__isoc99_vscanf"])(a0,a1);var _vsniprintf=Module["_vsniprintf"]=(a0,a1,a2,a3)=>(_vsniprintf=Module["_vsniprintf"]=wasmExports["vsniprintf"])(a0,a1,a2,a3);var ___small_vsnprintf=Module["___small_vsnprintf"]=(a0,a1,a2,a3)=>(___small_vsnprintf=Module["___small_vsnprintf"]=wasmExports["__small_vsnprintf"])(a0,a1,a2,a3);var ___isoc99_vsscanf=Module["___isoc99_vsscanf"]=(a0,a1,a2)=>(___isoc99_vsscanf=Module["___isoc99_vsscanf"]=wasmExports["__isoc99_vsscanf"])(a0,a1,a2);var ___isoc99_vswscanf=Module["___isoc99_vswscanf"]=(a0,a1,a2)=>(___isoc99_vswscanf=Module["___isoc99_vswscanf"]=wasmExports["__isoc99_vswscanf"])(a0,a1,a2);var _vwprintf=Module["_vwprintf"]=(a0,a1)=>(_vwprintf=Module["_vwprintf"]=wasmExports["vwprintf"])(a0,a1);var _vwscanf=Module["_vwscanf"]=(a0,a1)=>(_vwscanf=Module["_vwscanf"]=wasmExports["vwscanf"])(a0,a1);var ___isoc99_vwscanf=Module["___isoc99_vwscanf"]=(a0,a1)=>(___isoc99_vwscanf=Module["___isoc99_vwscanf"]=wasmExports["__isoc99_vwscanf"])(a0,a1);var _wcpcpy=Module["_wcpcpy"]=(a0,a1)=>(_wcpcpy=Module["_wcpcpy"]=wasmExports["wcpcpy"])(a0,a1);var _wcpncpy=Module["_wcpncpy"]=(a0,a1,a2)=>(_wcpncpy=Module["_wcpncpy"]=wasmExports["wcpncpy"])(a0,a1,a2);var _wcscasecmp=Module["_wcscasecmp"]=(a0,a1)=>(_wcscasecmp=Module["_wcscasecmp"]=wasmExports["wcscasecmp"])(a0,a1);var _wcsncasecmp=Module["_wcsncasecmp"]=(a0,a1,a2)=>(_wcsncasecmp=Module["_wcsncasecmp"]=wasmExports["wcsncasecmp"])(a0,a1,a2);var _wcscasecmp_l=Module["_wcscasecmp_l"]=(a0,a1,a2)=>(_wcscasecmp_l=Module["_wcscasecmp_l"]=wasmExports["wcscasecmp_l"])(a0,a1,a2);var _wcscat=Module["_wcscat"]=(a0,a1)=>(_wcscat=Module["_wcscat"]=wasmExports["wcscat"])(a0,a1);var ___wcscoll_l=Module["___wcscoll_l"]=(a0,a1,a2)=>(___wcscoll_l=Module["___wcscoll_l"]=wasmExports["__wcscoll_l"])(a0,a1,a2);var _wcscoll_l=Module["_wcscoll_l"]=(a0,a1,a2)=>(_wcscoll_l=Module["_wcscoll_l"]=wasmExports["wcscoll_l"])(a0,a1,a2);var _wcscspn=Module["_wcscspn"]=(a0,a1)=>(_wcscspn=Module["_wcscspn"]=wasmExports["wcscspn"])(a0,a1);var _wcsdup=Module["_wcsdup"]=a0=>(_wcsdup=Module["_wcsdup"]=wasmExports["wcsdup"])(a0);var _wmemcpy=Module["_wmemcpy"]=(a0,a1,a2)=>(_wmemcpy=Module["_wmemcpy"]=wasmExports["wmemcpy"])(a0,a1,a2);var _wcsncasecmp_l=Module["_wcsncasecmp_l"]=(a0,a1,a2,a3)=>(_wcsncasecmp_l=Module["_wcsncasecmp_l"]=wasmExports["wcsncasecmp_l"])(a0,a1,a2,a3);var _wcsncat=Module["_wcsncat"]=(a0,a1,a2)=>(_wcsncat=Module["_wcsncat"]=wasmExports["wcsncat"])(a0,a1,a2);var _wmemset=Module["_wmemset"]=(a0,a1,a2)=>(_wmemset=Module["_wmemset"]=wasmExports["wmemset"])(a0,a1,a2);var _wcsnrtombs=Module["_wcsnrtombs"]=(a0,a1,a2,a3,a4)=>(_wcsnrtombs=Module["_wcsnrtombs"]=wasmExports["wcsnrtombs"])(a0,a1,a2,a3,a4);var _wcspbrk=Module["_wcspbrk"]=(a0,a1)=>(_wcspbrk=Module["_wcspbrk"]=wasmExports["wcspbrk"])(a0,a1);var _wcsspn=Module["_wcsspn"]=(a0,a1)=>(_wcsspn=Module["_wcsspn"]=wasmExports["wcsspn"])(a0,a1);var _wcsstr=Module["_wcsstr"]=(a0,a1)=>(_wcsstr=Module["_wcsstr"]=wasmExports["wcsstr"])(a0,a1);var _wcstof=Module["_wcstof"]=(a0,a1)=>(_wcstof=Module["_wcstof"]=wasmExports["wcstof"])(a0,a1);var _wcstod=Module["_wcstod"]=(a0,a1)=>(_wcstod=Module["_wcstod"]=wasmExports["wcstod"])(a0,a1);var _wcstold=Module["_wcstold"]=(a0,a1,a2)=>(_wcstold=Module["_wcstold"]=wasmExports["wcstold"])(a0,a1,a2);var _wcstoull=Module["_wcstoull"]=(a0,a1,a2)=>(_wcstoull=Module["_wcstoull"]=wasmExports["wcstoull"])(a0,a1,a2);var _wcstoll=Module["_wcstoll"]=(a0,a1,a2)=>(_wcstoll=Module["_wcstoll"]=wasmExports["wcstoll"])(a0,a1,a2);var _wcstoul=Module["_wcstoul"]=(a0,a1,a2)=>(_wcstoul=Module["_wcstoul"]=wasmExports["wcstoul"])(a0,a1,a2);var _wcstoimax=Module["_wcstoimax"]=(a0,a1,a2)=>(_wcstoimax=Module["_wcstoimax"]=wasmExports["wcstoimax"])(a0,a1,a2);var _wcstoumax=Module["_wcstoumax"]=(a0,a1,a2)=>(_wcstoumax=Module["_wcstoumax"]=wasmExports["wcstoumax"])(a0,a1,a2);var _wcswcs=Module["_wcswcs"]=(a0,a1)=>(_wcswcs=Module["_wcswcs"]=wasmExports["wcswcs"])(a0,a1);var _wcswidth=Module["_wcswidth"]=(a0,a1)=>(_wcswidth=Module["_wcswidth"]=wasmExports["wcswidth"])(a0,a1);var _wcwidth=Module["_wcwidth"]=a0=>(_wcwidth=Module["_wcwidth"]=wasmExports["wcwidth"])(a0);var ___wcsxfrm_l=Module["___wcsxfrm_l"]=(a0,a1,a2,a3)=>(___wcsxfrm_l=Module["___wcsxfrm_l"]=wasmExports["__wcsxfrm_l"])(a0,a1,a2,a3);var _wcsxfrm_l=Module["_wcsxfrm_l"]=(a0,a1,a2,a3)=>(_wcsxfrm_l=Module["_wcsxfrm_l"]=wasmExports["wcsxfrm_l"])(a0,a1,a2,a3);var _wctob=Module["_wctob"]=a0=>(_wctob=Module["_wctob"]=wasmExports["wctob"])(a0);var _wctrans=Module["_wctrans"]=a0=>(_wctrans=Module["_wctrans"]=wasmExports["wctrans"])(a0);var _towctrans=Module["_towctrans"]=(a0,a1)=>(_towctrans=Module["_towctrans"]=wasmExports["towctrans"])(a0,a1);var ___wctrans_l=Module["___wctrans_l"]=(a0,a1)=>(___wctrans_l=Module["___wctrans_l"]=wasmExports["__wctrans_l"])(a0,a1);var ___towctrans_l=Module["___towctrans_l"]=(a0,a1,a2)=>(___towctrans_l=Module["___towctrans_l"]=wasmExports["__towctrans_l"])(a0,a1,a2);var _wctrans_l=Module["_wctrans_l"]=(a0,a1)=>(_wctrans_l=Module["_wctrans_l"]=wasmExports["wctrans_l"])(a0,a1);var _towctrans_l=Module["_towctrans_l"]=(a0,a1,a2)=>(_towctrans_l=Module["_towctrans_l"]=wasmExports["towctrans_l"])(a0,a1,a2);var _wmemmove=Module["_wmemmove"]=(a0,a1,a2)=>(_wmemmove=Module["_wmemmove"]=wasmExports["wmemmove"])(a0,a1,a2);var _wprintf=Module["_wprintf"]=(a0,a1)=>(_wprintf=Module["_wprintf"]=wasmExports["wprintf"])(a0,a1);var _wscanf=Module["_wscanf"]=(a0,a1)=>(_wscanf=Module["_wscanf"]=wasmExports["wscanf"])(a0,a1);var ___isoc99_wscanf=Module["___isoc99_wscanf"]=(a0,a1)=>(___isoc99_wscanf=Module["___isoc99_wscanf"]=wasmExports["__isoc99_wscanf"])(a0,a1);var ___libc_realloc=Module["___libc_realloc"]=(a0,a1)=>(___libc_realloc=Module["___libc_realloc"]=wasmExports["__libc_realloc"])(a0,a1);var _realloc_in_place=Module["_realloc_in_place"]=(a0,a1)=>(_realloc_in_place=Module["_realloc_in_place"]=wasmExports["realloc_in_place"])(a0,a1);var _memalign=Module["_memalign"]=(a0,a1)=>(_memalign=Module["_memalign"]=wasmExports["memalign"])(a0,a1);var _valloc=Module["_valloc"]=a0=>(_valloc=Module["_valloc"]=wasmExports["valloc"])(a0);var _pvalloc=Module["_pvalloc"]=a0=>(_pvalloc=Module["_pvalloc"]=wasmExports["pvalloc"])(a0);var _mallinfo=Module["_mallinfo"]=a0=>(_mallinfo=Module["_mallinfo"]=wasmExports["mallinfo"])(a0);var _mallopt=Module["_mallopt"]=(a0,a1)=>(_mallopt=Module["_mallopt"]=wasmExports["mallopt"])(a0,a1);var _malloc_trim=Module["_malloc_trim"]=a0=>(_malloc_trim=Module["_malloc_trim"]=wasmExports["malloc_trim"])(a0);var _malloc_usable_size=Module["_malloc_usable_size"]=a0=>(_malloc_usable_size=Module["_malloc_usable_size"]=wasmExports["malloc_usable_size"])(a0);var _malloc_footprint=Module["_malloc_footprint"]=()=>(_malloc_footprint=Module["_malloc_footprint"]=wasmExports["malloc_footprint"])();var _malloc_max_footprint=Module["_malloc_max_footprint"]=()=>(_malloc_max_footprint=Module["_malloc_max_footprint"]=wasmExports["malloc_max_footprint"])();var _malloc_footprint_limit=Module["_malloc_footprint_limit"]=()=>(_malloc_footprint_limit=Module["_malloc_footprint_limit"]=wasmExports["malloc_footprint_limit"])();var _malloc_set_footprint_limit=Module["_malloc_set_footprint_limit"]=a0=>(_malloc_set_footprint_limit=Module["_malloc_set_footprint_limit"]=wasmExports["malloc_set_footprint_limit"])(a0);var _independent_calloc=Module["_independent_calloc"]=(a0,a1,a2)=>(_independent_calloc=Module["_independent_calloc"]=wasmExports["independent_calloc"])(a0,a1,a2);var _independent_comalloc=Module["_independent_comalloc"]=(a0,a1,a2)=>(_independent_comalloc=Module["_independent_comalloc"]=wasmExports["independent_comalloc"])(a0,a1,a2);var _bulk_free=Module["_bulk_free"]=(a0,a1)=>(_bulk_free=Module["_bulk_free"]=wasmExports["bulk_free"])(a0,a1);var ___trap=Module["___trap"]=()=>(___trap=Module["___trap"]=wasmExports["__trap"])();var ___absvdi2=Module["___absvdi2"]=a0=>(___absvdi2=Module["___absvdi2"]=wasmExports["__absvdi2"])(a0);var ___absvsi2=Module["___absvsi2"]=a0=>(___absvsi2=Module["___absvsi2"]=wasmExports["__absvsi2"])(a0);var ___absvti2=Module["___absvti2"]=(a0,a1,a2)=>(___absvti2=Module["___absvti2"]=wasmExports["__absvti2"])(a0,a1,a2);var ___adddf3=Module["___adddf3"]=(a0,a1)=>(___adddf3=Module["___adddf3"]=wasmExports["__adddf3"])(a0,a1);var ___fe_getround=Module["___fe_getround"]=()=>(___fe_getround=Module["___fe_getround"]=wasmExports["__fe_getround"])();var ___fe_raise_inexact=Module["___fe_raise_inexact"]=()=>(___fe_raise_inexact=Module["___fe_raise_inexact"]=wasmExports["__fe_raise_inexact"])();var ___addsf3=Module["___addsf3"]=(a0,a1)=>(___addsf3=Module["___addsf3"]=wasmExports["__addsf3"])(a0,a1);var ___ashlti3=Module["___ashlti3"]=(a0,a1,a2,a3)=>(___ashlti3=Module["___ashlti3"]=wasmExports["__ashlti3"])(a0,a1,a2,a3);var ___lshrti3=Module["___lshrti3"]=(a0,a1,a2,a3)=>(___lshrti3=Module["___lshrti3"]=wasmExports["__lshrti3"])(a0,a1,a2,a3);var ___addvdi3=Module["___addvdi3"]=(a0,a1)=>(___addvdi3=Module["___addvdi3"]=wasmExports["__addvdi3"])(a0,a1);var ___addvsi3=Module["___addvsi3"]=(a0,a1)=>(___addvsi3=Module["___addvsi3"]=wasmExports["__addvsi3"])(a0,a1);var ___addvti3=Module["___addvti3"]=(a0,a1,a2,a3,a4)=>(___addvti3=Module["___addvti3"]=wasmExports["__addvti3"])(a0,a1,a2,a3,a4);var ___ashldi3=Module["___ashldi3"]=(a0,a1)=>(___ashldi3=Module["___ashldi3"]=wasmExports["__ashldi3"])(a0,a1);var ___ashrdi3=Module["___ashrdi3"]=(a0,a1)=>(___ashrdi3=Module["___ashrdi3"]=wasmExports["__ashrdi3"])(a0,a1);var ___ashrti3=Module["___ashrti3"]=(a0,a1,a2,a3)=>(___ashrti3=Module["___ashrti3"]=wasmExports["__ashrti3"])(a0,a1,a2,a3);var ___atomic_is_lock_free=Module["___atomic_is_lock_free"]=(a0,a1)=>(___atomic_is_lock_free=Module["___atomic_is_lock_free"]=wasmExports["__atomic_is_lock_free"])(a0,a1);var ___atomic_load=Module["___atomic_load"]=(a0,a1,a2,a3)=>(___atomic_load=Module["___atomic_load"]=wasmExports["__atomic_load"])(a0,a1,a2,a3);var ___atomic_store=Module["___atomic_store"]=(a0,a1,a2,a3)=>(___atomic_store=Module["___atomic_store"]=wasmExports["__atomic_store"])(a0,a1,a2,a3);var ___atomic_compare_exchange=Module["___atomic_compare_exchange"]=(a0,a1,a2,a3,a4,a5)=>(___atomic_compare_exchange=Module["___atomic_compare_exchange"]=wasmExports["__atomic_compare_exchange"])(a0,a1,a2,a3,a4,a5);var ___atomic_exchange=Module["___atomic_exchange"]=(a0,a1,a2,a3,a4)=>(___atomic_exchange=Module["___atomic_exchange"]=wasmExports["__atomic_exchange"])(a0,a1,a2,a3,a4);var ___atomic_load_1=Module["___atomic_load_1"]=(a0,a1)=>(___atomic_load_1=Module["___atomic_load_1"]=wasmExports["__atomic_load_1"])(a0,a1);var ___atomic_load_2=Module["___atomic_load_2"]=(a0,a1)=>(___atomic_load_2=Module["___atomic_load_2"]=wasmExports["__atomic_load_2"])(a0,a1);var ___atomic_load_4=Module["___atomic_load_4"]=(a0,a1)=>(___atomic_load_4=Module["___atomic_load_4"]=wasmExports["__atomic_load_4"])(a0,a1);var ___atomic_load_8=Module["___atomic_load_8"]=(a0,a1)=>(___atomic_load_8=Module["___atomic_load_8"]=wasmExports["__atomic_load_8"])(a0,a1);var ___atomic_load_16=Module["___atomic_load_16"]=(a0,a1,a2)=>(___atomic_load_16=Module["___atomic_load_16"]=wasmExports["__atomic_load_16"])(a0,a1,a2);var ___atomic_store_1=Module["___atomic_store_1"]=(a0,a1,a2)=>(___atomic_store_1=Module["___atomic_store_1"]=wasmExports["__atomic_store_1"])(a0,a1,a2);var ___atomic_store_2=Module["___atomic_store_2"]=(a0,a1,a2)=>(___atomic_store_2=Module["___atomic_store_2"]=wasmExports["__atomic_store_2"])(a0,a1,a2);var ___atomic_store_4=Module["___atomic_store_4"]=(a0,a1,a2)=>(___atomic_store_4=Module["___atomic_store_4"]=wasmExports["__atomic_store_4"])(a0,a1,a2);var ___atomic_store_8=Module["___atomic_store_8"]=(a0,a1,a2)=>(___atomic_store_8=Module["___atomic_store_8"]=wasmExports["__atomic_store_8"])(a0,a1,a2);var ___atomic_store_16=Module["___atomic_store_16"]=(a0,a1,a2,a3)=>(___atomic_store_16=Module["___atomic_store_16"]=wasmExports["__atomic_store_16"])(a0,a1,a2,a3);var ___atomic_exchange_1=Module["___atomic_exchange_1"]=(a0,a1,a2)=>(___atomic_exchange_1=Module["___atomic_exchange_1"]=wasmExports["__atomic_exchange_1"])(a0,a1,a2);var ___atomic_exchange_2=Module["___atomic_exchange_2"]=(a0,a1,a2)=>(___atomic_exchange_2=Module["___atomic_exchange_2"]=wasmExports["__atomic_exchange_2"])(a0,a1,a2);var ___atomic_exchange_4=Module["___atomic_exchange_4"]=(a0,a1,a2)=>(___atomic_exchange_4=Module["___atomic_exchange_4"]=wasmExports["__atomic_exchange_4"])(a0,a1,a2);var ___atomic_exchange_8=Module["___atomic_exchange_8"]=(a0,a1,a2)=>(___atomic_exchange_8=Module["___atomic_exchange_8"]=wasmExports["__atomic_exchange_8"])(a0,a1,a2);var ___atomic_exchange_16=Module["___atomic_exchange_16"]=(a0,a1,a2,a3,a4)=>(___atomic_exchange_16=Module["___atomic_exchange_16"]=wasmExports["__atomic_exchange_16"])(a0,a1,a2,a3,a4);var ___atomic_compare_exchange_1=Module["___atomic_compare_exchange_1"]=(a0,a1,a2,a3,a4)=>(___atomic_compare_exchange_1=Module["___atomic_compare_exchange_1"]=wasmExports["__atomic_compare_exchange_1"])(a0,a1,a2,a3,a4);var ___atomic_compare_exchange_2=Module["___atomic_compare_exchange_2"]=(a0,a1,a2,a3,a4)=>(___atomic_compare_exchange_2=Module["___atomic_compare_exchange_2"]=wasmExports["__atomic_compare_exchange_2"])(a0,a1,a2,a3,a4);var ___atomic_compare_exchange_4=Module["___atomic_compare_exchange_4"]=(a0,a1,a2,a3,a4)=>(___atomic_compare_exchange_4=Module["___atomic_compare_exchange_4"]=wasmExports["__atomic_compare_exchange_4"])(a0,a1,a2,a3,a4);var ___atomic_compare_exchange_8=Module["___atomic_compare_exchange_8"]=(a0,a1,a2,a3,a4)=>(___atomic_compare_exchange_8=Module["___atomic_compare_exchange_8"]=wasmExports["__atomic_compare_exchange_8"])(a0,a1,a2,a3,a4);var ___atomic_compare_exchange_16=Module["___atomic_compare_exchange_16"]=(a0,a1,a2,a3,a4,a5)=>(___atomic_compare_exchange_16=Module["___atomic_compare_exchange_16"]=wasmExports["__atomic_compare_exchange_16"])(a0,a1,a2,a3,a4,a5);var ___atomic_fetch_add_1=Module["___atomic_fetch_add_1"]=(a0,a1,a2)=>(___atomic_fetch_add_1=Module["___atomic_fetch_add_1"]=wasmExports["__atomic_fetch_add_1"])(a0,a1,a2);var ___atomic_fetch_add_2=Module["___atomic_fetch_add_2"]=(a0,a1,a2)=>(___atomic_fetch_add_2=Module["___atomic_fetch_add_2"]=wasmExports["__atomic_fetch_add_2"])(a0,a1,a2);var ___atomic_fetch_add_4=Module["___atomic_fetch_add_4"]=(a0,a1,a2)=>(___atomic_fetch_add_4=Module["___atomic_fetch_add_4"]=wasmExports["__atomic_fetch_add_4"])(a0,a1,a2);var ___atomic_fetch_add_8=Module["___atomic_fetch_add_8"]=(a0,a1,a2)=>(___atomic_fetch_add_8=Module["___atomic_fetch_add_8"]=wasmExports["__atomic_fetch_add_8"])(a0,a1,a2);var ___atomic_fetch_add_16=Module["___atomic_fetch_add_16"]=(a0,a1,a2,a3,a4)=>(___atomic_fetch_add_16=Module["___atomic_fetch_add_16"]=wasmExports["__atomic_fetch_add_16"])(a0,a1,a2,a3,a4);var ___atomic_fetch_sub_1=Module["___atomic_fetch_sub_1"]=(a0,a1,a2)=>(___atomic_fetch_sub_1=Module["___atomic_fetch_sub_1"]=wasmExports["__atomic_fetch_sub_1"])(a0,a1,a2);var ___atomic_fetch_sub_2=Module["___atomic_fetch_sub_2"]=(a0,a1,a2)=>(___atomic_fetch_sub_2=Module["___atomic_fetch_sub_2"]=wasmExports["__atomic_fetch_sub_2"])(a0,a1,a2);var ___atomic_fetch_sub_4=Module["___atomic_fetch_sub_4"]=(a0,a1,a2)=>(___atomic_fetch_sub_4=Module["___atomic_fetch_sub_4"]=wasmExports["__atomic_fetch_sub_4"])(a0,a1,a2);var ___atomic_fetch_sub_8=Module["___atomic_fetch_sub_8"]=(a0,a1,a2)=>(___atomic_fetch_sub_8=Module["___atomic_fetch_sub_8"]=wasmExports["__atomic_fetch_sub_8"])(a0,a1,a2);var ___atomic_fetch_sub_16=Module["___atomic_fetch_sub_16"]=(a0,a1,a2,a3,a4)=>(___atomic_fetch_sub_16=Module["___atomic_fetch_sub_16"]=wasmExports["__atomic_fetch_sub_16"])(a0,a1,a2,a3,a4);var ___atomic_fetch_and_1=Module["___atomic_fetch_and_1"]=(a0,a1,a2)=>(___atomic_fetch_and_1=Module["___atomic_fetch_and_1"]=wasmExports["__atomic_fetch_and_1"])(a0,a1,a2);var ___atomic_fetch_and_2=Module["___atomic_fetch_and_2"]=(a0,a1,a2)=>(___atomic_fetch_and_2=Module["___atomic_fetch_and_2"]=wasmExports["__atomic_fetch_and_2"])(a0,a1,a2);var ___atomic_fetch_and_4=Module["___atomic_fetch_and_4"]=(a0,a1,a2)=>(___atomic_fetch_and_4=Module["___atomic_fetch_and_4"]=wasmExports["__atomic_fetch_and_4"])(a0,a1,a2);var ___atomic_fetch_and_8=Module["___atomic_fetch_and_8"]=(a0,a1,a2)=>(___atomic_fetch_and_8=Module["___atomic_fetch_and_8"]=wasmExports["__atomic_fetch_and_8"])(a0,a1,a2);var ___atomic_fetch_and_16=Module["___atomic_fetch_and_16"]=(a0,a1,a2,a3,a4)=>(___atomic_fetch_and_16=Module["___atomic_fetch_and_16"]=wasmExports["__atomic_fetch_and_16"])(a0,a1,a2,a3,a4);var ___atomic_fetch_or_1=Module["___atomic_fetch_or_1"]=(a0,a1,a2)=>(___atomic_fetch_or_1=Module["___atomic_fetch_or_1"]=wasmExports["__atomic_fetch_or_1"])(a0,a1,a2);var ___atomic_fetch_or_2=Module["___atomic_fetch_or_2"]=(a0,a1,a2)=>(___atomic_fetch_or_2=Module["___atomic_fetch_or_2"]=wasmExports["__atomic_fetch_or_2"])(a0,a1,a2);var ___atomic_fetch_or_4=Module["___atomic_fetch_or_4"]=(a0,a1,a2)=>(___atomic_fetch_or_4=Module["___atomic_fetch_or_4"]=wasmExports["__atomic_fetch_or_4"])(a0,a1,a2);var ___atomic_fetch_or_8=Module["___atomic_fetch_or_8"]=(a0,a1,a2)=>(___atomic_fetch_or_8=Module["___atomic_fetch_or_8"]=wasmExports["__atomic_fetch_or_8"])(a0,a1,a2);var ___atomic_fetch_or_16=Module["___atomic_fetch_or_16"]=(a0,a1,a2,a3,a4)=>(___atomic_fetch_or_16=Module["___atomic_fetch_or_16"]=wasmExports["__atomic_fetch_or_16"])(a0,a1,a2,a3,a4);var ___atomic_fetch_xor_1=Module["___atomic_fetch_xor_1"]=(a0,a1,a2)=>(___atomic_fetch_xor_1=Module["___atomic_fetch_xor_1"]=wasmExports["__atomic_fetch_xor_1"])(a0,a1,a2);var ___atomic_fetch_xor_2=Module["___atomic_fetch_xor_2"]=(a0,a1,a2)=>(___atomic_fetch_xor_2=Module["___atomic_fetch_xor_2"]=wasmExports["__atomic_fetch_xor_2"])(a0,a1,a2);var ___atomic_fetch_xor_4=Module["___atomic_fetch_xor_4"]=(a0,a1,a2)=>(___atomic_fetch_xor_4=Module["___atomic_fetch_xor_4"]=wasmExports["__atomic_fetch_xor_4"])(a0,a1,a2);var ___atomic_fetch_xor_8=Module["___atomic_fetch_xor_8"]=(a0,a1,a2)=>(___atomic_fetch_xor_8=Module["___atomic_fetch_xor_8"]=wasmExports["__atomic_fetch_xor_8"])(a0,a1,a2);var ___atomic_fetch_xor_16=Module["___atomic_fetch_xor_16"]=(a0,a1,a2,a3,a4)=>(___atomic_fetch_xor_16=Module["___atomic_fetch_xor_16"]=wasmExports["__atomic_fetch_xor_16"])(a0,a1,a2,a3,a4);var ___atomic_fetch_nand_1=Module["___atomic_fetch_nand_1"]=(a0,a1,a2)=>(___atomic_fetch_nand_1=Module["___atomic_fetch_nand_1"]=wasmExports["__atomic_fetch_nand_1"])(a0,a1,a2);var ___atomic_fetch_nand_2=Module["___atomic_fetch_nand_2"]=(a0,a1,a2)=>(___atomic_fetch_nand_2=Module["___atomic_fetch_nand_2"]=wasmExports["__atomic_fetch_nand_2"])(a0,a1,a2);var ___atomic_fetch_nand_4=Module["___atomic_fetch_nand_4"]=(a0,a1,a2)=>(___atomic_fetch_nand_4=Module["___atomic_fetch_nand_4"]=wasmExports["__atomic_fetch_nand_4"])(a0,a1,a2);var ___atomic_fetch_nand_8=Module["___atomic_fetch_nand_8"]=(a0,a1,a2)=>(___atomic_fetch_nand_8=Module["___atomic_fetch_nand_8"]=wasmExports["__atomic_fetch_nand_8"])(a0,a1,a2);var ___atomic_fetch_nand_16=Module["___atomic_fetch_nand_16"]=(a0,a1,a2,a3,a4)=>(___atomic_fetch_nand_16=Module["___atomic_fetch_nand_16"]=wasmExports["__atomic_fetch_nand_16"])(a0,a1,a2,a3,a4);var _atomic_flag_clear=Module["_atomic_flag_clear"]=a0=>(_atomic_flag_clear=Module["_atomic_flag_clear"]=wasmExports["atomic_flag_clear"])(a0);var _atomic_flag_clear_explicit=Module["_atomic_flag_clear_explicit"]=(a0,a1)=>(_atomic_flag_clear_explicit=Module["_atomic_flag_clear_explicit"]=wasmExports["atomic_flag_clear_explicit"])(a0,a1);var _atomic_flag_test_and_set=Module["_atomic_flag_test_and_set"]=a0=>(_atomic_flag_test_and_set=Module["_atomic_flag_test_and_set"]=wasmExports["atomic_flag_test_and_set"])(a0);var _atomic_flag_test_and_set_explicit=Module["_atomic_flag_test_and_set_explicit"]=(a0,a1)=>(_atomic_flag_test_and_set_explicit=Module["_atomic_flag_test_and_set_explicit"]=wasmExports["atomic_flag_test_and_set_explicit"])(a0,a1);var _atomic_signal_fence=Module["_atomic_signal_fence"]=a0=>(_atomic_signal_fence=Module["_atomic_signal_fence"]=wasmExports["atomic_signal_fence"])(a0);var _atomic_thread_fence=Module["_atomic_thread_fence"]=a0=>(_atomic_thread_fence=Module["_atomic_thread_fence"]=wasmExports["atomic_thread_fence"])(a0);var ___bswapdi2=Module["___bswapdi2"]=a0=>(___bswapdi2=Module["___bswapdi2"]=wasmExports["__bswapdi2"])(a0);var ___bswapsi2=Module["___bswapsi2"]=a0=>(___bswapsi2=Module["___bswapsi2"]=wasmExports["__bswapsi2"])(a0);var ___clear_cache=Module["___clear_cache"]=(a0,a1)=>(___clear_cache=Module["___clear_cache"]=wasmExports["__clear_cache"])(a0,a1);var ___clzdi2=Module["___clzdi2"]=a0=>(___clzdi2=Module["___clzdi2"]=wasmExports["__clzdi2"])(a0);var ___clzsi2=Module["___clzsi2"]=a0=>(___clzsi2=Module["___clzsi2"]=wasmExports["__clzsi2"])(a0);var ___clzti2=Module["___clzti2"]=(a0,a1)=>(___clzti2=Module["___clzti2"]=wasmExports["__clzti2"])(a0,a1);var ___cmpdi2=Module["___cmpdi2"]=(a0,a1)=>(___cmpdi2=Module["___cmpdi2"]=wasmExports["__cmpdi2"])(a0,a1);var ___cmpti2=Module["___cmpti2"]=(a0,a1,a2,a3)=>(___cmpti2=Module["___cmpti2"]=wasmExports["__cmpti2"])(a0,a1,a2,a3);var ___ledf2=Module["___ledf2"]=(a0,a1)=>(___ledf2=Module["___ledf2"]=wasmExports["__ledf2"])(a0,a1);var ___gedf2=Module["___gedf2"]=(a0,a1)=>(___gedf2=Module["___gedf2"]=wasmExports["__gedf2"])(a0,a1);var ___unorddf2=Module["___unorddf2"]=(a0,a1)=>(___unorddf2=Module["___unorddf2"]=wasmExports["__unorddf2"])(a0,a1);var ___eqdf2=Module["___eqdf2"]=(a0,a1)=>(___eqdf2=Module["___eqdf2"]=wasmExports["__eqdf2"])(a0,a1);var ___ltdf2=Module["___ltdf2"]=(a0,a1)=>(___ltdf2=Module["___ltdf2"]=wasmExports["__ltdf2"])(a0,a1);var ___nedf2=Module["___nedf2"]=(a0,a1)=>(___nedf2=Module["___nedf2"]=wasmExports["__nedf2"])(a0,a1);var ___gtdf2=Module["___gtdf2"]=(a0,a1)=>(___gtdf2=Module["___gtdf2"]=wasmExports["__gtdf2"])(a0,a1);var ___lesf2=Module["___lesf2"]=(a0,a1)=>(___lesf2=Module["___lesf2"]=wasmExports["__lesf2"])(a0,a1);var ___gesf2=Module["___gesf2"]=(a0,a1)=>(___gesf2=Module["___gesf2"]=wasmExports["__gesf2"])(a0,a1);var ___unordsf2=Module["___unordsf2"]=(a0,a1)=>(___unordsf2=Module["___unordsf2"]=wasmExports["__unordsf2"])(a0,a1);var ___eqsf2=Module["___eqsf2"]=(a0,a1)=>(___eqsf2=Module["___eqsf2"]=wasmExports["__eqsf2"])(a0,a1);var ___ltsf2=Module["___ltsf2"]=(a0,a1)=>(___ltsf2=Module["___ltsf2"]=wasmExports["__ltsf2"])(a0,a1);var ___nesf2=Module["___nesf2"]=(a0,a1)=>(___nesf2=Module["___nesf2"]=wasmExports["__nesf2"])(a0,a1);var ___gtsf2=Module["___gtsf2"]=(a0,a1)=>(___gtsf2=Module["___gtsf2"]=wasmExports["__gtsf2"])(a0,a1);var ___ctzdi2=Module["___ctzdi2"]=a0=>(___ctzdi2=Module["___ctzdi2"]=wasmExports["__ctzdi2"])(a0);var ___ctzsi2=Module["___ctzsi2"]=a0=>(___ctzsi2=Module["___ctzsi2"]=wasmExports["__ctzsi2"])(a0);var ___ctzti2=Module["___ctzti2"]=(a0,a1)=>(___ctzti2=Module["___ctzti2"]=wasmExports["__ctzti2"])(a0,a1);var ___divdc3=Module["___divdc3"]=(a0,a1,a2,a3,a4)=>(___divdc3=Module["___divdc3"]=wasmExports["__divdc3"])(a0,a1,a2,a3,a4);var ___divdf3=Module["___divdf3"]=(a0,a1)=>(___divdf3=Module["___divdf3"]=wasmExports["__divdf3"])(a0,a1);var ___divdi3=Module["___divdi3"]=(a0,a1)=>(___divdi3=Module["___divdi3"]=wasmExports["__divdi3"])(a0,a1);var ___udivmoddi4=Module["___udivmoddi4"]=(a0,a1,a2)=>(___udivmoddi4=Module["___udivmoddi4"]=wasmExports["__udivmoddi4"])(a0,a1,a2);var ___divmoddi4=Module["___divmoddi4"]=(a0,a1,a2)=>(___divmoddi4=Module["___divmoddi4"]=wasmExports["__divmoddi4"])(a0,a1,a2);var ___divmodsi4=Module["___divmodsi4"]=(a0,a1,a2)=>(___divmodsi4=Module["___divmodsi4"]=wasmExports["__divmodsi4"])(a0,a1,a2);var ___udivmodsi4=Module["___udivmodsi4"]=(a0,a1,a2)=>(___udivmodsi4=Module["___udivmodsi4"]=wasmExports["__udivmodsi4"])(a0,a1,a2);var ___divmodti4=Module["___divmodti4"]=(a0,a1,a2,a3,a4,a5)=>(___divmodti4=Module["___divmodti4"]=wasmExports["__divmodti4"])(a0,a1,a2,a3,a4,a5);var ___udivmodti4=Module["___udivmodti4"]=(a0,a1,a2,a3,a4,a5)=>(___udivmodti4=Module["___udivmodti4"]=wasmExports["__udivmodti4"])(a0,a1,a2,a3,a4,a5);var ___divsc3=Module["___divsc3"]=(a0,a1,a2,a3,a4)=>(___divsc3=Module["___divsc3"]=wasmExports["__divsc3"])(a0,a1,a2,a3,a4);var ___divsf3=Module["___divsf3"]=(a0,a1)=>(___divsf3=Module["___divsf3"]=wasmExports["__divsf3"])(a0,a1);var ___divsi3=Module["___divsi3"]=(a0,a1)=>(___divsi3=Module["___divsi3"]=wasmExports["__divsi3"])(a0,a1);var ___divtc3=Module["___divtc3"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(___divtc3=Module["___divtc3"]=wasmExports["__divtc3"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var ___divti3=Module["___divti3"]=(a0,a1,a2,a3,a4)=>(___divti3=Module["___divti3"]=wasmExports["__divti3"])(a0,a1,a2,a3,a4);var _setThrew=(a0,a1)=>(_setThrew=wasmExports["setThrew"])(a0,a1);var ___wasm_setjmp=Module["___wasm_setjmp"]=(a0,a1,a2)=>(___wasm_setjmp=Module["___wasm_setjmp"]=wasmExports["__wasm_setjmp"])(a0,a1,a2);var ___wasm_setjmp_test=Module["___wasm_setjmp_test"]=(a0,a1)=>(___wasm_setjmp_test=Module["___wasm_setjmp_test"]=wasmExports["__wasm_setjmp_test"])(a0,a1);var _emscripten_longjmp=Module["_emscripten_longjmp"]=(a0,a1)=>(_emscripten_longjmp=Module["_emscripten_longjmp"]=wasmExports["emscripten_longjmp"])(a0,a1);var __emscripten_tempret_set=a0=>(__emscripten_tempret_set=wasmExports["_emscripten_tempret_set"])(a0);var __emscripten_tempret_get=()=>(__emscripten_tempret_get=wasmExports["_emscripten_tempret_get"])();var ___get_temp_ret=Module["___get_temp_ret"]=()=>(___get_temp_ret=Module["___get_temp_ret"]=wasmExports["__get_temp_ret"])();var ___set_temp_ret=Module["___set_temp_ret"]=a0=>(___set_temp_ret=Module["___set_temp_ret"]=wasmExports["__set_temp_ret"])(a0);var _getTempRet0=Module["_getTempRet0"]=()=>(_getTempRet0=Module["_getTempRet0"]=wasmExports["getTempRet0"])();var _setTempRet0=Module["_setTempRet0"]=a0=>(_setTempRet0=Module["_setTempRet0"]=wasmExports["setTempRet0"])(a0);var ___emutls_get_address=Module["___emutls_get_address"]=a0=>(___emutls_get_address=Module["___emutls_get_address"]=wasmExports["__emutls_get_address"])(a0);var ___enable_execute_stack=Module["___enable_execute_stack"]=a0=>(___enable_execute_stack=Module["___enable_execute_stack"]=wasmExports["__enable_execute_stack"])(a0);var ___extendhfsf2=Module["___extendhfsf2"]=a0=>(___extendhfsf2=Module["___extendhfsf2"]=wasmExports["__extendhfsf2"])(a0);var ___gnu_h2f_ieee=Module["___gnu_h2f_ieee"]=a0=>(___gnu_h2f_ieee=Module["___gnu_h2f_ieee"]=wasmExports["__gnu_h2f_ieee"])(a0);var ___extendsfdf2=Module["___extendsfdf2"]=a0=>(___extendsfdf2=Module["___extendsfdf2"]=wasmExports["__extendsfdf2"])(a0);var ___ffsdi2=Module["___ffsdi2"]=a0=>(___ffsdi2=Module["___ffsdi2"]=wasmExports["__ffsdi2"])(a0);var ___ffssi2=Module["___ffssi2"]=a0=>(___ffssi2=Module["___ffssi2"]=wasmExports["__ffssi2"])(a0);var ___ffsti2=Module["___ffsti2"]=(a0,a1)=>(___ffsti2=Module["___ffsti2"]=wasmExports["__ffsti2"])(a0,a1);var ___fixdfdi=Module["___fixdfdi"]=a0=>(___fixdfdi=Module["___fixdfdi"]=wasmExports["__fixdfdi"])(a0);var ___fixunsdfdi=Module["___fixunsdfdi"]=a0=>(___fixunsdfdi=Module["___fixunsdfdi"]=wasmExports["__fixunsdfdi"])(a0);var ___fixdfsi=Module["___fixdfsi"]=a0=>(___fixdfsi=Module["___fixdfsi"]=wasmExports["__fixdfsi"])(a0);var ___fixdfti=Module["___fixdfti"]=(a0,a1)=>(___fixdfti=Module["___fixdfti"]=wasmExports["__fixdfti"])(a0,a1);var ___fixsfdi=Module["___fixsfdi"]=a0=>(___fixsfdi=Module["___fixsfdi"]=wasmExports["__fixsfdi"])(a0);var ___fixunssfdi=Module["___fixunssfdi"]=a0=>(___fixunssfdi=Module["___fixunssfdi"]=wasmExports["__fixunssfdi"])(a0);var ___fixsfsi=Module["___fixsfsi"]=a0=>(___fixsfsi=Module["___fixsfsi"]=wasmExports["__fixsfsi"])(a0);var ___fixsfti=Module["___fixsfti"]=(a0,a1)=>(___fixsfti=Module["___fixsfti"]=wasmExports["__fixsfti"])(a0,a1);var ___fixtfti=Module["___fixtfti"]=(a0,a1,a2)=>(___fixtfti=Module["___fixtfti"]=wasmExports["__fixtfti"])(a0,a1,a2);var ___fixunsdfsi=Module["___fixunsdfsi"]=a0=>(___fixunsdfsi=Module["___fixunsdfsi"]=wasmExports["__fixunsdfsi"])(a0);var ___fixunsdfti=Module["___fixunsdfti"]=(a0,a1)=>(___fixunsdfti=Module["___fixunsdfti"]=wasmExports["__fixunsdfti"])(a0,a1);var ___fixunssfsi=Module["___fixunssfsi"]=a0=>(___fixunssfsi=Module["___fixunssfsi"]=wasmExports["__fixunssfsi"])(a0);var ___fixunssfti=Module["___fixunssfti"]=(a0,a1)=>(___fixunssfti=Module["___fixunssfti"]=wasmExports["__fixunssfti"])(a0,a1);var ___fixunstfdi=Module["___fixunstfdi"]=(a0,a1)=>(___fixunstfdi=Module["___fixunstfdi"]=wasmExports["__fixunstfdi"])(a0,a1);var ___fixunstfsi=Module["___fixunstfsi"]=(a0,a1)=>(___fixunstfsi=Module["___fixunstfsi"]=wasmExports["__fixunstfsi"])(a0,a1);var ___fixunstfti=Module["___fixunstfti"]=(a0,a1,a2)=>(___fixunstfti=Module["___fixunstfti"]=wasmExports["__fixunstfti"])(a0,a1,a2);var ___floatdidf=Module["___floatdidf"]=a0=>(___floatdidf=Module["___floatdidf"]=wasmExports["__floatdidf"])(a0);var ___floatdisf=Module["___floatdisf"]=a0=>(___floatdisf=Module["___floatdisf"]=wasmExports["__floatdisf"])(a0);var ___floatditf=Module["___floatditf"]=(a0,a1)=>(___floatditf=Module["___floatditf"]=wasmExports["__floatditf"])(a0,a1);var ___floatsidf=Module["___floatsidf"]=a0=>(___floatsidf=Module["___floatsidf"]=wasmExports["__floatsidf"])(a0);var ___floatsisf=Module["___floatsisf"]=a0=>(___floatsisf=Module["___floatsisf"]=wasmExports["__floatsisf"])(a0);var ___floattidf=Module["___floattidf"]=(a0,a1)=>(___floattidf=Module["___floattidf"]=wasmExports["__floattidf"])(a0,a1);var ___floattisf=Module["___floattisf"]=(a0,a1)=>(___floattisf=Module["___floattisf"]=wasmExports["__floattisf"])(a0,a1);var ___floattitf=Module["___floattitf"]=(a0,a1,a2)=>(___floattitf=Module["___floattitf"]=wasmExports["__floattitf"])(a0,a1,a2);var ___floatundidf=Module["___floatundidf"]=a0=>(___floatundidf=Module["___floatundidf"]=wasmExports["__floatundidf"])(a0);var ___floatundisf=Module["___floatundisf"]=a0=>(___floatundisf=Module["___floatundisf"]=wasmExports["__floatundisf"])(a0);var ___floatunditf=Module["___floatunditf"]=(a0,a1)=>(___floatunditf=Module["___floatunditf"]=wasmExports["__floatunditf"])(a0,a1);var ___floatunsidf=Module["___floatunsidf"]=a0=>(___floatunsidf=Module["___floatunsidf"]=wasmExports["__floatunsidf"])(a0);var ___floatunsisf=Module["___floatunsisf"]=a0=>(___floatunsisf=Module["___floatunsisf"]=wasmExports["__floatunsisf"])(a0);var ___floatuntidf=Module["___floatuntidf"]=(a0,a1)=>(___floatuntidf=Module["___floatuntidf"]=wasmExports["__floatuntidf"])(a0,a1);var ___floatuntisf=Module["___floatuntisf"]=(a0,a1)=>(___floatuntisf=Module["___floatuntisf"]=wasmExports["__floatuntisf"])(a0,a1);var ___floatuntitf=Module["___floatuntitf"]=(a0,a1,a2)=>(___floatuntitf=Module["___floatuntitf"]=wasmExports["__floatuntitf"])(a0,a1,a2);var ___lshrdi3=Module["___lshrdi3"]=(a0,a1)=>(___lshrdi3=Module["___lshrdi3"]=wasmExports["__lshrdi3"])(a0,a1);var ___moddi3=Module["___moddi3"]=(a0,a1)=>(___moddi3=Module["___moddi3"]=wasmExports["__moddi3"])(a0,a1);var ___modsi3=Module["___modsi3"]=(a0,a1)=>(___modsi3=Module["___modsi3"]=wasmExports["__modsi3"])(a0,a1);var ___modti3=Module["___modti3"]=(a0,a1,a2,a3,a4)=>(___modti3=Module["___modti3"]=wasmExports["__modti3"])(a0,a1,a2,a3,a4);var ___muldf3=Module["___muldf3"]=(a0,a1)=>(___muldf3=Module["___muldf3"]=wasmExports["__muldf3"])(a0,a1);var ___muldi3=Module["___muldi3"]=(a0,a1)=>(___muldi3=Module["___muldi3"]=wasmExports["__muldi3"])(a0,a1);var ___mulodi4=Module["___mulodi4"]=(a0,a1,a2)=>(___mulodi4=Module["___mulodi4"]=wasmExports["__mulodi4"])(a0,a1,a2);var ___mulosi4=Module["___mulosi4"]=(a0,a1,a2)=>(___mulosi4=Module["___mulosi4"]=wasmExports["__mulosi4"])(a0,a1,a2);var ___muloti4=Module["___muloti4"]=(a0,a1,a2,a3,a4,a5)=>(___muloti4=Module["___muloti4"]=wasmExports["__muloti4"])(a0,a1,a2,a3,a4,a5);var ___udivti3=Module["___udivti3"]=(a0,a1,a2,a3,a4)=>(___udivti3=Module["___udivti3"]=wasmExports["__udivti3"])(a0,a1,a2,a3,a4);var ___mulsf3=Module["___mulsf3"]=(a0,a1)=>(___mulsf3=Module["___mulsf3"]=wasmExports["__mulsf3"])(a0,a1);var ___mulvdi3=Module["___mulvdi3"]=(a0,a1)=>(___mulvdi3=Module["___mulvdi3"]=wasmExports["__mulvdi3"])(a0,a1);var ___mulvsi3=Module["___mulvsi3"]=(a0,a1)=>(___mulvsi3=Module["___mulvsi3"]=wasmExports["__mulvsi3"])(a0,a1);var ___mulvti3=Module["___mulvti3"]=(a0,a1,a2,a3,a4)=>(___mulvti3=Module["___mulvti3"]=wasmExports["__mulvti3"])(a0,a1,a2,a3,a4);var ___negdf2=Module["___negdf2"]=a0=>(___negdf2=Module["___negdf2"]=wasmExports["__negdf2"])(a0);var ___negdi2=Module["___negdi2"]=a0=>(___negdi2=Module["___negdi2"]=wasmExports["__negdi2"])(a0);var ___negsf2=Module["___negsf2"]=a0=>(___negsf2=Module["___negsf2"]=wasmExports["__negsf2"])(a0);var ___negti2=Module["___negti2"]=(a0,a1,a2)=>(___negti2=Module["___negti2"]=wasmExports["__negti2"])(a0,a1,a2);var ___negvdi2=Module["___negvdi2"]=a0=>(___negvdi2=Module["___negvdi2"]=wasmExports["__negvdi2"])(a0);var ___negvsi2=Module["___negvsi2"]=a0=>(___negvsi2=Module["___negvsi2"]=wasmExports["__negvsi2"])(a0);var ___negvti2=Module["___negvti2"]=(a0,a1,a2)=>(___negvti2=Module["___negvti2"]=wasmExports["__negvti2"])(a0,a1,a2);var ___paritydi2=Module["___paritydi2"]=a0=>(___paritydi2=Module["___paritydi2"]=wasmExports["__paritydi2"])(a0);var ___paritysi2=Module["___paritysi2"]=a0=>(___paritysi2=Module["___paritysi2"]=wasmExports["__paritysi2"])(a0);var ___parityti2=Module["___parityti2"]=(a0,a1)=>(___parityti2=Module["___parityti2"]=wasmExports["__parityti2"])(a0,a1);var ___popcountdi2=Module["___popcountdi2"]=a0=>(___popcountdi2=Module["___popcountdi2"]=wasmExports["__popcountdi2"])(a0);var ___popcountsi2=Module["___popcountsi2"]=a0=>(___popcountsi2=Module["___popcountsi2"]=wasmExports["__popcountsi2"])(a0);var ___popcountti2=Module["___popcountti2"]=(a0,a1)=>(___popcountti2=Module["___popcountti2"]=wasmExports["__popcountti2"])(a0,a1);var ___powidf2=Module["___powidf2"]=(a0,a1)=>(___powidf2=Module["___powidf2"]=wasmExports["__powidf2"])(a0,a1);var ___powisf2=Module["___powisf2"]=(a0,a1)=>(___powisf2=Module["___powisf2"]=wasmExports["__powisf2"])(a0,a1);var ___powitf2=Module["___powitf2"]=(a0,a1,a2,a3)=>(___powitf2=Module["___powitf2"]=wasmExports["__powitf2"])(a0,a1,a2,a3);var _emscripten_stack_init=Module["_emscripten_stack_init"]=()=>(_emscripten_stack_init=Module["_emscripten_stack_init"]=wasmExports["emscripten_stack_init"])();var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=(a0,a1)=>(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=wasmExports["emscripten_stack_set_limits"])(a0,a1);var _emscripten_stack_get_free=Module["_emscripten_stack_get_free"]=()=>(_emscripten_stack_get_free=Module["_emscripten_stack_get_free"]=wasmExports["emscripten_stack_get_free"])();var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"])(a0);var ___subdf3=Module["___subdf3"]=(a0,a1)=>(___subdf3=Module["___subdf3"]=wasmExports["__subdf3"])(a0,a1);var ___subsf3=Module["___subsf3"]=(a0,a1)=>(___subsf3=Module["___subsf3"]=wasmExports["__subsf3"])(a0,a1);var ___subvdi3=Module["___subvdi3"]=(a0,a1)=>(___subvdi3=Module["___subvdi3"]=wasmExports["__subvdi3"])(a0,a1);var ___subvsi3=Module["___subvsi3"]=(a0,a1)=>(___subvsi3=Module["___subvsi3"]=wasmExports["__subvsi3"])(a0,a1);var ___subvti3=Module["___subvti3"]=(a0,a1,a2,a3,a4)=>(___subvti3=Module["___subvti3"]=wasmExports["__subvti3"])(a0,a1,a2,a3,a4);var ___truncdfhf2=Module["___truncdfhf2"]=a0=>(___truncdfhf2=Module["___truncdfhf2"]=wasmExports["__truncdfhf2"])(a0);var ___truncdfsf2=Module["___truncdfsf2"]=a0=>(___truncdfsf2=Module["___truncdfsf2"]=wasmExports["__truncdfsf2"])(a0);var ___truncsfhf2=Module["___truncsfhf2"]=a0=>(___truncsfhf2=Module["___truncsfhf2"]=wasmExports["__truncsfhf2"])(a0);var ___gnu_f2h_ieee=Module["___gnu_f2h_ieee"]=a0=>(___gnu_f2h_ieee=Module["___gnu_f2h_ieee"]=wasmExports["__gnu_f2h_ieee"])(a0);var ___ucmpdi2=Module["___ucmpdi2"]=(a0,a1)=>(___ucmpdi2=Module["___ucmpdi2"]=wasmExports["__ucmpdi2"])(a0,a1);var ___ucmpti2=Module["___ucmpti2"]=(a0,a1,a2,a3)=>(___ucmpti2=Module["___ucmpti2"]=wasmExports["__ucmpti2"])(a0,a1,a2,a3);var ___udivdi3=Module["___udivdi3"]=(a0,a1)=>(___udivdi3=Module["___udivdi3"]=wasmExports["__udivdi3"])(a0,a1);var ___udivsi3=Module["___udivsi3"]=(a0,a1)=>(___udivsi3=Module["___udivsi3"]=wasmExports["__udivsi3"])(a0,a1);var ___umoddi3=Module["___umoddi3"]=(a0,a1)=>(___umoddi3=Module["___umoddi3"]=wasmExports["__umoddi3"])(a0,a1);var ___umodsi3=Module["___umodsi3"]=(a0,a1)=>(___umodsi3=Module["___umodsi3"]=wasmExports["__umodsi3"])(a0,a1);var ___umodti3=Module["___umodti3"]=(a0,a1,a2,a3,a4)=>(___umodti3=Module["___umodti3"]=wasmExports["__umodti3"])(a0,a1,a2,a3,a4);var ___cxa_allocate_exception=Module["___cxa_allocate_exception"]=a0=>(___cxa_allocate_exception=Module["___cxa_allocate_exception"]=wasmExports["__cxa_allocate_exception"])(a0);var ___cxa_free_exception=a0=>(___cxa_free_exception=wasmExports["__cxa_free_exception"])(a0);var ___cxa_pure_virtual=Module["___cxa_pure_virtual"]=()=>(___cxa_pure_virtual=Module["___cxa_pure_virtual"]=wasmExports["__cxa_pure_virtual"])();var ___cxa_decrement_exception_refcount=a0=>(___cxa_decrement_exception_refcount=wasmExports["__cxa_decrement_exception_refcount"])(a0);var ___cxa_increment_exception_refcount=a0=>(___cxa_increment_exception_refcount=wasmExports["__cxa_increment_exception_refcount"])(a0);var ___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=(a0,a1,a2)=>(___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=wasmExports["__cxa_init_primary_exception"])(a0,a1,a2);var ___dynamic_cast=Module["___dynamic_cast"]=(a0,a1,a2,a3)=>(___dynamic_cast=Module["___dynamic_cast"]=wasmExports["__dynamic_cast"])(a0,a1,a2,a3);var ___cxa_bad_cast=Module["___cxa_bad_cast"]=()=>(___cxa_bad_cast=Module["___cxa_bad_cast"]=wasmExports["__cxa_bad_cast"])();var ___cxa_bad_typeid=Module["___cxa_bad_typeid"]=()=>(___cxa_bad_typeid=Module["___cxa_bad_typeid"]=wasmExports["__cxa_bad_typeid"])();var ___cxa_throw_bad_array_new_length=Module["___cxa_throw_bad_array_new_length"]=()=>(___cxa_throw_bad_array_new_length=Module["___cxa_throw_bad_array_new_length"]=wasmExports["__cxa_throw_bad_array_new_length"])();var ___cxa_demangle=(a0,a1,a2,a3)=>(___cxa_demangle=wasmExports["__cxa_demangle"])(a0,a1,a2,a3);var ___gxx_personality_v0=Module["___gxx_personality_v0"]=(a0,a1,a2,a3,a4)=>(___gxx_personality_v0=Module["___gxx_personality_v0"]=wasmExports["__gxx_personality_v0"])(a0,a1,a2,a3,a4);var ___thrown_object_from_unwind_exception=Module["___thrown_object_from_unwind_exception"]=a0=>(___thrown_object_from_unwind_exception=Module["___thrown_object_from_unwind_exception"]=wasmExports["__thrown_object_from_unwind_exception"])(a0);var ___get_exception_message=(a0,a1,a2)=>(___get_exception_message=wasmExports["__get_exception_message"])(a0,a1,a2);var ___get_exception_terminate_message=Module["___get_exception_terminate_message"]=a0=>(___get_exception_terminate_message=Module["___get_exception_terminate_message"]=wasmExports["__get_exception_terminate_message"])(a0);var ___cxa_guard_acquire=Module["___cxa_guard_acquire"]=a0=>(___cxa_guard_acquire=Module["___cxa_guard_acquire"]=wasmExports["__cxa_guard_acquire"])(a0);var ___cxa_guard_release=Module["___cxa_guard_release"]=a0=>(___cxa_guard_release=Module["___cxa_guard_release"]=wasmExports["__cxa_guard_release"])(a0);var ___cxa_guard_abort=Module["___cxa_guard_abort"]=a0=>(___cxa_guard_abort=Module["___cxa_guard_abort"]=wasmExports["__cxa_guard_abort"])(a0);var ___cxa_thread_atexit=Module["___cxa_thread_atexit"]=(a0,a1,a2)=>(___cxa_thread_atexit=Module["___cxa_thread_atexit"]=wasmExports["__cxa_thread_atexit"])(a0,a1,a2);var ___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=()=>(___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=wasmExports["__cxa_deleted_virtual"])();var ___cxa_can_catch=(a0,a1,a2)=>(___cxa_can_catch=wasmExports["__cxa_can_catch"])(a0,a1,a2);var ___cxa_is_pointer_type=a0=>(___cxa_is_pointer_type=wasmExports["__cxa_is_pointer_type"])(a0);var _gethostbyaddr_r=Module["_gethostbyaddr_r"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_gethostbyaddr_r=Module["_gethostbyaddr_r"]=wasmExports["gethostbyaddr_r"])(a0,a1,a2,a3,a4,a5,a6,a7);var _gethostbyname2=Module["_gethostbyname2"]=(a0,a1)=>(_gethostbyname2=Module["_gethostbyname2"]=wasmExports["gethostbyname2"])(a0,a1);var _gethostbyname2_r=Module["_gethostbyname2_r"]=(a0,a1,a2,a3,a4,a5,a6)=>(_gethostbyname2_r=Module["_gethostbyname2_r"]=wasmExports["gethostbyname2_r"])(a0,a1,a2,a3,a4,a5,a6);var _gethostbyname_r=Module["_gethostbyname_r"]=(a0,a1,a2,a3,a4,a5)=>(_gethostbyname_r=Module["_gethostbyname_r"]=wasmExports["gethostbyname_r"])(a0,a1,a2,a3,a4,a5);var _shutdown=Module["_shutdown"]=(a0,a1)=>(_shutdown=Module["_shutdown"]=wasmExports["shutdown"])(a0,a1);var _socketpair=Module["_socketpair"]=(a0,a1,a2,a3)=>(_socketpair=Module["_socketpair"]=wasmExports["socketpair"])(a0,a1,a2,a3);var _py_docstring_mod=Module["_py_docstring_mod"]=4579904;var _PyExc_AttributeError=Module["_PyExc_AttributeError"]=3194552;var _stdout=Module["_stdout"]=4429104;var _PyExc_ModuleNotFoundError=Module["_PyExc_ModuleNotFoundError"]=3189676;var __Py_NoneStruct=Module["__Py_NoneStruct"]=3221384;var _internal_error=Module["_internal_error"]=4579912;var _conversion_error=Module["_conversion_error"]=4579916;var _PyExc_ImportError=Module["_PyExc_ImportError"]=3189464;var _pyodide_export_=Module["_pyodide_export_"]=3171360;var _py_version_major_=Module["_py_version_major_"]=3171364;var _set_new_cframe_=Module["_set_new_cframe_"]=3171368;var __Py_TrueStruct=Module["__Py_TrueStruct"]=3175940;var __Py_FalseStruct=Module["__Py_FalseStruct"]=3175956;var _jsbind=Module["_jsbind"]=4579972;var _PyExc_TypeError=Module["_PyExc_TypeError"]=3187976;var _Jsr_undefined=Module["_Jsr_undefined"]=255184;var _PyExc_StopIteration=Module["_PyExc_StopIteration"]=3188400;var _PyTraceBack_Type=Module["_PyTraceBack_Type"]=3722844;var _PyExc_GeneratorExit=Module["_PyExc_GeneratorExit"]=3188612;var _PyExc_StopAsyncIteration=Module["_PyExc_StopAsyncIteration"]=3188188;var _PyExc_RuntimeError=Module["_PyExc_RuntimeError"]=3193492;var _PyExc_Exception=Module["_PyExc_Exception"]=3187764;var _PyExc_BaseException=Module["_PyExc_BaseException"]=3187552;var _methods=Module["_methods"]=3172592;var _PyExc_SystemError=Module["_PyExc_SystemError"]=3198152;var _PyExc_KeyError=Module["_PyExc_KeyError"]=3195824;var _PyExc_IndexError=Module["_PyExc_IndexError"]=3195612;var _PySlice_Type=Module["_PySlice_Type"]=3226288;var _PyLong_Type=Module["_PyLong_Type"]=3211952;var _PyBool_Type=Module["_PyBool_Type"]=3176116;var _PyExc_ValueError=Module["_PyExc_ValueError"]=3188832;var _PyExc_NotImplementedError=Module["_PyExc_NotImplementedError"]=3193916;var _PyBaseObject_Type=Module["_PyBaseObject_Type"]=3228312;var _PyExc_OverflowError=Module["_PyExc_OverflowError"]=3197728;var _PyList_Type=Module["_PyList_Type"]=3210800;var _PyTuple_Type=Module["_PyTuple_Type"]=3226640;var __Py_NotImplementedStruct=Module["__Py_NotImplementedStruct"]=3222160;var _default_signature=Module["_default_signature"]=4579980;var _no_default=Module["_no_default"]=4579976;var _PyCoro_Type=Module["_PyCoro_Type"]=3204784;var _PyGen_Type=Module["_PyGen_Type"]=3204576;var _PyDict_Type=Module["_PyDict_Type"]=3213240;var _compat_to_string_repr=Module["_compat_to_string_repr"]=4579996;var _PyMethod_Type=Module["_PyMethod_Type"]=3181048;var _PyFunction_Type=Module["_PyFunction_Type"]=3208300;var _py_buffer_len_offset=Module["_py_buffer_len_offset"]=3174680;var _py_buffer_shape_offset=Module["_py_buffer_shape_offset"]=3174684;var _Jsr_true=Module["_Jsr_true"]=255188;var _Jsr_false=Module["_Jsr_false"]=255192;var _Jsr_novalue=Module["_Jsr_novalue"]=255196;var _PySet_Type=Module["_PySet_Type"]=3224912;var _PyFloat_Type=Module["_PyFloat_Type"]=3207040;var _threadstate_freelist_len=Module["_threadstate_freelist_len"]=4580072;var _threadstate_freelist=Module["_threadstate_freelist"]=4580032;var _size_of_cframe=Module["_size_of_cframe"]=3175244;var __PyParser_TokenNames=Module["__PyParser_TokenNames"]=3175248;var _PyExc_SyntaxError=Module["_PyExc_SyntaxError"]=3194764;var _PyExc_LookupError=Module["_PyExc_LookupError"]=3195400;var _PyExc_UnicodeDecodeError=Module["_PyExc_UnicodeDecodeError"]=3196668;var _PyExc_IndentationError=Module["_PyExc_IndentationError"]=3194976;var _PyExc_KeyboardInterrupt=Module["_PyExc_KeyboardInterrupt"]=3189252;var _PyExc_TabError=Module["_PyExc_TabError"]=3195188;var _PyExc_UnicodeError=Module["_PyExc_UnicodeError"]=3196244;var _stdin=Module["_stdin"]=4428952;var _PyExc_MemoryError=Module["_PyExc_MemoryError"]=3198368;var __PyRuntime=Module["__PyRuntime"]=3248360;var _PyComplex_Type=Module["_PyComplex_Type"]=3183164;var _PyBytes_Type=Module["_PyBytes_Type"]=3178520;var _PyUnicode_Type=Module["_PyUnicode_Type"]=3234880;var __Py_EllipsisObject=Module["__Py_EllipsisObject"]=3226144;var __Py_ctype_table=Module["__Py_ctype_table"]=456608;var _PyExc_DeprecationWarning=Module["_PyExc_DeprecationWarning"]=3199424;var _PyExc_SyntaxWarning=Module["_PyExc_SyntaxWarning"]=3199848;var __PyOS_ReadlineTState=Module["__PyOS_ReadlineTState"]=4580132;var _stderr=Module["_stderr"]=4428800;var _PyOS_InputHook=Module["_PyOS_InputHook"]=4580136;var _PyOS_ReadlineFunctionPointer=Module["_PyOS_ReadlineFunctionPointer"]=4580140;var _PyExc_OSError=Module["_PyExc_OSError"]=3189888;var _PyType_Type=Module["_PyType_Type"]=3227264;var _PyExc_BufferError=Module["_PyExc_BufferError"]=3198788;var _PyCFunction_Type=Module["_PyCFunction_Type"]=3220052;var _PyByteArray_Type=Module["_PyByteArray_Type"]=3176324;var __PyByteArray_empty_string=Module["__PyByteArray_empty_string"]=4580148;var __Py_ctype_tolower=Module["__Py_ctype_tolower"]=457632;var __Py_ctype_toupper=Module["__Py_ctype_toupper"]=457888;var _Py_hexdigits=Module["_Py_hexdigits"]=3243880;var _PyExc_BytesWarning=Module["_PyExc_BytesWarning"]=3200908;var _PyByteArrayIter_Type=Module["_PyByteArrayIter_Type"]=3177680;var __PyLong_DigitValue=Module["__PyLong_DigitValue"]=3212160;var _PyBytesIter_Type=Module["_PyBytesIter_Type"]=3179728;var _PyModule_Type=Module["_PyModule_Type"]=3220680;var _PyCapsule_Type=Module["_PyCapsule_Type"]=3180592;var _PyCell_Type=Module["_PyCell_Type"]=3180800;var _PyInstanceMethod_Type=Module["_PyInstanceMethod_Type"]=3181400;var _PyCode_Type=Module["_PyCode_Type"]=3181704;var _PyFrozenSet_Type=Module["_PyFrozenSet_Type"]=3225472;var _PyExc_ZeroDivisionError=Module["_PyExc_ZeroDivisionError"]=3197940;var __PyMethodWrapper_Type=Module["__PyMethodWrapper_Type"]=3185576;var _PyMethodDescr_Type=Module["_PyMethodDescr_Type"]=3183920;var _PyClassMethodDescr_Type=Module["_PyClassMethodDescr_Type"]=3184128;var _PyMemberDescr_Type=Module["_PyMemberDescr_Type"]=3184396;var _PyGetSetDescr_Type=Module["_PyGetSetDescr_Type"]=3184668;var _PyWrapperDescr_Type=Module["_PyWrapperDescr_Type"]=3184960;var _PyDictProxy_Type=Module["_PyDictProxy_Type"]=3185168;var _PyProperty_Type=Module["_PyProperty_Type"]=3186344;var _PyReversed_Type=Module["_PyReversed_Type"]=3187056;var _PyEnum_Type=Module["_PyEnum_Type"]=3186784;var _PyExc_BaseExceptionGroup=Module["_PyExc_BaseExceptionGroup"]=3188828;var _PyExc_UnicodeTranslateError=Module["_PyExc_UnicodeTranslateError"]=3196880;var _PyExc_BlockingIOError=Module["_PyExc_BlockingIOError"]=3190100;var _PyExc_BrokenPipeError=Module["_PyExc_BrokenPipeError"]=3190736;var _PyExc_ChildProcessError=Module["_PyExc_ChildProcessError"]=3190524;var _PyExc_ConnectionAbortedError=Module["_PyExc_ConnectionAbortedError"]=3190948;var _PyExc_ConnectionRefusedError=Module["_PyExc_ConnectionRefusedError"]=3191160;var _PyExc_ConnectionResetError=Module["_PyExc_ConnectionResetError"]=3191372;var _PyExc_FileExistsError=Module["_PyExc_FileExistsError"]=3191584;var _PyExc_FileNotFoundError=Module["_PyExc_FileNotFoundError"]=3191796;var _PyExc_IsADirectoryError=Module["_PyExc_IsADirectoryError"]=3192008;var _PyExc_NotADirectoryError=Module["_PyExc_NotADirectoryError"]=3192220;var _PyExc_InterruptedError=Module["_PyExc_InterruptedError"]=3192432;var _PyExc_PermissionError=Module["_PyExc_PermissionError"]=3192644;var _PyExc_ProcessLookupError=Module["_PyExc_ProcessLookupError"]=3192856;var _PyExc_TimeoutError=Module["_PyExc_TimeoutError"]=3193068;var _PyExc_EnvironmentError=Module["_PyExc_EnvironmentError"]=4580152;var _PyExc_IOError=Module["_PyExc_IOError"]=4580156;var _PyExc_SystemExit=Module["_PyExc_SystemExit"]=3188824;var _PyExc_ConnectionError=Module["_PyExc_ConnectionError"]=3190312;var _PyExc_EOFError=Module["_PyExc_EOFError"]=3193280;var _PyExc_RecursionError=Module["_PyExc_RecursionError"]=3193704;var _PyExc_NameError=Module["_PyExc_NameError"]=3194128;var _PyExc_UnboundLocalError=Module["_PyExc_UnboundLocalError"]=3194340;var _PyExc_UnicodeEncodeError=Module["_PyExc_UnicodeEncodeError"]=3196456;var _PyExc_AssertionError=Module["_PyExc_AssertionError"]=3197092;var _PyExc_ArithmeticError=Module["_PyExc_ArithmeticError"]=3197304;var _PyExc_FloatingPointError=Module["_PyExc_FloatingPointError"]=3197516;var _PyExc_ReferenceError=Module["_PyExc_ReferenceError"]=3198364;var _PyExc_Warning=Module["_PyExc_Warning"]=3199e3;var _PyExc_UserWarning=Module["_PyExc_UserWarning"]=3199212;var _PyExc_PendingDeprecationWarning=Module["_PyExc_PendingDeprecationWarning"]=3199636;var _PyExc_RuntimeWarning=Module["_PyExc_RuntimeWarning"]=3200060;var _PyExc_FutureWarning=Module["_PyExc_FutureWarning"]=3200272;var _PyExc_ImportWarning=Module["_PyExc_ImportWarning"]=3200484;var _PyExc_UnicodeWarning=Module["_PyExc_UnicodeWarning"]=3200696;var _PyExc_EncodingWarning=Module["_PyExc_EncodingWarning"]=3201120;var _PyExc_ResourceWarning=Module["_PyExc_ResourceWarning"]=3201332;var _Py_GenericAliasType=Module["_Py_GenericAliasType"]=3203852;var _PyAsyncGen_Type=Module["_PyAsyncGen_Type"]=3204112;var __PyAsyncGenWrappedValue_Type=Module["__PyAsyncGenWrappedValue_Type"]=3206160;var __PyCoroWrapper_Type=Module["__PyCoroWrapper_Type"]=3205360;var __PyAsyncGenASend_Type=Module["__PyAsyncGenASend_Type"]=3205952;var __PyAsyncGenAThrow_Type=Module["__PyAsyncGenAThrow_Type"]=3206448;var _PyStdPrinter_Type=Module["_PyStdPrinter_Type"]=3206656;var __Py_SwappedOp=Module["__Py_SwappedOp"]=3221392;var _PyFrame_Type=Module["_PyFrame_Type"]=3208072;var _PyClassMethod_Type=Module["_PyClassMethod_Type"]=3208956;var _PyStaticMethod_Type=Module["_PyStaticMethod_Type"]=3209292;var __PyInterpreterID_Type=Module["__PyInterpreterID_Type"]=3209780;var _PySeqIter_Type=Module["_PySeqIter_Type"]=321e4;var _PyCallIter_Type=Module["_PyCallIter_Type"]=3210272;var _PyListIter_Type=Module["_PyListIter_Type"]=3211392;var _PyListRevIter_Type=Module["_PyListRevIter_Type"]=3211664;var _PyDictIterKey_Type=Module["_PyDictIterKey_Type"]=3213968;var _PyDictRevIterKey_Type=Module["_PyDictRevIterKey_Type"]=3214592;var _PyDictRevIterValue_Type=Module["_PyDictRevIterValue_Type"]=3215008;var _PyDictKeys_Type=Module["_PyDictKeys_Type"]=3215216;var _PyDictItems_Type=Module["_PyDictItems_Type"]=3215424;var _PyDictIterItem_Type=Module["_PyDictIterItem_Type"]=3214384;var _PyDictIterValue_Type=Module["_PyDictIterValue_Type"]=3214176;var _PyDictRevIterItem_Type=Module["_PyDictRevIterItem_Type"]=3214800;var _PyDictValues_Type=Module["_PyDictValues_Type"]=3216080;var _PyODict_Type=Module["_PyODict_Type"]=3216776;var _PyODictIter_Type=Module["_PyODictIter_Type"]=3217024;var _PyODictKeys_Type=Module["_PyODictKeys_Type"]=3217264;var _PyODictValues_Type=Module["_PyODictValues_Type"]=3217744;var _PyODictItems_Type=Module["_PyODictItems_Type"]=3217504;var __PyManagedBuffer_Type=Module["__PyManagedBuffer_Type"]=3218344;var _PyMemoryView_Type=Module["_PyMemoryView_Type"]=3219252;var _PyCMethod_Type=Module["_PyCMethod_Type"]=3219844;var _PyModuleDef_Type=Module["_PyModuleDef_Type"]=3220472;var __PyNamespace_Type=Module["__PyNamespace_Type"]=3221176;var __PyNone_Type=Module["__PyNone_Type"]=3221560;var __PyNotImplemented_Type=Module["__PyNotImplemented_Type"]=3221952;var _PyContextToken_Type=Module["_PyContextToken_Type"]=3244464;var _PyContextVar_Type=Module["_PyContextVar_Type"]=3244256;var _PyContext_Type=Module["_PyContext_Type"]=3244048;var _PyEllipsis_Type=Module["_PyEllipsis_Type"]=3225936;var _PyFilter_Type=Module["_PyFilter_Type"]=3241600;var _PyLongRangeIter_Type=Module["_PyLongRangeIter_Type"]=3223904;var _PyMap_Type=Module["_PyMap_Type"]=3241840;var _PyPickleBuffer_Type=Module["_PyPickleBuffer_Type"]=3222728;var _PyRangeIter_Type=Module["_PyRangeIter_Type"]=3223632;var _PyRange_Type=Module["_PyRange_Type"]=3223360;var _PySetIter_Type=Module["_PySetIter_Type"]=3224160;var _PySuper_Type=Module["_PySuper_Type"]=3228816;var _PyTupleIter_Type=Module["_PyTupleIter_Type"]=3227056;var _PyUnicodeIter_Type=Module["_PyUnicodeIter_Type"]=3236800;var _PyZip_Type=Module["_PyZip_Type"]=3242096;var __PyBufferWrapper_Type=Module["__PyBufferWrapper_Type"]=3228528;var __PyWeakref_CallableProxyType=Module["__PyWeakref_CallableProxyType"]=3239264;var __PyWeakref_ProxyType=Module["__PyWeakref_ProxyType"]=3239056;var __PyWeakref_RefType=Module["__PyWeakref_RefType"]=3238600;var __PySet_Dummy=Module["__PySet_Dummy"]=3225688;var _PyStructSequence_UnnamedField=Module["_PyStructSequence_UnnamedField"]=3226516;var __Py_ascii_whitespace=Module["__Py_ascii_whitespace"]=308784;var _Py_Version=Module["_Py_Version"]=441460;var _PyImport_Inittab=Module["_PyImport_Inittab"]=3246992;var __PyImport_FrozenBootstrap=Module["__PyImport_FrozenBootstrap"]=4423776;var _PyImport_FrozenModules=Module["_PyImport_FrozenModules"]=4592152;var __PyImport_FrozenStdlib=Module["__PyImport_FrozenStdlib"]=4424112;var __PyImport_FrozenTest=Module["__PyImport_FrozenTest"]=4424368;var _Py_IgnoreEnvironmentFlag=Module["_Py_IgnoreEnvironmentFlag"]=4581964;var _Py_IsolatedFlag=Module["_Py_IsolatedFlag"]=4581984;var _Py_BytesWarningFlag=Module["_Py_BytesWarningFlag"]=4581956;var _Py_InspectFlag=Module["_Py_InspectFlag"]=4581944;var _Py_InteractiveFlag=Module["_Py_InteractiveFlag"]=4581940;var _Py_OptimizeFlag=Module["_Py_OptimizeFlag"]=4581948;var _Py_DebugFlag=Module["_Py_DebugFlag"]=4581928;var _Py_VerboseFlag=Module["_Py_VerboseFlag"]=4581932;var _Py_QuietFlag=Module["_Py_QuietFlag"]=4581936;var _Py_FrozenFlag=Module["_Py_FrozenFlag"]=4581960;var _Py_UnbufferedStdioFlag=Module["_Py_UnbufferedStdioFlag"]=4581976;var _Py_NoSiteFlag=Module["_Py_NoSiteFlag"]=4581952;var _Py_DontWriteBytecodeFlag=Module["_Py_DontWriteBytecodeFlag"]=4581968;var _Py_NoUserSiteDirectory=Module["_Py_NoUserSiteDirectory"]=4581972;var _Py_HashRandomizationFlag=Module["_Py_HashRandomizationFlag"]=4581980;var _Py_FileSystemDefaultEncoding=Module["_Py_FileSystemDefaultEncoding"]=4582032;var _Py_HasFileSystemDefaultEncoding=Module["_Py_HasFileSystemDefaultEncoding"]=4582036;var _Py_FileSystemDefaultEncodeErrors=Module["_Py_FileSystemDefaultEncodeErrors"]=4582040;var __Py_HasFileSystemDefaultEncodeErrors=Module["__Py_HasFileSystemDefaultEncodeErrors"]=4582044;var _Py_UTF8Mode=Module["_Py_UTF8Mode"]=4581924;var __Py_HashSecret=Module["__Py_HashSecret"]=4582048;var _Py_EMSCRIPTEN_SIGNAL_HANDLING=Module["_Py_EMSCRIPTEN_SIGNAL_HANDLING"]=4583164;var __PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET=Module["__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET"]=472248;var _ffi_type_pointer=Module["_ffi_type_pointer"]=2818724;var _ffi_type_void=Module["_ffi_type_void"]=2818616;var _ffi_type_sint32=Module["_ffi_type_sint32"]=2818688;var _ffi_type_uint8=Module["_ffi_type_uint8"]=2818628;var _ffi_type_double=Module["_ffi_type_double"]=2818748;var _ffi_type_longdouble=Module["_ffi_type_longdouble"]=2818760;var _ffi_type_float=Module["_ffi_type_float"]=2818736;var _ffi_type_sint16=Module["_ffi_type_sint16"]=2818664;var _ffi_type_uint16=Module["_ffi_type_uint16"]=2818652;var _ffi_type_uint32=Module["_ffi_type_uint32"]=2818676;var _ffi_type_sint64=Module["_ffi_type_sint64"]=2818712;var _ffi_type_uint64=Module["_ffi_type_uint64"]=2818700;var _ffi_type_sint8=Module["_ffi_type_sint8"]=2818640;var _environ=Module["_environ"]=4592176;var __deduplicate_map=Module["__deduplicate_map"]=4592156;var _z_errmsg=Module["_z_errmsg"]=4424672;var __length_code=Module["__length_code"]=2829376;var __dist_code=Module["__dist_code"]=2828864;var _deflate_copyright=Module["_deflate_copyright"]=2824032;var _inflate_copyright=Module["_inflate_copyright"]=2828560;var _BZ2_crc32Table=Module["_BZ2_crc32Table"]=4424784;var _BZ2_rNums=Module["_BZ2_rNums"]=4425808;var ___environ=Module["___environ"]=4592176;var ____environ=Module["____environ"]=4592176;var __environ=Module["__environ"]=4592176;var _timezone=Module["_timezone"]=4592840;var _daylight=Module["_daylight"]=4592844;var _tzname=Module["_tzname"]=4592848;var ___progname=Module["___progname"]=4594064;var ___optreset=Module["___optreset"]=4593028;var _optind=Module["_optind"]=4428072;var ___optpos=Module["___optpos"]=4593032;var _optarg=Module["_optarg"]=4593036;var _optopt=Module["_optopt"]=4593040;var _opterr=Module["_opterr"]=4428076;var _optreset=Module["_optreset"]=4593028;var _h_errno=Module["_h_errno"]=4593164;var ___signgam=Module["___signgam"]=4608460;var __ns_flagdata=Module["__ns_flagdata"]=3016752;var ___progname_full=Module["___progname_full"]=4594068;var _program_invocation_short_name=Module["_program_invocation_short_name"]=4594064;var _program_invocation_name=Module["_program_invocation_name"]=4594068;var ___sig_pending=Module["___sig_pending"]=4598440;var ___sig_actions=Module["___sig_actions"]=4599360;var _signgam=Module["_signgam"]=4608460;var ___THREW__=Module["___THREW__"]=4615360;var ___threwValue=Module["___threwValue"]=4615364;var ___cxa_unexpected_handler=Module["___cxa_unexpected_handler"]=4439364;var ___cxa_terminate_handler=Module["___cxa_terminate_handler"]=4439360;var ___cxa_new_handler=Module["___cxa_new_handler"]=4638144;var _in6addr_any=Module["_in6addr_any"]=3171248;var _in6addr_loopback=Module["_in6addr_loopback"]=3171264;var ___start_em_js=Module["___start_em_js"]=4446856;var ___stop_em_js=Module["___stop_em_js"]=4579647;function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiifi(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiidi(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_j(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_ji(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_jii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_v(index){var sp=stackSave();try{getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viijii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiij(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiid(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiijj(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_jiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_fiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_diii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiji(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_jiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_viif(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viid(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viijj(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function applySignatureConversions(wasmExports){wasmExports=Object.assign({},wasmExports);var makeWrapper_pp=f=>a0=>f(a0)>>>0;var makeWrapper_pppp=f=>(a0,a1,a2)=>f(a0,a1,a2)>>>0;var makeWrapper_p=f=>()=>f()>>>0;var makeWrapper_ppp=f=>(a0,a1)=>f(a0,a1)>>>0;var makeWrapper_pP=f=>a0=>f(a0)>>>0;wasmExports["malloc"]=makeWrapper_pp(wasmExports["malloc"]);wasmExports["memcpy"]=makeWrapper_pppp(wasmExports["memcpy"]);wasmExports["__errno_location"]=makeWrapper_p(wasmExports["__errno_location"]);wasmExports["pthread_self"]=makeWrapper_p(wasmExports["pthread_self"]);wasmExports["emscripten_builtin_malloc"]=makeWrapper_pp(wasmExports["emscripten_builtin_malloc"]);wasmExports["emscripten_stack_get_base"]=makeWrapper_p(wasmExports["emscripten_stack_get_base"]);wasmExports["emscripten_stack_get_end"]=makeWrapper_p(wasmExports["emscripten_stack_get_end"]);wasmExports["emscripten_builtin_memalign"]=makeWrapper_ppp(wasmExports["emscripten_builtin_memalign"]);wasmExports["emscripten_stack_get_current"]=makeWrapper_p(wasmExports["emscripten_stack_get_current"]);wasmExports["emscripten_main_runtime_thread_id"]=makeWrapper_p(wasmExports["emscripten_main_runtime_thread_id"]);wasmExports["sbrk"]=makeWrapper_pP(wasmExports["sbrk"]);wasmExports["memalign"]=makeWrapper_ppp(wasmExports["memalign"]);wasmExports["_emscripten_stack_alloc"]=makeWrapper_pp(wasmExports["_emscripten_stack_alloc"]);return wasmExports}Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["ERRNO_CODES"]=ERRNO_CODES;Module["wasmTable"]=wasmTable;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_unlink"]=FS.unlink;Module["LZ4"]=LZ4;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=resolveGlobalSymbol("main").sym;if(!entryFunction)return;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv;args.forEach(arg=>{HEAPU32[argv_ptr>>>2>>>0]=stringToUTF8OnStack(arg);argv_ptr+=4});HEAPU32[argv_ptr>>>2>>>0]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args=arguments_){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run();moduleRtn=readyPromise; return moduleRtn; } ); })(); globalThis._createPyodideModule = _createPyodideModule; ================================================ FILE: packages/app/public/pyodide/pyodide.js ================================================ "use strict";var loadPyodide=(()=>{var ne=Object.create;var I=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,ae=Object.prototype.hasOwnProperty;var s=(e,t)=>I(e,"name",{value:t,configurable:!0}),p=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+e+'" is not supported')});var se=(e,t)=>{for(var i in t)I(e,i,{get:t[i],enumerable:!0})},$=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!ae.call(e,a)&&a!==i&&I(e,a,{get:()=>t[a],enumerable:!(r=re(t,a))||r.enumerable});return e};var b=(e,t,i)=>(i=e!=null?ne(oe(e)):{},$(t||!e||!e.__esModule?I(i,"default",{value:e,enumerable:!0}):i,e)),ce=e=>$(I({},"__esModule",{value:!0}),e);var Ie={};se(Ie,{loadPyodide:()=>B,version:()=>x});function le(e){return!isNaN(parseFloat(e))&&isFinite(e)}s(le,"_isNumber");function w(e){return e.charAt(0).toUpperCase()+e.substring(1)}s(w,"_capitalize");function L(e){return function(){return this[e]}}s(L,"_getter");var _=["isConstructor","isEval","isNative","isToplevel"],F=["columnNumber","lineNumber"],R=["fileName","functionName","source"],de=["args"],ue=["evalOrigin"],k=_.concat(F,R,de,ue);function g(e){if(e)for(var t=0;t-1&&(n=n.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(,.*$)/g,""));var o=n.replace(/^\s+/,"").replace(/\(eval code/g,"(").replace(/^.*?\s+/,""),c=o.match(/ (\(.+\)$)/);o=c?o.replace(c[0],""):o;var l=this.extractLocation(c?c[1]:o),d=c&&o||void 0,u=["eval",""].indexOf(l[0])>-1?void 0:l[0];return new A({functionName:d,fileName:u,lineNumber:l[1],columnNumber:l[2],source:n})},this)},"ErrorStackParser$$parseV8OrIE"),parseFFOrSafari:s(function(r){var a=r.stack.split(` `).filter(function(n){return!n.match(t)},this);return a.map(function(n){if(n.indexOf(" > eval")>-1&&(n=n.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),n.indexOf("@")===-1&&n.indexOf(":")===-1)return new A({functionName:n});var o=/((.*".+"[^@]*)?[^@]*)(?:@)/,c=n.match(o),l=c&&c[1]?c[1]:void 0,d=this.extractLocation(n.replace(o,""));return new A({functionName:l,fileName:d[0],lineNumber:d[1],columnNumber:d[2],source:n})},this)},"ErrorStackParser$$parseFFOrSafari")}}s(fe,"ErrorStackParser");var me=new fe;var j=me;var y=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&!process.browser,T=y&&typeof module<"u"&&typeof module.exports<"u"&&typeof p<"u"&&typeof __dirname<"u",H=y&&!T,Le=typeof globalThis.Bun<"u",pe=typeof Deno<"u",z=!y&&!pe,V=z&&typeof window=="object"&&typeof document=="object"&&typeof document.createElement=="function"&&"sessionStorage"in window&&typeof importScripts!="function",q=z&&typeof importScripts=="function"&&typeof self=="object",Te=typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Chrome")==-1&&navigator.userAgent.indexOf("Safari")>-1;var K,U,Y,J,M;async function C(){if(!y||(K=(await import(/* webpackIgnore */"node:url")).default,J=await import(/* webpackIgnore */"node:fs"),M=await import(/* webpackIgnore */"node:fs/promises"),Y=(await import(/* webpackIgnore */"node:vm")).default,U=await import(/* webpackIgnore */"node:path"),W=U.sep,typeof p<"u"))return;let e=J,t=await import(/* webpackIgnore */"node:crypto"),i=await import(/* webpackIgnore */"ws"),r=await import(/* webpackIgnore */"node:child_process"),a={fs:e,crypto:t,ws:i,child_process:r};globalThis.require=function(n){return a[n]}}s(C,"initNodeModules");function ge(e,t){return U.resolve(t||".",e)}s(ge,"node_resolvePath");function ye(e,t){return t===void 0&&(t=location),new URL(e,t).toString()}s(ye,"browser_resolvePath");var D;y?D=ge:D=ye;var W;y||(W="/");function be(e,t){return e.startsWith("file://")&&(e=e.slice(7)),e.includes("://")?{response:fetch(e)}:{binary:M.readFile(e).then(i=>new Uint8Array(i.buffer,i.byteOffset,i.byteLength))}}s(be,"node_getBinaryResponse");function ve(e,t){let i=new URL(e,location);return{response:fetch(i,t?{integrity:t}:{})}}s(ve,"browser_getBinaryResponse");var P;y?P=be:P=ve;async function G(e,t){let{response:i,binary:r}=P(e,t);if(r)return r;let a=await i;if(!a.ok)throw new Error(`Failed to load '${e}': request failed.`);return new Uint8Array(await a.arrayBuffer())}s(G,"loadBinaryFile");var O;if(V)O=s(async e=>await import(/* webpackIgnore */e),"loadScript");else if(q)O=s(async e=>{try{globalThis.importScripts(e)}catch(t){if(t instanceof TypeError)await import(/* webpackIgnore */e);else throw t}},"loadScript");else if(y)O=he;else throw new Error("Cannot determine runtime environment");async function he(e){e.startsWith("file://")&&(e=e.slice(7)),e.includes("://")?Y.runInThisContext(await(await fetch(e)).text()):await import(/* webpackIgnore */K.pathToFileURL(e).href)}s(he,"nodeLoadScript");async function X(e){if(y){await C();let t=await M.readFile(e,{encoding:"utf8"});return JSON.parse(t)}else return await(await fetch(e)).json()}s(X,"loadLockFile");async function Q(){if(T)return __dirname;let e;try{throw new Error}catch(r){e=r}let t=j.parse(e)[0].fileName;if(y&&!t.startsWith("file://")&&(t=`file://${t}`),H){let r=await import(/* webpackIgnore */"node:path");return(await import(/* webpackIgnore */"node:url")).fileURLToPath(r.dirname(t))}let i=t.lastIndexOf(W);if(i===-1)throw new Error("Could not extract indexURL path from pyodide module location");return t.slice(0,i)}s(Q,"calculateDirname");function Z(e){let t=e.FS,i=e.FS.filesystems.MEMFS,r=e.PATH,a={DIR_MODE:16895,FILE_MODE:33279,mount:function(n){if(!n.opts.fileSystemHandle)throw new Error("opts.fileSystemHandle is required");return i.mount.apply(null,arguments)},syncfs:async(n,o,c)=>{try{let l=a.getLocalSet(n),d=await a.getRemoteSet(n),u=o?d:l,m=o?l:d;await a.reconcile(n,u,m),c(null)}catch(l){c(l)}},getLocalSet:n=>{let o=Object.create(null);function c(u){return u!=="."&&u!==".."}s(c,"isRealDir");function l(u){return m=>r.join2(u,m)}s(l,"toAbsolute");let d=t.readdir(n.mountpoint).filter(c).map(l(n.mountpoint));for(;d.length;){let u=d.pop(),m=t.stat(u);t.isDir(m.mode)&&d.push.apply(d,t.readdir(u).filter(c).map(l(u))),o[u]={timestamp:m.mtime,mode:m.mode}}return{type:"local",entries:o}},getRemoteSet:async n=>{let o=Object.create(null),c=await Ee(n.opts.fileSystemHandle);for(let[l,d]of c)l!=="."&&(o[r.join2(n.mountpoint,l)]={timestamp:d.kind==="file"?(await d.getFile()).lastModifiedDate:new Date,mode:d.kind==="file"?a.FILE_MODE:a.DIR_MODE});return{type:"remote",entries:o,handles:c}},loadLocalEntry:n=>{let c=t.lookupPath(n).node,l=t.stat(n);if(t.isDir(l.mode))return{timestamp:l.mtime,mode:l.mode};if(t.isFile(l.mode))return c.contents=i.getFileDataAsTypedArray(c),{timestamp:l.mtime,mode:l.mode,contents:c.contents};throw new Error("node type not supported")},storeLocalEntry:(n,o)=>{if(t.isDir(o.mode))t.mkdirTree(n,o.mode);else if(t.isFile(o.mode))t.writeFile(n,o.contents,{canOwn:!0});else throw new Error("node type not supported");t.chmod(n,o.mode),t.utime(n,o.timestamp,o.timestamp)},removeLocalEntry:n=>{var o=t.stat(n);t.isDir(o.mode)?t.rmdir(n):t.isFile(o.mode)&&t.unlink(n)},loadRemoteEntry:async n=>{if(n.kind==="file"){let o=await n.getFile();return{contents:new Uint8Array(await o.arrayBuffer()),mode:a.FILE_MODE,timestamp:o.lastModifiedDate}}else{if(n.kind==="directory")return{mode:a.DIR_MODE,timestamp:new Date};throw new Error("unknown kind: "+n.kind)}},storeRemoteEntry:async(n,o,c)=>{let l=n.get(r.dirname(o)),d=t.isFile(c.mode)?await l.getFileHandle(r.basename(o),{create:!0}):await l.getDirectoryHandle(r.basename(o),{create:!0});if(d.kind==="file"){let u=await d.createWritable();await u.write(c.contents),await u.close()}n.set(o,d)},removeRemoteEntry:async(n,o)=>{await n.get(r.dirname(o)).removeEntry(r.basename(o)),n.delete(o)},reconcile:async(n,o,c)=>{let l=0,d=[];Object.keys(o.entries).forEach(function(f){let v=o.entries[f],N=c.entries[f];(!N||t.isFile(v.mode)&&v.timestamp.getTime()>N.timestamp.getTime())&&(d.push(f),l++)}),d.sort();let u=[];if(Object.keys(c.entries).forEach(function(f){o.entries[f]||(u.push(f),l++)}),u.sort().reverse(),!l)return;let m=o.type==="remote"?o.handles:c.handles;for(let f of d){let v=r.normalize(f.replace(n.mountpoint,"/")).substring(1);if(c.type==="local"){let N=m.get(v),te=await a.loadRemoteEntry(N);a.storeLocalEntry(f,te)}else{let N=a.loadLocalEntry(f);await a.storeRemoteEntry(m,v,N)}}for(let f of u)if(c.type==="local")a.removeLocalEntry(f);else{let v=r.normalize(f.replace(n.mountpoint,"/")).substring(1);await a.removeRemoteEntry(m,v)}}};e.FS.filesystems.NATIVEFS_ASYNC=a}s(Z,"initializeNativeFS");var Ee=s(async e=>{let t=[];async function i(a){for await(let n of a.values())t.push(n),n.kind==="directory"&&await i(n)}s(i,"collect"),await i(e);let r=new Map;r.set(".",e);for(let a of t){let n=(await e.resolve(a)).join("/");r.set(n,a)}return r},"getFsHandles");function ee(e){let t={noImageDecoding:!0,noAudioDecoding:!0,noWasmDecoding:!1,preRun:Fe(e),quit(i,r){throw t.exited={status:i,toThrow:r},r},print:e.stdout,printErr:e.stderr,arguments:e.args,API:{config:e},locateFile:i=>e.indexURL+i,instantiateWasm:Re(e.indexURL)};return t}s(ee,"createSettings");function Se(e){return function(t){let i="/";try{t.FS.mkdirTree(e)}catch(r){console.error(`Error occurred while making a home directory '${e}':`),console.error(r),console.error(`Using '${i}' for a home directory instead`),e=i}t.FS.chdir(e)}}s(Se,"createHomeDirectory");function we(e){return function(t){Object.assign(t.ENV,e)}}s(we,"setEnvironment");function Ne(e){return t=>{for(let i of e)t.FS.mkdirTree(i),t.FS.mount(t.FS.filesystems.NODEFS,{root:i},i)}}s(Ne,"mountLocalDirectories");function _e(e){let t=G(e);return i=>{let r=i._py_version_major(),a=i._py_version_minor();i.FS.mkdirTree("/lib"),i.FS.mkdirTree(`/lib/python${r}.${a}/site-packages`),i.addRunDependency("install-stdlib"),t.then(n=>{i.FS.writeFile(`/lib/python${r}${a}.zip`,n)}).catch(n=>{console.error("Error occurred while installing the standard library:"),console.error(n)}).finally(()=>{i.removeRunDependency("install-stdlib")})}}s(_e,"installStdlib");function Fe(e){let t;return e.stdLibURL!=null?t=e.stdLibURL:t=e.indexURL+"python_stdlib.zip",[_e(t),Se(e.env.HOME),we(e.env),Ne(e._node_mounts),Z]}s(Fe,"getFileSystemInitializationFuncs");function Re(e){if(typeof WasmOffsetConverter<"u")return;let{binary:t,response:i}=P(e+"pyodide.asm.wasm");return function(r,a){return async function(){try{let n;i?n=await WebAssembly.instantiateStreaming(i,r):n=await WebAssembly.instantiate(await t,r);let{instance:o,module:c}=n;a(o,c)}catch(n){console.warn("wasm instantiation failed!"),console.warn(n)}}(),{}}}s(Re,"getInstantiateWasmFunc");var x="0.27.2";async function B(e={}){var u,m;await C();let t=e.indexURL||await Q();t=D(t),t.endsWith("/")||(t+="/"),e.indexURL=t;let i={fullStdLib:!1,jsglobals:globalThis,stdin:globalThis.prompt?globalThis.prompt:void 0,lockFileURL:t+"pyodide-lock.json",args:[],_node_mounts:[],env:{},packageCacheDir:t,packages:[],enableRunUntilComplete:!1,checkAPIVersion:!0,BUILD_ID:"f88dc4abb40ec8e780c94a5f70bcef45ec9eb3c1aee1c99da527febfef1c6f3f"},r=Object.assign(i,e);(u=r.env).HOME??(u.HOME="/home/pyodide"),(m=r.env).PYTHONINSPECT??(m.PYTHONINSPECT="1");let a=ee(r),n=a.API;if(n.lockFilePromise=X(r.lockFileURL),typeof _createPyodideModule!="function"){let f=`${r.indexURL}pyodide.asm.js`;await O(f)}let o;if(e._loadSnapshot){let f=await e._loadSnapshot;ArrayBuffer.isView(f)?o=f:o=new Uint8Array(f),a.noInitialRun=!0,a.INITIAL_MEMORY=o.length}let c=await _createPyodideModule(a);if(a.exited)throw a.exited.toThrow;if(e.pyproxyToStringRepr&&n.setPyProxyToStringMethod(!0),n.version!==x&&r.checkAPIVersion)throw new Error(`Pyodide version does not match: '${x}' <==> '${n.version}'. If you updated the Pyodide version, make sure you also updated the 'indexURL' parameter passed to loadPyodide.`);c.locateFile=f=>{throw new Error("Didn't expect to load any more file_packager files!")};let l;o&&(l=n.restoreSnapshot(o));let d=n.finalizeBootstrap(l,e._snapshotDeserializer);return n.sys.path.insert(0,n.config.env.HOME),d.version.includes("dev")||n.setCdnUrl(`https://cdn.jsdelivr.net/pyodide/v${d.version}/full/`),n._pyodide.set_excepthook(),await n.packageIndexReady,n.initializeStreams(r.stdin,r.stdout,r.stderr),d}s(B,"loadPyodide");globalThis.loadPyodide=B;return ce(Ie);})(); try{Object.assign(exports,loadPyodide)}catch(_){} globalThis.loadPyodide=loadPyodide.loadPyodide; //# sourceMappingURL=pyodide.js.map ================================================ FILE: packages/app/scripts/move-to-clickhouse.js ================================================ const fs = require('fs'); const path = require('path'); // Move out-gzipped to replace ClickHouse clickstack directory function moveToClickHouse() { const outGzippedDir = path.join(__dirname, '../out-gzipped'); const clickStackDir = path.join( __dirname, '../../../../ClickHouse/programs/server/clickstack', ); if (!fs.existsSync(outGzippedDir)) { console.error('Error: out-gzipped directory does not exist'); console.error('Run build:clickhouse first to generate the build'); process.exit(1); } const clickStackParentDir = path.dirname(clickStackDir); if (!fs.existsSync(clickStackParentDir)) { console.error( `Error: ClickHouse server directory does not exist at ${clickStackParentDir}`, ); console.error( 'Make sure the ClickHouse repository is cloned at ../ClickHouse', ); process.exit(1); } // Remove existing clickstack directory if it exists if (fs.existsSync(clickStackDir)) { console.log('Removing existing clickstack directory...'); fs.rmSync(clickStackDir, { recursive: true, force: true }); } // Copy out-gzipped to clickstack console.log(`Moving out-gzipped to ${clickStackDir}...`); fs.cpSync(outGzippedDir, clickStackDir, { recursive: true }); console.log('✓ Successfully moved build to ClickHouse clickstack directory'); } moveToClickHouse(); ================================================ FILE: packages/app/scripts/prepare-clickhouse-build-export.js ================================================ const fs = require('fs'); const path = require('path'); const OUT_DIR = path.join(__dirname, '../out'); const PYODIDE_PATH = path.join(OUT_DIR, 'pyodide'); const ALLOWED_EXTENSIONS = [ '.html', '.js', '.css', '.map', '.woff2', '.png', '.svg', '.ico', ]; // removes pyodide from a next static build. We want a small bundle size, so that feature would just be ignored if (fs.existsSync(PYODIDE_PATH)) { fs.rmSync(PYODIDE_PATH, { recursive: true, force: true }); console.log('Removed pyodide from static build'); } // Remove all files that are not in ALLOWED_EXTENSIONS function removeNonEssentialFiles(dir) { let removedCount = 0; function walkDir(currentPath) { const entries = fs.readdirSync(currentPath, { withFileTypes: true }); for (const entry of entries) { const fullPath = path.join(currentPath, entry.name); if (entry.isDirectory()) { walkDir(fullPath); } else if (entry.isFile()) { const ext = path.extname(entry.name).toLowerCase(); if (!ALLOWED_EXTENSIONS.includes(ext)) { fs.unlinkSync(fullPath); console.log( `Removed non-essential file: ${path.relative(OUT_DIR, fullPath)}`, ); removedCount++; } } } } walkDir(dir); console.log(`Removed ${removedCount} non-essential file(s)`); } // Execute cleanup and optimization if (fs.existsSync(OUT_DIR)) { removeNonEssentialFiles(OUT_DIR); } else { console.error('No out directory found. Build preparation failed.'); process.exit(1); } ================================================ FILE: packages/app/scripts/run-e2e.js ================================================ #!/usr/bin/env node /** * E2E Test Runner * * Usage: * yarn test:e2e # Run all tests (full-stack mode, default) * yarn test:e2e --local # Run frontend-only tests * yarn test:e2e --ui # Open Playwright UI (full-stack) * yarn test:e2e --ui --local # Open UI (local mode) * yarn test:e2e --debug # Debug mode (full-stack) * yarn test:e2e --debug --local # Debug (local mode) * yarn test:e2e --dev # Hot reload (next dev) instead of build+start */ import { spawn } from 'child_process'; import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; // Get __dirname equivalent in ES modules const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Parse command line arguments const args = process.argv.slice(2); const useLocal = args.includes('--local'); const useUI = args.includes('--ui'); const useDebug = args.includes('--debug'); const useDev = args.includes('--dev'); // Remove our custom flags from args const playwrightArgs = args.filter( arg => !['--local', '--ui', '--debug', '--dev'].includes(arg), ); // Build playwright command const playwrightCmd = ['playwright', 'test']; // Add mode flags if (useUI) { playwrightCmd.push('--ui'); } if (useDebug) { playwrightCmd.push('--debug'); } // Add grep-invert for local mode (exclude @full-stack tests) if (useLocal) { playwrightCmd.push('--grep-invert', '@full-stack'); } // Add any additional playwright arguments playwrightCmd.push(...playwrightArgs); // Set environment variables (Playwright and its webServer children inherit these) const env = { ...process.env, ...(!useLocal && { E2E_FULLSTACK: 'true' }), ...(useDev && { E2E_USE_DEV: 'true' }), }; // Full-stack: inject DEFAULT_CONNECTIONS/DEFAULT_SOURCES from fixture so the API gets them if (!useLocal) { const fixturePath = path.join( __dirname, '../tests/e2e/fixtures/e2e-fixtures.json', ); const fixture = JSON.parse(fs.readFileSync(fixturePath, 'utf8')); env.DEFAULT_CONNECTIONS = JSON.stringify(fixture.connections ?? []); env.DEFAULT_SOURCES = JSON.stringify(fixture.sources ?? []); } // Run playwright // eslint-disable-next-line no-console console.info(`Running: ${playwrightCmd.join(' ')}`); // eslint-disable-next-line no-console console.info(`Mode: ${useLocal ? 'Local (frontend only)' : 'Full-stack'}${useDev ? ' + dev (hot reload)' : ''}`); const child = spawn('npx', playwrightCmd, { stdio: 'inherit', shell: true, env, cwd: path.join(__dirname, '..'), }); child.on('exit', code => { process.exit(code); }); ================================================ FILE: packages/app/src/AlertsPage.tsx ================================================ import * as React from 'react'; import Head from 'next/head'; import Link from 'next/link'; import cx from 'classnames'; import type { Duration } from 'date-fns'; import { add, formatRelative } from 'date-fns'; import { AlertHistory, AlertSource, AlertState, } from '@hyperdx/common-utils/dist/types'; import { Alert, Badge, Button, Container, Group, Menu, Stack, Tooltip, } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { IconAlertTriangle, IconBell, IconBrandSlack, IconChartLine, IconCheck, IconChevronRight, IconHelpCircle, IconInfoCircleFilled, IconTableRow, } from '@tabler/icons-react'; import { useQueryClient } from '@tanstack/react-query'; import { ErrorBoundary } from '@/components/Error/ErrorBoundary'; import { PageHeader } from '@/components/PageHeader'; import { useBrandDisplayName } from './theme/ThemeProvider'; import { isAlertSilenceExpired } from './utils/alerts'; import { getWebhookChannelIcon } from './utils/webhookIcons'; import api from './api'; import { withAppNav } from './layout'; import type { AlertsPageItem } from './types'; import { FormatTime } from './useFormatTime'; import styles from '../styles/AlertsPage.module.scss'; function AlertHistoryCard({ history, alertUrl, }: { history: AlertHistory; alertUrl: string; }) { const start = new Date(history.createdAt.toString()); // eslint-disable-next-line no-restricted-syntax const today = React.useMemo(() => new Date(), []); const href = React.useMemo(() => { if (!alertUrl || !history.lastValues?.[0]?.startTime) return null; // Create time window from alert creation to last recorded value const to = new Date(history.createdAt).getTime(); const from = new Date(history.lastValues[0].startTime).getTime(); // Construct URL with time range parameters const url = new URL(alertUrl, window.location.origin); url.searchParams.set('from', from.toString()); url.searchParams.set('to', to.toString()); url.searchParams.set('isLive', 'false'); return url.pathname + url.search; }, [history, alertUrl]); const content = (
); return ( {href ? ( {content} ) : ( content )} ); } const HISTORY_ITEMS = 18; function AckAlert({ alert }: { alert: AlertsPageItem }) { const queryClient = useQueryClient(); const silenceAlert = api.useSilenceAlert(); const unsilenceAlert = api.useUnsilenceAlert(); const mutateOptions = React.useMemo( () => ({ onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['alerts'] }); }, onError: (error: any) => { const status = error?.response?.status; let message = 'Failed to silence alert, please try again later.'; if (status === 404) { message = 'Alert not found.'; } else if (status === 400) { message = 'Invalid request. Please ensure the silence duration is valid.'; } notifications.show({ color: 'red', message, }); }, }), [queryClient], ); const handleUnsilenceAlert = React.useCallback(() => { unsilenceAlert.mutate(alert._id || '', mutateOptions); }, [alert._id, mutateOptions, unsilenceAlert]); const isNoLongerMuted = React.useMemo(() => { return isAlertSilenceExpired(alert.silenced); }, [alert.silenced]); const handleSilenceAlert = React.useCallback( (duration: Duration) => { // eslint-disable-next-line no-restricted-syntax const mutedUntil = add(new Date(), duration); silenceAlert.mutate( { alertId: alert._id || '', mutedUntil: mutedUntil.toISOString(), }, mutateOptions, ); }, [alert._id, mutateOptions, silenceAlert], ); if (alert.silenced?.at) { return ( Acknowledged{' '} {alert.silenced?.by ? ( <> by {alert.silenced?.by} ) : null}{' '} on
.
{isNoLongerMuted ? ( 'Alert resumed.' ) : ( <> Resumes . )} {isNoLongerMuted ? 'Unacknowledge' : 'Resume alert'}
); } if (alert.state === 'ALERT') { return ( Acknowledge and silence for handleSilenceAlert({ minutes: 30, }) } > 30 minutes handleSilenceAlert({ hours: 1, }) } > 1 hour handleSilenceAlert({ hours: 6, }) } > 6 hours handleSilenceAlert({ hours: 24, }) } > 24 hours ); } return null; } function AlertHistoryCardList({ history, alertUrl, }: { history: AlertHistory[]; alertUrl: string; }) { const items = React.useMemo(() => { if (history.length < HISTORY_ITEMS) { return history; } return history.slice(0, HISTORY_ITEMS); }, [history]); const paddingItems = React.useMemo(() => { if (history.length > HISTORY_ITEMS) { return []; } return new Array(HISTORY_ITEMS - history.length).fill(null); }, [history]); return (
{paddingItems.map((_, index) => (
))} {items .slice() .reverse() .map((history, index) => ( ))}
); } function AlertDetails({ alert }: { alert: AlertsPageItem }) { const alertName = React.useMemo(() => { if (alert.source === AlertSource.TILE && alert.dashboard) { const tile = alert.dashboard?.tiles.find( tile => tile.id === alert.tileId, ); const tileName = tile?.config.name || 'Tile'; return ( <> {alert.dashboard?.name} {tileName ? ( <> {tileName} ) : null} ); } if (alert.source === AlertSource.SAVED_SEARCH && alert.savedSearch) { return alert.savedSearch?.name; } return '–'; }, [alert]); const alertUrl = React.useMemo(() => { if (alert.source === AlertSource.TILE && alert.dashboard) { return `/dashboards/${alert.dashboardId}?highlightedTileId=${alert.tileId}`; } if (alert.source === AlertSource.SAVED_SEARCH && alert.savedSearch) { return `/search/${alert.savedSearchId}`; } return ''; }, [alert]); const alertIcon = (() => { switch (alert.source) { case AlertSource.TILE: return ; case AlertSource.SAVED_SEARCH: return ; default: return ; } })(); const alertType = React.useMemo(() => { return ( <> If value is {alert.thresholdType === 'above' ? 'over' : 'under'}{' '} {alert.threshold} · ); }, [alert]); const notificationMethod = React.useMemo(() => { return ( Notify via {getWebhookChannelIcon(alert.channel.type)} Webhook ); }, [alert]); const linkTitle = React.useMemo(() => { switch (alert.source) { case AlertSource.TILE: return 'Dashboard tile'; case AlertSource.SAVED_SEARCH: return 'Saved search'; default: return ''; } }, [alert]); return (
{alert.state === AlertState.ALERT && ( Alert )} {alert.state === AlertState.OK && Ok} {alert.state === AlertState.DISABLED && ( Disabled )}
{alertIcon} {alertName}
{alertType} {notificationMethod} {alert.createdBy && ( <> · Created by {alert.createdBy.name || alert.createdBy.email} )}
); } function AlertCardList({ alerts }: { alerts: AlertsPageItem[] }) { const alarmAlerts = alerts.filter(alert => alert.state === AlertState.ALERT); const okData = alerts.filter(alert => alert.state === AlertState.OK); return (
{alarmAlerts.length > 0 && (
Triggered {alarmAlerts.map((alert, index) => ( ))}
)}
OK {okData.length === 0 && (
No alerts
)} {okData.map((alert, index) => ( ))}
); } export default function AlertsPage() { const brandName = useBrandDisplayName(); const { data, isError, isLoading } = api.useAlerts(); const alerts = React.useMemo(() => data?.data || [], [data?.data]); return (
Alerts - {brandName} Alerts
} color="gray" py="xs" mt="md" > Alerts can be{' '} created {' '} from dashboard charts and saved searches. {isLoading ? (
Loading...
) : isError ? (
Error
) : alerts?.length ? ( <> ) : (
No alerts created yet
)}
); } AlertsPage.getLayout = withAppNav; ================================================ FILE: packages/app/src/AuthLoadingBlocker.tsx ================================================ import { useEffect, useRef, useState } from 'react'; import { useBrandDisplayName } from './theme/ThemeProvider'; import api from './api'; export default function AuthLoadingBlocker() { const brandName = useBrandDisplayName(); const { data: meData } = api.useMe(); // increase number of periods rendered as a loading animation, 1 period per second const [periods, setPeriods] = useState(0); useEffect(() => { const interval = setInterval(() => { setPeriods(periods => (periods + 1) % 4); }, 1000); return () => clearInterval(interval); }, []); return ( <> {meData == null && (
Loading {brandName} {'.'.repeat(periods)}
)} ); } ================================================ FILE: packages/app/src/AuthPage.tsx ================================================ import { useEffect } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/router'; import { NextSeo } from 'next-seo'; import { HTTPError } from 'ky'; import { SubmitHandler, useForm, useWatch } from 'react-hook-form'; import { Button, Notification, Paper, PasswordInput, Stack, TextInput, } from '@mantine/core'; import { IconAt, IconLock } from '@tabler/icons-react'; import { useBrandDisplayName } from './theme/ThemeProvider'; import api from './api'; import * as config from './config'; import LandingHeader from './LandingHeader'; import { CheckOrX, PasswordCheck } from './PasswordCheck'; type FormData = { email: string; password: string; confirmPassword: string; }; export default function AuthPage({ action }: { action: 'register' | 'login' }) { const brandName = useBrandDisplayName(); const { data: team, isLoading: teamIsLoading } = api.useTeam(); const router = useRouter(); const isLoggedIn = Boolean(!teamIsLoading && team); useEffect(() => { if (isLoggedIn) { router.push('/search'); } }, [isLoggedIn, router]); const isRegister = action === 'register'; const { register, handleSubmit, formState: { errors, isSubmitting }, setError, control, } = useForm({ reValidateMode: 'onSubmit', }); const { err, msg } = router.query; const { data: installation } = api.useInstallation(); const registerPassword = api.useRegisterPassword(); const verificationSent = msg === 'verify'; const title = `${brandName} - ${isRegister ? 'Sign up' : 'Login'}`; useEffect(() => { // If an OSS user accidentally lands on /register after already creating a team // redirect them to login instead if (config.IS_OSS && installation?.isTeamExisting === true && isRegister) { router.push('/login'); } }, [installation, isRegister, router]); const currentPassword = useWatch({ control, name: 'password', defaultValue: '', }); const confirmPassword = useWatch({ control, name: 'confirmPassword', defaultValue: '', }); const confirmPass = () => { return currentPassword === confirmPassword; }; const onSubmit: SubmitHandler = data => registerPassword.mutate( { email: data.email, password: data.password, confirmPassword: data.confirmPassword, }, { onSuccess: () => router.push('/search'), onError: async error => { if (error instanceof HTTPError) { const jsonData = await error.response.json(); if (Array.isArray(jsonData) && jsonData[0]?.errors?.issues) { return jsonData[0].errors.issues.forEach((issue: any) => { setError(issue.path[0], { type: issue.code, message: issue.message, }); }); } } setError('root', { type: 'manual', message: 'An unexpected error occurred, please try again later.', }); }, }, ); const form = isRegister ? { controller: { onSubmit: handleSubmit(onSubmit) }, email: register('email', { required: true }), password: register('password', { required: true }), confirmPassword: register('confirmPassword', { required: true }), } : { controller: { action: `/api/login/password`, method: 'POST', }, email: { name: 'email' }, password: { name: 'password' }, }; return (
{config.IS_OSS && isRegister ? 'Setup ' : isRegister ? 'Register for ' : 'Login to '} {brandName}
{action === 'login' && (
Welcome back!
)} {isRegister && config.IS_OSS === true && (
Let{"'"}s create your user account.
)}
} error={errors.email?.message} required {...form.email} /> } error={errors.password?.message} required placeholder="Password" {...form.password} /> {isRegister && ( <> Confirm Password } size="md" required withAsterisk={false} leftSection={} error={errors.confirmPassword?.message} placeholder="Confirm Password" {...form.confirmPassword} /> )} {err != null && ( {err === 'missing' ? 'Please provide a valid email and password' : err === 'invalid' ? 'Email or password is invalid' : err === 'authFail' ? 'Failed to login with email and password, please try again.' : err === 'passwordAuthNotAllowed' ? 'Password authentication is not allowed by your team admin.' : err === 'teamAlreadyExists' ? 'Team already exists, please login instead.' : 'Unknown error occurred, please try again later.'} )} {verificationSent && ( Sent verification email! Please check your email inbox )} {isRegister && config.IS_OSS === false && (
Already have an account? Log in{' '} instead.
)} {action === 'login' && config.IS_OSS === false && (
Don{"'"}t have an account yet?{' '} Register instead.
)}
); } ================================================ FILE: packages/app/src/BenchmarkPage.tsx ================================================ import { useEffect, useMemo, useState } from 'react'; import dynamic from 'next/dynamic'; import { parseAsInteger, parseAsJson, parseAsString, useQueryState, } from 'nuqs'; import { useForm } from 'react-hook-form'; import { DataFormat } from '@hyperdx/common-utils/dist/clickhouse'; import { DisplayType } from '@hyperdx/common-utils/dist/types'; import { Button, Code, Grid, Loader, Stack, Table, Text, Title, } from '@mantine/core'; import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { useClickhouseClient } from '@/clickhouse'; import { SQLEditorControlled } from '@/components/SQLEditor/SQLEditor'; import { ConnectionSelectControlled } from './components/ConnectionSelect'; import DBTableChart from './components/DBTableChart'; import { DBTimeChart } from './components/DBTimeChart'; function useBenchmarkQueryIds({ queries, connections, iterations = 3, }: { queries: readonly string[]; connections: readonly string[]; iterations?: number; }) { const enabled = queries.length > 0 && connections.length > 0; const clickhouseClient = useClickhouseClient(); return useQuery({ enabled, queryKey: ['benchmark', queries, connections], queryFn: async () => { const shuffledQueries = queries.slice().sort(() => Math.random() - 0.5); const queryIds: Record = {}; for (let i = 0; i < iterations; i++) { for (let j = 0; j < queries.length; j++) { // We can't easily get the query_id from the response, so we'll just // ask CH to use ours instead const queryId = crypto.randomUUID(); await clickhouseClient .query({ query: shuffledQueries[j], connectionId: connections[j], format: 'NULL' as DataFormat, // clickhouse doesn't have this under the client-js lib for some reason clickhouse_settings: { min_bytes_to_use_direct_io: '1', use_query_cache: 0, wait_end_of_query: 1, }, queryId, }) .then(res => res.text()); queryIds[j] ??= []; queryIds[j].push(queryId); } // Wait 1s between queries await new Promise(resolve => setTimeout(resolve, 1000)); } // Wait for the query log to flush await new Promise(resolve => setTimeout(resolve, 10000)); return queryIds; }, refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, }); } function useEstimates( { queries, connections, }: { queries: string[]; connections: string[]; }, options: Omit, 'queryKey' | 'queryFn'> = {}, ) { const clickhouseClient = useClickhouseClient(); return useQuery({ queryKey: ['estimate', queries, connections], queryFn: async () => { return Promise.all( queries.map((query, i) => clickhouseClient .query({ query: `EXPLAIN ESTIMATE ${query}`, format: 'JSON', connectionId: connections[i], }) .then(res => res.json()), ), ); }, ...options, }); } function useIndexes( { queries, connections, }: { queries: string[]; connections: string[]; }, options: Omit, 'queryKey' | 'queryFn'> = {}, ) { const clickhouseClient = useClickhouseClient(); return useQuery({ queryKey: ['indexes', queries, connections], queryFn: async () => { return Promise.all( queries.map((query, i) => clickhouseClient .query({ query: `EXPLAIN indexes=1, json=1, description = 0 ${query}`, format: 'TabSeparatedRaw', connectionId: connections[i], }) .then(res => res.text()) .then(res => JSON.parse(res)), ), ); }, ...options, }); } function BenchmarkPage() { const [queries, setQueries] = useQueryState( 'queries', parseAsJson(), ); const [connections, setConnections] = useQueryState( 'connections', parseAsJson(), ); const [iterations, setIterations] = useQueryState( 'iterations', parseAsInteger.withDefault(3), ); const { control, handleSubmit } = useForm({ values: { queries: queries || [], connections, iterations, }, }); const onSubmit = (data: any) => { if ( !data.queries[0] || !data.queries[1] || !data.connections[0] || !data.connections[1] ) { return; } setQueries(data.queries || []); setConnections(data.connections || []); setIterations(data.iterations); }; const _queries = useMemo(() => queries || [], [queries]); const _connections = useMemo(() => connections || [], [connections]); const { data: estimates } = useEstimates( { queries: _queries, connections: _connections }, { enabled: _queries.length > 0 && _connections.length > 0, }, ); const { data: indexes } = useIndexes( { queries: _queries, connections: _connections }, { enabled: _queries.length > 0 && _connections.length > 0, }, ); const [startTime, setStartTime] = useState(null); const [endTime, setEndTime] = useState(null); const { data: queryIds, isLoading: isQueryIdsLoading } = useBenchmarkQueryIds( { queries: _queries, connections: _connections, iterations, }, ); // Hack to get time range useEffect(() => { if (_queries.length > 0 && _connections.length > 0) { // eslint-disable-next-line no-restricted-syntax setStartTime(new Date(Date.now() - 1000)); } }, [_queries, _connections]); useEffect(() => { if (queryIds != null && queryIds[0] != null) { setEndTime( new Date( // eslint-disable-next-line no-restricted-syntax Date.now() - 1000 * 9, // minus hard-coded flush interval ), ); } }, [queryIds]); return (
Clickhouse Query Benchmark
Query 1 Query 2 {isQueryIdsLoading && ( Running Benchmark... )} Query Estimate & Indexes Index utilization of your query {Object.entries(estimates?.[0].data?.[0] ?? {}).map( ([key, value]) => ( {key} {`${value}`} ), )}
{JSON.stringify(indexes?.[0] ?? {}, null, 2) .replace(/\},/g, '') .replace(/[[\]{}]/g, '') .replace(/\n\s*\n/g, '\n\n') .trim()}
{Object.entries(estimates?.[1].data?.[0] ?? {}).map( ([key, value]) => ( {key} {`${value}`} ), )}
{JSON.stringify(indexes?.[1] ?? {}, null, 2) .replace(/\},/g, '') .replace(/[[\]{}]/g, '') .replace(/\n\s*\n/g, '\n\n') .trim()}
{queryIds != null && queryIds[0] != null && startTime != null && endTime != null && (
`'${v}'`) .join(',')}]`, aggConditionLanguage: 'sql', alias: `Query 1 Duration`, }, { aggFn: 'max', valueExpression: 'query_duration_ms', aggCondition: `query_id IN [${(queryIds?.[1] ?? []) .map(v => `'${v}'`) .join(',')}]`, aggConditionLanguage: 'sql', alias: `Query 2 Duration`, }, ], displayType: DisplayType.Line, // dateRange: [new Date(Date.now() - 1000 * 60 * 2), new Date()], dateRange: [startTime, endTime], connection: _connections[0], timestampValueExpression: 'event_time', from: { databaseName: 'system', tableName: 'query_log', }, granularity: '1 second' as const, where: '', fillNulls: false, }} showDisplaySwitcher={false} />
)} {queryIds != null && queryIds[0] != null && startTime != null && endTime != null && (
`'${v}'`) .join(',')}], 'Query 1', 'Query 2') as Query`, where: '', }} />
)}
); } const BenchmarkPageDynamic = dynamic(async () => BenchmarkPage, { ssr: false }); export default BenchmarkPageDynamic; ================================================ FILE: packages/app/src/CareersPage.tsx ================================================ import { useMemo } from 'react'; import Head from 'next/head'; import { Anchor, Avatar, Card, Container, Group, Loader, Stack, Text, Title, } from '@mantine/core'; import { useQuery } from '@tanstack/react-query'; interface GreenhouseJob { id: number; title: string; absolute_url: string; location: { name: string }; updated_at: string; departments: { id: number; name: string }[]; content: string; } interface GreenhouseResponse { jobs: GreenhouseJob[]; } interface GitHubCommit { sha: string; html_url: string; commit: { message: string; author: { name: string; date: string; }; }; author: { login: string; avatar_url: string; } | null; } const GITHUB_COMMITS_URL = 'https://api.github.com/repos/hyperdxio/hyperdx/commits?sha=main&per_page=50'; const GREENHOUSE_API_URL = 'https://boards-api.greenhouse.io/v1/boards/clickhouse/jobs'; const FILTER_PATTERN = /hyperdx|clickstack/i; function useRecentCommits() { return useQuery({ queryKey: ['github-commits'], queryFn: async () => { const res = await fetch(GITHUB_COMMITS_URL); if (!res.ok) { throw new Error('Failed to fetch commits'); } return res.json(); }, staleTime: 5 * 60 * 1000, }); } function useGreenhouseJobs() { return useQuery({ queryKey: ['greenhouse-jobs'], queryFn: async () => { const res = await fetch(GREENHOUSE_API_URL); if (!res.ok) { throw new Error('Failed to fetch job listings'); } return res.json(); }, staleTime: 5 * 60 * 1000, }); } export default function CareersPage() { const { data: commitsData, isLoading: commitsLoading } = useRecentCommits(); const { data, isLoading, isError } = useGreenhouseJobs(); const filteredJobs = useMemo(() => { if (!data?.jobs) return []; return data.jobs.filter(job => FILTER_PATTERN.test(job.title)); }, [data]); return ( Careers | HyperDX ClickHouse Careers: Help Build the Future of Observability Join us to build ClickStack at ClickHouse, scaling a high performance observability platform that ingests and queries petabytes of telemetry across metrics, logs, and traces.

Open positions are listed below.
{isLoading && } {isError && ( Unable to load job listings. Please try again later. )} {!isLoading && !isError && filteredJobs.length === 0 && ( No open positions at the moment. Check back soon! )} {filteredJobs.map(job => (
{job.title} {job.location.name}
))} Recent Activity See what types of problems our team (and community) have been working on lately. {commitsLoading && } {commitsData?.map(commit => (
{commit.commit.message.split('\n')[0]} {commit.author?.login ?? commit.commit.author.name} {new Date(commit.commit.author.date).toLocaleDateString()}
))}
); } ================================================ FILE: packages/app/src/ChartUtils.tsx ================================================ import { useMemo } from 'react'; import { add, differenceInSeconds } from 'date-fns'; import { omit } from 'lodash'; import SqlString from 'sqlstring'; import { z } from 'zod'; import { ColumnMetaType, filterColumnMetaByType, inferTimestampColumn, JSDataType, ResponseJSON, } from '@hyperdx/common-utils/dist/clickhouse'; import { isMetricChartConfig } from '@hyperdx/common-utils/dist/core/renderChartConfig'; import { convertDateRangeToGranularityString, convertGranularityToSeconds, getAlignedDateRange, Granularity, } from '@hyperdx/common-utils/dist/core/utils'; import { isBuilderChartConfig } from '@hyperdx/common-utils/dist/guards'; import { AggregateFunction as AggFnV2, BuilderChartConfigWithDateRange, BuilderChartConfigWithOptTimestamp, BuilderSavedChartConfig, ChartConfigWithDateRange, ChartConfigWithOptDateRange, DisplayType, Filter, MetricsDataType as MetricsDataTypeV2, SourceKind, SQLInterval, TMetricSource, TSource, } from '@hyperdx/common-utils/dist/types'; import { SegmentedControl } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import DateRangeIndicator from './components/charts/DateRangeIndicator'; import { MVOptimizationExplanationResult } from './hooks/useMVOptimizationExplanation'; import { getMetricNameSql } from './otelSemanticConventions'; import { AggFn, ChartSeries, MetricsDataType, SourceTable, TableChartSeries, TimeChartSeries, } from './types'; import { NumberFormat } from './types'; import { getColorProps, getLogLevelColorOrder, logLevelColor } from './utils'; export const SORT_ORDER = [ { value: 'asc' as const, label: 'Ascending' }, { value: 'desc' as const, label: 'Descending' }, ]; export type SortOrder = (typeof SORT_ORDER)[number]['value']; export const TABLES = [ { value: 'logs' as const, label: 'Logs / Spans' }, { value: 'metrics' as const, label: 'Metrics' }, ]; export const AGG_FNS = [ { value: 'count' as const, label: 'Count of Events', isAttributable: false }, { value: 'sum' as const, label: 'Sum', isAttributable: false }, { value: 'p99' as const, label: '99th Percentile' }, { value: 'p95' as const, label: '95th Percentile' }, { value: 'p90' as const, label: '90th Percentile' }, { value: 'p50' as const, label: 'Median' }, { value: 'avg' as const, label: 'Average' }, { value: 'max' as const, label: 'Maximum' }, { value: 'min' as const, label: 'Minimum' }, { value: 'count_distinct' as const, label: 'Count Distinct', isAttributable: false, }, { value: 'any' as const, label: 'Any' }, { value: 'none' as const, label: 'Custom' }, ]; export const getMetricAggFns = ( dataType: MetricsDataType, ): { value: AggFn; label: string }[] => { if (dataType === MetricsDataType.Histogram) { return [ { value: 'p99', label: '99th Percentile' }, { value: 'p95', label: '95th Percentile' }, { value: 'p90', label: '90th Percentile' }, { value: 'p50', label: 'Median' }, ]; } else if (dataType === MetricsDataType.Summary) { return [ { value: 'sum', label: 'Sum' }, { value: 'max', label: 'Maximum' }, { value: 'min', label: 'Minimum' }, { value: 'count', label: 'Sample Count' }, ]; } return [ { value: 'sum', label: 'Sum' }, { value: 'p99', label: '99th Percentile' }, { value: 'p95', label: '95th Percentile' }, { value: 'p90', label: '90th Percentile' }, { value: 'p50', label: 'Median' }, { value: 'avg', label: 'Average' }, { value: 'max', label: 'Maximum' }, { value: 'min', label: 'Minimum' }, ]; }; export const DEFAULT_CHART_CONFIG: Omit< BuilderSavedChartConfig, 'source' | 'connection' > = { name: '', select: [ { aggFn: 'count', aggCondition: '', aggConditionLanguage: 'lucene', valueExpression: '', }, ], where: '', whereLanguage: 'lucene', displayType: DisplayType.Line, granularity: 'auto', alignDateRangeToGranularity: true, }; export const isGranularity = (value: string): value is Granularity => { return Object.values(Granularity).includes(value as Granularity); }; function getTimeChartGranularity( granularity: string | undefined, dateRange: [Date, Date], ) { return granularity === 'auto' || granularity == null ? convertDateRangeToGranularityString(dateRange, 80) : granularity; } function getTimeChartDateRange( dateRange: [Date, Date], alignDateRangeToGranularity: boolean | undefined, granularity: string, ) { return alignDateRangeToGranularity === false ? dateRange : getAlignedDateRange(dateRange, granularity); } export function convertToTimeChartConfig( config: ChartConfigWithDateRange, ): ChartConfigWithDateRange { const granularity = getTimeChartGranularity( config.granularity, config.dateRange, ); const dateRange = getTimeChartDateRange( config.dateRange, config.alignDateRangeToGranularity, granularity, ); return isBuilderChartConfig(config) ? { ...config, dateRange, dateRangeEndInclusive: false, granularity, limit: { limit: 100000 }, } : { ...config, dateRangeEndInclusive: false, dateRange, granularity, }; } export function useTimeChartSettings( config: Pick< ChartConfigWithDateRange, | 'displayType' | 'dateRange' | 'fillNulls' | 'granularity' | 'alignDateRangeToGranularity' >, ) { return useMemo(() => { const granularity = getTimeChartGranularity( config.granularity, config.dateRange, ); const dateRange = getTimeChartDateRange( config.dateRange, config.alignDateRangeToGranularity, granularity, ); return { displayType: config.displayType, fillNulls: config.fillNulls, dateRange, granularity, }; }, [config]); } export function seriesToSearchQuery({ series, groupByValue, }: { series: ChartSeries[]; groupByValue?: string; }) { const queries = series .map((s, i) => { if (s.type === 'time' || s.type === 'table' || s.type === 'number') { const { where, aggFn, field } = s; return `${where.trim()}${ aggFn !== 'count' && field ? ` ${field}:*` : '' }${ 'groupBy' in s && s.groupBy != null && s.groupBy.length > 0 ? ` ${s.groupBy}:${groupByValue ?? '*'}` : '' }`.trim(); } }) .filter(q => q != null && q.length > 0); const q = queries.length > 1 ? queries.map(q => `(${q})`).join(' OR ') : queries.join(''); return q; } export function seriesToUrlSearchQueryParam({ series, dateRange, groupByValue = '*', }: { series: ChartSeries[]; dateRange: [Date, Date]; groupByValue?: string | undefined; }) { const q = seriesToSearchQuery({ series, groupByValue }); return new URLSearchParams({ q, from: `${dateRange[0].getTime()}`, to: `${dateRange[1].getTime()}`, }); } export function TableToggle({ table, setTableAndAggFn, }: { setTableAndAggFn: (table: SourceTable, fn: AggFn) => void; table: string; }) { return ( { const val = value ?? 'logs'; if (val === 'logs') { setTableAndAggFn('logs', 'count'); } else if (val === 'metrics') { // TODO: This should set rate if metric field is a sum // or we should just reset the field if changing tables setTableAndAggFn('metrics', 'max'); } }} data={[ { label: 'Logs/Spans', value: 'logs' }, { label: 'Metrics', value: 'metrics' }, ]} /> ); } export const ChartKeyJoiner = ' · '; export const PreviousPeriodSuffix = ' (previous)'; // Note: roundToNearestMinutes is broken in date-fns currently // additionally it doesn't support seconds or > 30min // so we need to write our own :( // see: https://github.com/date-fns/date-fns/pull/3267/files export function toStartOfInterval(date: Date, granularity: SQLInterval): Date { const [num, unit] = granularity.split(' '); const numInt = Number.parseInt(num); const roundFn = Math.floor; switch (unit) { case 'second': return new Date( Date.UTC( date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), roundFn(date.getUTCSeconds() / numInt) * numInt, ), ); case 'minute': return new Date( Date.UTC( date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), roundFn(date.getUTCMinutes() / numInt) * numInt, ), ); case 'hour': return new Date( Date.UTC( date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), roundFn(date.getUTCHours() / numInt) * numInt, ), ); case 'day': { // Clickhouse uses the # of days since unix epoch to round dates // see: https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/DateLUTImpl.h#L1059 const daysSinceEpoch = date.getTime() / 1000 / 60 / 60 / 24; const daysSinceEpochRounded = roundFn(daysSinceEpoch / numInt) * numInt; return new Date(daysSinceEpochRounded * 1000 * 60 * 60 * 24); } default: return date; } } export function timeBucketByGranularity( start: Date, end: Date, granularity: SQLInterval, ): Date[] { const buckets: Date[] = []; let current = toStartOfInterval(start, granularity); const granularitySeconds = convertGranularityToSeconds(granularity); while (current < end) { buckets.push(current); current = add(current, { seconds: granularitySeconds, }); } return buckets; } export const isAggregateFunction = (value: string) => { const fns = [ // Basic aggregates 'count', 'countIf', 'countDistinct', 'sum', 'sumIf', 'avg', 'avgIf', 'min', 'max', 'any', 'anyLast', 'groupArray', 'groupArrayInsertAt', 'groupArrayMovingAvg', 'groupArraySample', 'groupUniqArray', 'groupUniqArrayIf', 'groupArrayIntersect', 'groupArrayIntersectIf', 'groupArrayReduce', 'groupBitmap', 'groupBitmapIf', 'groupBitmapOr', 'groupBitmapXor', // Quantiles 'quantile', 'quantileIf', 'quantileExact', 'quantileExactWeighted', 'quantileTiming', 'quantileTimingWeighted', 'quantileTDigest', 'quantileTDigestWeighted', 'quantileBFloat16', 'quantileBFloat16Weighted', 'quantiles', 'median', 'medianExact', 'medianTDigest', 'medianBFloat16', // Statistical functions 'stddevPop', 'stddevPopIf', 'stddevSamp', 'stddevSampIf', 'varPop', 'varPopIf', 'varSamp', 'varSampIf', 'covarPop', 'covarSamp', 'corr', // Combinators 'uniq', 'uniqExact', 'uniqCombined', 'uniqCombined64', 'uniqHLL12', 'uniqTheta', // Bit operations 'groupBitAnd', 'groupBitOr', 'groupBitXor', // Map and tuple 'groupArrayMap', 'groupArrayTuple', 'groupArraySorted', 'topK', 'topKIf', 'topKWeighted', // Aggregate combinators 'argMin', 'argMax', 'minMap', 'maxMap', // Specialized aggregates 'runningDifference', 'retention', 'sequenceCount', 'sequenceMatch', 'histogram', 'simpleLinearRegression', 'stochasticLinearRegression', 'categoricalInformationValue', 'sumMap', 'sumMapFiltered', 'sumWithOverflow', 'entropy', 'skewPop', 'skewSamp', 'kurtPop', 'kurtSamp', ]; // Make case-insensitive since ClickHouse function names are case-insensitive const lowerValue = value.toLowerCase(); return fns.some(fn => lowerValue.includes(fn.toLowerCase() + '(')); }; export const INTEGER_NUMBER_FORMAT: NumberFormat = { factor: 1, output: 'number', mantissa: 0, thousandSeparated: true, }; export const SINGLE_DECIMAL_NUMBER_FORMAT: NumberFormat = { factor: 1, output: 'number', mantissa: 1, thousandSeparated: true, }; export const MS_NUMBER_FORMAT: NumberFormat = { factor: 1, output: 'number', mantissa: 2, thousandSeparated: true, unit: 'ms', }; export const ERROR_RATE_PERCENTAGE_NUMBER_FORMAT: NumberFormat = { output: 'percent', mantissa: 0, }; export const K8S_CPU_PERCENTAGE_NUMBER_FORMAT: NumberFormat = { output: 'percent', mantissa: 0, }; export const K8S_FILESYSTEM_NUMBER_FORMAT: NumberFormat = { output: 'byte', }; export const K8S_MEM_NUMBER_FORMAT: NumberFormat = { output: 'byte', }; export const K8S_NETWORK_NUMBER_FORMAT: NumberFormat = { output: 'byte', }; function inferValueColumns( meta: Array<{ name: string; type: string }>, excluded: Set, ) { return filterColumnMetaByType(meta, [JSDataType.Number])?.filter( c => !excluded.has(c.name), ); } function inferGroupColumns(meta: Array<{ name: string; type: string }>) { return filterColumnMetaByType(meta, [ JSDataType.String, JSDataType.Map, JSDataType.Array, ]); } export function formatResponseForPieChart( data: ResponseJSON>, getColor: (index: number, label: string) => string, ): Array<{ label: string; value: number; color: string }> { if (data.meta == null) { throw new Error('No meta data found in response'); } if (data.data.length === 0) return []; const valueColumns = inferValueColumns(data.meta, new Set()) ?? []; if (valueColumns.length === 0) { throw new Error( `No value columns found in result column metadata. Make sure a numeric column exists in the result set.\n\nResult column metadata: ${JSON.stringify(data.meta)}`, ); } const valueColumn = valueColumns[0].name; const groupByColumns = inferGroupColumns(data.meta); return ( data.data .map(row => { const label = groupByColumns?.length ? groupByColumns.map(({ name }) => row[name]).join(' - ') : valueColumn; const rawValue = row[valueColumn]; const value = typeof rawValue === 'number' ? rawValue : Number.parseFloat(`${rawValue}`); return { label, value }; }) .filter(entry => !isNaN(entry.value) && isFinite(entry.value)) // Sort in descending order so the largest slice is always first and gets the first color in the palette .sort((a, b) => b.value - a.value) .map((entry, index) => ({ ...entry, color: getColor(index, entry.label), })) ); } export function getPreviousDateRange(currentRange: [Date, Date]): [Date, Date] { const [start, end] = currentRange; const offsetSeconds = differenceInSeconds(end, start); return [ new Date(start.getTime() - offsetSeconds * 1000), new Date(end.getTime() - offsetSeconds * 1000), ]; } export interface LineData { dataKey: string; currentPeriodKey: string; previousPeriodKey: string; displayName: string; color: string; isDashed?: boolean; } interface LineDataWithOptionalColor extends Omit { color?: string; } function setLineColors( sortedLineData: LineDataWithOptionalColor[], ): LineData[] { // Ensure that the current and previous period lines are the same color const lineColorByCurrentPeriodKey = new Map(); let colorIndex = 0; return sortedLineData.map(line => { const currentPeriodKey = line.currentPeriodKey; if (lineColorByCurrentPeriodKey.has(currentPeriodKey)) { line.color = lineColorByCurrentPeriodKey.get(currentPeriodKey); } else if (!line.color) { line.color = getColorProps( colorIndex++, line.displayName ?? line.dataKey, ); lineColorByCurrentPeriodKey.set(currentPeriodKey, line.color); } else { lineColorByCurrentPeriodKey.set(currentPeriodKey, line.color); } return line as LineData; }); } function firstGroupColumnIsLogLevel( source: TSource | undefined, groupColumns: ColumnMetaType[], ) { if (!source || groupColumns.length !== 1) return false; if (source.kind === SourceKind.Log) { return groupColumns[0].name === source.severityTextExpression; } if (source.kind === SourceKind.Trace) { return groupColumns[0].name === source.statusCodeExpression; } return false; } function addResponseToFormattedData({ response, lineDataMap, tsBucketMap, source, previousPeriodOffsetSeconds, isPreviousPeriod, hiddenSeries = [], }: { tsBucketMap: Map>; lineDataMap: { [keyName: string]: LineDataWithOptionalColor }; response: ResponseJSON>; source?: TSource; isPreviousPeriod: boolean; previousPeriodOffsetSeconds: number; hiddenSeries?: string[]; }) { const { meta, data } = response; if (meta == null) { throw new Error('No metadata found in response'); } const timestampColumn = inferTimestampColumn(meta); if (timestampColumn == null) { throw new Error( `No timestamp column found in result column metadata: ${JSON.stringify(meta)}`, ); } const valueColumns = inferValueColumns(meta, new Set(hiddenSeries)) ?? []; const groupColumns = inferGroupColumns(meta) ?? []; const isSingleValueColumn = valueColumns.length === 1; const hasGroupColumns = groupColumns.length > 0; for (const row of data) { const date = new Date(row[timestampColumn.name]); // Previous period data needs to be shifted forward to align with current period const offsetSeconds = isPreviousPeriod ? previousPeriodOffsetSeconds : 0; const ts = Math.round(date.getTime() / 1000 + offsetSeconds); for (const valueColumn of valueColumns) { let tsBucket = tsBucketMap.get(ts); if (tsBucket == null) { tsBucket = { [timestampColumn.name]: ts }; tsBucketMap.set(ts, tsBucket); } const currentPeriodKey = [ // Simplify the display name if there's only one series and a group by ...(isSingleValueColumn && hasGroupColumns ? [] : [valueColumn.name]), ...groupColumns.map(g => { const v = row[g.name]; return typeof v === 'object' && v !== null ? JSON.stringify(v) : v; }), ].join(ChartKeyJoiner); const previousPeriodKey = `${currentPeriodKey}${PreviousPeriodSuffix}`; const keyName = isPreviousPeriod ? previousPeriodKey : currentPeriodKey; // UInt64 are returned as strings, we'll convert to number // and accept a bit of floating point error const rawValue = row[valueColumn.name]; const value = typeof rawValue === 'number' ? rawValue : Number.parseFloat(rawValue); // Mutate the existing bucket object to avoid repeated large object copies tsBucket[keyName] = value; // Special handling for log level / trace severity colors let color: string | undefined = undefined; if (firstGroupColumnIsLogLevel(source, groupColumns)) { color = logLevelColor(row[groupColumns[0].name]); } lineDataMap[keyName] = { dataKey: keyName, currentPeriodKey, previousPeriodKey, displayName: keyName, color, isDashed: isPreviousPeriod, }; } } } // Input: { ts, value1, value2, groupBy1, groupBy2 }, // Output: { ts, [value1Name, groupBy1, groupBy2]: value1, [...]: value2 } export function formatResponseForTimeChart({ currentPeriodResponse, previousPeriodResponse, dateRange, granularity, generateEmptyBuckets = true, source, hiddenSeries = [], previousPeriodOffsetSeconds = 0, }: { dateRange: [Date, Date]; granularity?: SQLInterval; currentPeriodResponse: ResponseJSON>; previousPeriodResponse?: ResponseJSON>; generateEmptyBuckets?: boolean; source?: TSource; hiddenSeries?: string[]; previousPeriodOffsetSeconds?: number; }) { const meta = currentPeriodResponse.meta; if (meta == null) { throw new Error('No meta data found in response'); } const timestampColumn = inferTimestampColumn(meta); const valueColumns = inferValueColumns(meta, new Set(hiddenSeries)) ?? []; const groupColumns = inferGroupColumns(meta) ?? []; const isSingleValueColumn = valueColumns.length === 1; if (timestampColumn == null) { throw new Error( `No timestamp column found in result column metadata. Make sure a Date/DateTime column exists in the result set.\n\nResult column metadata: ${JSON.stringify(meta)}`, ); } if (valueColumns.length === 0) { throw new Error( `No value columns found in result column metadata. Make sure a numeric column exists in the result set.\n\nResult column metadata: ${JSON.stringify(meta)}`, ); } // Timestamp -> { tsCol, line1, line2, ...} const tsBucketMap: Map> = new Map(); const lineDataMap: { [keyName: string]: LineDataWithOptionalColor; } = {}; addResponseToFormattedData({ response: currentPeriodResponse, lineDataMap, tsBucketMap, source, isPreviousPeriod: false, previousPeriodOffsetSeconds, hiddenSeries, }); if (previousPeriodResponse != null) { addResponseToFormattedData({ response: previousPeriodResponse, lineDataMap, tsBucketMap, source, isPreviousPeriod: true, previousPeriodOffsetSeconds, hiddenSeries, }); } const logLevelColorOrder = getLogLevelColorOrder(); const sortedLineData = Object.values(lineDataMap).sort((a, b) => { return ( logLevelColorOrder.findIndex(color => color === a.color) - logLevelColorOrder.findIndex(color => color === b.color) ); }); if (generateEmptyBuckets && granularity != null) { const generatedTsBuckets = timeBucketByGranularity( dateRange[0], dateRange[1], granularity, ); generatedTsBuckets.forEach(date => { const ts = date.getTime() / 1000; const tsBucket = tsBucketMap.get(ts); if (tsBucket == null) { const tsBucket: Record = { [timestampColumn.name]: ts, }; for (const line of sortedLineData) { tsBucket[line.dataKey] = 0; } tsBucketMap.set(ts, tsBucket); } else { for (const line of sortedLineData) { if (tsBucket[line.dataKey] == null) { tsBucket[line.dataKey] = 0; } } tsBucketMap.set(ts, tsBucket); } }); } // Sort results again by timestamp const graphResults: { [key: string]: number | undefined; }[] = Array.from(tsBucketMap.values()).sort( (a, b) => a[timestampColumn.name] - b[timestampColumn.name], ); const sortedLineDataWithColors = setLineColors(sortedLineData); return { graphResults, timestampColumn, lineData: sortedLineDataWithColors, groupColumns: groupColumns.map(g => g.name), valueColumns: valueColumns.map(v => v.name), isSingleValueColumn, }; } // Define a mapping from app AggFn to common-utils AggregateFunction export const mapV1AggFnToV2 = (aggFn?: AggFn): AggFnV2 | undefined => { if (aggFn == null) { return aggFn; } // Map rate-based aggregations to their base aggregation if (aggFn.endsWith('_rate')) { return mapV1AggFnToV2(aggFn.replace('_rate', '') as AggFn); } // Map percentiles to quantile if ( aggFn === 'p50' || aggFn === 'p90' || aggFn === 'p95' || aggFn === 'p99' ) { return 'quantile'; } // Map per-time-unit counts to count if ( aggFn === 'count_per_sec' || aggFn === 'count_per_min' || aggFn === 'count_per_hour' ) { return 'count'; } // For standard aggregations that exist in both, return as is if ( [ 'avg', 'count', 'count_distinct', 'last_value', 'max', 'min', 'sum', ].includes(aggFn) ) { return aggFn as AggFnV2; } throw new Error(`Unsupported aggregation function in v2: ${aggFn}`); }; export const convertV1GroupByToV2 = ( metricSource: TMetricSource, groupBy: string[], ): string => { return groupBy .map(g => { if (g.startsWith('k8s')) { return `${metricSource.resourceAttributesExpression}['${g}']`; } return g; }) .join(','); }; export const convertV1ChartConfigToV2 = ( chartConfig: { // only support time or table series series: (TimeChartSeries | TableChartSeries)[]; granularity?: Granularity; dateRange: [Date, Date]; seriesReturnType: 'ratio' | 'column'; displayType?: 'stacked_bar' | 'line'; name?: string; fillNulls?: number | false; sortOrder?: SortOrder; }, source: { log?: TSource; metric?: TMetricSource; trace?: TSource; }, ): BuilderChartConfigWithDateRange => { const { series, granularity, dateRange, displayType = 'line', fillNulls, } = chartConfig; if (series.length < 1) { throw new Error('series is required'); } const firstSeries = series[0]; const convertedDisplayType = displayType === 'stacked_bar' ? DisplayType.StackedBar : DisplayType.Line; if (firstSeries.table === 'logs') { // TODO: this might not work properly since logs + traces are mixed in v1 throw new Error('IMPLEMENT ME (logs)'); } else if (firstSeries.table === 'metrics') { if (source.metric == null) { throw new Error('source.metric is required for metrics'); } return { select: series.map(s => { const field = s.field ?? ''; const [metricName, rawMetricDataType] = field .split(' - ') .map(s => s.trim()); // Check if this metric name needs version-based SQL transformation const metricNameSql = getMetricNameSql(metricName); const metricDataType = z .nativeEnum(MetricsDataTypeV2) .parse(rawMetricDataType?.toLowerCase()); return { aggFn: mapV1AggFnToV2(s.aggFn), metricType: metricDataType, valueExpression: field, metricName, metricNameSql, aggConditionLanguage: 'lucene', aggCondition: s.where, }; }), from: source.metric?.from, numberFormat: firstSeries.numberFormat, groupBy: convertV1GroupByToV2(source.metric, firstSeries.groupBy), dateRange, connection: source.metric?.connection, metricTables: source.metric?.metricTables, timestampValueExpression: source.metric?.timestampValueExpression, granularity, where: '', fillNulls, displayType: convertedDisplayType, }; } throw new Error(`unsupported table in v2: ${firstSeries.table}`); }; /** * Build search URL for viewing events based on group-by values * Used by both chart clicks and table row clicks */ export function buildEventsSearchUrl({ source, config, dateRange, groupFilters, valueRangeFilter, }: { source: TSource; config: BuilderChartConfigWithDateRange; dateRange: [Date, Date]; groupFilters?: Array<{ column: string; value: any }>; valueRangeFilter?: { expression: string; value: number; threshold?: number }; }): string | null { if (!source?.id) { return null; } const isMetricChart = isMetricChartConfig(config); if (isMetricChart) { const logSourceId = source.kind === SourceKind.Metric || source.kind === SourceKind.Trace ? source.logSourceId : undefined; if (logSourceId == null) { notifications.show({ color: 'yellow', message: 'No log source is associated with the selected metric source.', }); return null; } } let where = config.where; let whereLanguage = config.whereLanguage || 'lucene'; if ( where.length === 0 && Array.isArray(config.select) && config.select.length === 1 ) { where = config.select[0].aggCondition ?? ''; whereLanguage = config.select[0].aggConditionLanguage ?? 'lucene'; } const additionalFilters: Filter[] = []; // Add group-by column filters if (groupFilters && groupFilters.length > 0) { groupFilters.forEach(({ column, value }) => { if (column && value != null) { // Can't use SQLString.escape here because the search endpoint relies on exist match for UI const condition = `${column} IN (${SqlString.escape(value)})`; additionalFilters.push({ type: 'sql', condition }); } }); } // Add Y-axis value range filter (±threshold) for charts if (valueRangeFilter) { const { expression, value, threshold = 0.05 } = valueRangeFilter; const hasAggregateFunction = isAggregateFunction(expression); if (!hasAggregateFunction) { const lowerBound = value * (1 - threshold); const upperBound = value * (1 + threshold); // Can't use SQLString.escape here because the search endpoint relies on exist match for UI const condition = `${expression} BETWEEN ${SqlString.escape(lowerBound)} AND ${SqlString.escape(upperBound)}`; additionalFilters.push({ type: 'sql', condition, }); } } // Get the time range const from = dateRange[0].getTime(); const to = dateRange[1].getTime(); const params: Record = { source: source?.id ?? '', where: where, whereLanguage: whereLanguage, filters: JSON.stringify([...(config.filters ?? []), ...additionalFilters]), isLive: 'false', from: from.toString(), to: to.toString(), }; // If its a metric chart, we don't pass the where and filters if (isMetricChart) { params.where = ''; params.whereLanguage = 'lucene'; params.filters = JSON.stringify([]); params.source = (source.kind === SourceKind.Metric || source.kind === SourceKind.Trace ? source.logSourceId : undefined) ?? ''; } // Include the select parameter if provided to preserve custom columns // eventTableSelect is used for charts that override select (like histograms with count) // to preserve the original table's select expression if (config.eventTableSelect) { params.select = config.eventTableSelect; } return `/search?${new URLSearchParams(params).toString()}`; } /** * Extract group column names from chart config's groupBy field * Handles both string format ("col1, col2") and array format ([{ valueExpression: "col1" }, ...]) */ function extractGroupColumns( groupBy: BuilderChartConfigWithDateRange['groupBy'], ): string[] { if (!groupBy) return []; if (typeof groupBy === 'string') { // String GROUP BY: "col1, col2" return groupBy.split(',').map(v => v.trim()); } // Array GROUP BY: [{ valueExpression: "col1" }, ...] or ["col1", ...] return groupBy.map(g => (typeof g === 'string' ? g : g.valueExpression)); } /** * Build search URL from a table row click * Extracts group filters and value range filter from the row data */ export function buildTableRowSearchUrl({ row, source, config, dateRange, }: { row: Record; source: TSource | undefined; config: BuilderChartConfigWithDateRange; dateRange: [Date, Date]; }): string | null { if (!source?.id) { return null; } // Extract group-by column names and build filters from row values const groupFilters: Array<{ column: string; value: any }> = []; const groupColumns = extractGroupColumns(config.groupBy); groupColumns.forEach(col => { if (row[col] != null) { groupFilters.push({ column: col, value: row[col] }); } }); // Build value range filter from the first select column let valueRangeFilter: { expression: string; value: number } | undefined; const firstSelect = config.select?.[0]; if (firstSelect) { const aggFn = typeof firstSelect === 'string' ? undefined : firstSelect.aggFn; const isAttributable = AGG_FNS.find(fn => fn.value === aggFn)?.isAttributable !== false; if (isAttributable) { const valueExpression = typeof firstSelect === 'string' ? firstSelect : firstSelect.valueExpression; // Extract group column names to exclude them from value columns const groupColumnSet = new Set(extractGroupColumns(config.groupBy)); // Find the first value column (non-group column) const valueColumn = Object.keys(row).find( key => !groupColumnSet.has(key), ); const rowValue = valueColumn ? row[valueColumn] : undefined; if (rowValue != null && typeof rowValue === 'number') { valueRangeFilter = { expression: valueExpression, value: rowValue, }; } } } return buildEventsSearchUrl({ source, config, dateRange, groupFilters, valueRangeFilter, }); } export function convertToNumberChartConfig( config: BuilderChartConfigWithDateRange, ): BuilderChartConfigWithOptTimestamp { return omit(config, ['granularity', 'groupBy']); } export function convertToPieChartConfig( config: BuilderChartConfigWithOptTimestamp, ): BuilderChartConfigWithOptTimestamp { return omit(config, ['granularity']); } export function convertToTableChartConfig( config: BuilderChartConfigWithOptTimestamp, ): BuilderChartConfigWithOptTimestamp { const convertedConfig = structuredClone(omit(config, ['granularity'])); // Set a default limit if not already set if (!convertedConfig.limit) { convertedConfig.limit = { limit: 200 }; } // Set a default orderBy if groupBy is set but orderBy is not, // so that the set of rows within the limit is stable. if ( convertedConfig.groupBy && typeof convertedConfig.groupBy === 'string' && !convertedConfig.orderBy ) { convertedConfig.orderBy = convertedConfig.groupBy; } return convertedConfig; } export function buildMVDateRangeIndicator({ mvOptimizationData, originalDateRange, }: { mvOptimizationData?: MVOptimizationExplanationResult; originalDateRange: [Date, Date]; }) { const mvDateRange = mvOptimizationData?.optimizedConfig?.dateRange; if (!mvDateRange) return null; const mvGranularity = mvOptimizationData?.explanations.find(e => e.success) ?.mvConfig.minGranularity; return ( ); } export function shouldFillNullsWithZero( fillNulls: ChartConfigWithOptDateRange['fillNulls'], ): boolean { // To match legacy behavior, fill nulls with 0 unless explicitly disabled return fillNulls !== false; } ================================================ FILE: packages/app/src/Checkbox.tsx ================================================ export default function Checkbox({ id, className, labelClassName, checked, onChange, label, disabled, title, }: { id: string; className?: string; labelClassName?: string; checked: boolean; onChange: () => void; label: React.ReactNode; disabled?: boolean; title?: string; }) { return ( ); } ================================================ FILE: packages/app/src/ClickhousePage.tsx ================================================ import { useEffect, useMemo, useState } from 'react'; import dynamic from 'next/dynamic'; import { parseAsFloat, parseAsStringEnum, useQueryState, useQueryStates, } from 'nuqs'; import { useForm, useWatch } from 'react-hook-form'; import { sql } from '@codemirror/lang-sql'; import { format as formatSql } from '@hyperdx/common-utils/dist/sqlFormatter'; import { ChartConfigWithDateRange, DisplayType, Filter, } from '@hyperdx/common-utils/dist/types'; import { ActionIcon, Box, Button, Grid, Group, SegmentedControl, Stack, Tabs, Text, Tooltip, } from '@mantine/core'; import { IconRefresh } from '@tabler/icons-react'; import ReactCodeMirror from '@uiw/react-codemirror'; import { ConnectionSelectControlled } from '@/components/ConnectionSelect'; import { DBTimeChart } from '@/components/DBTimeChart'; import { TimePicker } from '@/components/TimePicker'; import { withAppNav } from '@/layout'; import { ChartBox } from './components/ChartBox'; import DBHeatmapChart from './components/DBHeatmapChart'; import { DBSqlRowTable } from './components/DBRowTable'; import DBTableChart from './components/DBTableChart'; import OnboardingModal from './components/OnboardingModal'; import { useDashboardRefresh } from './hooks/useDashboardRefresh'; import { useConnections } from './connection'; import { parseTimeQuery, useNewTimeQuery } from './timeQuery'; import { usePrevious } from './utils'; // TODO: This is a hack to set the default time range const defaultTimeRange = parseTimeQuery('Past 1h', false) as [Date, Date]; const from = { databaseName: 'system', tableName: 'query_log', }; function InfrastructureTab({ searchedTimeRange, connection, onTimeRangeSelect, }: { searchedTimeRange: [Date, Date]; connection: string; onTimeRangeSelect: (start: Date, end: Date) => void; }) { return ( Network Network activity for the entire machine, not only Clickhouse. } config={{ select: [ { aggFn: 'avg', aggCondition: '', valueExpression: 'value', }, ], from: { databaseName: 'system', tableName: 'asynchronous_metric_log', }, where: `metric ILIKE 'NetworkReceiveBytes_%' OR metric ILIKE 'NetworkSendBytes_%'`, groupBy: [{ valueExpression: 'metric' }], connection, dateRange: searchedTimeRange, timestampValueExpression: 'event_time', displayType: DisplayType.Line, numberFormat: { output: 'byte', mantissa: 2, }, }} onTimeRangeSelect={onTimeRangeSelect} /> ); } function InsertsTab({ searchedTimeRange, connection, onTimeRangeSelect, }: { searchedTimeRange: [Date, Date]; connection: string; onTimeRangeSelect: (start: Date, end: Date) => void; }) { const [insertsBy, setInsertsBy] = useQueryState( 'insertsBy', parseAsStringEnum(['queries', 'rows', 'bytes']).withDefault('queries'), ); const insertsPerTableConfig: ChartConfigWithDateRange = useMemo(() => { const filters: Filter[] = insertsBy === 'queries' ? [ { type: 'sql_ast', operator: '=', left: 'query_kind', right: `'Insert'`, }, // Each query will have a QueryStart and either a QueryFinish or an Exception event. // Filter to only QueryStart to avoid double counting. { type: 'sql_ast', operator: '=', left: 'type', right: `'QueryStart'`, }, ] : [ // Async inserts have no written_rows/written_bytes, when async inserts are enabled - the // associated written_rows/written_bytes will be present in AsyncInsertFlush events. { type: 'sql', condition: `query_kind IN ('Insert', 'AsyncInsertFlush')`, }, // Filter for only QueryFinish events to count only completed inserts. QueryStart // events will not have written_rows/written_bytes populated. { type: 'sql_ast', operator: '=', left: 'type', right: `'QueryFinish'`, }, ]; return { select: insertsBy === 'queries' ? [ { aggFn: 'count' as const, valueExpression: '', aggCondition: '', alias: 'Queries', }, ] : insertsBy === 'rows' ? [ { aggFn: 'sum' as const, valueExpression: 'written_rows' as const, aggCondition: '', alias: 'Rows', }, ] : [ { aggFn: 'sum' as const, valueExpression: 'written_bytes' as const, aggCondition: '', alias: 'Bytes', }, ], from, where: '', timestampValueExpression: 'event_time', dateRange: searchedTimeRange, displayType: DisplayType.Line, filters, groupBy: [{ valueExpression: 'tables' }], connection, numberFormat: insertsBy === 'bytes' ? { output: 'byte', mantissa: 2, } : undefined, }; }, [insertsBy, searchedTimeRange, connection]); return ( Insert{' '} {insertsBy === 'queries' ? 'Queries' : insertsBy === 'rows' ? 'Rows' : 'Bytes'}{' '} Per Table } toolbarPrefix={[ { // @ts-ignore setInsertsBy(value); }} data={[ { label: 'Queries', value: 'queries' }, { label: 'Rows', value: 'rows' }, { label: 'Bytes', value: 'bytes' }, ]} />, ]} config={insertsPerTableConfig} onTimeRangeSelect={onTimeRangeSelect} /> Active Parts Per Partition Recommended to stay under 300, ClickHouse will automatically throttle inserts after 1,000 parts per partition and stop inserts at 3,000 parts per partition. } config={{ dateRange: searchedTimeRange, select: [ { aggFn: 'count', valueExpression: '', alias: 'Part Count', }, { aggFn: 'sum', valueExpression: 'rows', alias: 'Rows', }, { valueExpression: 'database', alias: 'Database', }, { valueExpression: 'table', alias: 'Table', }, { valueExpression: 'partition', alias: 'Partition', }, ], from: { databaseName: 'system', tableName: 'parts', }, where: `active=1`, groupBy: [ { valueExpression: 'database' }, { valueExpression: 'table', }, { valueExpression: 'partition', }, ], connection, orderBy: [ { valueExpression: 'count()', ordering: 'DESC', }, ], limit: { limit: 100 }, selectGroupBy: false, }} /> ); } function ClickhousePage() { const { data: connections } = useConnections(); const [_connection, setConnection] = useQueryState('connection'); const [latencyFilter, setLatencyFilter] = useQueryStates({ latencyMin: parseAsFloat, latencyMax: parseAsFloat, }); const [tab, setTab] = useQueryState( 'tab', parseAsStringEnum(['selects', 'inserts', 'infrastructure']).withDefault( 'selects', ), ); const connection = _connection ?? connections?.[0]?.id ?? ''; const { control } = useForm({ values: { connection, }, }); const watchedConnection = useWatch({ control, name: 'connection' }); const previousWatchedConnection = usePrevious(watchedConnection); useEffect(() => { if (previousWatchedConnection !== watchedConnection) { setConnection(watchedConnection ?? null); } }, [watchedConnection, setConnection, previousWatchedConnection]); const DEFAULT_INTERVAL = 'Past 1h'; const [displayedTimeInputValue, setDisplayedTimeInputValue] = useState(DEFAULT_INTERVAL); const { searchedTimeRange, onSearch, onTimeRangeSelect } = useNewTimeQuery({ initialDisplayValue: DEFAULT_INTERVAL, initialTimeRange: defaultTimeRange, setDisplayedTimeInputValue, // showRelativeInterval: isLive, }); // For future use if Live button is added const [isLive, setIsLive] = useState(false); const { manualRefreshCooloff, refresh } = useDashboardRefresh({ searchedTimeRange, onTimeRangeSelect, isLive, }); const filters = useMemo(() => { const { latencyMin, latencyMax } = latencyFilter; return [ ...(latencyMax != null ? [ { type: 'sql_ast' as const, operator: '<' as const, left: 'query_duration_ms', right: `${latencyMax}`, }, ] : []), ...(latencyMin != null ? [ { type: 'sql_ast' as const, operator: '>' as const, left: 'query_duration_ms', right: `${latencyMin}`, }, ] : []), ]; }, [latencyFilter]); const heatmapToolbarItems = useMemo(() => { if (latencyFilter.latencyMin != null || latencyFilter.latencyMax != null) { return [ , ]; } }, [latencyFilter, onSearch, setLatencyFilter]); return ( Clickhouse Dashboard
{ e.preventDefault(); onSearch(displayedTimeInputValue); return false; }} >
Select Inserts {/* Merges / Mutations */} Infrastructure { onTimeRangeSelect( new Date(tsStart * 1000), new Date(tsEnd * 1000), ); setLatencyFilter({ latencyMax, latencyMin, }); }} /> { onTimeRangeSelect(start, end); }} /> Slowest Queries { return ( ); }} config={{ select: `event_time, query_kind, read_rows, formatReadableSize(memory_usage) as memory_usage, query_duration_ms, query`, dateRange: searchedTimeRange, from, where: `( type='ExceptionWhileProcessing' OR type='QueryFinish' )`, timestampValueExpression: 'event_time', connection, orderBy: [ { valueExpression: 'query_duration_ms', ordering: 'DESC', }, ], filters: [ ...filters, { type: 'sql_ast', operator: '=', left: 'query_kind', right: `'Select'`, }, ], limit: { limit: 100 }, }} />
); } const ClickhousePageDynamic = dynamic(async () => ClickhousePage, { ssr: false, }); // @ts-ignore ClickhousePageDynamic.getLayout = withAppNav; export default ClickhousePageDynamic; ================================================ FILE: packages/app/src/Clipboard.tsx ================================================ import { useState } from 'react'; import cx from 'classnames'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import { Button } from '@mantine/core'; export default function Clipboard({ text, className, children, }: { text: string; className?: string; children: ({ isCopied }: { isCopied: boolean }) => React.ReactNode; }) { const [isCopied, setIsCopied] = useState(false); return ( { setIsCopied(true); setTimeout(() => setIsCopied(false), 2000); }} > ); } ================================================ FILE: packages/app/src/DBChartPage.tsx ================================================ import { useRef, useState } from 'react'; import dynamic from 'next/dynamic'; import Head from 'next/head'; import { parseAsJson, useQueryState } from 'nuqs'; import { useForm } from 'react-hook-form'; import { useHotkeys } from 'react-hotkeys-hook'; import { SavedChartConfig, SourceKind } from '@hyperdx/common-utils/dist/types'; import { Alert, Box, Button, Collapse, Divider, Group, Loader, Pill, Text, } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { IconChevronDown, IconChevronUp, IconInfoCircle, } from '@tabler/icons-react'; import api from '@/api'; import { DEFAULT_CHART_CONFIG } from '@/ChartUtils'; import EditTimeChartForm from '@/components/DBEditTimeChartForm'; import { InputControlled } from '@/components/InputControlled'; import { SourceSelectControlled } from '@/components/SourceSelect'; import { useChartAssistant } from '@/hooks/ai'; import { withAppNav } from '@/layout'; import { useSources } from '@/source'; import { useBrandDisplayName } from '@/theme/ThemeProvider'; import { parseTimeQuery, useNewTimeQuery } from '@/timeQuery'; import { useLocalStorage } from '@/utils'; // Autocomplete can focus on column/map keys // Sampled field discovery and full field discovery // TODO: This is a hack to set the default time range const defaultTimeRange = parseTimeQuery('Past 1h', false) as [Date, Date]; function AIAssistant({ setConfig, onTimeRangeSelect, submitRef, aiAssistantEnabled, }: { setConfig: (config: SavedChartConfig) => void; onTimeRangeSelect: (start: Date, end: Date) => void; submitRef: React.RefObject<(() => void) | undefined>; aiAssistantEnabled: boolean; }) { const brandName = useBrandDisplayName(); const [opened, setOpened] = useState(false); const [alertDismissed, setAlertDismissed] = useLocalStorage( 'ai-assistant-alert-dismissed', false, ); const { control, setValue, handleSubmit } = useForm<{ text: string; source: string; }>({ defaultValues: { text: '', source: '', }, }); const chartAssistant = useChartAssistant(); const onSubmit = (data: { text: string; source: string }) => { chartAssistant.mutate( { sourceId: data.source, text: data.text, }, { onSuccess(data) { setConfig({ ...data, where: '' }); onTimeRangeSelect( new Date(data.dateRange[0]), new Date(data.dateRange[1]), ); // FIXME: This is a hack to submit after the form has been updated setTimeout(() => { if (submitRef.current) { submitRef.current(); } }, 100); notifications.show({ color: 'green', message: 'Chart generated successfully', autoClose: 2000, }); }, onError(err) { notifications.show({ color: 'red', title: 'Error Generating Chart', message: err.message, autoClose: 2000, }); }, }, ); }; useHotkeys( 'a', () => { setOpened(v => !v); }, { preventDefault: true, }, ); if (!aiAssistantEnabled && !alertDismissed) { return ( } variant="outline" withCloseButton onClose={() => setAlertDismissed(true)} p="xxs" > New AI Assistant available, enable with configuring the{' '} ANTHROPIC_API_KEY environment variable on the{' '} {brandName} server. ); } else if (!aiAssistantEnabled) { return null; } return ( Experimental {opened && ( // eslint-disable-next-line react-hooks/refs
{chartAssistant.isPending ? ( ) : ( )}
)}
); } function DBChartExplorerPage() { const brandName = useBrandDisplayName(); const { searchedTimeRange, displayedTimeInputValue, setDisplayedTimeInputValue, onSearch, onTimeRangeSelect, } = useNewTimeQuery({ initialDisplayValue: 'Past 1h', initialTimeRange: defaultTimeRange, // showRelativeInterval: isLive, }); const submitRef = useRef<(() => void) | undefined>(undefined); const { data: sources } = useSources(); const { data: me } = api.useMe(); const [chartConfig, setChartConfig] = useQueryState( 'config', parseAsJson().withDefault({ ...DEFAULT_CHART_CONFIG, source: sources?.[0]?.id ?? '', connection: sources?.[0]?.connection, }), ); return ( Chart Explorer - {brandName} { setChartConfig(config); }} dateRange={searchedTimeRange} setDisplayedTimeInputValue={setDisplayedTimeInputValue} displayedTimeInputValue={displayedTimeInputValue} onTimeRangeSearch={onSearch} onTimeRangeSelect={onTimeRangeSelect} submitRef={submitRef} /> ); } const DBChartExplorerPageDynamic = dynamic(async () => DBChartExplorerPage, { ssr: false, }); // @ts-ignore DBChartExplorerPageDynamic.getLayout = withAppNav; export default DBChartExplorerPageDynamic; ================================================ FILE: packages/app/src/DBDashboardImportPage.tsx ================================================ import { useEffect, useRef, useState } from 'react'; import dynamic from 'next/dynamic'; import Head from 'next/head'; import { useRouter } from 'next/router'; import { Controller, useForm, useWatch } from 'react-hook-form'; import { StringParam, useQueryParam } from 'use-query-params'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { convertToDashboardDocument } from '@hyperdx/common-utils/dist/core/utils'; import { isRawSqlSavedChartConfig } from '@hyperdx/common-utils/dist/guards'; import { DashboardTemplateSchema, SavedChartConfig, } from '@hyperdx/common-utils/dist/types'; import { Button, Collapse, Container, Group, Input, Stack, Table, Text, TextInput, } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { useDisclosure } from '@mantine/hooks'; import { notifications } from '@mantine/notifications'; import { IconChevronRight, IconFile, IconUpload, IconX, } from '@tabler/icons-react'; import { PageHeader } from './components/PageHeader'; import SelectControlled from './components/SelectControlled'; import { useBrandDisplayName } from './theme/ThemeProvider'; import { useConnections } from './connection'; import { useCreateDashboard, useUpdateDashboard } from './dashboard'; import { withAppNav } from './layout'; import { useSources } from './source'; // The schema for the JSON data we expect to receive const InputSchema = DashboardTemplateSchema; type Input = z.infer; function FileSelection({ onComplete, }: { onComplete: (input: Input | null) => void; }) { // The schema for the form data we expect to receive const FormSchema = z.object({ file: z.instanceof(File).nullable() }); type FormValues = z.infer; const [error, setError] = useState<{ message: string; details?: string; } | null>(null); const [errorDetails, { toggle: toggleErrorDetails }] = useDisclosure(false); const { control, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(FormSchema), }); const onSubmit = async ({ file }: FormValues) => { setError(null); if (!file) return; try { const text = await file.text(); const data = JSON.parse(text); const parsed = InputSchema.parse(data); // throws if invalid onComplete(parsed); } catch (e: any) { onComplete(null); setError({ message: 'Failed to Import Dashboard', details: e?.message ?? 'Failed to parse/validate JSON', }); } }; return (
( { field.onChange(files[0]); handleSubmit(onSubmit)(); }} onReject={() => setError({ message: 'Invalid File Type or Size' }) } maxSize={5 * 1024 ** 2} maxFiles={1} accept={['application/json']} >
Import Dashboard Drag and drop a JSON file here, or click to select from your computer.
)} /> {error && (
{error.message} {error.details && ( <> {error.details} )}
)}
); } const MappingForm = z.object({ dashboardName: z.string().min(1), sourceMappings: z.array(z.string()), connectionMappings: z.array(z.string()), filterSourceMappings: z.array(z.string()).optional(), }); type MappingFormValues = z.infer; function Mapping({ input }: { input: Input }) { const router = useRouter(); const { data: sources } = useSources(); const { data: connections } = useConnections(); const [dashboardId] = useQueryParam('dashboardId', StringParam); const { handleSubmit, getFieldState, control, setValue } = useForm({ resolver: zodResolver(MappingForm), defaultValues: { dashboardName: input.name, sourceMappings: input.tiles.map(() => ''), connectionMappings: input.tiles.map(() => ''), }, }); // When the input changes, reset the form useEffect(() => { if (!input || !sources || !connections) return; const sourceMappings = input.tiles.map(tile => { const config = tile.config as SavedChartConfig; if (!config.source) return ''; const match = sources.find( source => source.name.toLowerCase() === config.source!.toLowerCase(), ); return match?.id || ''; }); const connectionMappings = input.tiles.map(tile => { const config = tile.config as SavedChartConfig; if (!isRawSqlSavedChartConfig(config)) return ''; const match = connections.find( conn => conn.name.toLowerCase() === config.connection.toLowerCase(), ); return match?.id || ''; }); const filterSourceMappings = input.filters?.map(filter => { const match = sources.find( source => source.name.toLowerCase() === filter.source.toLowerCase(), ); return match?.id || ''; }); setValue('sourceMappings', sourceMappings); setValue('connectionMappings', connectionMappings); setValue('filterSourceMappings', filterSourceMappings); }, [setValue, sources, connections, input]); const isUpdatingRef = useRef(false); const sourceMappings = useWatch({ control, name: 'sourceMappings' }); const connectionMappings = useWatch({ control, name: 'connectionMappings' }); const prevSourceMappingsRef = useRef(sourceMappings); const prevConnectionMappingsRef = useRef(connectionMappings); // Propagate source mapping changes to other tiles/filters with the same input source useEffect(() => { if (isUpdatingRef.current) return; if (!sourceMappings || !input.tiles) return; const changedIdx = sourceMappings.findIndex( (mapping, idx) => mapping !== prevSourceMappingsRef.current?.[idx], ); if (changedIdx === -1) return; prevSourceMappingsRef.current = sourceMappings; const inputTile = input.tiles[changedIdx]; const inputTileConfig = inputTile?.config; if (!inputTileConfig || !inputTileConfig.source) return; const sourceId = sourceMappings[changedIdx] ?? ''; const inputTileSource = inputTileConfig.source; const keysForTilesWithMatchingSource = input.tiles .map((tile, index) => ({ config: tile.config, index })) .filter(tile => tile.config.source === inputTileSource) .map(({ index }) => `sourceMappings.${index}` as const); const keysForFiltersWithMatchingSource = input.filters ?.map((filter, index) => ({ ...filter, index })) .filter(f => f.source === inputTileSource) .map(({ index }) => `filterSourceMappings.${index}` as const) ?? []; isUpdatingRef.current = true; for (const key of [ ...keysForTilesWithMatchingSource, ...keysForFiltersWithMatchingSource, ]) { if (!getFieldState(key).isDirty) { setValue(key, sourceId, { shouldValidate: true }); } } isUpdatingRef.current = false; }, [sourceMappings, input.tiles, input.filters, getFieldState, setValue]); // Propagate connection mapping changes to other RawSQL tiles with the same input connection useEffect(() => { if (isUpdatingRef.current) return; if (!connectionMappings || !input.tiles) return; const changedIdx = connectionMappings.findIndex( (mapping, idx) => mapping !== prevConnectionMappingsRef.current?.[idx], ); if (changedIdx === -1) return; prevConnectionMappingsRef.current = connectionMappings; const inputTile = input.tiles[changedIdx]; const inputTileConfig = inputTile?.config as SavedChartConfig | undefined; if (!inputTileConfig || !isRawSqlSavedChartConfig(inputTileConfig)) return; const connectionId = connectionMappings[changedIdx] ?? ''; const inputTileConnection = inputTileConfig.connection; const keysForTilesWithMatchingConnection = input.tiles .map((tile, index) => ({ config: tile.config as SavedChartConfig, index, })) .filter( tile => isRawSqlSavedChartConfig(tile.config) && tile.config.connection === inputTileConnection, ) .map(({ index }) => `connectionMappings.${index}` as const); isUpdatingRef.current = true; for (const key of keysForTilesWithMatchingConnection) { if (!getFieldState(key).isDirty) { setValue(key, connectionId, { shouldValidate: true }); } } isUpdatingRef.current = false; }, [connectionMappings, input.tiles, getFieldState, setValue]); const createDashboard = useCreateDashboard(); const updateDashboard = useUpdateDashboard(); const onSubmit = async (data: MappingFormValues) => { try { // Zip the source/connection mappings with the input tiles const zippedTiles = input.tiles.map((tile, idx) => { const source = sources?.find( source => source.id === data.sourceMappings[idx], ); if (isRawSqlSavedChartConfig(tile.config)) { const connection = connections?.find( conn => conn.id === data.connectionMappings[idx], ); return { ...tile, config: { ...tile.config, connection: connection!.id, ...(source ? { source: source.id } : {}), }, }; } return { ...tile, config: { ...tile.config, source: source!.id, }, }; }); // Zip the source mappings with the input filters const zippedFilters = input.filters?.map((filter, idx) => { const source = sources?.find( source => source.id === data.filterSourceMappings?.[idx], ); return { ...filter, source: source!.id, }; }); // Format for server const output = convertToDashboardDocument({ ...input, tiles: zippedTiles, filters: zippedFilters, name: data.dashboardName, }); let _dashboardId = dashboardId; if (_dashboardId) { await updateDashboard.mutateAsync({ ...output, id: _dashboardId, }); } else { const result = await createDashboard.mutateAsync(output); _dashboardId = result.id; } // Redirect notifications.show({ color: 'green', message: 'Import Successful!', }); router.push(`/dashboards/${_dashboardId}`); } catch { notifications.show({ color: 'red', message: 'Something went wrong. Please try again.', }); } }; return (
Step 2: Map Data ( )} /> Name Input Source Mapped Source Input Connection Mapped Connection {input.tiles.map((tile, i) => { const config = tile.config; const isRawSql = isRawSqlSavedChartConfig(config); return ( {tile.config.name} {config.source ?? ''} {config.source != null && ( ({ value: source.id, label: source.name, }))} placeholder="Select a source" /> )} {isRawSql ? config.connection : ''} {isRawSql ? ( ({ value: conn.id, label: conn.name, }))} placeholder="Select a connection" /> ) : null} ); })} {input.filters?.map((filter, i) => ( {filter.name} (filter) {filter.source} ({ value: source.id, label: source.name, }))} placeholder="Select a source" /> ))}
{createDashboard.isError && ( {createDashboard.error.toString()} )}
); } function DBDashboardImportPage() { const brandName = useBrandDisplayName(); const [input, setInput] = useState(null); return (
Create a Dashboard - {brandName}
Create Dashboard > Import Dashboard
{ setInput(i); }} /> {input && }
); } const DBDashboardImportPageDynamic = dynamic( async () => DBDashboardImportPage, { ssr: false, }, ); // @ts-ignore DBDashboardImportPageDynamic.getLayout = withAppNav; export default DBDashboardImportPageDynamic; ================================================ FILE: packages/app/src/DBDashboardPage.tsx ================================================ import { ForwardedRef, forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from 'react'; import dynamic from 'next/dynamic'; import Head from 'next/head'; import { useRouter } from 'next/router'; import { formatRelative } from 'date-fns'; import produce from 'immer'; import { pick } from 'lodash'; import { parseAsString, useQueryState } from 'nuqs'; import { ErrorBoundary } from 'react-error-boundary'; import RGL, { WidthProvider } from 'react-grid-layout'; import { useForm, useWatch } from 'react-hook-form'; import { TableConnection } from '@hyperdx/common-utils/dist/core/metadata'; import { convertToDashboardTemplate } from '@hyperdx/common-utils/dist/core/utils'; import { isBuilderChartConfig, isBuilderSavedChartConfig, isRawSqlChartConfig, isRawSqlSavedChartConfig, } from '@hyperdx/common-utils/dist/guards'; import { AlertState, ChartConfigWithDateRange, DashboardContainer, DashboardFilter, DisplayType, Filter, isLogSource, isTraceSource, SearchCondition, SearchConditionLanguage, SourceKind, SQLInterval, TSource, } from '@hyperdx/common-utils/dist/types'; import { ActionIcon, Box, Button, Flex, Group, Indicator, Input, Menu, Modal, Paper, Text, Title, Tooltip, } from '@mantine/core'; import { useHotkeys, useHover } from '@mantine/hooks'; import { notifications } from '@mantine/notifications'; import { IconArrowsMaximize, IconBell, IconCopy, IconDeviceFloppy, IconDotsVertical, IconDownload, IconFilterEdit, IconLayoutList, IconPencil, IconPlayerPlay, IconRefresh, IconTags, IconTrash, IconUpload, IconX, IconZoomExclamation, } from '@tabler/icons-react'; import { ContactSupportText } from '@/components/ContactSupportText'; import EditTimeChartForm from '@/components/DBEditTimeChartForm'; import DBNumberChart from '@/components/DBNumberChart'; import DBTableChart from '@/components/DBTableChart'; import { DBTimeChart } from '@/components/DBTimeChart'; import FullscreenPanelModal from '@/components/FullscreenPanelModal'; import SectionHeader from '@/components/SectionHeader'; import { TimePicker } from '@/components/TimePicker'; import { Dashboard, type Tile, useCreateDashboard, useDeleteDashboard, } from '@/dashboard'; import ChartContainer from './components/charts/ChartContainer'; import { DBPieChart } from './components/DBPieChart'; import DBSqlRowTableWithSideBar from './components/DBSqlRowTableWithSidebar'; import OnboardingModal from './components/OnboardingModal'; import SearchWhereInput, { getStoredLanguage, } from './components/SearchInput/SearchWhereInput'; import { Tags } from './components/Tags'; import useDashboardFilters from './hooks/useDashboardFilters'; import { useDashboardRefresh } from './hooks/useDashboardRefresh'; import { useBrandDisplayName } from './theme/ThemeProvider'; import { parseAsJsonEncoded, parseAsStringEncoded } from './utils/queryParsers'; import { buildTableRowSearchUrl, DEFAULT_CHART_CONFIG } from './ChartUtils'; import { useConnections } from './connection'; import { useDashboard } from './dashboard'; import DashboardFilters from './DashboardFilters'; import DashboardFiltersModal from './DashboardFiltersModal'; import { GranularityPickerControlled } from './GranularityPicker'; import HDXMarkdownChart from './HDXMarkdownChart'; import { withAppNav } from './layout'; import { getFirstTimestampValueExpression, useSource, useSources, } from './source'; import { parseTimeQuery, useNewTimeQuery } from './timeQuery'; import { useConfirm } from './useConfirm'; import { getMetricTableName } from './utils'; import { useZIndex, ZIndexContext } from './zIndex'; import 'react-grid-layout/css/styles.css'; import 'react-resizable/css/styles.css'; const makeId = () => Math.floor(100000000 * Math.random()).toString(36); const ReactGridLayout = WidthProvider(RGL); const tileToLayoutItem = (chart: Tile): RGL.Layout => ({ i: chart.id, x: chart.x, y: chart.y, w: chart.w, h: chart.h, minH: 1, minW: 1, }); // TODO: This is a hack to set the default time range const defaultTimeRange = parseTimeQuery('Past 1h', false) as [Date, Date]; const whereLanguageParser = parseAsString.withDefault( typeof window !== 'undefined' ? (getStoredLanguage() ?? 'lucene') : 'lucene', ); const Tile = forwardRef( ( { chart, dateRange, onDuplicateClick, onEditClick, onDeleteClick, onUpdateChart, onMoveToSection, containers: availableSections, granularity, onTimeRangeSelect, filters, // Properties forwarded by grid layout className, style, onMouseDown, onMouseUp, onTouchEnd, children, isHighlighted, }: { chart: Tile; dateRange: [Date, Date]; onDuplicateClick: () => void; onEditClick: () => void; onAddAlertClick?: () => void; onDeleteClick: () => void; onUpdateChart?: (chart: Tile) => void; onMoveToSection?: (containerId: string | undefined) => void; containers?: DashboardContainer[]; onSettled?: () => void; granularity: SQLInterval | undefined; onTimeRangeSelect: (start: Date, end: Date) => void; filters?: Filter[]; // Properties forwarded by grid layout className?: string; style?: React.CSSProperties; onMouseDown?: (e: React.MouseEvent) => void; onMouseUp?: (e: React.MouseEvent) => void; onTouchEnd?: (e: React.TouchEvent) => void; children?: React.ReactNode; // Resizer tooltip isHighlighted?: boolean; }, ref: ForwardedRef, ) => { const [isFullscreen, setIsFullscreen] = useState(false); const [isFocused, setIsFocused] = useState(false); useEffect(() => { if (isHighlighted) { document .getElementById(`chart-${chart.id}`) ?.scrollIntoView({ behavior: 'smooth' }); } }, [chart.id, isHighlighted]); // YouTube-style 'f' key shortcut for fullscreen toggle useHotkeys([['f', () => isFocused && setIsFullscreen(prev => !prev)]]); const [queriedConfig, setQueriedConfig] = useState< ChartConfigWithDateRange | undefined >(undefined); const { data: source } = useSource({ id: chart.config.source, }); useEffect(() => { if (isRawSqlSavedChartConfig(chart.config)) { // Some raw SQL charts don't have a source if (!chart.config.source) { setQueriedConfig({ ...chart.config, dateRange, granularity, filters, }); } else if (source != null) { setQueriedConfig({ ...chart.config, // Populate these two columns from the source to support Lucene-based filters ...pick(source, ['implicitColumnExpression', 'from']), dateRange, granularity, filters, }); } return; } if (source != null && isBuilderSavedChartConfig(chart.config)) { const isMetricSource = source.kind === SourceKind.Metric; // TODO: will need to update this when we allow for multiple metrics per chart const firstSelect = chart.config.select[0]; const metricType = isMetricSource && typeof firstSelect !== 'string' ? firstSelect?.metricType : undefined; const tableName = getMetricTableName(source, metricType); if (source.connection) { setQueriedConfig({ ...chart.config, connection: source.connection, dateRange, granularity, timestampValueExpression: source.timestampValueExpression, from: { databaseName: source.from?.databaseName || 'default', tableName: tableName || '', }, implicitColumnExpression: isLogSource(source) || isTraceSource(source) ? source.implicitColumnExpression : undefined, filters, metricTables: isMetricSource ? source.metricTables : undefined, }); } } }, [source, chart, dateRange, granularity, filters]); const [hovered, setHovered] = useState(false); const alert = isBuilderSavedChartConfig(chart.config) ? chart.config.alert : undefined; const alertIndicatorColor = useMemo(() => { if (!alert) { return 'transparent'; } if (alert.state === AlertState.OK) { return 'green'; } if (alert.silenced?.at) { return 'yellow'; } return 'red'; }, [alert]); const alertTooltip = useMemo(() => { if (!alert) { return 'Add alert'; } let tooltip = `Has alert and is in ${alert.state} state`; if (alert.silenced?.at) { const silencedAt = new Date(alert.silenced.at); // eslint-disable-next-line no-restricted-syntax tooltip += `. Ack'd ${formatRelative(silencedAt, new Date())}`; } return tooltip; }, [alert]); const filterWarning = useMemo(() => { const doFiltersExist = !!filters?.filter( f => (f.type === 'lucene' || f.type === 'sql') && f.condition.trim(), )?.length; if ( !doFiltersExist || !queriedConfig || !isRawSqlChartConfig(queriedConfig) ) return null; const isMissingSourceForFiltering = !queriedConfig.source; const isMissingFiltersMacro = !queriedConfig.sqlTemplate.includes('$__filters'); if (!isMissingSourceForFiltering && !isMissingFiltersMacro) return null; const message = isMissingFiltersMacro ? 'Filters are not applied because the SQL does not include the required $__filters macro' : 'Filters are not applied because no Source is set for this chart'; return ( ); }, [filters, queriedConfig]); const hoverToolbar = useMemo(() => { return ( e.stopPropagation()} key="hover-toolbar" style={{ visibility: hovered ? 'visible' : 'hidden' }} > {(chart.config.displayType === DisplayType.Line || chart.config.displayType === DisplayType.StackedBar || chart.config.displayType === DisplayType.Number) && ( +} mr={4} > )} { e.stopPropagation(); setIsFullscreen(true); }} title="View Fullscreen (f)" > {onMoveToSection && availableSections && availableSections.length > 0 && ( Move to Section {chart.containerId && ( onMoveToSection(undefined)}> (Ungrouped) )} {availableSections .filter(s => s.id !== chart.containerId) .map(s => ( onMoveToSection(s.id)} > {s.title} ))} )} ); }, [ alert, alertIndicatorColor, alertTooltip, availableSections, chart.config.displayType, chart.id, chart.containerId, hovered, onDeleteClick, onDuplicateClick, onEditClick, onMoveToSection, ]); const title = useMemo( () => ( {chart.config.name} ), [chart.config.name], ); // Render chart content (used in both tile and fullscreen views) const renderChartContent = useCallback( (hideToolbar: boolean = false, isFullscreenView: boolean = false) => { const toolbar = hideToolbar ? [filterWarning] : [hoverToolbar, filterWarning]; const keyPrefix = isFullscreenView ? 'fullscreen' : 'tile'; // Markdown charts may not have queriedConfig, if config.source is not set const effectiveMarkdownConfig = queriedConfig ?? chart.config; return ( An error occurred while rendering the chart.
} > {(queriedConfig?.displayType === DisplayType.Line || queriedConfig?.displayType === DisplayType.StackedBar) && ( { onUpdateChart?.({ ...chart, config: { ...chart.config, displayType, }, }); }} /> )} {queriedConfig?.displayType === DisplayType.Table && ( buildTableRowSearchUrl({ row, source, config: queriedConfig, dateRange: dateRange, }) : undefined } /> )} {queriedConfig?.displayType === DisplayType.Number && ( )} {queriedConfig?.displayType === DisplayType.Pie && ( )} {effectiveMarkdownConfig?.displayType === DisplayType.Markdown && 'markdown' in effectiveMarkdownConfig && ( )} {queriedConfig?.displayType === DisplayType.Search && isBuilderChartConfig(queriedConfig) && isBuilderSavedChartConfig(chart.config) && ( )} ); }, [ hoverToolbar, queriedConfig, title, chart, onTimeRangeSelect, onUpdateChart, source, dateRange, filterWarning, ], ); return ( <>
{ setHovered(true); setIsFocused(true); }} onMouseLeave={() => { setHovered(false); setIsFocused(false); }} key={chart.id} ref={ref} style={{ ...style, }} onMouseDown={onMouseDown} onMouseUp={onMouseUp} onTouchEnd={onTouchEnd} >
e.stopPropagation()} > {renderChartContent()}
{children}
{/* Fullscreen Modal */} setIsFullscreen(false)} > {isFullscreen && renderChartContent(true, true)} ); }, ); const EditTileModal = ({ dashboardId, chart, onClose, onSave, isSaving, dateRange, }: { dashboardId?: string; chart: Tile | undefined; onClose: () => void; dateRange: [Date, Date]; isSaving?: boolean; onSave: (chart: Tile) => void; }) => { const contextZIndex = useZIndex(); const modalZIndex = contextZIndex + 10; const confirm = useConfirm(); const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); useEffect(() => { if (chart != null) { setHasUnsavedChanges(false); } }, [chart]); const handleClose = useCallback(() => { if (isSaving) return; if (hasUnsavedChanges) { confirm( 'You have unsaved changes. Discard them and close the editor?', 'Discard', ).then(ok => { if (ok) { // Reset dirty state before closing so any re-invocation of // handleClose (e.g. from Mantine focus management after the // confirm modal closes) doesn't re-show the confirm dialog. setHasUnsavedChanges(false); onClose(); } }); } else { onClose(); } }, [confirm, isSaving, hasUnsavedChanges, onClose]); return ( {chart != null && ( { onSave({ ...chart, config: config, }); }} onClose={handleClose} onDirtyChange={setHasUnsavedChanges} isDashboardForm /> )} ); }; const updateLayout = (newLayout: RGL.Layout[]) => { return (dashboard: Dashboard) => { for (const chart of dashboard.tiles) { const newChartLayout = newLayout.find(layout => layout.i === chart.id); if (newChartLayout) { chart.x = newChartLayout.x; chart.y = newChartLayout.y; chart.w = newChartLayout.w; chart.h = newChartLayout.h; } } }; }; function DashboardName({ name, onSave, }: { name: string; onSave: (name: string) => void; }) { const [editing, setEditing] = useState(false); const [editedName, setEditedName] = useState(name); const { hovered, ref } = useHover(); return ( setEditing(true)} className="cursor-pointer" title="Double click to edit" > {editing ? (
{ e.preventDefault(); onSave(editedName); setEditing(false); }} > ) => setEditedName(e.target.value) } placeholder="Dashboard Name" />
) : (
{name} {hovered && ( )}
)}
); } // Download an object to users computer as JSON using specified name function downloadObjectAsJson(object: object, fileName = 'output') { const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(object)); const downloadAnchorNode = document.createElement('a'); downloadAnchorNode.setAttribute('href', dataStr); downloadAnchorNode.setAttribute('download', fileName + '.json'); document.body.appendChild(downloadAnchorNode); // required for firefox downloadAnchorNode.click(); downloadAnchorNode.remove(); } function DBDashboardPage({ presetConfig }: { presetConfig?: Dashboard }) { const brandName = useBrandDisplayName(); const confirm = useConfirm(); const router = useRouter(); const dashboardId = router.query.dashboardId as string | undefined; const { dashboard, setDashboard, dashboardHash, isLocalDashboard, isFetching: isFetchingDashboard, isSetting: isSavingDashboard, } = useDashboard({ dashboardId: dashboardId as string | undefined, presetConfig, }); const { data: sources } = useSources(); const { data: connections } = useConnections(); const [highlightedTileId] = useQueryState('highlightedTileId'); const tableConnections = useMemo(() => { if (!dashboard) return []; const tc: TableConnection[] = []; for (const { config } of dashboard.tiles) { if (!isBuilderSavedChartConfig(config)) continue; const source = sources?.find(v => v.id === config.source); if (!source) continue; // TODO: will need to update this when we allow for multiple metrics per chart const firstSelect = config.select[0]; const metricType = typeof firstSelect !== 'string' ? firstSelect?.metricType : undefined; const tableName = getMetricTableName(source, metricType); if (!tableName) continue; tc.push({ databaseName: source.from.databaseName, tableName: tableName, connectionId: source.connection, }); } return tc; }, [dashboard, sources]); const [granularity, setGranularity] = useQueryState( 'granularity', parseAsString, // TODO: Build parser ) as [SQLInterval | undefined, (value: SQLInterval | undefined) => void]; const [where, setWhere] = useQueryState( 'where', parseAsStringEncoded.withDefault(''), ); const [whereLanguage, setWhereLanguage] = useQueryState( 'whereLanguage', whereLanguageParser, ); // Get raw filter queries from URL (not processed by hook) const [rawFilterQueries] = useQueryState( 'filters', parseAsJsonEncoded(), ); // Track if we've initialized query for this dashboard const initializedDashboard = useRef(undefined); const [showFiltersModal, setShowFiltersModal] = useState(false); const filters = dashboard?.filters ?? []; const { filterValues, setFilterValue, filterQueries, setFilterQueries } = useDashboardFilters(filters); const handleSaveFilter = (filter: DashboardFilter) => { if (!dashboard) return; setDashboard( produce(dashboard, draft => { const filterIndex = draft.filters?.findIndex(p => p.id === filter.id) ?? -1; if (draft.filters && filterIndex !== -1) { draft.filters[filterIndex] = filter; } else { draft.filters = [...(draft.filters ?? []), filter]; } }), ); }; const handleRemoveFilter = (id: string) => { if (!dashboard) return; setDashboard({ ...dashboard, filters: dashboard.filters?.filter(p => p.id !== id) ?? [], }); }; const [isLive, setIsLive] = useState(false); const { control, setValue, getValues, handleSubmit } = useForm<{ granularity: SQLInterval | 'auto'; where: SearchCondition; whereLanguage: SearchConditionLanguage; }>({ defaultValues: { granularity: granularity ?? 'auto', where: where ?? '', whereLanguage: (whereLanguage as SearchConditionLanguage) ?? getStoredLanguage() ?? 'lucene', }, }); const watchedGranularity = useWatch({ control, name: 'granularity' }); useEffect(() => { if (watchedGranularity && watchedGranularity !== granularity) { setGranularity(watchedGranularity as SQLInterval); } }, [watchedGranularity, granularity, setGranularity]); const [displayedTimeInputValue, setDisplayedTimeInputValue] = useState('Past 1h'); const { searchedTimeRange, onSearch, onTimeRangeSelect } = useNewTimeQuery({ initialDisplayValue: 'Past 1h', initialTimeRange: defaultTimeRange, setDisplayedTimeInputValue, }); const { granularityOverride, isRefreshEnabled, manualRefreshCooloff, refresh, } = useDashboardRefresh({ searchedTimeRange, onTimeRangeSelect, isLive, }); const onSubmit = useCallback(() => { onSearch(displayedTimeInputValue); handleSubmit(data => { setWhere(data.where as SearchCondition); setWhereLanguage((data.whereLanguage as SearchConditionLanguage) ?? null); })(); }, [ displayedTimeInputValue, handleSubmit, onSearch, setWhere, setWhereLanguage, ]); // Initialize query/filter state once when dashboard changes. useEffect(() => { if (!dashboard?.id || !router.isReady) return; if (!isLocalDashboard && isFetchingDashboard) return; if (initializedDashboard.current === dashboard.id) return; const isSwitchingDashboards = initializedDashboard.current != null && initializedDashboard.current !== dashboard.id; const hasWhereInUrl = 'where' in router.query; const hasFiltersInUrl = 'filters' in router.query; // Query defaults: URL query overrides saved defaults. If switching to a // dashboard without defaults, clear query. On first load/reload, keep current state. if (!hasWhereInUrl) { if (dashboard.savedQuery) { setValue('where', dashboard.savedQuery); setWhere(dashboard.savedQuery); const savedLanguage = dashboard.savedQueryLanguage ?? 'lucene'; setValue('whereLanguage', savedLanguage); setWhereLanguage(savedLanguage); } else if (isSwitchingDashboards) { setValue('where', ''); setWhere(''); setValue('whereLanguage', 'lucene'); setWhereLanguage('lucene'); } } // Filter defaults: URL filters override saved defaults. If switching to a // dashboard without defaults, clear selected filters. if (!hasFiltersInUrl) { if (dashboard.savedFilterValues) { setFilterQueries(dashboard.savedFilterValues); } else if (isSwitchingDashboards) { setFilterQueries(null); } } initializedDashboard.current = dashboard.id; }, [ dashboard?.id, dashboard?.savedQuery, dashboard?.savedQueryLanguage, dashboard?.savedFilterValues, isLocalDashboard, isFetchingDashboard, router.isReady, router.query, setValue, setWhere, setWhereLanguage, setFilterQueries, ]); const handleSaveQuery = useCallback(() => { if (!dashboard || isLocalDashboard) return; // Execute the query first (updates URL) onSubmit(); // Then save to database (reads from form values which were just submitted to URL) const formValues = getValues(); const currentWhere = formValues.where || null; const currentWhereLanguage = currentWhere ? formValues.whereLanguage || 'lucene' : null; const currentFilterValues = rawFilterQueries?.length ? rawFilterQueries : []; setDashboard( produce(dashboard, draft => { draft.savedQuery = currentWhere; draft.savedQueryLanguage = currentWhereLanguage; draft.savedFilterValues = currentFilterValues; }), () => { notifications.show({ color: 'green', title: 'Query saved and executed', message: 'Filter query and dropdown values have been saved with the dashboard', autoClose: 3000, }); }, ); }, [ dashboard, isLocalDashboard, setDashboard, getValues, rawFilterQueries, onSubmit, ]); const handleRemoveSavedQuery = useCallback(() => { if (!dashboard || isLocalDashboard) return; setDashboard( produce(dashboard, draft => { draft.savedQuery = null; draft.savedQueryLanguage = null; draft.savedFilterValues = []; }), () => { notifications.show({ color: 'green', title: 'Default query and filters removed', message: 'Dashboard will no longer auto-apply saved defaults', autoClose: 3000, }); }, ); }, [dashboard, isLocalDashboard, setDashboard]); const [editedTile, setEditedTile] = useState(); const onAddTile = (containerId?: string) => { // Auto-expand collapsed section so the new tile is visible if (containerId && dashboard) { const section = dashboard.containers?.find(s => s.id === containerId); if (section?.collapsed) { setDashboard( produce(dashboard, draft => { const s = draft.containers?.find(c => c.id === containerId); if (s) s.collapsed = false; }), ); } } setEditedTile({ id: makeId(), x: 0, y: 0, w: 8, h: 10, config: { ...DEFAULT_CHART_CONFIG, source: sources?.[0]?.id ?? '', }, ...(containerId ? { containerId } : {}), }); }; const sections = useMemo( () => dashboard?.containers ?? [], [dashboard?.containers], ); const hasSections = sections.length > 0; const allTiles = useMemo(() => dashboard?.tiles ?? [], [dashboard?.tiles]); const handleMoveTileToSection = useCallback( (tileId: string, containerId: string | undefined) => { if (!dashboard) return; setDashboard( produce(dashboard, draft => { const tile = draft.tiles.find(t => t.id === tileId); if (tile) { if (containerId) tile.containerId = containerId; else delete tile.containerId; } }), ); }, [dashboard, setDashboard], ); const renderTileComponent = useCallback( (chart: Tile) => ( setEditedTile(chart)} granularity={ isRefreshEnabled ? granularityOverride : (granularity ?? undefined) } filters={[ { type: whereLanguage === 'sql' ? 'sql' : 'lucene', condition: where, }, ...(filterQueries ?? []), ]} onTimeRangeSelect={onTimeRangeSelect} isHighlighted={highlightedTileId === chart.id} onUpdateChart={newChart => { if (!dashboard) return; setDashboard( produce(dashboard, draft => { const chartIndex = draft.tiles.findIndex(c => c.id === chart.id); if (chartIndex === -1) return; draft.tiles[chartIndex] = newChart; }), ); }} onDuplicateClick={async () => { if (dashboard != null) { if ( !(await confirm( <> Duplicate {'"'} {chart.config.name} {'"'}? , 'Duplicate', )) ) { return; } setDashboard({ ...dashboard, tiles: [ ...dashboard.tiles, { ...chart, id: makeId(), config: { ...chart.config, alert: undefined, }, }, ], }); } }} onDeleteClick={async () => { if (dashboard != null) { if ( !(await confirm( <> Delete{' '} {chart.config.name} ? , 'Delete', { variant: 'danger' }, )) ) { return; } setDashboard({ ...dashboard, tiles: dashboard.tiles.filter(c => c.id !== chart.id), }); } }} containers={sections} onMoveToSection={containerId => handleMoveTileToSection(chart.id, containerId) } /> ), [ dashboard, searchedTimeRange, isRefreshEnabled, granularityOverride, granularity, highlightedTileId, confirm, setDashboard, where, whereLanguage, onTimeRangeSelect, filterQueries, sections, handleMoveTileToSection, ], ); const makeOnLayoutChange = useCallback( (gridTiles: Tile[]) => (newLayout: RGL.Layout[]) => { if (!dashboard) return; const currentLayout = gridTiles.map(tileToLayoutItem); let hasDiff = false; if (newLayout.length !== currentLayout.length) { hasDiff = true; } else { for (const curr of newLayout) { const old = currentLayout.find(l => l.i === curr.i); if ( old?.x !== curr.x || old?.y !== curr.y || old?.h !== curr.h || old?.w !== curr.w ) { hasDiff = true; break; } } } if (hasDiff) { setDashboard(produce(dashboard, updateLayout(newLayout))); } }, [dashboard, setDashboard], ); // Intentionally persists collapsed state to the server via setDashboard // (same pattern as tile drag/resize). This matches Grafana and Kibana // behavior where collapsed state is saved with the dashboard for all viewers. const handleToggleSection = useCallback( (containerId: string) => { if (!dashboard) return; setDashboard( produce(dashboard, draft => { const section = draft.containers?.find(s => s.id === containerId); if (section) section.collapsed = !section.collapsed; }), ); }, [dashboard, setDashboard], ); const handleAddSection = useCallback(() => { if (!dashboard) return; setDashboard( produce(dashboard, draft => { if (!draft.containers) draft.containers = []; draft.containers.push({ id: makeId(), type: 'section', title: 'New Section', collapsed: false, }); }), ); }, [dashboard, setDashboard]); const handleRenameSection = useCallback( (containerId: string, newTitle: string) => { if (!dashboard || !newTitle.trim()) return; setDashboard( produce(dashboard, draft => { const section = draft.containers?.find(s => s.id === containerId); if (section) section.title = newTitle.trim(); }), ); }, [dashboard, setDashboard], ); const handleDeleteSection = useCallback( (containerId: string) => { if (!dashboard) return; setDashboard( produce(dashboard, draft => { // Find the bottom edge of existing ungrouped tiles so freed // tiles are placed below them without collision. const sectionIds = new Set(draft.containers?.map(c => c.id) ?? []); let maxUngroupedY = 0; for (const tile of draft.tiles) { if (!tile.containerId || !sectionIds.has(tile.containerId)) { maxUngroupedY = Math.max(maxUngroupedY, tile.y + tile.h); } } for (const tile of draft.tiles) { if (tile.containerId === containerId) { tile.y += maxUngroupedY; delete tile.containerId; } } draft.containers = draft.containers?.filter( s => s.id !== containerId, ); }), ); }, [dashboard, setDashboard], ); // Group tiles by section; orphaned tiles (containerId not matching any // section) fall back to ungrouped to avoid silently hiding them. const tilesByContainerId = useMemo(() => { const map = new Map(); for (const section of sections) { map.set( section.id, allTiles.filter(t => t.containerId === section.id), ); } return map; }, [sections, allTiles]); const ungroupedTiles = useMemo( () => hasSections ? allTiles.filter( t => !t.containerId || !tilesByContainerId.has(t.containerId), ) : allTiles, [hasSections, allTiles, tilesByContainerId], ); const onUngroupedLayoutChange = useMemo( () => makeOnLayoutChange(ungroupedTiles), [makeOnLayoutChange, ungroupedTiles], ); const sectionLayoutChangeHandlers = useMemo(() => { const map = new Map void>(); for (const section of sections) { const tiles = tilesByContainerId.get(section.id) ?? []; map.set(section.id, makeOnLayoutChange(tiles)); } return map; }, [sections, tilesByContainerId, makeOnLayoutChange]); const deleteDashboard = useDeleteDashboard(); const handleUpdateTags = useCallback( (newTags: string[]) => { if (dashboard?.id) { setDashboard( { ...dashboard, tags: newTags, }, () => { notifications.show({ color: 'green', message: 'Tags updated successfully', }); }, () => { notifications.show({ color: 'red', message: ( <> An error occurred. ), }); }, ); } }, [dashboard, setDashboard], ); const createDashboard = useCreateDashboard(); const onCreateDashboard = useCallback(() => { createDashboard.mutate( { name: 'My Dashboard', tiles: [], tags: [], }, { onSuccess: data => { router.push(`/dashboards/${data.id}`); }, }, ); }, [createDashboard, router]); const [isSaving, setIsSaving] = useState(false); const hasTiles = dashboard && dashboard.tiles.length > 0; const hasSavedQueryAndFilterDefaults = Boolean( dashboard?.savedQuery || dashboard?.savedFilterValues?.length, ); return ( Dashboard – {brandName} { if (!isSaving) setEditedTile(undefined); }} dateRange={searchedTimeRange} isSaving={isSaving} onSave={newChart => { if (dashboard == null) { return; } setIsSaving(true); setDashboard( produce(dashboard, draft => { const chartIndex = draft.tiles.findIndex( chart => chart.id === newChart.id, ); // This is a new chart (probably?) if (chartIndex === -1) { draft.tiles.push(newChart); } else { draft.tiles[chartIndex] = newChart; } }), () => { setEditedTile(undefined); setIsSaving(false); }, () => { setIsSaving(false); }, ); }} /> {isLocalDashboard && ( This is a temporary dashboard and can not be saved. )} { if (dashboard != null) { setDashboard({ ...dashboard, name: editedName, }); } }} /> {!isLocalDashboard && dashboard?.id && ( )} {!isLocalDashboard /* local dashboards cant be "deleted" */ && ( {hasTiles && ( } onClick={() => { if (!sources || !dashboard) { notifications.show({ color: 'red', message: 'Export Failed', }); return; } downloadObjectAsJson( convertToDashboardTemplate( dashboard, // TODO: fix this type issue sources, connections, ), dashboard?.name, ); }} > Export Dashboard )} } onClick={() => { if (dashboard && !dashboard.tiles.length) { router.push( `/dashboards/import?dashboardId=${dashboard.id}`, ); } else { router.push('/dashboards/import'); } }} > {hasTiles ? 'Import New Dashboard' : 'Import Dashboard'} } onClick={handleAddSection} > Add Section } onClick={handleSaveQuery} > {hasSavedQueryAndFilterDefaults ? 'Update Default Query & Filters' : 'Save Query & Filters as Default'} {hasSavedQueryAndFilterDefaults && ( } color="red" onClick={handleRemoveSavedQuery} > Remove Default Query & Filters )} } color="red" onClick={() => deleteDashboard.mutate(dashboard?.id ?? '', { onSuccess: () => { router.push('/dashboards'); }, }) } > Delete Dashboard )} {/* */} { e.preventDefault(); onSubmit(); }} > setValue('whereLanguage', lang) } label="WHERE" enableHotkey allowMultiline minWidth={300} data-testid="search-input" /> { onSearch(range); }} /> setShowFiltersModal(true)} data-testid="edit-filters-button" size="input-sm" > {dashboard != null && dashboard.tiles != null ? ( An error occurred while rendering the dashboard.
} > {hasSections ? ( <> {ungroupedTiles.length > 0 && ( {ungroupedTiles.map(renderTileComponent)} )} {sections.map(section => { const sectionTiles = tilesByContainerId.get(section.id) ?? []; return (
handleToggleSection(section.id)} onRename={newTitle => handleRenameSection(section.id, newTitle) } onDelete={() => handleDeleteSection(section.id)} onAddTile={() => onAddTile(section.id)} /> {!section.collapsed && sectionTiles.length > 0 && ( {sectionTiles.map(renderTileComponent)} )}
); })} ) : ( {ungroupedTiles.map(renderTileComponent)} )} ) : null} setShowFiltersModal(false)} filters={filters} onSaveFilter={handleSaveFilter} onRemoveFilter={handleRemoveFilter} isLoading={isSavingDashboard || isFetchingDashboard} /> ); } const DBDashboardPageDynamic = dynamic(async () => DBDashboardPage, { ssr: false, }); // @ts-expect-error for getLayout DBDashboardPageDynamic.getLayout = withAppNav; export default DBDashboardPageDynamic; ================================================ FILE: packages/app/src/DBSearchPage.tsx ================================================ import { FormEvent, FormEventHandler, memo, SetStateAction, useCallback, useEffect, useMemo, useRef, useState, } from 'react'; import dynamic from 'next/dynamic'; import Head from 'next/head'; import router from 'next/router'; import { parseAsBoolean, parseAsInteger, parseAsString, parseAsStringEnum, useQueryState, useQueryStates, } from 'nuqs'; import { useForm, useWatch } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { ClickHouseQueryError } from '@hyperdx/common-utils/dist/clickhouse'; import { tcFromSource } from '@hyperdx/common-utils/dist/core/metadata'; import { aliasMapToWithClauses, isBrowser, splitAndTrimWithBracket, } from '@hyperdx/common-utils/dist/core/utils'; import { BuilderChartConfigWithDateRange, ChartConfigWithDateRange, DisplayType, Filter, isLogSource, isTraceSource, SourceKind, TSource, } from '@hyperdx/common-utils/dist/types'; import { ActionIcon, Box, Button, Card, Center, Code, Flex, Grid, Group, Modal, Paper, Select, Stack, Text, Tooltip, } from '@mantine/core'; import { useDebouncedCallback, useDisclosure, useDocumentVisibility, } from '@mantine/hooks'; import { notifications } from '@mantine/notifications'; import { IconBolt, IconPlayerPlay, IconPlus, IconTags, IconX, } from '@tabler/icons-react'; import { useIsFetching } from '@tanstack/react-query'; import { SortingState } from '@tanstack/react-table'; import CodeMirror from '@uiw/react-codemirror'; import { ContactSupportText } from '@/components/ContactSupportText'; import { DBSearchPageFilters } from '@/components/DBSearchPageFilters'; import { DBTimeChart } from '@/components/DBTimeChart'; import { ErrorBoundary } from '@/components/Error/ErrorBoundary'; import { InputControlled } from '@/components/InputControlled'; import OnboardingModal from '@/components/OnboardingModal'; import SearchWhereInput, { getStoredLanguage, } from '@/components/SearchInput/SearchWhereInput'; import SearchPageActionBar from '@/components/SearchPageActionBar'; import SearchTotalCountChart from '@/components/SearchTotalCountChart'; import { TableSourceForm } from '@/components/Sources/SourceForm'; import { SourceSelectControlled } from '@/components/SourceSelect'; import { SQLInlineEditorControlled } from '@/components/SQLEditor/SQLInlineEditor'; import { Tags } from '@/components/Tags'; import { TimePicker } from '@/components/TimePicker'; import { IS_LOCAL_MODE } from '@/config'; import { useAliasMapFromChartConfig } from '@/hooks/useChartConfig'; import { useExplainQuery } from '@/hooks/useExplainQuery'; import { withAppNav } from '@/layout'; import { useCreateSavedSearch, useDeleteSavedSearch, useSavedSearch, useUpdateSavedSearch, } from '@/savedSearch'; import { useSearchPageFilterState } from '@/searchFilters'; import { getEventBody, getFirstTimestampValueExpression, useSource, useSources, } from '@/source'; import { useAppTheme, useBrandDisplayName } from '@/theme/ThemeProvider'; import { parseRelativeTimeQuery, parseTimeQuery, useNewTimeQuery, } from '@/timeQuery'; import { QUERY_LOCAL_STORAGE, useLocalStorage, usePrevious } from '@/utils'; import { SQLPreview } from './components/ChartSQLPreview'; import DBSqlRowTableWithSideBar from './components/DBSqlRowTableWithSidebar'; import PatternTable from './components/PatternTable'; import { DBSearchHeatmapChart } from './components/Search/DBSearchHeatmapChart'; import SourceSchemaPreview from './components/SourceSchemaPreview'; import { getRelativeTimeOptionLabel, LIVE_TAIL_DURATION_MS, } from './components/TimePicker/utils'; import { useTableMetadata } from './hooks/useMetadata'; import { useSqlSuggestions } from './hooks/useSqlSuggestions'; import { parseAsJsonEncoded, parseAsSortingStateString, parseAsStringEncoded, } from './utils/queryParsers'; import api from './api'; import { LOCAL_STORE_CONNECTIONS_KEY } from './connection'; import { DBSearchPageAlertModal } from './DBSearchPageAlertModal'; import { SearchConfig } from './types'; import searchPageStyles from '../styles/SearchPage.module.scss'; const LIVE_TAIL_REFRESH_FREQUENCY_OPTIONS = [ { value: '1000', label: '1s' }, { value: '2000', label: '2s' }, { value: '4000', label: '4s' }, { value: '10000', label: '10s' }, { value: '30000', label: '30s' }, ]; const DEFAULT_REFRESH_FREQUENCY = 4000; const ALLOWED_SOURCE_KINDS = [SourceKind.Log, SourceKind.Trace]; const SearchConfigSchema = z.object({ select: z.string(), source: z.string(), where: z.string(), whereLanguage: z.enum(['sql', 'lucene']), orderBy: z.string(), filters: z.array( z.union([ z.object({ type: z.literal('sql_ast'), operator: z.enum(['=', '<', '>', '>=', '<=', '!=']), left: z.string(), right: z.string(), }), z.object({ type: z.enum(['sql', 'lucene']), condition: z.string(), }), ]), ), }); type SearchConfigFromSchema = z.infer; // Helper function to get the default source id export function getDefaultSourceId( sources: { id: string }[] | undefined, lastSelectedSourceId: string | undefined, ): string { if (!sources || sources.length === 0) return ''; if ( lastSelectedSourceId && sources.some(s => s.id === lastSelectedSourceId) ) { return lastSelectedSourceId; } return sources[0].id; } function SourceEditModal({ opened, onClose, inputSource, }: { opened: boolean; onClose: () => void; inputSource: string | undefined; }) { return ( ); } function NewSourceModal({ opened, onClose, onCreate, }: { opened: boolean; onClose: () => void; onCreate: (source: TSource) => void; }) { return ( ); } function ResumeLiveTailButton({ handleResumeLiveTail, }: { handleResumeLiveTail: () => void; }) { const { themeName } = useAppTheme(); const variant = themeName === 'clickstack' ? 'secondary' : 'primary'; return ( ); } function SearchSubmitButton({ isFormStateDirty, }: { isFormStateDirty: boolean; }) { return ( ); } function SearchNumRows({ config, enabled, }: { config: ChartConfigWithDateRange; enabled: boolean; }) { const { data, isLoading, error } = useExplainQuery(config, { enabled, }); if (!enabled) { return null; } const numRows = data?.[0]?.rows; return ( {isLoading ? 'Scanned Rows ...' : error || !numRows ? '' : `Scanned Rows: ${Number.parseInt(numRows)?.toLocaleString()}`} ); } function SaveSearchModalComponent({ searchedConfig, opened, onClose, isUpdate, savedSearchId, }: { searchedConfig: SearchConfig; opened: boolean; onClose: () => void; isUpdate: boolean; savedSearchId: string | undefined | null; }) { const { data: savedSearch } = useSavedSearch( { id: savedSearchId ?? '' }, { enabled: savedSearchId != null, }, ); const { control, handleSubmit, formState, reset: resetForm, } = useForm({ ...(isUpdate ? { values: { name: savedSearch?.name ?? '', }, } : {}), resetOptions: { keepDirtyValues: true, keepErrors: true, }, }); const closeAndReset = () => { resetForm(); onClose(); }; const isValidName = (name?: string): boolean => Boolean(name && name.trim().length > 0); const [tags, setTags] = useState(savedSearch?.tags || []); // Update tags when savedSearch changes useEffect(() => { if (savedSearch?.tags) { setTags(savedSearch.tags); } }, [savedSearch]); const createSavedSearch = useCreateSavedSearch(); const updateSavedSearch = useUpdateSavedSearch(); const onSubmit = (e: FormEvent) => { e.preventDefault(); handleSubmit(({ name }) => { if (isUpdate) { if (savedSearchId == null) { throw new Error('savedSearchId is required for update'); } updateSavedSearch.mutate( { id: savedSearchId, name, select: searchedConfig.select ?? '', where: searchedConfig.where ?? '', whereLanguage: searchedConfig.whereLanguage ?? getStoredLanguage() ?? 'lucene', source: searchedConfig.source ?? '', orderBy: searchedConfig.orderBy ?? '', filters: searchedConfig.filters ?? [], tags: tags, }, { onSuccess: () => { onClose(); }, }, ); } else { createSavedSearch.mutate( { name, select: searchedConfig.select ?? '', where: searchedConfig.where ?? '', whereLanguage: searchedConfig.whereLanguage ?? getStoredLanguage() ?? 'lucene', source: searchedConfig.source ?? '', orderBy: searchedConfig.orderBy ?? '', filters: searchedConfig.filters ?? [], tags: tags, }, { onSuccess: savedSearch => { router.push(`/search/${savedSearch.id}${window.location.search}`); onClose(); }, }, ); } })(); }; const { data: chartConfig } = useSearchedConfigToChartConfig(searchedConfig); return (
{chartConfig != null ? ( SELECT {`${chartConfig.select}`} FROM {chartConfig?.from.databaseName}.{chartConfig?.from.tableName} WHERE {chartConfig.where ? ( {chartConfig.where} ) : ( None )} ORDER BY {chartConfig.orderBy} {searchedConfig.filters && searchedConfig.filters.length > 0 && ( <> FILTERS {searchedConfig.filters.map((filter, idx) => ( {filter.type === 'sql_ast' ? `${filter.left} ${filter.operator} ${filter.right}` : filter.condition} ))} )} ) : ( Loading Chart Config... )} Name Tags {tags.map(tag => ( ))}
); } const SaveSearchModal = memo(SaveSearchModalComponent); // TODO: This is a hack to set the default time range const defaultTimeRange = parseTimeQuery('Past 15m', false) as [Date, Date]; function useLiveUpdate({ isLive, interval, // ms ago to refresh from refreshFrequency, // ms, how often to refresh onTimeRangeSelect, pause, }: { isLive: boolean; interval: number; refreshFrequency: number; onTimeRangeSelect: ( start: Date, end: Date, displayedTimeInputValue?: string | null, ) => void; pause: boolean; }) { const documentState = useDocumentVisibility(); const isDocumentVisible = documentState === 'visible'; const [refreshOnVisible, setRefreshOnVisible] = useState(false); const refresh = useCallback(() => { // eslint-disable-next-line no-restricted-syntax onTimeRangeSelect(new Date(Date.now() - interval), new Date(), null); }, [onTimeRangeSelect, interval]); // When the user comes back to the app after switching tabs, we immediately refresh the list. useEffect(() => { if (refreshOnVisible && isDocumentVisible) { if (!pause) { refresh(); } setRefreshOnVisible(false); } }, [refreshOnVisible, isDocumentVisible, pause, refresh]); const intervalRef = useRef(null); useEffect(() => { if (isLive) { if (intervalRef.current) { window.clearInterval(intervalRef.current); } // only start interval if no queries are fetching if (!pause) { intervalRef.current = window.setInterval(() => { if (isDocumentVisible) { refresh(); } else { setRefreshOnVisible(true); } }, refreshFrequency); } } else { if (intervalRef.current) { window.clearInterval(intervalRef.current); } } return () => { if (intervalRef.current) { window.clearInterval(intervalRef.current); } }; }, [ isLive, isDocumentVisible, onTimeRangeSelect, pause, refresh, refreshFrequency, ]); } /** * Takes in a input search config (user edited search config) and a default search config (saved search or source default config) * and returns a chart config. */ function useSearchedConfigToChartConfig( { select, source, whereLanguage, where, filters, orderBy }: SearchConfig, defaultSearchConfig?: Partial, ) { const { data: sourceObj, isLoading } = useSource({ id: source, kinds: [SourceKind.Log, SourceKind.Trace], }); const defaultOrderBy = useDefaultOrderBy(source); return useMemo(() => { if (sourceObj != null) { return { data: { select: select || defaultSearchConfig?.select || sourceObj.defaultTableSelectExpression, from: sourceObj.from, source: sourceObj.id, ...(isLogSource(sourceObj) && sourceObj.tableFilterExpression != null ? { filters: [ { type: 'sql' as const, condition: sourceObj.tableFilterExpression, }, ...(filters ?? []), ], } : {}), ...(filters != null ? { filters } : {}), where: where ?? '', whereLanguage: whereLanguage ?? 'sql', timestampValueExpression: sourceObj.timestampValueExpression, implicitColumnExpression: sourceObj.implicitColumnExpression, connection: sourceObj.connection, displayType: DisplayType.Search, orderBy: orderBy || defaultSearchConfig?.orderBy || defaultOrderBy, }, }; } return { data: null, isLoading }; }, [ sourceObj, isLoading, select, filters, defaultSearchConfig, where, whereLanguage, defaultOrderBy, orderBy, ]); } function optimizeDefaultOrderBy( timestampExpr: string, displayedTimestampExpr: string | undefined, sortingKey: string | undefined, ) { const defaultModifier = 'DESC'; const firstTimestampValueExpression = getFirstTimestampValueExpression(timestampExpr ?? '') ?? ''; const defaultOrderByItems = [firstTimestampValueExpression]; const trimmedDisplayedTimestampExpr = displayedTimestampExpr?.trim(); if ( trimmedDisplayedTimestampExpr && trimmedDisplayedTimestampExpr !== firstTimestampValueExpression ) { defaultOrderByItems.push(trimmedDisplayedTimestampExpr); } const fallbackOrderBy = defaultOrderByItems.length > 1 ? `(${defaultOrderByItems.join(', ')}) ${defaultModifier}` : `${defaultOrderByItems[0]} ${defaultModifier}`; if (!sortingKey) return fallbackOrderBy; const orderByArr = []; const sortKeys = splitAndTrimWithBracket(sortingKey); for (let i = 0; i < sortKeys.length; i++) { const sortKey = sortKeys[i]; if ( sortKey.includes('toStartOf') && sortKey.includes(firstTimestampValueExpression) ) { orderByArr.push(sortKey); } else if ( sortKey === firstTimestampValueExpression || (sortKey.startsWith('toUnixTimestamp') && sortKey.includes(firstTimestampValueExpression)) || (sortKey.startsWith('toDateTime') && sortKey.includes(firstTimestampValueExpression)) ) { if (orderByArr.length === 0) { // fallback if the first sort key is the timestamp sort key return fallbackOrderBy; } else { orderByArr.push(sortKey); break; } } else if (sortKey === trimmedDisplayedTimestampExpr) { orderByArr.push(sortKey); } } // If we can't find an optimized order by, use the fallback/default if (orderByArr.length === 0) { return fallbackOrderBy; } if ( trimmedDisplayedTimestampExpr && !orderByArr.includes(trimmedDisplayedTimestampExpr) ) { orderByArr.push(trimmedDisplayedTimestampExpr); } return orderByArr.length > 1 ? `(${orderByArr.join(', ')}) ${defaultModifier}` : `${orderByArr[0]} ${defaultModifier}`; } export function useDefaultOrderBy(sourceID: string | undefined | null) { const { data: source } = useSource({ id: sourceID, kinds: [SourceKind.Log, SourceKind.Trace], }); const { data: tableMetadata } = useTableMetadata(tcFromSource(source)); // When source changes, make sure select and orderby fields are set to default return useMemo(() => { // If no source, return undefined so that the orderBy is not set incorrectly if (!source) return undefined; const trimmedOrderBy = source.orderByExpression?.trim(); if (trimmedOrderBy) return trimmedOrderBy; return optimizeDefaultOrderBy( source?.timestampValueExpression ?? '', source.displayedTimestampValueExpression, tableMetadata?.sorting_key, ); }, [source, tableMetadata]); } // This is outside as it needs to be a stable reference const queryStateMap = { source: parseAsString, where: parseAsStringEncoded, select: parseAsStringEncoded, whereLanguage: parseAsStringEnum<'sql' | 'lucene'>(['sql', 'lucene']), filters: parseAsJsonEncoded(), orderBy: parseAsStringEncoded, }; function DBSearchPage() { const brandName = useBrandDisplayName(); // Next router is laggy behind window.location, which causes race // conditions with useQueryStates, so we'll parse it directly const paths = window.location.pathname.split('/'); const savedSearchId = paths.length === 3 ? paths[2] : null; const [searchedConfig, setSearchedConfig] = useQueryStates(queryStateMap); const { data: savedSearch } = useSavedSearch( { id: `${savedSearchId}` }, { enabled: savedSearchId != null, }, ); const { data: sources } = useSources(); const [lastSelectedSourceId, setLastSelectedSourceId] = useLocalStorage( 'hdx-last-selected-source-id', '', ); const { data: searchedSource } = useSource({ id: searchedConfig.source, kinds: [SourceKind.Log, SourceKind.Trace], }); const [analysisMode, setAnalysisMode] = useQueryState( 'mode', parseAsStringEnum<'results' | 'delta' | 'pattern'>([ 'results', 'delta', 'pattern', ]).withDefault('results'), ); const [isLive, setIsLive] = useQueryState( 'isLive', parseAsBoolean.withDefault(true), ); useEffect(() => { if (analysisMode === 'delta' || analysisMode === 'pattern') { setIsLive(false); } }, [analysisMode, setIsLive]); const [denoiseResults, _setDenoiseResults] = useQueryState( 'denoise', parseAsBoolean.withDefault(false), ); const setDenoiseResults = useCallback( (value: boolean) => { setIsLive(false); _setDenoiseResults(value); }, [setIsLive, _setDenoiseResults], ); // Get default source const defaultSourceId = useMemo( () => getDefaultSourceId(sources, lastSelectedSourceId), [sources, lastSelectedSourceId], ); const { control, setValue, reset, handleSubmit, getValues, formState, setError, resetField, } = useForm({ values: { select: searchedConfig.select || '', where: searchedConfig.where || '', whereLanguage: searchedConfig.whereLanguage ?? getStoredLanguage() ?? 'lucene', source: searchedConfig.source || defaultSourceId, filters: searchedConfig.filters ?? [], orderBy: searchedConfig.orderBy ?? '', }, resetOptions: { keepDirtyValues: true, keepErrors: true, }, resolver: zodResolver(SearchConfigSchema), }); const inputSource = useWatch({ name: 'source', control }); const defaultOrderBy = useDefaultOrderBy(inputSource); // The default search config to use when the user hasn't changed the search config const defaultSearchConfig = useMemo(() => { let _savedSearch = savedSearch; // Ensure to not use the saved search if the saved search id is not the same as the current saved search id if (!savedSearchId || savedSearch?.id !== savedSearchId) { _savedSearch = undefined; } // Ensure to not use the saved search if the input source is not the same as the saved search source if (inputSource !== savedSearch?.source) { _savedSearch = undefined; } return { select: _savedSearch?.select ?? (searchedSource?.kind === SourceKind.Log || searchedSource?.kind === SourceKind.Trace ? searchedSource.defaultTableSelectExpression : undefined), where: _savedSearch?.where ?? '', whereLanguage: _savedSearch?.whereLanguage ?? 'lucene', source: _savedSearch?.source, filters: _savedSearch?.filters ?? [], orderBy: _savedSearch?.orderBy || defaultOrderBy, }; }, [searchedSource, inputSource, savedSearch, defaultOrderBy, savedSearchId]); // const { data: inputSourceObj } = useSource({ id: inputSource }); const { data: inputSourceObjs } = useSources(); const inputSourceObj = inputSourceObjs?.find(s => s.id === inputSource); const [displayedTimeInputValue, setDisplayedTimeInputValue] = useState('Live Tail'); const { isReady, searchedTimeRange, onSearch, onTimeRangeSelect } = useNewTimeQuery({ initialDisplayValue: 'Live Tail', initialTimeRange: defaultTimeRange, showRelativeInterval: isLive ?? true, setDisplayedTimeInputValue, updateInput: !isLive, }); // Sync url state back with form state // (ex. for history navigation) // TODO: Check if there are any bad edge cases here const prevSearched = usePrevious(searchedConfig); useEffect(() => { if (JSON.stringify(prevSearched) !== JSON.stringify(searchedConfig)) { reset({ select: searchedConfig?.select ?? '', where: searchedConfig?.where ?? '', whereLanguage: searchedConfig?.whereLanguage ?? getStoredLanguage() ?? 'lucene', source: searchedConfig?.source ?? undefined, filters: searchedConfig?.filters ?? [], orderBy: searchedConfig?.orderBy ?? '', }); } }, [searchedConfig, reset, prevSearched]); // Populate searched query with saved search if the query params have // been wiped (ex. clicking on the same saved search again) useEffect(() => { const { source, where, select, whereLanguage, filters } = searchedConfig; const isSearchConfigEmpty = !source && !where && !select && !whereLanguage && !filters?.length; // Landed on saved search (if we just landed on a searchId route) if ( savedSearch != null && // Make sure saved search data is loaded savedSearch.id === savedSearchId && // Make sure we've loaded the correct saved search isSearchConfigEmpty // Only populate if URL doesn't have explicit config ) { setSearchedConfig({ source: savedSearch.source, where: savedSearch.where, select: savedSearch.select, whereLanguage: savedSearch.whereLanguage as 'sql' | 'lucene', filters: savedSearch.filters ?? [], orderBy: savedSearch.orderBy ?? '', }); return; } // Landed on a new search - ensure we have a source selected if (savedSearchId == null && defaultSourceId && isSearchConfigEmpty) { setSearchedConfig({ source: defaultSourceId, where: '', select: '', whereLanguage: getStoredLanguage() ?? 'lucene', filters: [], orderBy: '', }); return; } }, [ savedSearch, searchedConfig, setSearchedConfig, savedSearchId, defaultSourceId, sources, ]); const [_queryErrors, setQueryErrors] = useState<{ [key: string]: Error | ClickHouseQueryError; }>({}); useEffect(() => { if (!isBrowser || !IS_LOCAL_MODE) return; const nullQueryErrors = (event: StorageEvent) => { if (event.key === LOCAL_STORE_CONNECTIONS_KEY) { setQueryErrors({}); } }; window.addEventListener('storage', nullQueryErrors); return () => { window.removeEventListener('storage', nullQueryErrors); }; }, []); const onSubmit = useCallback(() => { onSearch(displayedTimeInputValue); handleSubmit( ({ select, where, whereLanguage, source, filters, orderBy }) => { setSearchedConfig({ select, where, whereLanguage, source, filters, orderBy, }); }, )(); // clear query errors setQueryErrors({}); }, [ handleSubmit, setSearchedConfig, displayedTimeInputValue, onSearch, setQueryErrors, ]); const debouncedSubmit = useDebouncedCallback(onSubmit, 1000); const handleSetFilters = useCallback( (filters: Filter[]) => { setValue('filters', filters); debouncedSubmit(); }, [debouncedSubmit, setValue], ); const filters = useWatch({ name: 'filters', control }); const searchFilters = useSearchPageFilterState({ searchQuery: filters ?? undefined, onFilterChange: handleSetFilters, }); const watchedSource = useWatch({ control, name: 'source', // Watch will reset when changing saved search, so we need to default to the URL defaultValue: searchedConfig.source ?? undefined, }); const prevSourceRef = useRef(watchedSource); useEffect(() => { // If the user changes the source dropdown, reset the select and orderby fields // to match the new source selected if (watchedSource !== prevSourceRef.current) { prevSourceRef.current = watchedSource; const newInputSourceObj = inputSourceObjs?.find( s => s.id === watchedSource, ); if (newInputSourceObj != null) { // Save the selected source ID to localStorage setLastSelectedSourceId(newInputSourceObj.id); // If the user isn't in a saved search (or the source is different from the saved search source), reset fields if (savedSearchId == null || savedSearch?.source !== watchedSource) { setValue('select', ''); setValue('orderBy', ''); // Clear all search filters only when switching to a different source searchFilters.clearAllFilters(); // If the user is in a saved search, prefer the saved search's select/orderBy if available } else { setValue('select', savedSearch?.select ?? ''); setValue('orderBy', savedSearch?.orderBy ?? ''); // Don't clear filters - we're loading from saved search } } } }, [ watchedSource, setValue, savedSearch, savedSearchId, inputSourceObjs, searchFilters, setLastSelectedSourceId, ]); const onTableScroll = useCallback( (scrollTop: number) => { // If the user scrolls a bit down, kick out of live mode if (scrollTop > 16 && isLive) { setIsLive(false); } }, [isLive, setIsLive], ); const onSidebarOpen = useCallback(() => { setIsLive(false); }, [setIsLive]); const [modelFormExpanded, setModelFormExpanded] = useState(false); // Used in local mode const [saveSearchModalState, setSaveSearchModalState] = useState< 'create' | 'update' | undefined >(undefined); const { data: chartConfig, isLoading: isChartConfigLoading } = useSearchedConfigToChartConfig(searchedConfig, defaultSearchConfig); // query error handling const { hasQueryError, queryError } = useMemo(() => { const hasQueryError = Object.values(_queryErrors).length > 0; const queryError: Error | ClickHouseQueryError | null = hasQueryError ? Object.values(_queryErrors)[0] : null; return { hasQueryError, queryError }; }, [_queryErrors]); const inputWhere = useWatch({ name: 'where', control }); const inputWhereLanguage = useWatch({ name: 'whereLanguage', control }); // query suggestion for 'where' if error const whereSuggestions = useSqlSuggestions({ input: inputWhere, enabled: hasQueryError && inputWhereLanguage === 'sql', }); const queryReady = chartConfig?.from?.databaseName && chartConfig?.from?.tableName && chartConfig?.timestampValueExpression; const updateSavedSearch = useUpdateSavedSearch(); const deleteSavedSearch = useDeleteSavedSearch(); const onSaveSearch = useCallback(() => { if (savedSearch == null) { setSaveSearchModalState('create'); } else { handleSubmit(s => { updateSavedSearch.mutate( { id: savedSearch.id, ...s, }, { onSuccess: () => { // Make sure to run the query onSubmit(); }, }, ); })(); } }, [savedSearch, updateSavedSearch, onSubmit, handleSubmit]); const handleUpdateTags = useCallback( (newTags: string[]) => { if (savedSearch?.id) { updateSavedSearch.mutate( { id: savedSearch.id, name: savedSearch.name, select: searchedConfig.select ?? '', where: searchedConfig.where ?? '', whereLanguage: searchedConfig.whereLanguage ?? getStoredLanguage() ?? 'lucene', source: searchedConfig.source ?? '', orderBy: searchedConfig.orderBy ?? '', filters: searchedConfig.filters ?? [], tags: newTags, }, { onSuccess: () => { notifications.show({ color: 'green', message: 'Tags updated successfully', }); }, onError: () => { notifications.show({ color: 'red', message: ( <> An error occurred. ), }); }, }, ); } }, [savedSearch, searchedConfig, updateSavedSearch], ); const [newSourceModalOpened, setNewSourceModalOpened] = useState(false); const QUERY_KEY_PREFIX = 'search'; const isAnyQueryFetching = useIsFetching({ queryKey: [QUERY_KEY_PREFIX], }) > 0; const isTabVisible = useDocumentVisibility(); // State for collapsing all expanded rows when resuming live tail const [collapseAllRows, setCollapseAllRows] = useState(false); const [interval, setInterval] = useQueryState( 'liveInterval', parseAsInteger.withDefault(LIVE_TAIL_DURATION_MS), ); const [refreshFrequency, setRefreshFrequency] = useQueryState( 'refreshFrequency', parseAsInteger.withDefault(DEFAULT_REFRESH_FREQUENCY), ); const updateRelativeTimeInputValue = useCallback((interval: number) => { const label = getRelativeTimeOptionLabel(interval); if (label) { setDisplayedTimeInputValue(label); } }, []); useEffect(() => { if (isReady && isLive) { updateRelativeTimeInputValue(interval); } // we only want this to run on initial mount // eslint-disable-next-line react-hooks/exhaustive-deps }, [updateRelativeTimeInputValue, searchedConfig.source, isReady]); useLiveUpdate({ isLive, interval, refreshFrequency, onTimeRangeSelect, pause: isAnyQueryFetching || !queryReady || !isTabVisible, }); // This ensures we only render this conditionally on the client // otherwise we get SSR hydration issues const [shouldShowLiveModeHint, setShouldShowLiveModeHint] = useState(false); useEffect(() => { setShouldShowLiveModeHint(isLive === false); }, [isLive]); const { data: me } = api.useMe(); // Callback to handle when rows are expanded - kick user out of live tail const onExpandedRowsChange = useCallback( (hasExpandedRows: boolean) => { if (hasExpandedRows && isLive) { setIsLive(false); } }, [isLive, setIsLive], ); const handleResumeLiveTail = useCallback(() => { setIsLive(true); updateRelativeTimeInputValue(interval); // Trigger collapsing all expanded rows setCollapseAllRows(true); // Reset the collapse trigger after a short delay setTimeout(() => setCollapseAllRows(false), 100); }, [interval, updateRelativeTimeInputValue, setIsLive]); const dbSqlRowTableConfig = useMemo(() => { if (chartConfig == null) { return undefined; } return { ...chartConfig, dateRange: searchedTimeRange, }; }, [chartConfig, searchedTimeRange]); const displayedColumns = useMemo( () => splitAndTrimWithBracket( dbSqlRowTableConfig?.select ?? defaultSearchConfig.select ?? '', ), [dbSqlRowTableConfig?.select, defaultSearchConfig.select], ); const toggleColumn = useCallback( (column: string) => { const newSelectArray = displayedColumns.includes(column) ? displayedColumns.filter(s => s !== column) : [...displayedColumns, column]; setValue('select', newSelectArray.join(', ')); onSubmit(); }, [displayedColumns, setValue, onSubmit], ); const generateSearchUrl = useCallback( ({ where, whereLanguage, source, }: { where: SearchConfig['where']; whereLanguage: SearchConfig['whereLanguage']; source?: TSource; }) => { const qParams = new URLSearchParams({ whereLanguage: whereLanguage || 'sql', from: searchedTimeRange[0].getTime().toString(), to: searchedTimeRange[1].getTime().toString(), isLive: 'false', liveInterval: interval.toString(), }); // When generating a search based on a different source, // filters and select for the current source are not preserved. if (source && source.id !== searchedSource?.id) { qParams.append('where', where || ''); qParams.append('source', source.id); } else { qParams.append('select', searchedConfig.select || ''); qParams.append('where', where || searchedConfig.where || ''); qParams.append('filters', JSON.stringify(searchedConfig.filters ?? [])); qParams.append('source', searchedSource?.id || ''); } return `/search?${qParams.toString()}`; }, [ interval, searchedConfig.filters, searchedConfig.select, searchedConfig.where, searchedSource?.id, searchedTimeRange, ], ); const handleTableError = useCallback( (error: Error | ClickHouseQueryError) => { setIsLive(false); setQueryErrors(prev => ({ ...prev, DBSqlRowTable: error })); }, [setIsLive, setQueryErrors], ); const [isAlertModalOpen, { open: openAlertModal, close: closeAlertModal }] = useDisclosure(); // Add this effect to trigger initial search when component mounts useEffect(() => { if (isReady && queryReady && !isChartConfigLoading) { // Only trigger if we haven't searched yet (no time range in URL) const searchParams = new URLSearchParams(window.location.search); if (!searchParams.has('from') && !searchParams.has('to')) { onSearch('Live Tail'); } } }, [isReady, queryReady, isChartConfigLoading, onSearch]); const { data: aliasMap } = useAliasMapFromChartConfig(dbSqlRowTableConfig); const aliasWith = useMemo(() => aliasMapToWithClauses(aliasMap), [aliasMap]); const histogramTimeChartConfig = useMemo(() => { if (chartConfig == null) { return undefined; } const variableConfig: any = {}; switch (searchedSource?.kind) { case SourceKind.Log: variableConfig.groupBy = searchedSource?.severityTextExpression; break; case SourceKind.Trace: variableConfig.groupBy = searchedSource?.statusCodeExpression; break; } return { ...chartConfig, select: [ { aggFn: 'count', aggCondition: '', valueExpression: '', }, ], orderBy: undefined, granularity: 'auto', dateRange: searchedTimeRange, displayType: DisplayType.StackedBar, with: aliasWith, // Preserve the original table select string for "View Events" links eventTableSelect: searchedConfig.select, // In live mode, when the end date is aligned to the granularity, the end date does // not change on every query, resulting in cached data being re-used. alignDateRangeToGranularity: !isLive, ...variableConfig, }; }, [ chartConfig, searchedSource, aliasWith, searchedTimeRange, searchedConfig.select, isLive, ]); const onFormSubmit = useCallback>( e => { e.preventDefault(); onSubmit(); return false; }, [onSubmit], ); const onSortingChange = useCallback( (sortState: SortingState | null) => { setIsLive(false); const sort = sortState?.at(0); setSearchedConfig({ orderBy: sort ? `${sort.id} ${sort.desc ? 'DESC' : 'ASC'}` : defaultSearchConfig.orderBy, }); }, [setIsLive, defaultSearchConfig.orderBy, setSearchedConfig], ); // Parse the orderBy string into a SortingState. We need the string // version in other places so we keep this parser separate. const initialSortBy = useMemo(() => { const orderBy = parseAsSortingStateString.parse( searchedConfig.orderBy ?? '', ); return orderBy ? [orderBy] : []; }, [searchedConfig.orderBy]); const handleTimeRangeSelect = useCallback( (d1: Date, d2: Date) => { onTimeRangeSelect(d1, d2); setIsLive(false); }, [onTimeRangeSelect, setIsLive], ); const filtersChartConfig = useMemo(() => { const overrides = { orderBy: undefined, dateRange: searchedTimeRange, with: aliasWith, } as const; return chartConfig ? { ...chartConfig, ...overrides, } : { timestampValueExpression: '', connection: '', from: { databaseName: '', tableName: '', }, where: '', select: '', ...overrides, }; }, [chartConfig, searchedTimeRange, aliasWith]); const openNewSourceModal = useCallback(() => { setNewSourceModalOpened(true); }, []); const [isDrawerChildModalOpen, setDrawerChildModalOpen] = useState(false); const rowTableContext = useMemo( () => ({ onPropertyAddClick: searchFilters.setFilterValue, displayedColumns, toggleColumn, generateSearchUrl, dbSqlRowTableConfig, isChildModalOpen: isDrawerChildModalOpen, setChildModalOpen: setDrawerChildModalOpen, source: searchedSource, }), [ searchFilters.setFilterValue, searchedSource, dbSqlRowTableConfig, displayedColumns, toggleColumn, generateSearchUrl, isDrawerChildModalOpen, ], ); const inputSourceTableConnection = useMemo( () => tcFromSource(inputSourceObj), [inputSourceObj], ); const sourceSchemaPreview = useMemo( () => , [inputSourceObj], ); const onTimePickerSearch = useCallback( (range: string) => { setIsLive(false); onSearch(range); }, [setIsLive, onSearch], ); const onTimePickerRelativeSearch = useCallback( (rangeMs: number) => { const _range = parseRelativeTimeQuery(rangeMs); setIsLive(true); setInterval(rangeMs); onTimeRangeSelect(_range[0], _range[1], null); }, [setIsLive, setInterval, onTimeRangeSelect], ); const clearSaveSearchModalState = useCallback( () => setSaveSearchModalState(undefined), [setSaveSearchModalState], ); const onModelFormExpandClose = useCallback(() => { setModelFormExpanded(false); }, [setModelFormExpanded]); const onEditSources = useCallback(() => { if (IS_LOCAL_MODE) { setModelFormExpanded(v => !v); } else { router.push('/team'); } }, [setModelFormExpanded]); const setNewSourceModalClosed = useCallback( () => setNewSourceModalOpened(false), [setNewSourceModalOpened], ); const onNewSourceCreate = useCallback( (newSource: TSource) => { setValue('source', newSource.id); setNewSourceModalClosed(); }, [setValue, setNewSourceModalClosed], ); return ( {savedSearch ? `${savedSearch.name} Search` : 'Search'} - {brandName} {!IS_LOCAL_MODE && isAlertModalOpen && ( )}
{/* */} <> {!savedSearchId ? ( ) : ( )} {!IS_LOCAL_MODE && ( )} {!!savedSearch && ( <> { deleteSavedSearch.mutate(savedSearch?.id ?? '', { onSuccess: () => { router.push('/search'); }, }); }} onClickRenameSavedSearch={() => { setSaveSearchModalState('update'); }} /> )} {isLive && ( ); }; interface DashboardFilterProps { filters: DashboardFilter[]; filterValues: FilterState; onSetFilterValue: (expression: string, value: string | null) => void; dateRange: [Date, Date]; } const DashboardFilters = ({ filters, dateRange, filterValues, onSetFilterValue, }: DashboardFilterProps) => { const { data: filterValuesBySource, isFetching } = useDashboardFilterValues({ filters, dateRange, }); return ( {Object.values(filters).map(filter => { const queriedFilterValues = filterValuesBySource?.get( filter.expression, ); return ( onSetFilterValue(filter.expression, value)} values={queriedFilterValues?.values} value={filterValues[filter.expression]?.included .values() .next() .value?.toString()} /> ); })} {isFetching && } ); }; export default DashboardFilters; ================================================ FILE: packages/app/src/DashboardFiltersModal.tsx ================================================ import { useEffect, useState } from 'react'; import { Controller, FieldError, useForm, useWatch } from 'react-hook-form'; import { TableConnection } from '@hyperdx/common-utils/dist/core/metadata'; import { DashboardFilter, MetricsDataType, SourceKind, TSource, } from '@hyperdx/common-utils/dist/types'; import { Button, Center, Group, Input, Modal, Paper, Radio, Stack, Text, TextInput, Title, Tooltip, UnstyledButton, } from '@mantine/core'; import { IconFilter, IconInfoCircle, IconPencil, IconRefresh, IconStack, IconTrash, } from '@tabler/icons-react'; import { SQLInlineEditorControlled } from '@/components/SQLEditor/SQLInlineEditor'; import SourceSchemaPreview from './components/SourceSchemaPreview'; import { SourceSelectControlled } from './components/SourceSelect'; import { useSource, useSources } from './source'; import { getMetricTableName } from './utils'; import styles from '../styles/DashboardFiltersModal.module.scss'; const MODAL_SIZE = 'sm'; interface CustomInputWrapperProps { children: React.ReactNode; label: string; tooltipText?: string; error?: FieldError; } const CustomInputWrapper = ({ children, label, tooltipText, error, }: CustomInputWrapperProps) => { const errorMessage = error && (error.message || (error?.type === 'required' ? 'This field is required' : 'Error')); return (
{label} {tooltipText && ( )} {errorMessage && ( {errorMessage} )}
{children}
); }; interface DashboardFilterEditFormProps { filter: DashboardFilter; isNew: boolean; source: TSource | undefined; onSave: (definition: DashboardFilter) => void; onClose: () => void; onCancel: () => void; } const DashboardFilterEditForm = ({ filter, isNew, source: presetSource, onSave, onClose, onCancel, }: DashboardFilterEditFormProps) => { const { handleSubmit, register, formState, control, reset } = useForm({ defaultValues: filter, }); useEffect(() => { reset(filter); }, [filter, reset]); const sourceId = useWatch({ control, name: 'source' }); const { data: source } = useSource({ id: sourceId }); const metricType = useWatch({ control, name: 'sourceMetricType' }); const tableName = source && getMetricTableName(source, metricType); const tableConnection: TableConnection | undefined = tableName ? { connectionId: source.connection, databaseName: source.from.databaseName, tableName, } : undefined; const sourceIsMetric = source?.kind === SourceKind.Metric; const metricTypes = Object.values(MetricsDataType).filter(type => source?.kind === SourceKind.Metric ? source.metricTables?.[type] : false, ); const [modalContentRef, setModalContentRef] = useState( null, ); return (
} disabled={!!presetSource} /> {sourceIsMetric && ( ( onChange(v)} withAsterisk > {metricTypes.map(type => ( ))} )} /> )}
); }; interface EmptyStateProps { onCreateFilter: () => void; onClose: () => void; } const EmptyState = ({ onCreateFilter, onClose }: EmptyStateProps) => { return ( No filters yet. Add filters to let users quickly narrow data on key columns. Saved filters will stay with this dashboard. ); }; interface DashboardFiltersListProps { filters: DashboardFilter[]; isLoading?: boolean; onEdit: (filter: DashboardFilter) => void; onRemove: (id: string) => void; onClose: () => void; onAddNew: () => void; } const DashboardFiltersList = ({ filters, isLoading, onEdit, onRemove, onClose, onAddNew, }: DashboardFiltersListProps) => { const { data: sources } = useSources(); return ( {filters.map(filter => ( {filter.name} onEdit(filter)} className={styles.filterActionButton} data-testid={`edit-filter-button-${filter.name}`} > onRemove(filter.id)} className={`${styles.filterActionButton} ${styles.deleteButton}`} data-testid={`delete-filter-button-${filter.name}`} > {sources?.find(s => s.id === filter.source)?.name} ))} {isLoading && (
)}
); }; interface DashboardFiltersEditModalProps { opened: boolean; filters: DashboardFilter[]; isLoading?: boolean; source?: TSource; onClose: () => void; onSaveFilter: (filter: DashboardFilter) => void; onRemoveFilter: (id: string) => void; } const NEW_FILTER_ID = 'new'; const DashboardFiltersModal = ({ opened, filters, isLoading, source, onClose, onSaveFilter, onRemoveFilter, }: DashboardFiltersEditModalProps) => { const [selectedFilter, setSelectedFilter] = useState(); useEffect(() => { if (opened) { setSelectedFilter(undefined); } }, [opened]); const handleRemoveFilter = (id: string) => { if (id === selectedFilter?.id) { setSelectedFilter(filters.find(f => f.id !== id)); } onRemoveFilter(id); }; const handleAddNewFilter = () => { setSelectedFilter({ id: NEW_FILTER_ID, type: 'QUERY_EXPRESSION', name: '', expression: '', source: source?.id ?? '', }); }; const handleSaveFilter = (filter: DashboardFilter) => { setSelectedFilter(undefined); if (filter.id === NEW_FILTER_ID) { const filterWithRealId = { ...filter, id: crypto.randomUUID() }; onSaveFilter(filterWithRealId); } else { onSaveFilter(filter); } }; const isEmpty = !selectedFilter && filters.length === 0; if (!opened) { return null; } else if (isEmpty) { return ; } else if (selectedFilter) { return ( setSelectedFilter(undefined)} onClose={onClose} isNew={selectedFilter.id === NEW_FILTER_ID} source={source} /> ); } else { return ( ); } }; export default DashboardFiltersModal; ================================================ FILE: packages/app/src/GranularityPicker.tsx ================================================ import { memo } from 'react'; import { useController, UseControllerProps } from 'react-hook-form'; import { Granularity } from '@hyperdx/common-utils/dist/core/utils'; import { Select } from '@mantine/core'; export default function GranularityPicker({ value, onChange, disabled, }: { value: Granularity | 'auto' | undefined; onChange: (granularity: Granularity | 'auto' | undefined) => void; disabled?: boolean; }) { return ( value && setUserPreference({ timeFormat: value as UserPreferences['timeFormat'], }) } data={['12h', '24h']} allowDeselect={false} /> setUserPreference({ isUTC: e.currentTarget.checked, }) } /> Appearance Experimental } labelPosition="left" mt="sm" /> { if (value && isValidThemeName(value)) { setTheme(value); } }} data={OPTIONS_BRAND_THEMES} allowDeselect={false} /> )} {/* Font selection is only available for HyperDX theme */} {/* ClickStack theme always uses Inter font and doesn't show this setting */} {themeName !== 'clickstack' && ( options} onChange={value => setUserPreference({ font: value as UserPreferences['font'], }) } data={OPTIONS_FONTS} /> )} ); }; ================================================ FILE: packages/app/src/__mocks__/ky-universal.ts ================================================ // Mock for ky-universal ESM module const ky = jest.fn(() => ({ get: jest.fn(() => Promise.resolve({})), post: jest.fn(() => Promise.resolve({})), put: jest.fn(() => Promise.resolve({})), patch: jest.fn(() => Promise.resolve({})), delete: jest.fn(() => Promise.resolve({})), head: jest.fn(() => Promise.resolve({})), })); // Mock the create and extend methods to return the ky mock itself // @ts-expect-error this exists ky.create = jest.fn(() => ky); // @ts-expect-error this exists ky.extend = jest.fn(() => ky); module.exports = ky; ================================================ FILE: packages/app/src/__mocks__/react-json-tree.tsx ================================================ // Mock for react-json-tree ESM module. We could improve this by mocking the actual module if needed. const JSONTree =
JSONTree
; module.exports = JSONTree; ================================================ FILE: packages/app/src/__tests__/ChartUtils.test.ts ================================================ import { BuilderChartConfigWithDateRange, SourceKind, TSource, } from '@hyperdx/common-utils/dist/types'; import { convertToNumberChartConfig, convertToTableChartConfig, convertToTimeChartConfig, formatResponseForPieChart, formatResponseForTimeChart, } from '@/ChartUtils'; import { COLORS, getChartColorError } from '@/utils'; describe('ChartUtils', () => { describe('formatResponseForTimeChart', () => { it('should throw an error if there is no timestamp column', () => { const res = { data: [ { 'AVG(toFloat64OrDefault(toString(Duration)))': 167783540.53459233, }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 182291463.92714182, }, ], meta: [ { name: 'AVG(toFloat64OrDefault(toString(Duration)))', type: 'Float64', }, ], }; expect(() => formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(), new Date()], granularity: '1 minute', generateEmptyBuckets: false, }), ).toThrow( 'No timestamp column found in result column metadata. Make sure a Date/DateTime column exists in the result set.\n\nResult column metadata: [{"name":"AVG(toFloat64OrDefault(toString(Duration)))","type":"Float64"}]', ); }); it('should return empty results for an empty response', () => { const res = { data: [], meta: [ { name: 'AVG(toFloat64OrDefault(toString(Duration)))', type: 'Float64', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(), new Date()], granularity: '1 minute', generateEmptyBuckets: false, }); expect(actual.graphResults).toEqual([]); expect(actual.timestampColumn).toEqual({ name: '__hdx_time_bucket', type: 'DateTime', }); expect(actual.lineData).toEqual([]); }); it('should format a response with a single value column and no group by', () => { const res = { data: [ { 'AVG(toFloat64OrDefault(toString(Duration)))': 167783540.53459233, __hdx_time_bucket: '2025-11-26T11:12:00Z', }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 182291463.92714182, __hdx_time_bucket: '2025-11-26T11:13:00Z', }, ], meta: [ { name: 'AVG(toFloat64OrDefault(toString(Duration)))', type: 'Float64', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(), new Date()], granularity: '1 minute', generateEmptyBuckets: false, }); expect(actual.graphResults).toEqual([ { __hdx_time_bucket: 1764155520, 'AVG(toFloat64OrDefault(toString(Duration)))': 167783540.53459233, }, { __hdx_time_bucket: 1764155580, 'AVG(toFloat64OrDefault(toString(Duration)))': 182291463.92714182, }, ]); expect(actual.timestampColumn).toEqual({ name: '__hdx_time_bucket', type: 'DateTime', }); expect(actual.lineData).toEqual([ { color: COLORS[0], dataKey: 'AVG(toFloat64OrDefault(toString(Duration)))', currentPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration)))', previousPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) (previous)', displayName: 'AVG(toFloat64OrDefault(toString(Duration)))', isDashed: false, }, ]); }); it('should format a response with multiple value columns and a group by', () => { const res = { data: [ { 'AVG(toFloat64OrDefault(toString(Duration)))': 43828228.21181263, max: 563518061, ServiceName: 'checkout', __hdx_time_bucket: '2025-11-26T12:23:00Z', }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 6759697.6283185845, max: 42092944, ServiceName: 'shipping', __hdx_time_bucket: '2025-11-26T12:23:00Z', }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 36209980.6533264, max: 795111023, ServiceName: 'checkout', __hdx_time_bucket: '2025-11-26T12:24:00Z', }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 6479038.598323171, max: 63136666, ServiceName: 'shipping', __hdx_time_bucket: '2025-11-26T12:24:00Z', }, ], meta: [ { name: 'AVG(toFloat64OrDefault(toString(Duration)))', type: 'Float64', }, { name: 'max', type: 'Float64', }, { name: 'ServiceName', type: 'LowCardinality(String)', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(), new Date()], granularity: '1 minute', generateEmptyBuckets: false, }); expect(actual.graphResults).toEqual([ { __hdx_time_bucket: 1764159780, 'AVG(toFloat64OrDefault(toString(Duration))) · checkout': 43828228.21181263, 'AVG(toFloat64OrDefault(toString(Duration))) · shipping': 6759697.6283185845, 'max · checkout': 563518061, 'max · shipping': 42092944, }, { __hdx_time_bucket: 1764159840, 'AVG(toFloat64OrDefault(toString(Duration))) · checkout': 36209980.6533264, 'AVG(toFloat64OrDefault(toString(Duration))) · shipping': 6479038.598323171, 'max · checkout': 795111023, 'max · shipping': 63136666, }, ]); expect(actual.timestampColumn).toEqual({ name: '__hdx_time_bucket', type: 'DateTime', }); expect(actual.lineData).toEqual([ { color: COLORS[0], dataKey: 'AVG(toFloat64OrDefault(toString(Duration))) · checkout', currentPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) · checkout', previousPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) · checkout (previous)', displayName: 'AVG(toFloat64OrDefault(toString(Duration))) · checkout', isDashed: false, }, { color: COLORS[1], dataKey: 'max · checkout', currentPeriodKey: 'max · checkout', previousPeriodKey: 'max · checkout (previous)', displayName: 'max · checkout', isDashed: false, }, { color: COLORS[2], dataKey: 'AVG(toFloat64OrDefault(toString(Duration))) · shipping', currentPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) · shipping', previousPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) · shipping (previous)', displayName: 'AVG(toFloat64OrDefault(toString(Duration))) · shipping', isDashed: false, }, { color: COLORS[3], dataKey: 'max · shipping', currentPeriodKey: 'max · shipping', previousPeriodKey: 'max · shipping (previous)', displayName: 'max · shipping', isDashed: false, }, ]); }); it('should assign colors to log levels', () => { const res = { data: [ { 'count()': '1', SeverityText: 'info', __hdx_time_bucket: '2025-11-26T12:23:00Z', }, { 'count()': '3', SeverityText: 'debug', __hdx_time_bucket: '2025-11-26T12:23:00Z', }, { 'count()': '1', SeverityText: 'error', __hdx_time_bucket: '2025-11-26T12:24:00Z', }, ], meta: [ { name: 'count()', type: 'UInt64', }, { name: 'SeverityText', type: 'LowCardinality(String)', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const source = { kind: SourceKind.Log, severityTextExpression: 'SeverityText', } as TSource; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(), new Date()], granularity: '1 minute', generateEmptyBuckets: false, source, }); expect(actual.lineData).toEqual([ { color: COLORS[0], dataKey: 'info', currentPeriodKey: 'info', previousPeriodKey: 'info (previous)', displayName: 'info', isDashed: false, }, { color: COLORS[0], dataKey: 'debug', currentPeriodKey: 'debug', previousPeriodKey: 'debug (previous)', displayName: 'debug', isDashed: false, }, { color: getChartColorError(), dataKey: 'error', currentPeriodKey: 'error', previousPeriodKey: 'error (previous)', displayName: 'error', isDashed: false, }, ]); }); it('should zero-fill missing time buckets when generateEmptyBuckets is undefined', () => { const res = { data: [ { 'AVG(toFloat64OrDefault(toString(Duration)))': 43828228.21181263, max: 563518061, ServiceName: 'checkout', __hdx_time_bucket: '2025-11-26T12:23:00Z', }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 6759697.6283185845, max: 42092944, ServiceName: 'shipping', __hdx_time_bucket: '2025-11-26T12:23:00Z', }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 6479038.598323171, max: 63136666, ServiceName: 'shipping', __hdx_time_bucket: '2025-11-26T12:25:00Z', }, ], meta: [ { name: 'AVG(toFloat64OrDefault(toString(Duration)))', type: 'Float64', }, { name: 'max', type: 'Float64', }, { name: 'ServiceName', type: 'LowCardinality(String)', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(1764159780000), new Date(1764159900000)], granularity: '1 minute', }); expect(actual.graphResults).toEqual([ { __hdx_time_bucket: 1764159780, 'AVG(toFloat64OrDefault(toString(Duration))) · checkout': 43828228.21181263, 'AVG(toFloat64OrDefault(toString(Duration))) · shipping': 6759697.6283185845, 'max · checkout': 563518061, 'max · shipping': 42092944, }, // Generated bucket with zeros { __hdx_time_bucket: 1764159840, 'AVG(toFloat64OrDefault(toString(Duration))) · checkout': 0, 'AVG(toFloat64OrDefault(toString(Duration))) · shipping': 0, 'max · checkout': 0, 'max · shipping': 0, }, { __hdx_time_bucket: 1764159900, 'AVG(toFloat64OrDefault(toString(Duration))) · shipping': 6479038.598323171, 'max · shipping': 63136666, }, ]); expect(actual.timestampColumn).toEqual({ name: '__hdx_time_bucket', type: 'DateTime', }); expect(actual.lineData).toEqual([ { color: COLORS[0], dataKey: 'AVG(toFloat64OrDefault(toString(Duration))) · checkout', currentPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) · checkout', previousPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) · checkout (previous)', displayName: 'AVG(toFloat64OrDefault(toString(Duration))) · checkout', isDashed: false, }, { color: COLORS[1], dataKey: 'max · checkout', currentPeriodKey: 'max · checkout', previousPeriodKey: 'max · checkout (previous)', displayName: 'max · checkout', isDashed: false, }, { color: COLORS[2], dataKey: 'AVG(toFloat64OrDefault(toString(Duration))) · shipping', currentPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) · shipping', previousPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) · shipping (previous)', displayName: 'AVG(toFloat64OrDefault(toString(Duration))) · shipping', isDashed: false, }, { color: COLORS[3], dataKey: 'max · shipping', currentPeriodKey: 'max · shipping', previousPeriodKey: 'max · shipping (previous)', displayName: 'max · shipping', isDashed: false, }, ]); }); it('should fill missing time buckets with zero when generateEmptyBuckets is true', () => { const res = { data: [ { 'count()': 10, __hdx_time_bucket: '2025-11-26T12:23:00Z', }, { 'count()': 20, __hdx_time_bucket: '2025-11-26T12:25:00Z', }, ], meta: [ { name: 'count()', type: 'UInt64', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(1764159780000), new Date(1764159900000)], granularity: '1 minute', generateEmptyBuckets: true, }); expect(actual.graphResults).toEqual([ { __hdx_time_bucket: 1764159780, 'count()': 10, }, { __hdx_time_bucket: 1764159840, 'count()': 0, }, { __hdx_time_bucket: 1764159900, 'count()': 20, }, ]); }); it('should not fill missing time buckets when generateEmptyBuckets is false', () => { const res = { data: [ { 'count()': 10, __hdx_time_bucket: '2025-11-26T12:23:00Z', }, { 'count()': 20, __hdx_time_bucket: '2025-11-26T12:25:00Z', }, ], meta: [ { name: 'count()', type: 'UInt64', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(1764159780000), new Date(1764159900000)], granularity: '1 minute', generateEmptyBuckets: false, }); // Should only have the two data points, no filled buckets expect(actual.graphResults).toEqual([ { __hdx_time_bucket: 1764159780, 'count()': 10, }, { __hdx_time_bucket: 1764159900, 'count()': 20, }, ]); }); it('should use only the first timestamp column when multiple are present', () => { const res = { data: [ { 'count()': 10, first_timestamp: '2025-11-26T11:12:00Z', other_timestamp: '2025-11-26T11:13:00Z', }, ], meta: [ { name: 'count()', type: 'UInt64', }, { name: 'first_timestamp', type: 'DateTime', }, { name: 'other_timestamp', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(), new Date()], granularity: '1 minute', generateEmptyBuckets: false, }); expect(actual.timestampColumn).toEqual({ name: 'first_timestamp', type: 'DateTime', }); expect(actual.graphResults).toEqual([ { first_timestamp: 1764155520, 'count()': 10, }, ]); }); it('should treat Map, String, and Array type columns as group columns', () => { const res = { data: [ { 'count()': 5, string_col: 'foo', map_col: { key: 'val' }, array_col: [1, 2, 3], __hdx_time_bucket: '2025-11-26T11:12:00Z', }, ], meta: [ { name: 'count()', type: 'UInt64', }, { name: 'string_col', type: 'String', }, { name: 'map_col', type: 'Map(String, String)', }, { name: 'array_col', type: 'Array(UInt64)', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse: res, dateRange: [new Date(), new Date()], granularity: '1 minute', generateEmptyBuckets: false, }); // All three non-numeric, non-timestamp columns form the group key. // With a single value column, the value column name is omitted from the key. // Map and Array values are serialized as JSON strings. expect(actual.graphResults).toEqual([ { __hdx_time_bucket: 1764155520, 'foo · {"key":"val"} · [1,2,3]': 5, }, ]); expect(actual.lineData).toEqual([ { color: COLORS[0], dataKey: 'foo · {"key":"val"} · [1,2,3]', currentPeriodKey: 'foo · {"key":"val"} · [1,2,3]', previousPeriodKey: 'foo · {"key":"val"} · [1,2,3] (previous)', displayName: 'foo · {"key":"val"} · [1,2,3]', isDashed: false, }, ]); }); it('should plot previous period data when provided, shifted to align with current period', () => { const currentPeriodResponse = { data: [ { 'AVG(toFloat64OrDefault(toString(Duration)))': 167783540.53459233, __hdx_time_bucket: '2025-11-26T11:12:00Z', }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 182291463.92714182, __hdx_time_bucket: '2025-11-26T11:13:00Z', }, ], meta: [ { name: 'AVG(toFloat64OrDefault(toString(Duration)))', type: 'Float64', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const previousPeriodResponse = { data: [ { 'AVG(toFloat64OrDefault(toString(Duration)))': 123.45, __hdx_time_bucket: '2025-11-26T11:10:00Z', }, { 'AVG(toFloat64OrDefault(toString(Duration)))': 678.9, __hdx_time_bucket: '2025-11-26T11:11:00Z', }, ], meta: [ { name: 'AVG(toFloat64OrDefault(toString(Duration)))', type: 'Float64', }, { name: '__hdx_time_bucket', type: 'DateTime', }, ], }; const actual = formatResponseForTimeChart({ currentPeriodResponse, previousPeriodResponse, dateRange: [ new Date('2025-11-26T11:12:00Z'), new Date('2025-11-26T11:14:00Z'), ], granularity: '1 minute', generateEmptyBuckets: false, previousPeriodOffsetSeconds: 120, }); expect(actual.graphResults).toEqual([ { __hdx_time_bucket: 1764155520, 'AVG(toFloat64OrDefault(toString(Duration)))': 167783540.53459233, 'AVG(toFloat64OrDefault(toString(Duration))) (previous)': 123.45, }, { __hdx_time_bucket: 1764155580, 'AVG(toFloat64OrDefault(toString(Duration)))': 182291463.92714182, 'AVG(toFloat64OrDefault(toString(Duration))) (previous)': 678.9, }, ]); expect(actual.timestampColumn).toEqual({ name: '__hdx_time_bucket', type: 'DateTime', }); expect(actual.lineData).toEqual([ { color: COLORS[0], currentPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration)))', previousPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) (previous)', dataKey: 'AVG(toFloat64OrDefault(toString(Duration)))', displayName: 'AVG(toFloat64OrDefault(toString(Duration)))', isDashed: false, }, { color: COLORS[0], currentPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration)))', previousPeriodKey: 'AVG(toFloat64OrDefault(toString(Duration))) (previous)', dataKey: 'AVG(toFloat64OrDefault(toString(Duration))) (previous)', displayName: 'AVG(toFloat64OrDefault(toString(Duration))) (previous)', isDashed: true, }, ]); }); }); describe('convertToTimeChartConfig', () => { it('should set granularity when granularity is auto', () => { const config = { granularity: 'auto', dateRange: [ new Date('2025-11-26T00:00:00Z'), new Date('2025-11-27T00:00:00Z'), ], } as BuilderChartConfigWithDateRange; const granularityFromFunction = convertToTimeChartConfig(config).granularity; expect(granularityFromFunction).toBe('30 minute'); }); it('should set granularity when granularity is undefined', () => { const config = { dateRange: [ new Date('2025-11-26T00:00:00Z'), new Date('2025-11-27T00:00:00Z'), ], } as BuilderChartConfigWithDateRange; const granularityFromFunction = convertToTimeChartConfig(config).granularity; expect(granularityFromFunction).toBe('30 minute'); }); it('should retain the specified granularity when not auto', () => { const config = { granularity: '5 minute', dateRange: [ new Date('2025-11-26T00:00:00Z'), new Date('2025-11-27T00:00:00Z'), ], } as BuilderChartConfigWithDateRange; const granularityFromFunction = convertToTimeChartConfig(config).granularity; expect(granularityFromFunction).toBe('5 minute'); }); }); describe('convertToNumberChartConfig', () => { it('should remove granularity and groupBy from the config', () => { const config = { granularity: '5 minute', groupBy: 'ServiceName', dateRange: [ new Date('2025-11-26T00:00:00Z'), new Date('2025-11-27T00:00:00Z'), ], } as BuilderChartConfigWithDateRange; const convertedConfig = convertToNumberChartConfig(config); expect(convertedConfig.granularity).toBeUndefined(); expect(convertedConfig.groupBy).toBeUndefined(); }); }); describe('convertToTableChartConfig', () => { it('should remove granularity from the config', () => { const config = { granularity: '5 minute', dateRange: [ new Date('2025-11-26T00:00:00Z'), new Date('2025-11-27T00:00:00Z'), ], } as BuilderChartConfigWithDateRange; const convertedConfig = convertToTableChartConfig(config); expect(convertedConfig.granularity).toBeUndefined(); }); it('should apply a default sort if none is provided', () => { const config = { groupBy: 'ServiceName', dateRange: [ new Date('2025-11-26T00:00:00Z'), new Date('2025-11-27T00:00:00Z'), ], } as BuilderChartConfigWithDateRange; const convertedConfig = convertToTableChartConfig(config); expect(convertedConfig.orderBy).toEqual('ServiceName'); }); it('should apply a default limit if none is provided', () => { const config = { groupBy: 'ServiceName', dateRange: [ new Date('2025-11-26T00:00:00Z'), new Date('2025-11-27T00:00:00Z'), ], } as BuilderChartConfigWithDateRange; const convertedConfig = convertToTableChartConfig(config); expect(convertedConfig.limit).toEqual({ limit: 200 }); }); }); describe('formatResponseForPieChart', () => { const getColor = (index: number, label: string) => `color-${index}-${label}`; it('returns empty array when data.data is empty', () => { const result = formatResponseForPieChart( { data: [], meta: [{ name: 'count()', type: 'UInt64' }], }, getColor, ); expect(result).toEqual([]); }); it('throws when meta is missing', () => { expect(() => formatResponseForPieChart( { data: [{ 'count()': 10 }] } as any, getColor, ), ).toThrow('No meta data found in response'); }); it('throws when there are no numeric value columns', () => { expect(() => formatResponseForPieChart( { data: [{ ServiceName: 'checkout' }], meta: [{ name: 'ServiceName', type: 'LowCardinality(String)' }], }, getColor, ), ).toThrow( 'No value columns found in result column metadata. Make sure a numeric column exists in the result set.\n\nResult column metadata: [{"name":"ServiceName","type":"LowCardinality(String)"}]', ); }); it('uses the value column name as label when there are no group-by columns', () => { const result = formatResponseForPieChart( { data: [{ 'count()': 10 }], meta: [{ name: 'count()', type: 'UInt64' }], }, getColor, ); expect(result).toEqual([ { label: 'count()', value: 10, color: 'color-0-count()' }, ]); }); it('joins group-by column values with " - " as the label', () => { const result = formatResponseForPieChart( { data: [ { 'count()': 10, ServiceName: 'checkout', env: 'prod' }, { 'count()': 5, ServiceName: 'shipping', env: 'prod' }, ], meta: [ { name: 'count()', type: 'UInt64' }, { name: 'ServiceName', type: 'LowCardinality(String)' }, { name: 'env', type: 'LowCardinality(String)' }, ], }, getColor, ); expect(result).toEqual([ { label: 'checkout - prod', value: 10, color: 'color-0-checkout - prod', }, { label: 'shipping - prod', value: 5, color: 'color-1-shipping - prod', }, ]); }); it('parses string numeric values', () => { const result = formatResponseForPieChart( { data: [{ 'count()': '42' }], meta: [{ name: 'count()', type: 'UInt64' }], }, getColor, ); expect(result).toEqual([ { label: 'count()', value: 42, color: 'color-0-count()' }, ]); }); it('filters out NaN values', () => { const result = formatResponseForPieChart( { data: [{ 'count()': 'not-a-number' }, { 'count()': 5 }], meta: [{ name: 'count()', type: 'UInt64' }], }, getColor, ); expect(result).toEqual([ { label: 'count()', value: 5, color: 'color-0-count()' }, ]); }); it('sorts entries in descending order by value', () => { const result = formatResponseForPieChart( { data: [ { 'count()': 3, ServiceName: 'c' }, { 'count()': 10, ServiceName: 'a' }, { 'count()': 1, ServiceName: 'b' }, ], meta: [ { name: 'count()', type: 'UInt64' }, { name: 'ServiceName', type: 'LowCardinality(String)' }, ], }, getColor, ); expect(result.map(e => e.value)).toEqual([10, 3, 1]); }); it('assigns colors by sorted index', () => { const result = formatResponseForPieChart( { data: [ { 'count()': 1, ServiceName: 'b' }, { 'count()': 10, ServiceName: 'a' }, ], meta: [ { name: 'count()', type: 'UInt64' }, { name: 'ServiceName', type: 'LowCardinality(String)' }, ], }, getColor, ); // 'a' (value 10) sorts first and gets index 0; 'b' (value 1) gets index 1 expect(result[0]).toMatchObject({ label: 'a', color: 'color-0-a' }); expect(result[1]).toMatchObject({ label: 'b', color: 'color-1-b' }); }); it('uses only the first numeric column as the value column', () => { const result = formatResponseForPieChart( { data: [{ count: 5, duration: 999, ServiceName: 'svc' }], meta: [ { name: 'count', type: 'UInt64' }, { name: 'duration', type: 'Float64' }, { name: 'ServiceName', type: 'LowCardinality(String)' }, ], }, getColor, ); expect(result).toEqual([ { label: 'svc', value: 5, color: 'color-0-svc' }, ]); }); }); }); ================================================ FILE: packages/app/src/__tests__/DBSearchPage.test.tsx ================================================ import { SourceKind } from '@hyperdx/common-utils/dist/types'; import { renderHook } from '@testing-library/react'; import * as sourceModule from '@/source'; import { useDefaultOrderBy } from '../DBSearchPage'; import * as metadataModule from '../hooks/useMetadata'; // Mock the dependencies jest.mock('@/layout', () => ({ withAppNav: (component: any) => component, })); describe('useDefaultOrderBy', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('optimizeOrderBy function', () => { describe('should handle', () => { const testCases = [ { sortingKey: undefined, expected: 'Timestamp DESC', }, { sortingKey: '', expected: 'Timestamp DESC', }, { // Traces Table sortingKey: 'ServiceName, SpanName, toDateTime(Timestamp)', expected: 'Timestamp DESC', }, { // Optimized Traces Table sortingKey: 'toStartOfHour(Timestamp), ServiceName, SpanName, toDateTime(Timestamp)', expected: '(toStartOfHour(Timestamp), toDateTime(Timestamp)) DESC', }, { // Unsupported for now as it's not a great sort key, want to just // use default behavior for this sortingKey: 'toDateTime(Timestamp), ServiceName, SpanName, Timestamp', expected: 'Timestamp DESC', }, { // Unsupported prefix sort key sortingKey: 'toDateTime(Timestamp), ServiceName, SpanName', expected: 'Timestamp DESC', }, { // Inverted sort key order, we should not try to optimize this sortingKey: 'ServiceName, toDateTime(Timestamp), SeverityText, toStartOfHour(Timestamp)', expected: 'Timestamp DESC', }, { sortingKey: 'toStartOfHour(Timestamp), other_column, Timestamp', expected: '(toStartOfHour(Timestamp), Timestamp) DESC', }, { sortingKey: 'Timestamp, other_column', expected: 'Timestamp DESC', }, { sortingKey: 'user_id, toStartOfHour(Timestamp), status, Timestamp', expected: '(toStartOfHour(Timestamp), Timestamp) DESC', }, { sortingKey: 'toStartOfMinute(Timestamp), user_id, status, toUnixTimestamp(Timestamp)', expected: '(toStartOfMinute(Timestamp), toUnixTimestamp(Timestamp)) DESC', }, { // test variation of toUnixTimestamp sortingKey: 'toStartOfMinute(Timestamp), user_id, status, toUnixTimestamp64Nano(Timestamp)', expected: '(toStartOfMinute(Timestamp), toUnixTimestamp64Nano(Timestamp)) DESC', }, { sortingKey: 'toUnixTimestamp(toStartOfMinute(Timestamp)), user_id, status, Timestamp', expected: '(toUnixTimestamp(toStartOfMinute(Timestamp)), Timestamp) DESC', }, { sortingKey: 'toStartOfMinute(Timestamp), user_id, status, Timestamp', timestampValueExpression: 'Timestamp, toStartOfMinute(Timestamp)', expected: '(toStartOfMinute(Timestamp), Timestamp) DESC', }, { sortingKey: 'Timestamp', displayedTimestampValueExpression: 'Timestamp64', expected: '(Timestamp, Timestamp64) DESC', }, { sortingKey: 'Timestamp', displayedTimestampValueExpression: 'Timestamp64 ', expected: '(Timestamp, Timestamp64) DESC', }, { sortingKey: 'Timestamp', displayedTimestampValueExpression: 'Timestamp', expected: 'Timestamp DESC', }, { sortingKey: 'Timestamp', displayedTimestampValueExpression: '', expected: 'Timestamp DESC', }, { sortingKey: 'Timestamp, ServiceName, Timestamp64', displayedTimestampValueExpression: 'Timestamp64', expected: '(Timestamp, Timestamp64) DESC', }, { sortingKey: 'toStartOfMinute(Timestamp), Timestamp, ServiceName, Timestamp64', displayedTimestampValueExpression: 'Timestamp64', expected: '(toStartOfMinute(Timestamp), Timestamp, Timestamp64) DESC', }, { sortingKey: 'toStartOfMinute(Timestamp), Timestamp64, ServiceName, Timestamp', displayedTimestampValueExpression: 'Timestamp64', expected: '(toStartOfMinute(Timestamp), Timestamp64, Timestamp) DESC', }, { sortingKey: 'SomeOtherTimeColumn', displayedTimestampValueExpression: 'Timestamp64', expected: '(Timestamp, Timestamp64) DESC', }, { sortingKey: '', displayedTimestampValueExpression: 'Timestamp64', expected: '(Timestamp, Timestamp64) DESC', }, { sortingKey: 'ServiceName, TimestampTime, Timestamp', timestampValueExpression: 'TimestampTime, Timestamp', displayedTimestampValueExpression: 'Timestamp', expected: '(TimestampTime, Timestamp) DESC', }, { sortingKey: 'ServiceName, TimestampTime, Timestamp', timestampValueExpression: 'Timestamp, TimestampTime', displayedTimestampValueExpression: 'Timestamp', expected: 'Timestamp DESC', }, { sortingKey: '', timestampValueExpression: 'Timestamp, TimestampTime', displayedTimestampValueExpression: '', expected: 'Timestamp DESC', }, ]; for (const testCase of testCases) { it(`${testCase.sortingKey}`, () => { const mockSource = { kind: SourceKind.Log, timestampValueExpression: testCase.timestampValueExpression || 'Timestamp', displayedTimestampValueExpression: testCase.displayedTimestampValueExpression, }; const mockTableMetadata = { sorting_key: testCase.sortingKey, }; jest.spyOn(sourceModule, 'useSource').mockReturnValue({ data: mockSource, isLoading: false, error: null, } as any); jest.spyOn(metadataModule, 'useTableMetadata').mockReturnValue({ data: mockTableMetadata, isLoading: false, error: null, } as any); const { result } = renderHook(() => useDefaultOrderBy('source-id')); expect(result.current).toBe(testCase.expected); }); } }); it('should handle null source ungracefully', () => { jest.spyOn(sourceModule, 'useSource').mockReturnValue({ data: null, isLoading: false, error: null, } as any); jest.spyOn(metadataModule, 'useTableMetadata').mockReturnValue({ data: null, isLoading: false, error: null, } as any); const { result } = renderHook(() => useDefaultOrderBy(null)); expect(result.current).toBe(undefined); }); it('should handle undefined sourceID ungracefully', () => { jest.spyOn(sourceModule, 'useSource').mockReturnValue({ data: null, isLoading: false, error: null, } as any); jest.spyOn(metadataModule, 'useTableMetadata').mockReturnValue({ data: null, isLoading: false, error: null, } as any); const { result } = renderHook(() => useDefaultOrderBy(undefined)); expect(result.current).toBe(undefined); }); it('should return orderByExpression when set on the source', () => { const mockSource = { kind: SourceKind.Log, timestampValueExpression: 'Timestamp', orderByExpression: 'Timestamp ASC', }; const mockTableMetadata = { sorting_key: 'toStartOfMinute(Timestamp), Timestamp', }; jest.spyOn(sourceModule, 'useSource').mockReturnValue({ data: mockSource, isLoading: false, error: null, } as any); jest.spyOn(metadataModule, 'useTableMetadata').mockReturnValue({ data: mockTableMetadata, isLoading: false, error: null, } as any); const { result } = renderHook(() => useDefaultOrderBy('source-id')); expect(result.current).toBe('Timestamp ASC'); }); it('should fall back to optimized order when orderByExpression is empty', () => { const mockSource = { kind: SourceKind.Log, timestampValueExpression: 'Timestamp', orderByExpression: '', }; const mockTableMetadata = { sorting_key: 'toStartOfHour(Timestamp), Timestamp', }; jest.spyOn(sourceModule, 'useSource').mockReturnValue({ data: mockSource, isLoading: false, error: null, } as any); jest.spyOn(metadataModule, 'useTableMetadata').mockReturnValue({ data: mockTableMetadata, isLoading: false, error: null, } as any); const { result } = renderHook(() => useDefaultOrderBy('source-id')); expect(result.current).toBe('(toStartOfHour(Timestamp), Timestamp) DESC'); }); it('should fall back to optimized order when orderByExpression is undefined', () => { const mockSource = { kind: SourceKind.Log, timestampValueExpression: 'Timestamp', }; const mockTableMetadata = { sorting_key: 'toStartOfHour(Timestamp), Timestamp', }; jest.spyOn(sourceModule, 'useSource').mockReturnValue({ data: mockSource, isLoading: false, error: null, } as any); jest.spyOn(metadataModule, 'useTableMetadata').mockReturnValue({ data: mockTableMetadata, isLoading: false, error: null, } as any); const { result } = renderHook(() => useDefaultOrderBy('source-id')); expect(result.current).toBe('(toStartOfHour(Timestamp), Timestamp) DESC'); }); it('should handle complex Timestamp expressions', () => { const mockSource = { kind: SourceKind.Log, timestampValueExpression: 'toDateTime(timestamp_ms / 1000)', }; const mockTableMetadata = { sorting_key: 'toStartOfHour(toDateTime(timestamp_ms / 1000)), toDateTime(timestamp_ms / 1000)', }; jest.spyOn(sourceModule, 'useSource').mockReturnValue({ data: mockSource, isLoading: false, error: null, } as any); jest.spyOn(metadataModule, 'useTableMetadata').mockReturnValue({ data: mockTableMetadata, isLoading: false, error: null, } as any); const { result } = renderHook(() => useDefaultOrderBy('source-id')); expect(result.current).toBe( '(toStartOfHour(toDateTime(timestamp_ms / 1000)), toDateTime(timestamp_ms / 1000)) DESC', ); }); it('should memoize result correctly when dependencies change', () => { const mockSource1 = { timestampValueExpression: 'timestamp1', }; const mockSource2 = { timestampValueExpression: 'timestamp2', }; const useSourceSpy = jest .spyOn(sourceModule, 'useSource') .mockReturnValue({ data: mockSource1, isLoading: false, error: null, } as any); jest.spyOn(metadataModule, 'useTableMetadata').mockReturnValue({ data: undefined, isLoading: false, error: null, } as any); const { result, rerender } = renderHook(() => useDefaultOrderBy('source-id'), ); expect(result.current).toBe('timestamp1 DESC'); // Update the mock to return different data useSourceSpy.mockReturnValue({ data: mockSource2, isLoading: false, error: null, } as any); rerender(); expect(result.current).toBe('timestamp2 DESC'); }); }); }); ================================================ FILE: packages/app/src/__tests__/DBSearchPageQueryKey.test.tsx ================================================ import React from 'react'; import objectHash from 'object-hash'; import { ChartConfigWithDateRange, DisplayType, } from '@hyperdx/common-utils/dist/types'; import { DBTimeChart } from '@/components/DBTimeChart'; import SearchTotalCountChart from '@/components/SearchTotalCountChart'; // Mock the API and hooks jest.mock('@/api', () => ({ __esModule: true, default: { useMe: () => ({ data: { team: { parallelizeWhenPossible: false } }, isLoading: false, }), }, })); jest.mock('@/hooks/useMVOptimizationExplanation', () => ({ useMVOptimizationExplanation: jest.fn().mockReturnValue({ data: undefined, isLoading: false, isPlaceholderData: false, }), })); jest.mock('@/hooks/useChartConfig', () => ({ useQueriedChartConfig: jest.fn(() => ({ data: { data: [], isComplete: true }, isLoading: false, isError: false, isPlaceholderData: false, isSuccess: true, })), })); jest.mock('@/source', () => ({ useSource: () => ({ data: null, isLoading: false }), })); jest.mock('@/ChartUtils', () => ({ useTimeChartSettings: () => ({ displayType: DisplayType.StackedBar, dateRange: [new Date('2024-01-01'), new Date('2024-01-02')], granularity: '30 minutes', fillNulls: true, }), formatResponseForTimeChart: () => ({ graphResults: [], timestampColumn: undefined, lineData: [], groupColumns: [], valueColumns: [], isSingleValueColumn: true, }), getPreviousDateRange: (dateRange: [Date, Date]) => [ new Date('2023-12-31'), new Date('2024-01-01'), ], getAlignedDateRange: (dateRange: [Date, Date]) => dateRange, convertToTimeChartConfig: jest.requireActual('@/ChartUtils').convertToTimeChartConfig, })); describe('DBSearchPage QueryKey Consistency', () => { let mockUseQueriedChartConfig: jest.Mock; beforeEach(async () => { mockUseQueriedChartConfig = (await import('@/hooks/useChartConfig')) .useQueriedChartConfig as any; mockUseQueriedChartConfig.mockClear(); }); it('should use matching queryKeys between SearchTotalCountChart and DBTimeChart', () => { const config: ChartConfigWithDateRange = { select: 'count()', from: { databaseName: 'test', tableName: 'logs' }, where: '', timestampValueExpression: 'timestamp', connection: 'test-connection', displayType: DisplayType.StackedBar, dateRange: [new Date('2024-01-01'), new Date('2024-01-02')], }; const queryKeyPrefix = 'search'; // Render SearchTotalCountChart renderWithMantine( , ); // Render DBTimeChart renderWithMantine( , ); // Get all calls to useQueriedChartConfig const calls = mockUseQueriedChartConfig.mock.calls; // Should have at least 2 calls (one for each component) expect(calls.length).toBeGreaterThanOrEqual(2); // Extract queryKey from each call const searchTotalCountQueryKey = calls[0][1]?.queryKey; const dbTimeChartQueryKey = calls[1][1]?.queryKey; // Both should exist expect(searchTotalCountQueryKey).toBeDefined(); expect(dbTimeChartQueryKey).toBeDefined(); // The key structure should be identical for both components // This ensures React Query can properly dedupe the queries expect(searchTotalCountQueryKey).toEqual(dbTimeChartQueryKey); // Additional object hash check for deep equality verification const searchQueryKeyHash = objectHash(searchTotalCountQueryKey); const chartQueryKeyHash = objectHash(dbTimeChartQueryKey); expect(searchQueryKeyHash).toBe(chartQueryKeyHash); }); it('should use consistent queryKeys when disableQueryChunking is set', () => { const config: ChartConfigWithDateRange = { select: 'count()', from: { databaseName: 'test', tableName: 'logs' }, where: '', timestampValueExpression: 'timestamp', connection: 'test-connection', displayType: DisplayType.StackedBar, dateRange: [new Date('2024-01-01'), new Date('2024-01-02')], }; const queryKeyPrefix = 'search'; // Render both components with disableQueryChunking renderWithMantine( , ); renderWithMantine( , ); const calls = mockUseQueriedChartConfig.mock.calls; const searchQueryKey = calls[0][1]?.queryKey; const chartQueryKey = calls[1][1]?.queryKey; // Verify the options include disableQueryChunking expect(searchQueryKey[3]).toHaveProperty('disableQueryChunking', true); expect(chartQueryKey[3]).toHaveProperty('disableQueryChunking', true); // Keys should still match expect(searchQueryKey).toEqual(chartQueryKey); // Additional object hash check for deep equality verification const searchQueryKeyHash = objectHash(searchQueryKey); const chartQueryKeyHash = objectHash(chartQueryKey); expect(searchQueryKeyHash).toBe(chartQueryKeyHash); }); }); ================================================ FILE: packages/app/src/__tests__/KubernetesDashboardPage.test.ts ================================================ import { SourceKind, TSource } from '@hyperdx/common-utils/dist/types'; import { resolveSourceIds } from '@/KubernetesDashboardPage'; describe('resolveSourceIds', () => { const mockLogSource: TSource = { id: 'log-1', name: 'Log Source 1', kind: SourceKind.Log, connection: 'connection-1', metricSourceId: 'metric-1', } as TSource; const mockMetricSource: TSource = { id: 'metric-1', name: 'Metric Source 1', kind: SourceKind.Metric, connection: 'connection-1', logSourceId: 'log-1', } as TSource; const mockMetricSourceNotCorrelated: TSource = { id: 'metric-1-not-correlated', name: 'Metric Source Not Correlated', kind: SourceKind.Metric, connection: 'connection-1', } as TSource; const mockLogSourceNotCorrelated: TSource = { id: 'log-1-not-correlated', name: 'Log Source Not Correlated', kind: SourceKind.Log, connection: 'connection-1', } as TSource; const mockLogSource2: TSource = { id: 'log-2', name: 'Log Source 2', kind: SourceKind.Log, connection: 'connection-2', } as TSource; const mockMetricSource2: TSource = { id: 'metric-2', name: 'Metric Source 2', kind: SourceKind.Metric, connection: 'connection-2', } as TSource; describe('when both source IDs are provided', () => { it('should return both source IDs as-is', () => { const result = resolveSourceIds('log-1', 'metric-1', [ mockLogSource, mockMetricSource, ]); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); }); it('should return both source IDs even if sources array is undefined', () => { const result = resolveSourceIds('log-1', 'metric-1', undefined); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); }); it('should return both source IDs even if they are not in the sources array', () => { const result = resolveSourceIds('log-999', 'metric-999', [ mockLogSource, mockMetricSource, ]); expect(result).toEqual({ logSourceId: 'log-999', metricSourceId: 'metric-999', }); }); }); describe('when only log source ID is provided', () => { it('should return the correlated metric source when one is available', () => { const sources = [ mockLogSourceNotCorrelated, mockLogSource, mockMetricSourceNotCorrelated, mockMetricSource, mockMetricSource2, mockLogSource2, ]; const result = resolveSourceIds('log-1', null, sources); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); }); it('should find metric source from the same connection if there is no correlated metric source', () => { const sources = [ mockLogSource, mockMetricSource, mockMetricSource2, mockLogSource2, ]; const result = resolveSourceIds('log-2', null, sources); expect(result).toEqual({ logSourceId: 'log-2', metricSourceId: 'metric-2', }); }); it('should return undefined for metric source if no matching connection', () => { const sources = [mockLogSource, mockMetricSource2]; const result = resolveSourceIds('log-1', null, sources); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: undefined, }); }); it('should return undefined for metric source if log source not found', () => { const sources = [mockLogSource, mockMetricSource]; const result = resolveSourceIds('log-999', null, sources); expect(result).toEqual({ logSourceId: 'log-999', metricSourceId: undefined, }); }); it('should return log source ID and undefined if sources array is undefined', () => { const result = resolveSourceIds('log-1', null, undefined); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: undefined, }); }); it('should handle undefined metric source ID', () => { const sources = [mockLogSource, mockMetricSource]; const result = resolveSourceIds('log-1', undefined, sources); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); }); }); describe('when only metric source ID is provided', () => { it('should return the correlated metric source when one is available', () => { const sources = [ mockLogSourceNotCorrelated, mockLogSource, mockMetricSourceNotCorrelated, mockMetricSource, mockMetricSource2, mockLogSource2, ]; const result = resolveSourceIds('log-1', null, sources); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); }); it('should find log source from the same connection when there is no correlated log source', () => { const sources = [ mockLogSourceNotCorrelated, mockMetricSource, mockLogSource2, mockMetricSource2, ]; const result = resolveSourceIds(null, 'metric-1', sources); expect(result).toEqual({ logSourceId: 'log-1-not-correlated', metricSourceId: 'metric-1', }); }); it('should return undefined for log source if no matching connection', () => { const sources = [mockLogSource2, mockMetricSource]; const result = resolveSourceIds(null, 'metric-1', sources); expect(result).toEqual({ logSourceId: undefined, metricSourceId: 'metric-1', }); }); it('should return undefined for log source if metric source not found', () => { const sources = [mockLogSource, mockMetricSource]; const result = resolveSourceIds(null, 'metric-999', sources); expect(result).toEqual({ logSourceId: undefined, metricSourceId: 'metric-999', }); }); it('should return undefined and metric source ID if sources array is undefined', () => { const result = resolveSourceIds(null, 'metric-1', undefined); expect(result).toEqual({ logSourceId: undefined, metricSourceId: 'metric-1', }); }); it('should handle undefined log source ID', () => { const sources = [mockLogSource, mockMetricSource]; const result = resolveSourceIds(undefined, 'metric-1', sources); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); }); }); describe('when neither source ID is provided', () => { it('should return two correlated sources, if available', () => { const sources = [ mockLogSourceNotCorrelated, mockLogSource, mockMetricSourceNotCorrelated, mockMetricSource, mockMetricSource2, mockLogSource2, ]; const result = resolveSourceIds(null, null, sources); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); }); it('should find log and metric sources from the same connection, if there are no correlated sources', () => { const sources = [ mockLogSourceNotCorrelated, mockMetricSourceNotCorrelated, mockLogSource2, mockMetricSource2, ]; const result = resolveSourceIds(null, null, sources); expect(result).toEqual({ logSourceId: 'log-1-not-correlated', metricSourceId: 'metric-1-not-correlated', }); }); it('should return sources from the connection with both source kinds', () => { const sources = [mockLogSource2, mockLogSource, mockMetricSource]; const result = resolveSourceIds(null, null, sources); expect(result).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); }); it('should handle connection with only one source kind', () => { const sources = [mockLogSource, mockMetricSource2]; const result = resolveSourceIds(null, null, sources); expect(result).toEqual({ logSourceId: undefined, metricSourceId: undefined, }); }); it('should return [null, null] if sources array is undefined', () => { const result = resolveSourceIds(null, null, undefined); expect(result).toEqual({ logSourceId: undefined, metricSourceId: undefined, }); }); it('should return [undefined, undefined] if sources array is empty', () => { const result = resolveSourceIds(null, null, []); expect(result).toEqual({ logSourceId: undefined, metricSourceId: undefined, }); }); it('should return [undefined, undefined] if no connection has both kinds', () => { const sources = [mockLogSource]; const result = resolveSourceIds(null, null, sources); expect(result).toEqual({ logSourceId: undefined, metricSourceId: undefined, }); }); }); describe('edge cases', () => { it('should handle multiple sources on the same connection', () => { const logSource3: TSource = { id: 'log-3', name: 'Log Source 3', kind: SourceKind.Log, connection: 'connection-1', } as TSource; const metricSource3: TSource = { id: 'metric-3', name: 'Metric Source 3', kind: SourceKind.Metric, connection: 'connection-1', } as TSource; const sources = [ mockLogSource, logSource3, mockMetricSource, metricSource3, ]; // When log source is specified, should find first metric on same connection const result1 = resolveSourceIds('log-1', null, sources); expect(result1).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-1', }); // When metric source is specified, should find first log on same connection const result2 = resolveSourceIds(null, 'metric-3', sources); expect(result2).toEqual({ logSourceId: 'log-1', metricSourceId: 'metric-3', }); }); }); }); ================================================ FILE: packages/app/src/__tests__/ServicesDashboardPage.test.ts ================================================ import { buildInFilterCondition } from '../ServicesDashboardPage'; describe('buildInFilterCondition', () => { it.each([ { columnExpression: 'ServiceName', value: 'checkout-service', expected: "ServiceName IN ('checkout-service')", }, { columnExpression: "SpanAttributes['service.name']", value: "O'Reilly API", expected: "SpanAttributes['service.name'] IN ('O\\'Reilly API')", }, { columnExpression: "ResourceAttributes['service.namespace']", value: 'payments "v2"', expected: "ResourceAttributes['service.namespace'] IN ('payments \\\"v2\\\"')", }, ])( 'escapes value and keeps column expression for $columnExpression', ({ columnExpression, value, expected }) => { expect(buildInFilterCondition(columnExpression, value)).toBe(expected); }, ); }); ================================================ FILE: packages/app/src/__tests__/Spotlights.test.tsx ================================================ import { renderHook } from '@testing-library/react'; import api from '../api'; import { useSavedSearches } from '../savedSearch'; import { useSpotlightActions } from '../Spotlights'; jest.mock('next/router', () => ({ useRouter() { return { route: '/', pathname: '', query: '', asPath: '', push: jest.fn(), events: { on: jest.fn(), off: jest.fn(), }, beforePopState: jest.fn(() => null), prefetch: jest.fn(() => null), }; }, })); jest.mock('../savedSearch'); jest.mock('../api'); const mockUseSavedSearches = useSavedSearches as jest.Mock; const mockUseDashboards = api.useDashboards as jest.Mock; describe('useSpotlightActions', () => { const mockSavedSearches = { data: [ { _id: '67ced5f5d02ab8b11d7f1638', team: '67c25ae0e3b6d5e2f2443787', name: 'save template1', select: '', where: '200', whereLanguage: 'lucene', orderBy: '', source: '67c25aeee3b6d5e2f24437b3', tags: [], createdAt: '2025-03-10T12:07:17.062Z', updatedAt: '2025-03-10T12:07:17.062Z', __v: 0, id: '67ced5f5d02ab8b11d7f1638', }, ], }; const mockSavedDashboard = { data: [ { _id: '67cfc5f7d02ab8b11d7f87c1', name: 'save dashboard1', tiles: [ { id: 'c9mnw', x: 0, y: 0, w: 8, h: 10, config: { name: 'saved line', select: [ { aggFn: 'count', aggCondition: '200', aggConditionLanguage: 'lucene', valueExpression: '', }, ], where: '', whereLanguage: 'lucene', displayType: 'line', granularity: 'auto', source: '67c25aeee3b6d5e2f24437b3', }, }, ], team: '67c25ae0e3b6d5e2f2443787', tags: [], createdAt: '2025-03-11T05:11:19.141Z', updatedAt: '2025-03-11T05:12:02.967Z', __v: 0, id: '67cfc5f7d02ab8b11d7f87c1', }, ], }; // Reset mocks before each test beforeEach(() => { jest.clearAllMocks(); mockUseSavedSearches.mockReturnValue(mockSavedSearches); mockUseDashboards.mockReturnValue(mockSavedDashboard); }); it('saved searches and dashboards should be loaded', () => { const { result } = renderHook(() => useSpotlightActions()); expect(result.current.actions[0].id).toEqual(mockSavedSearches.data[0]._id); expect(result.current.actions[0].label).toEqual( mockSavedSearches.data[0].name, ); expect(result.current.actions[1].id).toEqual( mockSavedDashboard.data[0]._id, ); expect(result.current.actions[1].label).toEqual( mockSavedDashboard.data[0].name, ); }); }); ================================================ FILE: packages/app/src/__tests__/dashboard.test.ts ================================================ jest.mock('../api', () => ({ hdxServer: jest.fn() })); jest.mock('../config', () => ({ IS_LOCAL_MODE: true })); jest.mock('@mantine/notifications', () => ({ notifications: { show: jest.fn() }, })); jest.mock('nuqs', () => ({ parseAsJson: jest.fn(), useQueryState: jest.fn(), })); jest.mock('@tanstack/react-query', () => ({ useQuery: jest.fn(), useMutation: jest.fn(), useQueryClient: jest.fn(), })); jest.mock('@/utils', () => ({ hashCode: jest.fn(() => 0) })); import { fetchLocalDashboards, getLocalDashboardTags } from '../dashboard'; const STORAGE_KEY = 'hdx-local-dashboards'; beforeEach(() => { localStorage.clear(); }); describe('fetchLocalDashboards', () => { it('returns empty array when no dashboards exist', () => { expect(fetchLocalDashboards()).toEqual([]); }); it('returns all stored dashboards', () => { const dashboards = [ { id: 'a', name: 'Dashboard A', tiles: [], tags: [] }, { id: 'b', name: 'Dashboard B', tiles: [], tags: [] }, ]; localStorage.setItem(STORAGE_KEY, JSON.stringify(dashboards)); expect(fetchLocalDashboards()).toHaveLength(2); }); }); describe('getLocalDashboardTags', () => { it('returns empty array when no dashboards exist', () => { expect(getLocalDashboardTags()).toEqual([]); }); it('returns empty array when dashboards have no tags', () => { const dashboards = [ { id: 'a', name: 'A', tiles: [], tags: [] }, { id: 'b', name: 'B', tiles: [], tags: [] }, ]; localStorage.setItem(STORAGE_KEY, JSON.stringify(dashboards)); expect(getLocalDashboardTags()).toEqual([]); }); it('collects tags from all dashboards', () => { const dashboards = [ { id: 'a', name: 'A', tiles: [], tags: ['production'] }, { id: 'b', name: 'B', tiles: [], tags: ['staging'] }, ]; localStorage.setItem(STORAGE_KEY, JSON.stringify(dashboards)); expect(getLocalDashboardTags()).toEqual( expect.arrayContaining(['production', 'staging']), ); expect(getLocalDashboardTags()).toHaveLength(2); }); it('deduplicates tags that appear on multiple dashboards', () => { const dashboards = [ { id: 'a', name: 'A', tiles: [], tags: ['production', 'infra'] }, { id: 'b', name: 'B', tiles: [], tags: ['production', 'billing'] }, ]; localStorage.setItem(STORAGE_KEY, JSON.stringify(dashboards)); const tags = getLocalDashboardTags(); expect(tags).toHaveLength(3); expect(tags).toEqual( expect.arrayContaining(['production', 'infra', 'billing']), ); }); it('handles dashboards with undefined tags', () => { const dashboards = [ { id: 'a', name: 'A', tiles: [] }, { id: 'b', name: 'B', tiles: [], tags: ['ops'] }, ]; localStorage.setItem(STORAGE_KEY, JSON.stringify(dashboards)); expect(getLocalDashboardTags()).toEqual(['ops']); }); }); ================================================ FILE: packages/app/src/__tests__/dashboardSections.test.tsx ================================================ import { DashboardContainerSchema, DashboardSchema, TileSchema, } from '@hyperdx/common-utils/dist/types'; describe('DashboardContainer schema', () => { it('validates a valid section', () => { const result = DashboardContainerSchema.safeParse({ id: 'section-1', type: 'section', title: 'Infrastructure', collapsed: false, }); expect(result.success).toBe(true); }); it('validates a collapsed section', () => { const result = DashboardContainerSchema.safeParse({ id: 'section-2', type: 'section', title: 'Database Metrics', collapsed: true, }); expect(result.success).toBe(true); }); it('rejects a section missing required fields', () => { const result = DashboardContainerSchema.safeParse({ id: 'section-3', // missing title and collapsed }); expect(result.success).toBe(false); }); it('rejects a section with empty id or title', () => { expect( DashboardContainerSchema.safeParse({ id: '', type: 'section', title: 'Valid', collapsed: false, }).success, ).toBe(false); expect( DashboardContainerSchema.safeParse({ id: 'valid', type: 'section', title: '', collapsed: false, }).success, ).toBe(false); }); }); describe('Tile schema with containerId', () => { const baseTile = { id: 'tile-1', x: 0, y: 0, w: 8, h: 10, config: { source: 'source-1', select: [ { aggFn: 'count', aggCondition: '', valueExpression: '', }, ], where: '', from: { databaseName: 'default', tableName: 'logs' }, }, }; it('validates a tile without containerId (backward compatible)', () => { const result = TileSchema.safeParse(baseTile); expect(result.success).toBe(true); if (result.success) { expect(result.data.containerId).toBeUndefined(); } }); it('validates a tile with containerId', () => { const result = TileSchema.safeParse({ ...baseTile, containerId: 'section-1', }); expect(result.success).toBe(true); if (result.success) { expect(result.data.containerId).toBe('section-1'); } }); }); describe('Dashboard schema with sections', () => { const baseDashboard = { id: 'dash-1', name: 'My Dashboard', tiles: [], tags: ['production'], }; it('validates a dashboard without sections (backward compatible)', () => { const result = DashboardSchema.safeParse(baseDashboard); expect(result.success).toBe(true); if (result.success) { expect(result.data.containers).toBeUndefined(); } }); it('validates a dashboard with empty sections array', () => { const result = DashboardSchema.safeParse({ ...baseDashboard, containers: [], }); expect(result.success).toBe(true); if (result.success) { expect(result.data.containers).toEqual([]); } }); it('rejects duplicate section IDs', () => { const result = DashboardSchema.safeParse({ ...baseDashboard, containers: [ { id: 's1', type: 'section', title: 'Section A', collapsed: false }, { id: 's1', type: 'section', title: 'Section B', collapsed: true }, ], }); expect(result.success).toBe(false); }); it('validates a dashboard with sections', () => { const result = DashboardSchema.safeParse({ ...baseDashboard, containers: [ { id: 's1', type: 'section', title: 'Infrastructure', collapsed: false, }, { id: 's2', type: 'section', title: 'Application', collapsed: true }, ], }); expect(result.success).toBe(true); if (result.success) { expect(result.data.containers).toHaveLength(2); expect(result.data.containers![0].collapsed).toBe(false); expect(result.data.containers![1].collapsed).toBe(true); } }); it('validates a full dashboard with sections and tiles referencing them', () => { const tile = { id: 'tile-1', x: 0, y: 0, w: 8, h: 10, containerId: 's1', config: { source: 'source-1', select: [ { aggFn: 'count', aggCondition: '', valueExpression: '', }, ], where: '', from: { databaseName: 'default', tableName: 'logs' }, }, }; const result = DashboardSchema.safeParse({ ...baseDashboard, tiles: [tile], containers: [ { id: 's1', type: 'section', title: 'Infrastructure', collapsed: false, }, ], }); expect(result.success).toBe(true); if (result.success) { expect(result.data.tiles[0].containerId).toBe('s1'); expect(result.data.containers![0].title).toBe('Infrastructure'); } }); }); describe('section tile grouping logic', () => { // Test the grouping logic used in DBDashboardPage type SimpleTile = { id: string; containerId?: string }; type SimpleSection = { id: string; title: string; collapsed: boolean }; function groupTilesBySection(tiles: SimpleTile[], sections: SimpleSection[]) { const bySectionId = new Map(); for (const section of sections) { bySectionId.set( section.id, tiles.filter(t => t.containerId === section.id), ); } // Orphaned tiles (containerId not matching any section) fall back to ungrouped const ungrouped = tiles.filter( t => !t.containerId || !bySectionId.has(t.containerId), ); return { ungrouped, bySectionId }; } it('groups all tiles as ungrouped when no sections exist', () => { const tiles: SimpleTile[] = [{ id: 'a' }, { id: 'b' }, { id: 'c' }]; const { ungrouped, bySectionId } = groupTilesBySection(tiles, []); expect(ungrouped).toHaveLength(3); expect(bySectionId.size).toBe(0); }); it('groups tiles by section correctly', () => { const tiles: SimpleTile[] = [ { id: 'a', containerId: 's1' }, { id: 'b', containerId: 's2' }, { id: 'c', containerId: 's1' }, { id: 'd' }, // ungrouped ]; const sections: SimpleSection[] = [ { id: 's1', title: 'Section 1', collapsed: false }, { id: 's2', title: 'Section 2', collapsed: true }, ]; const { ungrouped, bySectionId } = groupTilesBySection(tiles, sections); expect(ungrouped).toHaveLength(1); expect(ungrouped[0].id).toBe('d'); expect(bySectionId.get('s1')).toHaveLength(2); expect(bySectionId.get('s2')).toHaveLength(1); }); it('handles sections with no tiles', () => { const tiles: SimpleTile[] = [{ id: 'a', containerId: 's1' }]; const sections: SimpleSection[] = [ { id: 's1', title: 'Has tiles', collapsed: false }, { id: 's2', title: 'Empty', collapsed: false }, ]; const { bySectionId } = groupTilesBySection(tiles, sections); expect(bySectionId.get('s1')).toHaveLength(1); expect(bySectionId.get('s2')).toHaveLength(0); }); it('filters visible tiles correctly for lazy loading', () => { const tiles: SimpleTile[] = [ { id: 'a', containerId: 's1' }, { id: 'b', containerId: 's2' }, { id: 'c' }, ]; const sections: SimpleSection[] = [ { id: 's1', title: 'Expanded', collapsed: false }, { id: 's2', title: 'Collapsed', collapsed: true }, ]; const collapsedIds = new Set( sections.filter(s => s.collapsed).map(s => s.id), ); const visibleTiles = tiles.filter( t => !t.containerId || !collapsedIds.has(t.containerId), ); expect(visibleTiles).toHaveLength(2); expect(visibleTiles.map(t => t.id)).toEqual(['a', 'c']); // Tile 'b' is in collapsed section s2 and should not be rendered }); it('treats tiles with non-existent containerId as ungrouped', () => { const tiles: SimpleTile[] = [ { id: 'a', containerId: 's1' }, { id: 'b', containerId: 'deleted-section' }, { id: 'c' }, ]; const sections: SimpleSection[] = [ { id: 's1', title: 'Existing', collapsed: false }, ]; const { ungrouped, bySectionId } = groupTilesBySection(tiles, sections); // Tile 'b' references a non-existent section, should be ungrouped expect(ungrouped).toHaveLength(2); expect(ungrouped.map(t => t.id)).toEqual(['b', 'c']); expect(bySectionId.get('s1')).toHaveLength(1); }); }); describe('section authoring operations', () => { type SimpleTile = { id: string; containerId?: string }; type SimpleSection = { id: string; title: string; collapsed: boolean }; type SimpleDashboard = { tiles: SimpleTile[]; containers?: SimpleSection[]; }; function addSection(dashboard: SimpleDashboard, section: SimpleSection) { const containers = [...(dashboard.containers ?? []), section]; return { ...dashboard, containers }; } function renameSection( dashboard: SimpleDashboard, containerId: string, newTitle: string, ) { const trimmed = newTitle.trim(); if (!trimmed) return dashboard; return { ...dashboard, containers: dashboard.containers?.map(s => s.id === containerId ? { ...s, title: trimmed } : s, ), }; } function deleteSection(dashboard: SimpleDashboard, containerId: string) { return { ...dashboard, containers: dashboard.containers?.filter(s => s.id !== containerId), tiles: dashboard.tiles.map(t => t.containerId === containerId ? { ...t, containerId: undefined } : t, ), }; } function toggleSectionCollapsed( dashboard: SimpleDashboard, containerId: string, ) { return { ...dashboard, containers: dashboard.containers?.map(s => s.id === containerId ? { ...s, collapsed: !s.collapsed } : s, ), }; } function moveTileToSection( dashboard: SimpleDashboard, tileId: string, containerId: string | undefined, ) { return { ...dashboard, tiles: dashboard.tiles.map(t => t.id === tileId ? { ...t, containerId } : t, ), }; } describe('add section', () => { it('adds a section to a dashboard without sections', () => { const dashboard: SimpleDashboard = { tiles: [] }; const result = addSection(dashboard, { id: 's1', title: 'New Section', collapsed: false, }); expect(result.containers).toHaveLength(1); expect(result.containers![0]).toEqual({ id: 's1', title: 'New Section', collapsed: false, }); }); it('appends to existing sections', () => { const dashboard: SimpleDashboard = { tiles: [], containers: [{ id: 's1', title: 'First', collapsed: false }], }; const result = addSection(dashboard, { id: 's2', title: 'Second', collapsed: false, }); expect(result.containers).toHaveLength(2); expect(result.containers![1].id).toBe('s2'); }); }); describe('rename section', () => { it('renames a section', () => { const dashboard: SimpleDashboard = { tiles: [], containers: [{ id: 's1', title: 'Old Name', collapsed: false }], }; const result = renameSection(dashboard, 's1', 'New Name'); expect(result.containers![0].title).toBe('New Name'); }); it('trims whitespace from new title', () => { const dashboard: SimpleDashboard = { tiles: [], containers: [{ id: 's1', title: 'Old', collapsed: false }], }; const result = renameSection(dashboard, 's1', ' Trimmed '); expect(result.containers![0].title).toBe('Trimmed'); }); it('rejects empty title', () => { const dashboard: SimpleDashboard = { tiles: [], containers: [{ id: 's1', title: 'Keep Me', collapsed: false }], }; const result = renameSection(dashboard, 's1', ' '); expect(result.containers![0].title).toBe('Keep Me'); }); it('does not affect other sections', () => { const dashboard: SimpleDashboard = { tiles: [], containers: [ { id: 's1', title: 'One', collapsed: false }, { id: 's2', title: 'Two', collapsed: true }, ], }; const result = renameSection(dashboard, 's1', 'Updated'); expect(result.containers![0].title).toBe('Updated'); expect(result.containers![1].title).toBe('Two'); }); }); describe('delete section', () => { it('removes the section', () => { const dashboard: SimpleDashboard = { tiles: [], containers: [ { id: 's1', title: 'Keep', collapsed: false }, { id: 's2', title: 'Delete Me', collapsed: false }, ], }; const result = deleteSection(dashboard, 's2'); expect(result.containers).toHaveLength(1); expect(result.containers![0].id).toBe('s1'); }); it('ungroups child tiles when section is deleted', () => { const dashboard: SimpleDashboard = { tiles: [ { id: 'a', containerId: 's1' }, { id: 'b', containerId: 's1' }, { id: 'c', containerId: 's2' }, { id: 'd' }, ], containers: [ { id: 's1', title: 'Delete Me', collapsed: false }, { id: 's2', title: 'Keep', collapsed: false }, ], }; const result = deleteSection(dashboard, 's1'); expect(result.containers).toHaveLength(1); expect(result.tiles.find(t => t.id === 'a')?.containerId).toBeUndefined(); expect(result.tiles.find(t => t.id === 'b')?.containerId).toBeUndefined(); expect(result.tiles.find(t => t.id === 'c')?.containerId).toBe('s2'); expect(result.tiles.find(t => t.id === 'd')?.containerId).toBeUndefined(); }); it('handles deleting the last section', () => { const dashboard: SimpleDashboard = { tiles: [{ id: 'a', containerId: 's1' }], containers: [{ id: 's1', title: 'Only One', collapsed: false }], }; const result = deleteSection(dashboard, 's1'); expect(result.containers).toHaveLength(0); expect(result.tiles[0].containerId).toBeUndefined(); }); }); describe('toggle default collapsed', () => { it('toggles collapsed from false to true', () => { const dashboard: SimpleDashboard = { tiles: [], containers: [{ id: 's1', title: 'Test', collapsed: false }], }; const result = toggleSectionCollapsed(dashboard, 's1'); expect(result.containers![0].collapsed).toBe(true); }); it('toggles collapsed from true to false', () => { const dashboard: SimpleDashboard = { tiles: [], containers: [{ id: 's1', title: 'Test', collapsed: true }], }; const result = toggleSectionCollapsed(dashboard, 's1'); expect(result.containers![0].collapsed).toBe(false); }); }); describe('move tile to section', () => { it('assigns a tile to a section', () => { const dashboard: SimpleDashboard = { tiles: [{ id: 'a' }, { id: 'b' }], containers: [{ id: 's1', title: 'Target', collapsed: false }], }; const result = moveTileToSection(dashboard, 'a', 's1'); expect(result.tiles.find(t => t.id === 'a')?.containerId).toBe('s1'); expect(result.tiles.find(t => t.id === 'b')?.containerId).toBeUndefined(); }); it('moves a tile between sections', () => { const dashboard: SimpleDashboard = { tiles: [{ id: 'a', containerId: 's1' }], containers: [ { id: 's1', title: 'From', collapsed: false }, { id: 's2', title: 'To', collapsed: false }, ], }; const result = moveTileToSection(dashboard, 'a', 's2'); expect(result.tiles[0].containerId).toBe('s2'); }); it('ungroups a tile from a section', () => { const dashboard: SimpleDashboard = { tiles: [{ id: 'a', containerId: 's1' }], containers: [{ id: 's1', title: 'Source', collapsed: false }], }; const result = moveTileToSection(dashboard, 'a', undefined); expect(result.tiles[0].containerId).toBeUndefined(); }); }); }); ================================================ FILE: packages/app/src/__tests__/localStore.test.ts ================================================ import { SavedSearch, TSource } from '@hyperdx/common-utils/dist/types'; // Mock config so we can control HDX_LOCAL_DEFAULT_SOURCES in tests jest.mock('../config', () => ({ HDX_LOCAL_DEFAULT_SOURCES: null, })); // Mock parseJSON so tests aren't coupled to its implementation. // Returns null for empty/falsy input, matching the real parseJSON behaviour. jest.mock('../utils', () => ({ parseJSON: jest.fn((s: string) => { if (!s) return null; return JSON.parse(s); }), })); import { createEntityStore, localSavedSearches, localSources, } from '../localStore'; type Item = { id: string; name: string }; const TEST_KEY = 'test-entity-store'; function makeStore() { return createEntityStore(TEST_KEY); } beforeEach(() => { localStorage.clear(); jest.clearAllMocks(); }); // --------------------------------------------------------------------------- // createEntityStore — core CRUD // --------------------------------------------------------------------------- describe('createEntityStore', () => { describe('getAll', () => { it('returns empty array when store is empty', () => { const store = makeStore(); expect(store.getAll()).toEqual([]); }); it('returns stored items', () => { const store = makeStore(); store.create({ name: 'alpha' }); store.create({ name: 'beta' }); expect(store.getAll()).toHaveLength(2); expect(store.getAll().map(i => i.name)).toEqual(['alpha', 'beta']); }); it('calls getDefaultItems when the key is absent', () => { const defaults: Item[] = [{ id: 'default-1', name: 'default' }]; const getDefaultItems = jest.fn(() => defaults); const store = createEntityStore(TEST_KEY, getDefaultItems); const result = store.getAll(); expect(getDefaultItems).toHaveBeenCalledTimes(1); expect(result).toEqual(defaults); }); it('does not call getDefaultItems once data exists in storage', () => { const getDefaultItems = jest.fn(() => [ { id: 'default-1', name: 'default' }, ]); const store = createEntityStore(TEST_KEY, getDefaultItems); // First write: key absent, so getDefaultItems is used to seed transact store.create({ name: 'persisted' }); getDefaultItems.mockClear(); // Subsequent reads/writes should not consult defaults store.getAll(); expect(getDefaultItems).not.toHaveBeenCalled(); }); }); describe('create', () => { it('persists a new item and returns it with a generated id', () => { const store = makeStore(); const created = store.create({ name: 'new item' }); expect(created.name).toBe('new item'); expect(created.id).toBeDefined(); expect(store.getAll()).toHaveLength(1); expect(store.getAll()[0]).toEqual(created); }); it('generates hex ids matching /[0-9a-f]+/', () => { const store = makeStore(); const { id } = store.create({ name: 'x' }); expect(id).toMatch(/^[0-9a-f]+$/); }); it('each create appends without replacing existing items', () => { const store = makeStore(); store.create({ name: 'first' }); store.create({ name: 'second' }); store.create({ name: 'third' }); expect(store.getAll()).toHaveLength(3); }); }); describe('update', () => { it('updates the matching item and returns the updated value', () => { const store = makeStore(); const { id } = store.create({ name: 'original' }); const updated = store.update(id, { name: 'updated' }); expect(updated).toEqual({ id, name: 'updated' }); expect(store.getAll()[0]).toEqual({ id, name: 'updated' }); }); it('preserves other items when updating', () => { const store = makeStore(); const a = store.create({ name: 'a' }); const b = store.create({ name: 'b' }); store.update(a.id, { name: 'a-updated' }); const all = store.getAll(); expect(all).toHaveLength(2); expect(all.find(i => i.id === b.id)?.name).toBe('b'); }); it('preserves the original id even if updates include an id field', () => { const store = makeStore(); const { id } = store.create({ name: 'x' }); const updated = store.update(id, { name: 'y', id: 'injected-id', } as Partial>); expect(updated.id).toBe(id); }); it('throws when id is not found', () => { const store = makeStore(); expect(() => store.update('nonexistent', { name: 'x' })).toThrow( /not found/, ); }); }); describe('delete', () => { it('removes the item with the given id', () => { const store = makeStore(); const { id } = store.create({ name: 'to-delete' }); store.create({ name: 'keep' }); store.delete(id); const all = store.getAll(); expect(all).toHaveLength(1); expect(all[0].name).toBe('keep'); }); it('is a no-op for a non-existent id', () => { const store = makeStore(); store.create({ name: 'a' }); expect(() => store.delete('nonexistent')).not.toThrow(); expect(store.getAll()).toHaveLength(1); }); }); describe('set', () => { it('replaces the entire collection', () => { const store = makeStore(); store.create({ name: 'old' }); const replacement: Item[] = [ { id: 'x1', name: 'new-a' }, { id: 'x2', name: 'new-b' }, ]; store.set(replacement); expect(store.getAll()).toEqual(replacement); }); it('set with empty array clears the store', () => { const store = makeStore(); store.create({ name: 'a' }); store.set([]); expect(store.getAll()).toEqual([]); }); }); describe('isolation', () => { it('two stores with different keys do not share data', () => { const storeA = createEntityStore('key-a'); const storeB = createEntityStore('key-b'); storeA.create({ name: 'a-item' }); expect(storeB.getAll()).toEqual([]); }); }); describe('mutations against env-var defaults (key absent from localStorage)', () => { const defaults: Item[] = [{ id: 'default-id', name: 'default-item' }]; function makeStoreWithDefaults() { return createEntityStore(TEST_KEY, () => defaults); } it('update finds an item that exists only in defaults', () => { const store = makeStoreWithDefaults(); // Nothing in localStorage yet — getAll() returns defaults expect(store.getAll()).toEqual(defaults); const updated = store.update('default-id', { name: 'updated-name' }); expect(updated).toEqual({ id: 'default-id', name: 'updated-name' }); // After the write the value is now in localStorage expect(store.getAll()).toEqual([ { id: 'default-id', name: 'updated-name' }, ]); }); it('delete removes an item that exists only in defaults', () => { const store = makeStoreWithDefaults(); store.delete('default-id'); expect(store.getAll()).toEqual([]); }); it('create preserves defaults when adding a new item', () => { const store = makeStoreWithDefaults(); const created = store.create({ name: 'brand-new' }); const all = store.getAll(); expect(all).toHaveLength(2); expect(all.find(i => i.id === 'default-id')).toBeDefined(); expect(all.find(i => i.id === created.id)).toBeDefined(); }); }); }); // --------------------------------------------------------------------------- // localSources — env-var default fallback // --------------------------------------------------------------------------- describe('localSources', () => { const mockedUtils = jest.requireMock('../utils') as { parseJSON: jest.Mock }; const mockedConfig = jest.requireMock('../config') as { HDX_LOCAL_DEFAULT_SOURCES: string | null; }; it('returns empty array when storage is empty and no env-var default', () => { mockedConfig.HDX_LOCAL_DEFAULT_SOURCES = null; expect(localSources.getAll()).toEqual([]); }); it('returns env-var defaults when storage is empty', () => { const defaults = [{ id: 'src-1', name: 'Demo Logs' }]; mockedConfig.HDX_LOCAL_DEFAULT_SOURCES = JSON.stringify(defaults); mockedUtils.parseJSON.mockReturnValueOnce(defaults); expect(localSources.getAll()).toEqual(defaults); }); it('persists defaults + new item on first write and stops consulting env-var after', () => { const envDefaults = [{ id: 'env-src', name: 'Env Source' }]; mockedConfig.HDX_LOCAL_DEFAULT_SOURCES = JSON.stringify(envDefaults); // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion const stored = localSources.create({ name: 'My Source' } as Omit< TSource, 'id' >); mockedUtils.parseJSON.mockClear(); const all = localSources.getAll(); expect(all).toHaveLength(2); expect(all.find(s => s.id === 'env-src')).toBeDefined(); expect(all.find(s => s.id === stored.id)).toBeDefined(); // Subsequent reads do not consult env-var defaults expect(mockedUtils.parseJSON).not.toHaveBeenCalled(); }); }); // --------------------------------------------------------------------------- // localSavedSearches — basic sanity (delegates to createEntityStore) // --------------------------------------------------------------------------- describe('localSavedSearches', () => { it('starts empty', () => { expect(localSavedSearches.getAll()).toEqual([]); }); it('creates, updates, and deletes a saved search', () => { const created = localSavedSearches.create({ name: 'My Search', select: 'Timestamp, Body', where: '', whereLanguage: 'lucene', source: 'src-1', tags: [], filters: [], orderBy: '', } as Omit); expect(created.id).toMatch(/^[0-9a-f]+$/); expect(localSavedSearches.getAll()).toHaveLength(1); localSavedSearches.update(created.id, { name: 'Renamed' }); expect(localSavedSearches.getAll()[0].name).toBe('Renamed'); localSavedSearches.delete(created.id); expect(localSavedSearches.getAll()).toHaveLength(0); }); }); ================================================ FILE: packages/app/src/__tests__/otelSemanticConventions.test.ts ================================================ import { getMetricNameSql } from '../otelSemanticConventions'; describe('otelSemanticConventions', () => { describe('getMetricNameSql', () => { it('should return SQL for k8s.pod.cpu.utilization migration', () => { const result = getMetricNameSql('k8s.pod.cpu.utilization'); expect(result).toBe( "MetricName IN ('k8s.pod.cpu.utilization', 'k8s.pod.cpu.usage')", ); }); it('should return SQL for k8s.node.cpu.utilization migration', () => { const result = getMetricNameSql('k8s.node.cpu.utilization'); expect(result).toBe( "MetricName IN ('k8s.node.cpu.utilization', 'k8s.node.cpu.usage')", ); }); it('should return SQL for container.cpu.utilization migration', () => { const result = getMetricNameSql('container.cpu.utilization'); expect(result).toBe( "MetricName IN ('container.cpu.utilization', 'container.cpu.usage')", ); }); it('should return undefined for non-migrated metrics', () => { const result = getMetricNameSql('some.other.metric'); expect(result).toBeUndefined(); }); it('should return undefined for empty string', () => { const result = getMetricNameSql(''); expect(result).toBeUndefined(); }); it('should return undefined for new metric names', () => { // If someone queries using the new name directly, we shouldn't transform it const result = getMetricNameSql('k8s.pod.cpu.usage'); expect(result).toBeUndefined(); }); }); }); ================================================ FILE: packages/app/src/__tests__/searchFilters.test.ts ================================================ import { enableMapSet } from 'immer'; import { act, renderHook } from '@testing-library/react'; import { areFiltersEqual, filtersToQuery, parseQuery, useSearchPageFilterState, } from '../searchFilters'; enableMapSet(); describe('searchFilters', () => { describe('filtersToQuery', () => { it('should return empty string when no filters', () => { const filters = {}; expect(filtersToQuery(filters)).toEqual([]); }); it('should return query for one filter', () => { const filters = { a: { included: new Set(['b']), excluded: new Set() }, }; expect(filtersToQuery(filters)).toEqual([ { type: 'sql', condition: "a IN ('b')" }, ]); }); it('should return query for multiple filters', () => { const filters = { a: { included: new Set(['b']), excluded: new Set() }, c: { included: new Set(['d', 'x']), excluded: new Set(), }, }; expect(filtersToQuery(filters)).toEqual([ { type: 'sql', condition: "a IN ('b')" }, { type: 'sql', condition: "c IN ('d', 'x')" }, ]); }); it('should handle excluded values', () => { const filters = { a: { included: new Set(['b']), excluded: new Set(['c']), }, }; expect(filtersToQuery(filters)).toEqual([ { type: 'sql', condition: "a IN ('b')" }, { type: 'sql', condition: "a NOT IN ('c')" }, ]); }); it('should wrap keys with toString() when specified', () => { const filters = { 'json.key': { included: new Set(['value']), excluded: new Set(['other value']), }, }; expect(filtersToQuery(filters, { stringifyKeys: true })).toEqual([ { type: 'sql', condition: "toString(json.key) IN ('value')" }, { type: 'sql', condition: "toString(json.key) NOT IN ('other value')" }, ]); }); it('should should handle boolean filter values', () => { const filters = { isRootSpan: { included: new Set([true]), excluded: new Set([]), }, another_column: { included: new Set([]), excluded: new Set([true, false]), }, }; expect(filtersToQuery(filters)).toEqual([ { type: 'sql', condition: 'isRootSpan IN (true)' }, { type: 'sql', condition: 'another_column NOT IN (true, false)' }, ]); }); }); describe('parseQuery', () => { it('empty query', () => { const result = parseQuery([]); expect(result.filters).toEqual({}); }); it('parses one filter', () => { const result = parseQuery([ { type: 'sql', condition: `service IN ('z')` }, ]); expect(result.filters).toEqual({ service: { included: new Set(['z']), excluded: new Set() }, }); }); it('parses 1 group, multiple values', () => { const result = parseQuery([ { type: 'sql', condition: `service IN ('z', 'y', 'x')` }, ]); expect(result.filters).toEqual({ service: { included: new Set(['z', 'y', 'x']), excluded: new Set() }, }); }); it('parses 3 groups, multiple values', () => { const result = parseQuery([ { type: 'sql', condition: `service IN ('z', 'y', 'x')` }, { type: 'sql', condition: `level IN ('info', 'error')` }, { type: 'sql', condition: `type IN ('event')` }, ]); expect(result.filters).toEqual({ service: { included: new Set(['z', 'y', 'x']), excluded: new Set() }, level: { included: new Set(['info', 'error']), excluded: new Set() }, type: { included: new Set(['event']), excluded: new Set() }, }); }); it('parses excluded values', () => { const result = parseQuery([ { type: 'sql', condition: `service IN ('z')` }, { type: 'sql', condition: `service NOT IN ('y')` }, ]); expect(result.filters).toEqual({ service: { included: new Set(['z']), excluded: new Set(['y']) }, }); }); it('skips non-supported filters', () => { const result = parseQuery([{ type: 'lucene', condition: `app:*` }]); expect(result.filters).toEqual({}); }); it('extracts IN clauses from complex conditions with AND operator', () => { const result = parseQuery([ { type: 'sql', condition: `SpanName = 'flagd.evaluation.v1.Service/EventStream' AND SpanKind IN ('Server', 'SPAN_KIND_SERVER')`, }, ]); expect(result.filters).toEqual({ SpanKind: { included: new Set(['Server', 'SPAN_KIND_SERVER']), excluded: new Set(), }, }); }); it('skips conditions with OR operator (not supported)', () => { const result = parseQuery([ { type: 'sql', condition: `level IN ('error') OR severity IN ('high')`, }, ]); // OR is not supported, so it just tries to parse as-is and should fail cleanly expect(result.filters).toEqual({}); }); it('skips conditions with only equality operators', () => { const result = parseQuery([ { type: 'sql', condition: `status_code = 200`, }, ]); expect(result.filters).toEqual({}); }); it('skips conditions with only comparison operators', () => { const result = parseQuery([ { type: 'sql', condition: `duration > 1000`, }, ]); expect(result.filters).toEqual({}); }); it('parses simple IN conditions alongside extracting from complex conditions', () => { const result = parseQuery([ { type: 'sql', condition: `service IN ('app', 'api')` }, { type: 'sql', condition: `SpanName = 'test' AND SpanKind IN ('Server')`, }, { type: 'sql', condition: `level IN ('error')` }, ]); expect(result.filters).toEqual({ service: { included: new Set(['app', 'api']), excluded: new Set() }, SpanKind: { included: new Set(['Server']), excluded: new Set() }, level: { included: new Set(['error']), excluded: new Set() }, }); }); it('handles multiple IN clauses with AND', () => { const result = parseQuery([ { type: 'sql', condition: `service IN ('app') AND level IN ('error', 'warn')`, }, ]); expect(result.filters).toEqual({ service: { included: new Set(['app']), excluded: new Set() }, level: { included: new Set(['error', 'warn']), excluded: new Set() }, }); }); it('extracts NOT IN clauses from complex conditions', () => { const result = parseQuery([ { type: 'sql', condition: `status = 'active' AND level NOT IN ('debug')`, }, ]); expect(result.filters).toEqual({ level: { included: new Set(), excluded: new Set(['debug']) }, }); }); it('handles string values with special characters in AND conditions', () => { const result = parseQuery([ { type: 'sql', condition: `SpanName = 'flagd.evaluation.v1.Service/EventStream' AND SpanKind IN ('Server', 'SPAN_KIND_SERVER')`, }, ]); expect(result.filters).toEqual({ SpanKind: { included: new Set(['Server', 'SPAN_KIND_SERVER']), excluded: new Set(), }, }); }); it('handles JSON values with commas and special characters', () => { const result = parseQuery([ { type: 'sql', condition: `Body IN ('{"orderId": "123", "total": 100}')`, }, ]); expect(result.filters).toEqual({ Body: { included: new Set(['{"orderId": "123", "total": 100}']), excluded: new Set(), }, }); }); it('handles complex multi-line JSON values', () => { const result = parseQuery([ { type: 'sql', condition: `Body IN ('Order details: { "orderId": "7b54ad99", "items": [{"id": 1}, {"id": 2}] }')`, }, ]); expect(result.filters).toEqual({ Body: { included: new Set([ 'Order details: { "orderId": "7b54ad99", "items": [{"id": 1}, {"id": 2}] }', ]), excluded: new Set(), }, }); }); it('handles multiple simple values alongside single complex JSON value', () => { const result = parseQuery([ { type: 'sql', condition: `status IN ('active', 'pending')`, }, { type: 'sql', condition: `data IN ('{"key": "value", "nested": {"a": 1}}')`, }, ]); expect(result.filters).toEqual({ status: { included: new Set(['active', 'pending']), excluded: new Set(), }, data: { included: new Set(['{"key": "value", "nested": {"a": 1}}']), excluded: new Set(), }, }); }); it('handles boolean filter values', () => { const result = parseQuery([ { type: 'sql', condition: `isRootSpan IN (true)`, }, { type: 'sql', condition: `another_boolean NOT IN (TRUE, FALSE)`, }, ]); expect(result.filters).toEqual({ isRootSpan: { included: new Set([true]), excluded: new Set(), }, another_boolean: { included: new Set(), excluded: new Set([true, false]), }, }); }); }); describe('areFiltersEqual', () => { it('should return true for equal filters', () => { const a = { a: { included: new Set(['b']), excluded: new Set() }, }; const b = { a: { included: new Set(['b']), excluded: new Set() }, }; expect(areFiltersEqual(a, b)).toBe(true); }); it('should return false for different filters', () => { const a = { a: { included: new Set(['b']), excluded: new Set() }, }; const b = { a: { included: new Set(['c']), excluded: new Set() }, }; expect(areFiltersEqual(a, b)).toBe(false); }); it('should return true for equal filters in different order', () => { const a = { service: { included: new Set(['a', 'b']), excluded: new Set(), }, level: { included: new Set(['info', 'error']), excluded: new Set(), }, type: { included: new Set(), excluded: new Set() }, }; const b = { level: { included: new Set(['error', 'info']), excluded: new Set(), }, service: { included: new Set(['b', 'a']), excluded: new Set(), }, type: { included: new Set(), excluded: new Set() }, }; expect(areFiltersEqual(a, b)).toBe(true); }); it('should handle boolean filters', () => { const a = { isRootSpan: { included: new Set([true]), excluded: new Set(), }, another_column: { included: new Set(), excluded: new Set([true, false]), }, }; const b = { isRootSpan: { included: new Set([true]), excluded: new Set(), }, another_column: { included: new Set(), excluded: new Set([false, true]), }, }; expect(areFiltersEqual(a, b)).toBe(true); }); }); describe('useSearchPageFilterState', () => { const onFilterChange = jest.fn(); it('adding filter to empty query', () => { const { result } = renderHook(() => useSearchPageFilterState({ searchQuery: [], onFilterChange, }), ); act(() => { result.current.setFilterValue('service', 'app'); result.current.setFilterValue('level', 'error'); }); expect(onFilterChange).toHaveBeenLastCalledWith([ { type: 'sql', condition: "service IN ('app')", }, { type: 'sql', condition: "level IN ('error')", }, ]); }); it('updating filter query', () => { const { result } = renderHook(() => useSearchPageFilterState({ searchQuery: [ { type: 'sql', condition: `service IN ('hdx-oss-dev-app')` }, { type: 'sql', condition: `hyperdx_event_type IN ('span')` }, { type: 'sql', condition: `level IN ('info', 'ok')` }, ], onFilterChange, }), ); act(() => { result.current.setFilterValue('service', 'hdx-oss-dev-app'); // deselect result.current.setFilterValue('another_facet', 'some_value'); }); expect(onFilterChange).toHaveBeenLastCalledWith([ { type: 'sql', condition: `hyperdx_event_type IN ('span')` }, { type: 'sql', condition: `level IN ('info', 'ok')` }, { type: 'sql', condition: `another_facet IN ('some_value')` }, ]); }); it('clearing filter', () => { const { result } = renderHook(() => useSearchPageFilterState({ searchQuery: [ { type: 'sql', condition: `service IN ('hdx-oss-dev-app')` }, { type: 'sql', condition: `hyperdx_event_type IN ('span')` }, { type: 'sql', condition: `level IN ('info', 'ok')` }, ], onFilterChange, }), ); act(() => { result.current.clearFilter('level'); }); expect(onFilterChange).toHaveBeenLastCalledWith([ { type: 'sql', condition: `service IN ('hdx-oss-dev-app')` }, { type: 'sql', condition: `hyperdx_event_type IN ('span')` }, ]); }); it('correctly hydrates filter state from query', () => { const { result } = renderHook(() => useSearchPageFilterState({ searchQuery: [ { type: 'sql', condition: `service IN ('hdx-oss-dev-app')` }, { type: 'sql', condition: `hyperdx_event_type IN ('span')` }, { type: 'sql', condition: `level IN ('info', 'ok')` }, ], onFilterChange, }), ); expect(result.current.filters).toEqual({ service: { included: new Set(['hdx-oss-dev-app']), excluded: new Set(), }, hyperdx_event_type: { included: new Set(['span']), excluded: new Set(), }, level: { included: new Set(['info', 'ok']), excluded: new Set() }, }); }); it('should clear excluded values when using only action', () => { const { result } = renderHook(() => useSearchPageFilterState({ searchQuery: [ { type: 'sql', condition: `service IN ('app')` }, { type: 'sql', condition: `level NOT IN ('error')` }, ], onFilterChange, }), ); act(() => { result.current.setFilterValue('level', 'info', 'only'); }); expect(onFilterChange).toHaveBeenCalledWith([ { type: 'sql', condition: `service IN ('app')` }, { type: 'sql', condition: `level IN ('info')` }, // Should only have the included value, no excluded values ]); }); }); }); ================================================ FILE: packages/app/src/__tests__/serviceDashboard.test.ts ================================================ import type { ColumnMeta } from '@hyperdx/common-utils/dist/clickhouse'; import type { TTraceSource } from '@hyperdx/common-utils/dist/types'; import { SourceKind } from '@hyperdx/common-utils/dist/types'; import { renderHook } from '@testing-library/react'; import * as metadataModule from '../hooks/useMetadata'; import { getExpressions, makeCoalescedFieldsAccessQuery, useServiceDashboardExpressions, } from '../serviceDashboard'; function removeAllWhitespace(str: string) { return str.replace(/\s|\t|\n/g, ''); } describe('Service Dashboard', () => { const mockSource: TTraceSource = { id: 'test-source', name: 'Test Source', kind: SourceKind.Trace, from: { databaseName: 'test_db', tableName: 'otel_traces_json', }, connection: 'test-connection', timestampValueExpression: 'Timestamp', defaultTableSelectExpression: 'Timestamp', durationExpression: 'Duration', durationPrecision: 9, traceIdExpression: 'TraceId', spanIdExpression: 'SpanId', parentSpanIdExpression: 'ParentSpanId', serviceNameExpression: 'ServiceName', spanNameExpression: 'SpanName', spanKindExpression: 'SpanKind', statusCodeExpression: 'StatusCode', }; describe('getExpressions', () => { it('should use map syntax for non-JSON columns by default', () => { const expressions = getExpressions(mockSource, [], []); expect(expressions.k8sResourceName).toBe( "SpanAttributes['k8s.resource.name']", ); expect(expressions.k8sPodName).toBe("SpanAttributes['k8s.pod.name']"); expect(expressions.serverAddress).toBe( "SpanAttributes['server.address']", ); expect(expressions.httpHost).toBe("SpanAttributes['http.host']"); expect(expressions.dbStatement).toBe( "coalesce(nullif(SpanAttributes['db.query.text'], ''), nullif(SpanAttributes['db.statement'], ''))", ); }); it('should use backtick syntax when SpanAttributes is a JSON column', () => { const expressions = getExpressions(mockSource, [], ['SpanAttributes']); expect(expressions.k8sResourceName).toBe( 'SpanAttributes.`k8s.resource.name`', ); expect(expressions.k8sPodName).toBe('SpanAttributes.`k8s.pod.name`'); expect(expressions.serverAddress).toBe('SpanAttributes.`server.address`'); expect(expressions.httpHost).toBe('SpanAttributes.`http.host`'); const resultWithWhitespaceStripped = removeAllWhitespace( expressions.dbStatement, ); expect(resultWithWhitespaceStripped).toEqual( `coalesce(if(toString(SpanAttributes.\`db.query.text\`)!='',toString(SpanAttributes.\`db.query.text\`),if(toString(SpanAttributes.\`db.statement\`)!='',toString(SpanAttributes.\`db.statement\`),'')))`, ); }); it('should work with empty jsonColumns array', () => { const expressions = getExpressions(mockSource, [], []); // Should default to map syntax expect(expressions.k8sResourceName).toBe( "SpanAttributes['k8s.resource.name']", ); }); }); describe('makeCoalescedFieldsAccessQuery', () => { it('should throw an error if an empty list of fields is passed', () => { expect(() => { makeCoalescedFieldsAccessQuery([], false); }).toThrow( 'Empty fields array passed while trying to build a coalesced field access query', ); }); it('should throw an error if more than 100 fields are passed', () => { expect(() => { makeCoalescedFieldsAccessQuery(Array(101).fill('field'), false); }).toThrow( 'Too many fields (101) passed while trying to build a coalesced field access query. Maximum allowed is 100', ); }); it('should handle single field for non-JSON columns', () => { const result = makeCoalescedFieldsAccessQuery(['field1'], false); expect(result).toBe("nullif(field1, '')"); }); it('should handle single field for JSON columns', () => { const result = makeCoalescedFieldsAccessQuery(['field1'], true); expect(result).toBe("if(toString(field1) != '', toString(field1), '')"); }); it('should handle multiple fields for non-JSON columns', () => { const result = makeCoalescedFieldsAccessQuery( ['field1', 'field2'], false, ); expect(result).toBe("coalesce(nullif(field1, ''), nullif(field2, ''))"); }); it('should handle multiple fields for JSON columns', () => { const result = makeCoalescedFieldsAccessQuery(['field1', 'field2'], true); const resultWithWhitespaceStripped = removeAllWhitespace(result); expect(resultWithWhitespaceStripped).toEqual( `coalesce(if(toString(field1)!='',toString(field1),if(toString(field2)!='',toString(field2),'')))`, ); }); it('should handle three fields for JSON columns', () => { const result = makeCoalescedFieldsAccessQuery( ['field1', 'field2', 'field3'], true, ); const resultWithWhitespaceStripped = removeAllWhitespace(result); expect(resultWithWhitespaceStripped).toEqual( `coalesce(if(toString(field1)!='',toString(field1),if(toString(field2)!='',toString(field2),if(toString(field3)!='',toString(field3),''))))`, ); }); it('should handle three fields for non-JSON columns', () => { const result = makeCoalescedFieldsAccessQuery( ['field1', 'field2', 'field3'], false, ); expect(result).toBe( "coalesce(nullif(field1, ''), nullif(field2, ''), nullif(field3, ''))", ); }); }); describe('useServiceDashboardExpressions', () => { const mockColumns: ColumnMeta[] = [ { name: 'Duration', type: 'UInt64' }, { name: 'TraceId', type: 'String' }, { name: 'ServiceName', type: 'String' }, { name: 'SpanName', type: 'String' }, { name: 'SpanKind', type: 'String' }, { name: 'StatusCode', type: 'String' }, { name: 'SpanAttributes', type: 'Map(String, String)' }, ] as ColumnMeta[]; const mockJsonColumns: string[] = []; beforeEach(() => { jest.clearAllMocks(); }); it('should return loading state when source is undefined', () => { jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: undefined, isLoading: false, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: undefined, isLoading: false, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: undefined }), ); expect(result.current.isLoading).toBe(true); expect(result.current.expressions).toBeUndefined(); }); it('should return loading state when columns are loading', () => { jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: undefined, isLoading: true, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: undefined, isLoading: true, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: mockSource }), ); expect(result.current.isLoading).toBe(true); expect(result.current.expressions).toBeUndefined(); }); it('should return loading state when jsonColumns are loading', () => { jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: undefined, isLoading: true, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: mockColumns, isLoading: false, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: mockSource }), ); expect(result.current.isLoading).toBe(true); expect(result.current.expressions).toBeUndefined(); }); it('should return expressions when data is loaded with non-JSON columns', () => { jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: mockJsonColumns, isLoading: false, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: mockColumns, isLoading: false, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: mockSource }), ); expect(result.current.isLoading).toBe(false); expect(result.current.expressions).toBeDefined(); expect(result.current.expressions?.duration).toBe('Duration'); expect(result.current.expressions?.service).toBe('ServiceName'); expect(result.current.expressions?.spanName).toBe('SpanName'); expect(result.current.expressions?.traceId).toBe('TraceId'); expect(result.current.expressions?.k8sResourceName).toBe( "SpanAttributes['k8s.resource.name']", ); }); it('should return expressions when data is loaded with JSON columns', () => { jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: ['SpanAttributes'], isLoading: false, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: mockColumns, isLoading: false, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: mockSource }), ); expect(result.current.isLoading).toBe(false); expect(result.current.expressions).toBeDefined(); expect(result.current.expressions?.k8sResourceName).toBe( 'SpanAttributes.`k8s.resource.name`', ); }); it('should use materialized endpoint column when available', () => { const columnsWithEndpoint: ColumnMeta[] = [ ...mockColumns, { name: 'endpoint', type: 'String' }, ] as ColumnMeta[]; jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: mockJsonColumns, isLoading: false, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: columnsWithEndpoint, isLoading: false, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: mockSource }), ); expect(result.current.isLoading).toBe(false); expect(result.current.expressions?.endpoint).toBe('endpoint'); }); it('should fallback to spanName when materialized endpoint column is not available', () => { jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: mockJsonColumns, isLoading: false, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: mockColumns, isLoading: false, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: mockSource }), ); expect(result.current.isLoading).toBe(false); expect(result.current.expressions?.endpoint).toBe('SpanName'); }); it('should include filter expressions', () => { jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: mockJsonColumns, isLoading: false, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: mockColumns, isLoading: false, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: mockSource }), ); expect(result.current.isLoading).toBe(false); expect(result.current.expressions?.isError).toBe( "lower(StatusCode) = 'error'", ); expect(result.current.expressions?.isSpanKindServer).toContain( 'SpanKind IN', ); expect(result.current.expressions?.isEndpointNonEmpty).toContain( 'NOT empty(', ); }); it('should include auxiliary expressions', () => { jest.spyOn(metadataModule, 'useJsonColumns').mockReturnValue({ data: mockJsonColumns, isLoading: false, } as any); jest.spyOn(metadataModule, 'useColumns').mockReturnValue({ data: mockColumns, isLoading: false, } as any); const { result } = renderHook(() => useServiceDashboardExpressions({ source: mockSource }), ); expect(result.current.isLoading).toBe(false); expect(result.current.expressions?.durationInMillis).toBe('Duration/1e6'); expect(result.current.expressions?.durationDivisorForMillis).toBe('1e6'); }); }); }); ================================================ FILE: packages/app/src/__tests__/source.test.ts ================================================ import { SourceKind, TTraceSource } from '@hyperdx/common-utils/dist/types'; import { getEventBody } from '../source'; describe('getEventBody', () => { // Added to prevent regression back to HDX-3361 it('returns spanNameExpression for trace kind source when both bodyExpression and spanNameExpression are present', () => { const source = { kind: SourceKind.Trace, from: { databaseName: 'default', tableName: 'otel_traces', }, timestampValueExpression: 'Timestamp', connection: 'test-connection', name: 'Traces', id: 'test-source-id', spanNameExpression: 'SpanName', durationExpression: 'Duration', durationPrecision: 9, traceIdExpression: 'TraceId', spanIdExpression: 'SpanId', parentSpanIdExpression: 'ParentSpanId', spanKindExpression: 'SpanKind', } as TTraceSource; const result = getEventBody(source); expect(result).toBe('SpanName'); }); }); ================================================ FILE: packages/app/src/__tests__/timeQuery.test.tsx ================================================ import * as React from 'react'; import { useImperativeHandle } from 'react'; import { useRouter } from 'next/router'; import { NextAdapter } from 'next-query-params'; import { QueryParamProvider } from 'use-query-params'; import { LocationMock } from '@jedmao/location'; import { render } from '@testing-library/react'; import { TestRouter } from '@/fixtures'; import { getLiveTailTimeRange, useNewTimeQuery, type UseTimeQueryInputType, type UseTimeQueryReturnType, } from '../timeQuery'; import { useUserPreferences } from '../useUserPreferences'; // Setting a fixed time of 10/03/23 at 12pm EDT const INITIAL_DATE_STRING = 'Tue Oct 03 2023 12:00:00 GMT-0400 (Eastern Daylight Time)'; jest.mock('next/router', () => ({ useRouter: jest.fn(), })); function TestWrapper({ children, isUTC, }: { children: React.ReactNode; isUTC?: boolean; }) { const { setUserPreference } = useUserPreferences(); React.useEffect(() => { setUserPreference({ isUTC }); }, [setUserPreference, isUTC]); return ( {children} ); } const TestComponent = React.forwardRef(function Component( timeQueryInput: UseTimeQueryInputType, ref: React.Ref, ) { const timeQueryVal = useNewTimeQuery(timeQueryInput); useImperativeHandle(ref, () => timeQueryVal); return null; }); const { location: savedLocation } = window; // TODO: Issues with testing nuqs :( // https://github.com/47ng/nuqs/issues/259 describe.skip('useTimeQuery tests', () => { let testRouter: TestRouter; let locationMock: LocationMock; beforeAll(() => { // @ts-ignore - This complains because we can only delete optional operands delete window.location; }); beforeEach(() => { jest.resetAllMocks(); locationMock = new LocationMock('https://www.hyperdx.io/'); testRouter = new TestRouter(locationMock); // @ts-ignore - this is a mock window.location = locationMock; (useRouter as jest.Mock).mockReturnValue(testRouter); jest.useFakeTimers().setSystemTime(new Date(INITIAL_DATE_STRING)); }); afterAll(() => { // @ts-ignore - this is a mock window.location = savedLocation; }); it('initializes successfully to a non-UTC time', async () => { const timeQueryRef = React.createRef(); render( , ); // The live tail time range is 15 mins expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Oct 3 11:45:00 - Oct 3 12:00:00"`, ); }); it('initializes successfully to a UTC time', async () => { const timeQueryRef = React.createRef(); render( , ); // The live tail time range is 15 mins expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Oct 3 15:45:00 - Oct 3 16:00:00"`, ); }); it('can be overridden by `tq` url param', async () => { const timeQueryRef = React.createRef(); testRouter.replace('/search?tq=Last+4H'); const { rerender } = render( , ); jest.runAllTimers(); rerender( , ); jest.runAllTimers(); // Once the hook runs, it will unset the `tq` param and replace it with // a `from` and `to` expect(locationMock.searchParams.get('tq')).toBeNull(); // `From` should be 10/03/23 at 8:00am EDT expect(locationMock.searchParams.get('from')).toBe('1696334400000'); // `To` should be 10/03/23 at 12:00pm EDT expect(locationMock.searchParams.get('to')).toBe('1696348800000'); expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Oct 3 08:00:00 - Oct 3 12:00:00"`, ); }); it('browser navigation of from/to qparmas updates the searched time range', async () => { const timeQueryRef = React.createRef(); testRouter.setIsReady(false); testRouter.replace('/search'); const result = render( , ); jest.runAllTimers(); testRouter.setIsReady(true); result.rerender( , ); expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Past 1h"`, ); expect(timeQueryRef.current?.searchedTimeRange).toMatchInlineSnapshot(` Array [ 2023-10-03T15:45:00.000Z, 2023-10-03T16:00:00.000Z, ] `); // 10/03/23 from 04:00am EDT to 08:00am EDT testRouter.replace('/search?from=1696320000000&to=1696334400000'); result.rerender( , ); result.rerender( , ); expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Oct 3 04:00:00 - Oct 3 08:00:00"`, ); expect(timeQueryRef.current?.searchedTimeRange).toMatchInlineSnapshot(` Array [ 2023-10-03T08:00:00.000Z, 2023-10-03T12:00:00.000Z, ] `); }); it('overrides initial value with async updated `from` and `to` params', async () => { const timeQueryRef = React.createRef(); // 10/03/23 from 04:00am EDT to 08:00am EDT testRouter.setIsReady(false); testRouter.replace('/search'); const result = render( , ); jest.runAllTimers(); testRouter.replace('/search?from=1696320000000&to=1696334400000'); testRouter.setIsReady(true); result.rerender( , ); expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Oct 3 04:00:00 - Oct 3 08:00:00"`, ); expect(timeQueryRef.current?.searchedTimeRange).toMatchInlineSnapshot(` Array [ 2023-10-03T08:00:00.000Z, 2023-10-03T12:00:00.000Z, ] `); }); it('accepts `from` and `to` url params', async () => { const timeQueryRef = React.createRef(); // 10/03/23 from 04:00am EDT to 08:00am EDT testRouter.replace('/search?from=1696320000000&to=1696334400000'); render( , ); jest.runAllTimers(); expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Oct 3 04:00:00 - Oct 3 08:00:00"`, ); }); it('handles bad input in `from` and `to` url params', async () => { const timeQueryRef = React.createRef(); testRouter.replace('/search?from=abc&to=def'); render( , ); jest.runAllTimers(); // Should initialize to the initial time range 11:45am - 12:00pm expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Oct 3 11:45:00 - Oct 3 12:00:00"`, ); }); it('prefers `tq` param over `from` and `to` params', async () => { const timeQueryRef = React.createRef(); // 10/03/23 from 04:00am EDT to 08:00am EDT, tq says last 1 hour testRouter.replace( '/search?from=1696320000000&to=1696334400000&tq=Past+1h', ); const result = render( , ); jest.runAllTimers(); result.rerender( , ); jest.runAllTimers(); // The time range should be the last 1 hour even though the `from` and `to` // params are passed in. expect(timeQueryRef.current?.displayedTimeInputValue).toMatchInlineSnapshot( `"Oct 3 11:00:00 - Oct 3 12:00:00"`, ); }); it('enables custom display value', async () => { const timeQueryRef = React.createRef(); testRouter.replace('/search'); const initialDisplayValue = 'Live Tail'; render( , ); jest.runAllTimers(); expect(timeQueryRef.current?.displayedTimeInputValue).toBe( initialDisplayValue, ); }); }); ================================================ FILE: packages/app/src/__tests__/useUserPreferences.test.tsx ================================================ /** * Unit tests for useUserPreferences migration function * * Tests cover: * - Legacy format migration (theme → colorMode) * - Partial/corrupted localStorage data handling * - Migration idempotency (safe to run multiple times) */ import type { UserPreferences } from '../useUserPreferences'; import { migrateUserPreferences } from '../useUserPreferences'; const STORAGE_KEY = 'hdx-user-preferences'; describe('migrateUserPreferences', () => { // Store original localStorage const originalLocalStorage = window.localStorage; let localStorageMock: jest.Mocked; beforeEach(() => { // Create localStorage mock localStorageMock = { getItem: jest.fn().mockReturnValue(null), setItem: jest.fn(), removeItem: jest.fn(), clear: jest.fn(), key: jest.fn(), length: 0, }; Object.defineProperty(window, 'localStorage', { value: localStorageMock, writable: true, configurable: true, }); }); afterEach(() => { jest.clearAllMocks(); }); afterAll(() => { // Restore original localStorage Object.defineProperty(window, 'localStorage', { value: originalLocalStorage, writable: true, configurable: true, }); }); describe('Legacy format migration (theme → colorMode)', () => { it('should migrate theme="dark" to colorMode="dark"', () => { const legacyData = JSON.stringify({ isUTC: false, timeFormat: '12h', theme: 'dark', font: 'IBM Plex Mono', }); const result = migrateUserPreferences(legacyData); expect(result).toEqual({ isUTC: false, timeFormat: '12h', colorMode: 'dark', font: 'IBM Plex Mono', }); // Verify theme property was removed during migration expect('theme' in (result || {})).toBe(false); expect(localStorageMock.setItem).toHaveBeenCalledWith( STORAGE_KEY, JSON.stringify(result), ); }); it('should migrate theme="light" to colorMode="light"', () => { const legacyData = JSON.stringify({ isUTC: true, timeFormat: '24h', theme: 'light', font: 'Inter', }); const result = migrateUserPreferences(legacyData); expect(result).toEqual({ isUTC: true, timeFormat: '24h', colorMode: 'light', font: 'Inter', }); // Verify theme property was removed during migration expect('theme' in (result || {})).toBe(false); }); it('should use default colorMode when theme property is missing', () => { // JSON.stringify omits undefined properties, so we simulate legacy data // without theme property - this should not match legacy format const legacyDataWithoutTheme = JSON.stringify({ isUTC: false, timeFormat: '12h', font: 'IBM Plex Mono', // theme property missing }); // Should return null since it doesn't match legacy format const result = migrateUserPreferences(legacyDataWithoutTheme); expect(result).toBeNull(); }); it('should return null when theme is explicitly null (invalid value)', () => { // Simulate legacy data where theme was explicitly set to null // null is not a valid theme value, so it won't match legacy format const legacyData = JSON.stringify({ isUTC: false, timeFormat: '12h', theme: null, font: 'IBM Plex Mono', }); // null theme doesn't match legacy format (type guard requires string or undefined) // and it's not a valid UserPreferences (no colorMode) // So it should return null to use defaults const result = migrateUserPreferences(legacyData); expect(result).toBeNull(); }); it('should preserve all other user preferences during migration', () => { const legacyData = JSON.stringify({ isUTC: true, timeFormat: '24h', theme: 'light', font: 'Roboto Mono', expandSidebarHeader: true, }); const result = migrateUserPreferences(legacyData); expect(result).toEqual({ isUTC: true, timeFormat: '24h', colorMode: 'light', font: 'Roboto Mono', expandSidebarHeader: true, }); }); it('should merge with default preferences for missing fields', () => { const legacyData = JSON.stringify({ theme: 'dark', // Missing other fields }); const result = migrateUserPreferences(legacyData); expect(result).toEqual({ isUTC: false, // From DEFAULT_PREFERENCES timeFormat: '12h', // From DEFAULT_PREFERENCES colorMode: 'dark', // Migrated from theme font: 'IBM Plex Mono', // From DEFAULT_PREFERENCES }); }); }); describe('Partial/corrupted localStorage data', () => { it('should return null for null input', () => { const result = migrateUserPreferences(null); expect(result).toBeNull(); expect(localStorageMock.setItem).not.toHaveBeenCalled(); }); it('should return null for invalid JSON', () => { const invalidJson = '{ invalid json }'; const result = migrateUserPreferences(invalidJson); expect(result).toBeNull(); expect(localStorageMock.setItem).not.toHaveBeenCalled(); }); it('should return null for empty string', () => { const result = migrateUserPreferences(''); expect(result).toBeNull(); }); it('should return null for non-object JSON', () => { const result = migrateUserPreferences('"string"'); expect(result).toBeNull(); }); it('should return null for array JSON', () => { const result = migrateUserPreferences('[]'); expect(result).toBeNull(); }); it('should return null for object without theme or colorMode', () => { const invalidData = JSON.stringify({ isUTC: false, timeFormat: '12h', // No theme or colorMode }); const result = migrateUserPreferences(invalidData); expect(result).toBeNull(); }); it('should return null for object with invalid colorMode value', () => { const invalidData = JSON.stringify({ colorMode: 'invalid-value', isUTC: false, }); const result = migrateUserPreferences(invalidData); expect(result).toBeNull(); }); it('should handle partial legacy data gracefully', () => { const partialData = JSON.stringify({ theme: 'light', // Missing other required fields }); const result = migrateUserPreferences(partialData); expect(result).toEqual({ isUTC: false, // From DEFAULT_PREFERENCES timeFormat: '12h', // From DEFAULT_PREFERENCES colorMode: 'light', // Migrated from theme font: 'IBM Plex Mono', // From DEFAULT_PREFERENCES }); }); it('should handle extra unknown properties in legacy data', () => { const legacyData = JSON.stringify({ theme: 'dark', isUTC: false, timeFormat: '12h', font: 'IBM Plex Mono', unknownProperty: 'should be preserved', anotherUnknown: 123, }); const result = migrateUserPreferences(legacyData); expect(result).toEqual({ isUTC: false, timeFormat: '12h', colorMode: 'dark', font: 'IBM Plex Mono', unknownProperty: 'should be preserved', anotherUnknown: 123, }); }); }); describe('Migration idempotency', () => { it('should return already migrated data unchanged', () => { const migratedData: UserPreferences = { isUTC: false, timeFormat: '12h', colorMode: 'dark', font: 'IBM Plex Mono', }; const result = migrateUserPreferences(JSON.stringify(migratedData)); expect(result).toEqual(migratedData); // Should not call setItem since data is already migrated expect(localStorageMock.setItem).not.toHaveBeenCalled(); }); it('should accept colorMode "system" as valid', () => { const dataWithSystem: UserPreferences = { isUTC: false, timeFormat: '12h', colorMode: 'system', font: 'IBM Plex Mono', }; const result = migrateUserPreferences(JSON.stringify(dataWithSystem)); expect(result).toEqual(dataWithSystem); expect(localStorageMock.setItem).not.toHaveBeenCalled(); }); it('should handle data with both theme and colorMode (edge case)', () => { // If somehow both exist, prefer colorMode (already migrated) const mixedData = JSON.stringify({ theme: 'light', colorMode: 'dark', isUTC: false, timeFormat: '12h', font: 'IBM Plex Mono', }); const result = migrateUserPreferences(mixedData); // Should use colorMode (already migrated, ignore theme) expect(result?.colorMode).toBe('dark'); expect(localStorageMock.setItem).not.toHaveBeenCalled(); }); it('should be safe to call multiple times on same legacy data', () => { const legacyData = JSON.stringify({ theme: 'light', isUTC: true, timeFormat: '24h', font: 'Inter', }); // First migration const firstResult = migrateUserPreferences(legacyData); expect(firstResult?.colorMode).toBe('light'); // Verify theme property was removed during migration expect('theme' in (firstResult || {})).toBe(false); // Simulate that localStorage now has migrated data localStorageMock.getItem.mockReturnValue(JSON.stringify(firstResult)); // Second migration (should be idempotent) const secondResult = migrateUserPreferences(JSON.stringify(firstResult)); expect(secondResult).toEqual(firstResult); // Should not call setItem again since already migrated expect(localStorageMock.setItem).toHaveBeenCalledTimes(1); }); }); describe('localStorage error handling', () => { it('should handle localStorage.setItem errors gracefully', () => { localStorageMock.setItem.mockImplementation(() => { throw new Error('localStorage quota exceeded'); }); const legacyData = JSON.stringify({ theme: 'dark', isUTC: false, timeFormat: '12h', font: 'IBM Plex Mono', }); // Should not throw, should return migrated data even if save fails const result = migrateUserPreferences(legacyData); expect(result).toEqual({ isUTC: false, timeFormat: '12h', colorMode: 'dark', font: 'IBM Plex Mono', }); }); }); describe('SSR safety', () => { it('should return migrated data even if localStorage is unavailable', () => { // Simulate localStorage being unavailable (private browsing, etc.) // The function should still return migrated data even if it can't save localStorageMock.setItem.mockImplementation(() => { throw new Error('localStorage unavailable'); }); const legacyData = JSON.stringify({ theme: 'dark', isUTC: false, timeFormat: '12h', font: 'IBM Plex Mono', }); // Should not throw - should return migrated data const result = migrateUserPreferences(legacyData); expect(result).toEqual({ isUTC: false, timeFormat: '12h', colorMode: 'dark', font: 'IBM Plex Mono', }); }); }); }); ================================================ FILE: packages/app/src/__tests__/utils.test.ts ================================================ import { TSource } from '@hyperdx/common-utils/dist/types'; import { SortingState } from '@tanstack/react-table'; import { act, renderHook } from '@testing-library/react'; import { MetricsDataType, NumberFormat } from '../types'; import * as utils from '../utils'; import { formatAttributeClause, formatNumber, getAllMetricTables, getMetricTableName, mapKeyBy, orderByStringToSortingState, sortingStateToOrderByString, stripTrailingSlash, useQueryHistory, } from '../utils'; describe('formatAttributeClause', () => { it('should format SQL attribute clause correctly', () => { expect( formatAttributeClause('ResourceAttributes', 'service', 'nginx', true), ).toBe("ResourceAttributes['service']='nginx'"); expect(formatAttributeClause('metadata', 'environment', 'prod', true)).toBe( "metadata['environment']='prod'", ); expect(formatAttributeClause('data', 'user-id', 'abc-123', true)).toBe( "data['user-id']='abc-123'", ); }); it('should format lucene attribute clause correctly', () => { expect(formatAttributeClause('attrs', 'service', 'nginx', false)).toBe( 'attrs.service:"nginx"', ); expect( formatAttributeClause('metadata', 'environment', 'prod', false), ).toBe('metadata.environment:"prod"'); expect(formatAttributeClause('data', 'user-id', 'abc-123', false)).toBe( 'data.user-id:"abc-123"', ); }); }); describe('getMetricTableName', () => { // Base source object with required properties const createBaseSource = () => ({ from: { tableName: '', databaseName: 'test_db', }, id: 'test-id', name: 'test-source', timestampValueExpression: 'timestamp', connection: 'test-connection', kind: 'metric' as const, }); // Source with metric tables const createSourceWithMetrics = () => ({ ...createBaseSource(), metricTables: { gauge: 'gauge_table', counter: 'counter_table', }, }); it('returns the default table name when metricType is null', () => { const source = createSourceWithMetrics() as unknown as TSource; expect(getMetricTableName(source)).toBe(''); expect(getMetricTableName(source, undefined)).toBe(''); }); it('returns the specific metric table when metricType is provided', () => { const source = createSourceWithMetrics() as unknown as TSource; expect(getMetricTableName(source, 'gauge' as MetricsDataType)).toBe( 'gauge_table', ); expect(getMetricTableName(source, 'counter' as MetricsDataType)).toBe( 'counter_table', ); }); it('handles case insensitivity for metric types', () => { const source = createSourceWithMetrics() as unknown as TSource; expect(getMetricTableName(source, 'GAUGE' as MetricsDataType)).toBe( 'gauge_table', ); expect(getMetricTableName(source, 'Counter' as MetricsDataType)).toBe( 'counter_table', ); }); it('returns undefined when the requested metric type does not exist', () => { const source = { ...createBaseSource(), metricTables: { gauge: 'gauge_table', }, } as unknown as TSource; expect( getMetricTableName(source, 'histogram' as MetricsDataType), ).toBeUndefined(); }); it('handles sources without metricTables property', () => { const source = createBaseSource() as unknown as TSource; expect(getMetricTableName(source)).toBe(''); expect( getMetricTableName(source, 'gauge' as MetricsDataType), ).toBeUndefined(); }); }); describe('getAllMetricTables', () => { const createMetricSource = (metricTables: Record): TSource => ({ kind: 'metric' as const, from: { databaseName: 'test_db', tableName: '' }, connection: 'test-conn', id: 'test-id', name: 'test', timestampValueExpression: 'timestamp', metricTables, }) as unknown as TSource; it('returns empty array for non-metric source', () => { const source = { kind: 'log' as const, from: { databaseName: 'test_db', tableName: 'logs' }, connection: 'test-conn', id: 'test-id', name: 'test', timestampValueExpression: 'timestamp', } as unknown as TSource; expect(getAllMetricTables(source)).toEqual([]); }); it('returns empty array when metricTables is undefined', () => { const source = { kind: 'metric' as const, from: { databaseName: 'test_db', tableName: '' }, connection: 'test-conn', id: 'test-id', name: 'test', timestampValueExpression: 'timestamp', } as unknown as TSource; expect(getAllMetricTables(source)).toEqual([]); }); it('returns TableConnection for each populated metric table', () => { const source = createMetricSource({ Gauge: 'gauge_table', Sum: 'sum_table', }); const result = getAllMetricTables(source); expect(result).toEqual( expect.arrayContaining([ { tableName: 'gauge_table', databaseName: 'test_db', connectionId: 'test-conn', }, { tableName: 'sum_table', databaseName: 'test_db', connectionId: 'test-conn', }, ]), ); expect(result).toHaveLength(2); }); it('filters out metric types with no table name', () => { const source = createMetricSource({ Gauge: 'gauge_table', Histogram: '', }); const result = getAllMetricTables(source); expect(result).toEqual([ { tableName: 'gauge_table', databaseName: 'test_db', connectionId: 'test-conn', }, ]); }); it('returns all four metric types when all are populated', () => { const source = createMetricSource({ Gauge: 'gauge_t', Histogram: 'histogram_t', Sum: 'sum_t', Summary: 'summary_t', }); const result = getAllMetricTables(source); expect(result).toHaveLength(4); expect(result.map(t => t.tableName).sort()).toEqual([ 'gauge_t', 'histogram_t', 'sum_t', 'summary_t', ]); // All should share the same database and connection for (const tc of result) { expect(tc.databaseName).toBe('test_db'); expect(tc.connectionId).toBe('test-conn'); } }); it('returns empty array when all metric table values are falsy', () => { const source = createMetricSource({ Gauge: '', Histogram: '', }); expect(getAllMetricTables(source)).toEqual([]); }); }); describe('formatNumber', () => { it('handles undefined/null values', () => { expect(formatNumber(undefined)).toBe('N/A'); expect(formatNumber(null as any)).toBe('N/A'); }); it('returns string representation when no format options provided', () => { expect(formatNumber(1234)).toBe('1234'); expect(formatNumber(0)).toBe('0'); expect(formatNumber(-1234)).toBe('-1234'); }); describe('number format', () => { it('formats with mantissa', () => { const format: NumberFormat = { output: 'number', mantissa: 2, }; expect(formatNumber(1234.5678, format)).toBe('1234.57'); }); it('formats with thousand separator', () => { const format: NumberFormat = { output: 'number', thousandSeparated: true, }; expect(formatNumber(1234567, format)).toBe('1,234,567'); }); it('does not apply factor multiplication', () => { const format: NumberFormat = { output: 'number', factor: 0.001, // Convert to milliseconds }; expect(formatNumber(1000, format)).toBe('1000'); }); }); describe('currency format', () => { it('formats with default currency symbol', () => { const format: NumberFormat = { output: 'currency', thousandSeparated: true, }; expect(formatNumber(1234.56, format)).toBe('$1,235'); }); it('formats with custom currency symbol', () => { const format: NumberFormat = { output: 'currency', currencySymbol: '€', }; expect(formatNumber(1234.56, format)).toBe('€1235'); }); }); describe('percentage format', () => { it('formats as percentage', () => { const format: NumberFormat = { output: 'percent', }; expect(formatNumber(0.1234, format)).toBe('12%'); }); it('formats percentage with mantissa', () => { const format: NumberFormat = { output: 'percent', mantissa: 2, }; expect(formatNumber(0.1234, format)).toBe('12.34%'); }); }); describe('byte format', () => { it('formats bytes with binary base', () => { const format: NumberFormat = { output: 'byte', decimalBytes: false, }; expect(formatNumber(1024, format)).toBe('1 KB'); }); it('formats bytes with decimal base', () => { const format: NumberFormat = { output: 'byte', decimalBytes: true, }; expect(formatNumber(1000, format)).toBe('1 KB'); }); }); describe('time format', () => { it('formats seconds input', () => { const format: NumberFormat = { output: 'time', factor: 1, // seconds }; expect(formatNumber(3661, format)).toBe('1:01:01'); }); it('formats milliseconds input', () => { const format: NumberFormat = { output: 'time', factor: 0.001, // milliseconds }; expect(formatNumber(61000, format)).toBe('0:01:01'); }); it('formats microseconds input', () => { const format: NumberFormat = { output: 'time', factor: 0.000001, // microseconds }; expect(formatNumber(1000000, format)).toBe('0:00:01'); }); it('formats nanoseconds input', () => { const format: NumberFormat = { output: 'time', factor: 0.000000001, // nanoseconds }; expect(formatNumber(1000000001, format)).toBe('0:00:01'); }); }); describe('unit handling', () => { it('appends unit to formatted number', () => { const format: NumberFormat = { output: 'number', unit: 'ms', }; expect(formatNumber(1234, format)).toBe('1234 ms'); }); }); describe('average format', () => { it('formats large numbers with abbreviations when average is true', () => { const format: NumberFormat = { output: 'number', average: true, }; expect(formatNumber(1234567, format)).toBe('1m'); }); }); describe('NaN handling', () => { it('returns "N/A" for NaN without options', () => { expect(formatNumber(NaN)).toBe('N/A'); expect(formatNumber(NaN, { output: 'number', mantissa: 2 })).toBe('N/A'); }); it('returns a string unchanged if a number cannot be parsed from it', () => { // @ts-expect-error not passing a number expect(formatNumber('not a number')).toBe('not a number'); expect( // @ts-expect-error not passing a number formatNumber('not a number', { output: 'number', mantissa: 2 }), ).toBe('not a number'); }); }); }); describe('useLocalStorage', () => { // Create a mock for localStorage let localStorageMock: jest.Mocked; beforeEach(() => { // Clear all mocks between tests jest.clearAllMocks(); // Create localStorage mock localStorageMock = { getItem: jest.fn().mockImplementation((_: string) => null), setItem: jest.fn(), removeItem: jest.fn(), clear: jest.fn(), key: jest.fn(), length: 0, }; // Replace window.localStorage with our mock Object.defineProperty(window, 'localStorage', { value: localStorageMock, writable: true, }); }); afterAll(() => { // Restore original implementations jest.restoreAllMocks(); }); test('should initialize with initial value when localStorage is empty', () => { // Mock localStorage.getItem to return null (empty) localStorageMock.getItem.mockReturnValueOnce(null); const initialValue = { test: 'value' }; const { result } = renderHook(() => utils.useLocalStorage('testKey', initialValue), ); // Check if initialized with initial value expect(result.current[0]).toEqual(initialValue); // Verify localStorage was checked expect(localStorageMock.getItem).toHaveBeenCalledWith('testKey'); }); test('should retrieve existing value from localStorage', () => { // Mock localStorage to return existing value const existingValue = { test: 'existing' }; localStorageMock.getItem.mockReturnValueOnce(JSON.stringify(existingValue)); const { result } = renderHook(() => utils.useLocalStorage('testKey', { test: 'default' }), ); // Should use the value from localStorage, not the initial value expect(result.current[0]).toEqual(existingValue); expect(localStorageMock.getItem).toHaveBeenCalledWith('testKey'); }); test('should update localStorage when setValue is called', () => { localStorageMock.getItem.mockReturnValueOnce(null); const { result } = renderHook(() => utils.useLocalStorage('testKey', 'initial'), ); // Update value const newValue = 'updated'; act(() => { result.current[1](newValue); }); // Check if state updated expect(result.current[0]).toBe(newValue); // Check if localStorage was updated expect(localStorageMock.setItem).toHaveBeenCalledWith( 'testKey', JSON.stringify(newValue), ); }); test('should handle functional updates', () => { localStorageMock.getItem.mockReturnValueOnce(JSON.stringify(0)); const { result } = renderHook(() => utils.useLocalStorage('testKey', 0), ); // Update using function act(() => { result.current[1](prev => prev + 1); }); // Check if state updated correctly expect(result.current[0]).toBe(1); // Check if localStorage was updated expect(localStorageMock.setItem).toHaveBeenCalledWith( 'testKey', JSON.stringify(1), ); }); test('should handle storage event from another window', () => { // Initial setup localStorageMock.getItem.mockReturnValueOnce(JSON.stringify('initial')); const { result } = renderHook(() => utils.useLocalStorage('testKey', 'initial'), ); // Update mock to return new value when checked after event localStorageMock.getItem.mockReturnValue(JSON.stringify('external update')); // Dispatch storage event act(() => { window.dispatchEvent( new StorageEvent('storage', { key: 'testKey', newValue: JSON.stringify('external update'), }), ); }); // State should be updated expect(result.current[0]).toBe('external update'); }); test('should handle customStorage event from same window but different hook instance', () => { // First hook instance localStorageMock.getItem.mockReturnValueOnce(JSON.stringify('initial1')); const { result: result1 } = renderHook(() => utils.useLocalStorage('sharedKey', 'initial1'), ); // Second hook instance localStorageMock.getItem.mockReturnValueOnce(JSON.stringify('initial1')); const { result: result2 } = renderHook(() => utils.useLocalStorage('sharedKey', 'initial2'), ); // Clear mock calls count localStorageMock.getItem.mockClear(); // When the second hook checks localStorage after custom event localStorageMock.getItem.mockReturnValue( JSON.stringify('updated by hook 1'), ); // Update value in the first instance act(() => { result1.current[1]('updated by hook 1'); }); // Manually trigger custom event (since it's happening within the same test) act(() => { const event = new CustomEvent( 'customStorage', { detail: { key: 'sharedKey', instanceId: 'some-id', // Different from the instance updating }, }, ); window.dispatchEvent(event); }); // The second instance should have updated values expect(result2.current[0]).toBe('updated by hook 1'); }); test('should not update if storage event is for a different key', () => { // Initial setup localStorageMock.getItem.mockReturnValueOnce(JSON.stringify('initial')); const { result } = renderHook(() => utils.useLocalStorage('testKey', 'initial'), ); // Clear the mock calls counter localStorageMock.getItem.mockClear(); // Simulate storage event for a different key act(() => { window.dispatchEvent( new StorageEvent('storage', { key: 'differentKey', newValue: JSON.stringify('different value'), }), ); }); // State should remain unchanged expect(result.current[0]).toBe('initial'); // localStorage should not be accessed since key doesn't match expect(localStorageMock.getItem).not.toHaveBeenCalled(); }); }); describe('stripTrailingSlash', () => { it('should throw an error for nullish values', () => { expect(() => stripTrailingSlash(null)).toThrow( 'URL must be a non-empty string', ); expect(() => stripTrailingSlash(undefined)).toThrow( 'URL must be a non-empty string', ); }); it('should throw an error for non-string values', () => { expect(() => stripTrailingSlash(123 as any)).toThrow( 'URL must be a non-empty string', ); expect(() => stripTrailingSlash({} as any)).toThrow( 'URL must be a non-empty string', ); }); it('should remove trailing slash from URLs', () => { expect(stripTrailingSlash('http://example.com/')).toBe( 'http://example.com', ); expect(stripTrailingSlash('http://example.com/api/')).toBe( 'http://example.com/api', ); }); it('should not modify URLs without trailing slash', () => { expect(stripTrailingSlash('http://example.com')).toBe('http://example.com'); expect(stripTrailingSlash('http://example.com/api')).toBe( 'http://example.com/api', ); }); it('should handle URLs with multiple trailing slashes', () => { expect(stripTrailingSlash('http://example.com///')).toBe( 'http://example.com//', ); }); }); describe('useQueryHistory', () => { const mockGetItem = jest.fn(); const mockSetItem = jest.fn(); const mockRemoveItem = jest.fn(); const originalLocalStorage = window.localStorage; beforeEach(() => { mockGetItem.mockClear(); mockSetItem.mockClear(); mockRemoveItem.mockClear(); mockGetItem.mockReturnValue('["service = test3","service = test1"]'); Object.defineProperty(window, 'localStorage', { value: { getItem: (...args: string[]) => mockGetItem(...args), setItem: (...args: string[]) => mockSetItem(...args), removeItem: (...args: string[]) => mockRemoveItem(...args), }, }); }); afterEach(() => { jest.restoreAllMocks(); Object.defineProperty(window, 'localStorage', { value: originalLocalStorage, configurable: true, }); }); it('adds new query', () => { const { result } = renderHook(() => useQueryHistory('searchSQL')); const setQueryHistory = result.current[1]; act(() => { setQueryHistory('service = test2'); }); expect(mockSetItem).toHaveBeenCalledWith( 'QuerySearchHistory.searchSQL', '["service = test2","service = test3","service = test1"]', ); }); it('does not add duplicate query, but change the order to front', () => { const { result } = renderHook(() => useQueryHistory('searchSQL')); const setQueryHistory = result.current[1]; act(() => { setQueryHistory('service = test1'); }); expect(mockSetItem).toHaveBeenCalledWith( 'QuerySearchHistory.searchSQL', '["service = test1","service = test3"]', ); }); it('does not add empty query', () => { const { result } = renderHook(() => useQueryHistory('searchSQL')); const setQueryHistory = result.current[1]; act(() => { setQueryHistory(' '); // empty after trim }); expect(mockSetItem).not.toHaveBeenCalled(); }); }); describe('sortingStateToOrderByString', () => { it('returns undefined for null input', () => { expect(sortingStateToOrderByString(null)).toBeUndefined(); }); it('returns undefined for empty array', () => { const sortingState: SortingState = []; expect(sortingStateToOrderByString(sortingState)).toBeUndefined(); }); it('converts sorting state with desc: false to ASC order', () => { const sortingState: SortingState = [{ id: 'timestamp', desc: false }]; expect(sortingStateToOrderByString(sortingState)).toBe('timestamp ASC'); }); it('converts sorting state with desc: true to DESC order', () => { const sortingState: SortingState = [{ id: 'timestamp', desc: true }]; expect(sortingStateToOrderByString(sortingState)).toBe('timestamp DESC'); }); it('handles column names with special characters', () => { const sortingState: SortingState = [{ id: 'user_count', desc: false }]; expect(sortingStateToOrderByString(sortingState)).toBe('user_count ASC'); }); }); describe('orderByStringToSortingState', () => { it('returns undefined for undefined input', () => { expect(orderByStringToSortingState(undefined)).toBeUndefined(); }); it('returns undefined for empty string', () => { expect(orderByStringToSortingState('')).toBeUndefined(); }); it('converts "column ASC" to sorting state with desc: false', () => { const result = orderByStringToSortingState('timestamp ASC'); expect(result).toEqual([{ id: 'timestamp', desc: false }]); }); it('converts "column DESC" to sorting state with desc: true', () => { const result = orderByStringToSortingState('timestamp DESC'); expect(result).toEqual([{ id: 'timestamp', desc: true }]); }); it('handles case insensitive direction keywords', () => { expect(orderByStringToSortingState('col asc')).toEqual([ { id: 'col', desc: false }, ]); expect(orderByStringToSortingState('col Asc')).toEqual([ { id: 'col', desc: false }, ]); expect(orderByStringToSortingState('col desc')).toEqual([ { id: 'col', desc: true }, ]); expect(orderByStringToSortingState('col Desc')).toEqual([ { id: 'col', desc: true }, ]); expect(orderByStringToSortingState('col DESC')).toEqual([ { id: 'col', desc: true }, ]); }); it('returns undefined for invalid format without direction', () => { expect(orderByStringToSortingState('timestamp')).toBeUndefined(); }); it('returns undefined for invalid format with wrong number of parts', () => { expect(orderByStringToSortingState('col name ASC')).toBeUndefined(); }); it('returns undefined for invalid direction keyword', () => { expect(orderByStringToSortingState('col INVALID')).toBeUndefined(); }); it('handles column names with underscores', () => { const result = orderByStringToSortingState('user_count DESC'); expect(result).toEqual([{ id: 'user_count', desc: true }]); }); it('handles column names with numbers', () => { const result = orderByStringToSortingState('col123 ASC'); expect(result).toEqual([{ id: 'col123', desc: false }]); }); it('round-trips correctly with sortingStateToOrderByString', () => { const originalSort: SortingState = [{ id: 'service_name', desc: true }]; const orderByString = sortingStateToOrderByString(originalSort); const roundTripSort = orderByStringToSortingState(orderByString); expect(roundTripSort).toEqual(originalSort); }); }); describe('mapKeyBy', () => { it('returns a map', () => { const result = mapKeyBy([{ id: 'a' }, { id: 'b' }], 'id'); expect(result).toBeInstanceOf(Map); }); it('adds each item to the map, keyed by the provided `key` param', () => { const data = [{ id: 'a' }, { id: 'b' }]; const result = mapKeyBy(data, 'id'); expect(result.size).toBe(2); expect(result.get('a')).toBe(data.at(0)); expect(result.get('b')).toBe(data.at(1)); }); it('overwrites items with the same key', () => { const data = [{ id: 'a' }, { id: 'a' }]; const result = mapKeyBy(data, 'id'); expect(result.size).toBe(1); expect(result.get('a')).toBe(data.at(1)); }); }); ================================================ FILE: packages/app/src/api.ts ================================================ import Router from 'next/router'; import type { HTTPError, Options, ResponsePromise } from 'ky'; import ky from 'ky-universal'; import type { Alert, AlertsApiResponse, InstallationApiResponse, MeApiResponse, PresetDashboard, PresetDashboardFilter, RotateApiKeyApiResponse, TeamApiResponse, TeamInvitationsApiResponse, TeamMembersApiResponse, TeamTagsApiResponse, UpdateClickHouseSettingsApiResponse, WebhookCreateApiResponse, WebhooksApiResponse, WebhookTestApiResponse, WebhookUpdateApiResponse, } from '@hyperdx/common-utils/dist/types'; import type { UseQueryOptions } from '@tanstack/react-query'; import { useMutation, useQuery } from '@tanstack/react-query'; import { IS_LOCAL_MODE } from './config'; import { Dashboard, fetchLocalDashboards, getLocalDashboardTags, } from './dashboard'; type ServicesResponse = { data: Record< string, Array<{ 'deployment.environment'?: string; 'k8s.namespace.name'?: string; 'k8s.pod.name'?: string; 'k8s.pod.uid'?: string; }> >; }; export function loginHook(request: Request, options: any, response: Response) { // marketing pages const WHITELIST_PATHS = [ '/', '/forgot', '/join-team', '/login', '/register', '/reset-password', ]; if (!WHITELIST_PATHS.includes(Router.pathname) && response.status === 401) { try { window.sessionStorage.setItem('hdx-login-redirect-url', Router.asPath); } catch (e: any) { console.error(e); } Router.push('/login'); } } export const server = ky.create({ prefixUrl: '/api', credentials: 'include', hooks: { afterResponse: [loginHook], }, timeout: false, }); export const hdxServer = ( url: string, options?: Options | undefined, ): ResponsePromise => { return server(url, { ...options, }); }; const api = { useCreateAlert() { return useMutation<{ data: Alert }, Error, Alert>({ mutationFn: async alert => server('alerts', { method: 'POST', json: alert, }).json(), }); }, useUpdateAlert() { return useMutation<{ data: Alert }, Error, { id: string } & Alert>({ mutationFn: async alert => server(`alerts/${alert.id}`, { method: 'PUT', json: alert, }).json(), }); }, useDeleteAlert() { return useMutation({ mutationFn: async (alertId: string) => { await server(`alerts/${alertId}`, { method: 'DELETE', }); }, }); }, useSilenceAlert() { return useMutation({ mutationFn: async ({ alertId, mutedUntil }) => { await server(`alerts/${alertId}/silenced`, { method: 'POST', json: { mutedUntil }, }); }, }); }, useUnsilenceAlert() { return useMutation({ mutationFn: async (alertId: string) => { await server(`alerts/${alertId}/silenced`, { method: 'DELETE', }); }, }); }, useDashboards(options?: UseQueryOptions) { return useQuery({ queryKey: [`dashboards`], queryFn: IS_LOCAL_MODE ? async () => fetchLocalDashboards() : () => hdxServer(`dashboards`, { method: 'GET' }).json(), ...options, }); }, useCreateDashboard() { return useMutation({ mutationFn: async ({ name, charts, query, tags, }: { name: string; charts: Dashboard['tiles']; query: string; tags: string[]; }) => hdxServer(`dashboards`, { method: 'POST', json: { name, charts, query, tags }, }).json(), }); }, useUpdateDashboard() { return useMutation({ mutationFn: async ({ id, name, charts, query, tags, }: { id: string; name: string; charts: Dashboard['tiles']; query: string; tags: string[]; }) => hdxServer(`dashboards/${id}`, { method: 'PUT', json: { name, charts, query, tags }, }).json(), }); }, useDeleteDashboard() { return useMutation({ mutationFn: async ({ id }: { id: string }) => { await hdxServer(`dashboards/${id}`, { method: 'DELETE', }); }, }); }, usePresetDashboardFilters( presetDashboard: PresetDashboard, sourceId: string, enabled: boolean = true, ) { return useQuery({ queryKey: [`dashboards`, `preset`, presetDashboard, `filters`, sourceId], queryFn: () => hdxServer(`dashboards/preset/${presetDashboard}/filters/`, { method: 'GET', searchParams: { sourceId }, }).json(), enabled: !!sourceId && enabled, }); }, useCreatePresetDashboardFilter() { return useMutation({ mutationFn: async (filter: PresetDashboardFilter) => hdxServer(`dashboards/preset/${filter.presetDashboard}/filter`, { method: 'POST', json: { filter }, }).json(), }); }, useUpdatePresetDashboardFilter() { return useMutation({ mutationFn: async (filter: PresetDashboardFilter) => hdxServer(`dashboards/preset/${filter.presetDashboard}/filter`, { method: 'PUT', json: { filter }, }).json(), }); }, useDeletePresetDashboardFilter() { return useMutation< PresetDashboardFilter, Error, { id: string; presetDashboard: PresetDashboard } >({ mutationFn: async ({ id, presetDashboard, }: { id: string; presetDashboard: PresetDashboard; }) => hdxServer(`dashboards/preset/${presetDashboard}/filter/${id}`, { method: 'DELETE', }).json(), }); }, useAlerts() { return useQuery({ queryKey: [`alerts`], queryFn: () => hdxServer(`alerts`).json(), }); }, useServices() { return useQuery({ queryKey: [`services`], queryFn: () => hdxServer(`chart/services`, { method: 'GET', }).json(), }); }, useRotateTeamApiKey() { return useMutation({ mutationFn: async () => hdxServer(`team/apiKey`, { method: 'PATCH', }).json(), }); }, useDeleteTeamMember() { return useMutation< { message: string }, Error | HTTPError, { userId: string } >({ mutationFn: async ({ userId }: { userId: string }) => hdxServer(`team/member/${userId}`, { method: 'DELETE', }).json<{ message: string }>(), }); }, useTeamInvitations() { return useQuery({ queryKey: [`team/invitations`], queryFn: () => hdxServer(`team/invitations`).json(), }); }, useSaveTeamInvitation() { return useMutation< { url: string }, Error | HTTPError, { name?: string; email: string } >({ mutationFn: async ({ name, email }: { name?: string; email: string }) => hdxServer(`team/invitation`, { method: 'POST', json: { name, email, }, }).json<{ url: string }>(), }); }, useDeleteTeamInvitation() { return useMutation({ mutationFn: async ({ id }: { id: string }) => hdxServer(`team/invitation/${id}`, { method: 'DELETE', }).json<{ message: string }>(), }); }, useInstallation() { return useQuery({ queryKey: [`installation`], queryFn: () => { if (IS_LOCAL_MODE) { return; } return hdxServer(`installation`).json(); }, }); }, useMe() { return useQuery({ queryKey: [`me`], queryFn: () => { if (IS_LOCAL_MODE) { return null; } return hdxServer(`me`).json(); }, }); }, useTeam() { return useQuery({ queryKey: [`team`], queryFn: () => { if (IS_LOCAL_MODE) { return null; } return hdxServer(`team`).json(); }, retry: 1, }); }, useTeamMembers() { return useQuery({ queryKey: [`team/members`], queryFn: () => hdxServer(`team/members`).json(), }); }, useSetTeamName() { return useMutation<{ name: string }, HTTPError, { name: string }>({ mutationFn: async ({ name }) => hdxServer(`team/name`, { method: 'PATCH', json: { name }, }).json<{ name: string }>(), }); }, useUpdateClickhouseSettings() { return useMutation< UpdateClickHouseSettingsApiResponse, HTTPError, { searchRowLimit?: number; fieldMetadataDisabled?: boolean; metadataMaxRowsToRead?: number; } >({ mutationFn: async settings => hdxServer(`team/clickhouse-settings`, { method: 'PATCH', json: settings, }).json(), }); }, useTags() { return useQuery({ queryKey: [`team/tags`], queryFn: IS_LOCAL_MODE ? async () => ({ data: getLocalDashboardTags() }) : () => hdxServer(`team/tags`).json(), }); }, useSaveWebhook() { return useMutation< WebhookCreateApiResponse, Error | HTTPError, { service: string; url: string; name: string; description: string; queryParams?: Record; headers?: Record; body?: string; } >({ mutationFn: async ({ service, url, name, description, queryParams, headers, body, }) => hdxServer(`webhooks`, { method: 'POST', json: { name, service, url, description, queryParams: queryParams || {}, headers: headers || {}, body, }, }).json(), }); }, useUpdateWebhook() { return useMutation< WebhookUpdateApiResponse, Error | HTTPError, { id: string; service: string; url: string; name: string; description: string; queryParams?: Record; headers?: Record; body?: string; } >({ mutationFn: async ({ id, service, url, name, description, queryParams, headers, body, }) => hdxServer(`webhooks/${id}`, { method: 'PUT', json: { name, service, url, description, queryParams: queryParams || {}, headers: headers || {}, body, }, }).json(), }); }, useWebhooks(services: string[]) { return useQuery({ queryKey: [...services], queryFn: () => hdxServer('webhooks', { method: 'GET', searchParams: [...services.map(service => ['service', service])], }).json(), }); }, useDeleteWebhook() { return useMutation< Record, Error | HTTPError, { id: string } >({ mutationFn: async ({ id }: { id: string }) => hdxServer(`webhooks/${id}`, { method: 'DELETE', }).json(), }); }, useTestWebhook() { return useMutation< WebhookTestApiResponse, Error | HTTPError, { service: string; url: string; queryParams?: Record; headers?: Record; body?: string; } >({ mutationFn: async ({ service, url, queryParams, headers, body }) => hdxServer(`webhooks/test`, { method: 'POST', json: { service, url, queryParams: queryParams || {}, headers: headers || {}, body, }, }).json(), }); }, useRegisterPassword() { return useMutation< { status: string }, Error, { email: string; password: string; confirmPassword: string } >({ mutationFn: async ({ email, password, confirmPassword }) => hdxServer(`register/password`, { method: 'POST', json: { email, password, confirmPassword, }, }).json<{ status: string }>(), }); }, useTestConnection() { return useMutation< { success: boolean; error?: string }, Error, { host: string; username: string; password: string } >({ mutationFn: async ({ host, username, password }) => hdxServer(`clickhouse-proxy/test`, { method: 'POST', json: { host, username, password, }, }).json<{ success: boolean; error?: string }>(), }); }, }; export default api; ================================================ FILE: packages/app/src/clickhouse.ts ================================================ // ================================ // NOTE: // This file should only hold functions that relate to the clickhouse client // not specific querying/functionality logic // please move app-specific functions elsewhere in the app // ================================ import { chSql, ClickhouseClientOptions, ColumnMeta, ResponseJSON, } from '@hyperdx/common-utils/dist/clickhouse'; import { ClickhouseClient } from '@hyperdx/common-utils/dist/clickhouse/browser'; import { useQuery, UseQueryOptions } from '@tanstack/react-query'; import { IS_LOCAL_MODE } from '@/config'; import { getLocalConnections } from '@/connection'; import api from './api'; import { DEFAULT_QUERY_TIMEOUT } from './defaults'; const PROXY_CLICKHOUSE_HOST = '/api/clickhouse-proxy'; export const getClickhouseClient = ( options: ClickhouseClientOptions = {}, ): ClickhouseClient => { if (IS_LOCAL_MODE) { const localConnections = getLocalConnections(); if (localConnections.length === 0) { console.warn('No local connection found'); return new ClickhouseClient({ host: '', ...options, }); } return new ClickhouseClient({ host: localConnections[0].host, username: localConnections[0].username, password: localConnections[0].password, ...options, }); } return new ClickhouseClient({ host: PROXY_CLICKHOUSE_HOST, ...options, }); }; export const useClickhouseClient = ( options: ClickhouseClientOptions = {}, ): ClickhouseClient => { const { data: me } = api.useMe(); const teamQueryTimeout = me?.team?.queryTimeout; if (teamQueryTimeout !== undefined) { options.queryTimeout = teamQueryTimeout; } else { options.queryTimeout = DEFAULT_QUERY_TIMEOUT; } return getClickhouseClient(options); }; export function useDatabasesDirect( { connectionId }: { connectionId: string }, options?: Omit, 'queryKey'>, ) { const clickhouseClient = getClickhouseClient(); return useQuery, Error>({ queryKey: [`direct_datasources/databases`, connectionId], queryFn: async () => { const json = await clickhouseClient .query({ query: 'SHOW DATABASES', connectionId, }) .then(res => res.json()); return json; }, staleTime: 1000 * 60 * 5, // Cache every 5 min ...options, }); } export function useTablesDirect( { database, connectionId }: { database: string; connectionId: string }, options?: Omit, 'queryKey'>, ) { const clickhouseClient = getClickhouseClient(); return useQuery, Error>({ queryKey: [`direct_datasources/databases/${database}/tables`, connectionId], queryFn: async () => { const paramSql = chSql`SHOW TABLES FROM ${{ Identifier: database }}`; const json = await clickhouseClient .query({ query: paramSql.sql, query_params: paramSql.params, connectionId, }) .then(res => res.json()); return json; }, staleTime: 1000 * 60 * 5, // Cache every 5 min ...options, }); } ================================================ FILE: packages/app/src/components/AggFnSelect.tsx ================================================ import { useCallback, useMemo } from 'react'; import { useController, UseControllerProps } from 'react-hook-form'; import { Select } from '@mantine/core'; import { AGG_FNS } from '@/ChartUtils'; type AggFnValues = (typeof AGG_FNS)[number]['value']; type OnChangeValue = | { aggFn?: AggFnValues } | { aggFn: 'quantile'; level: number }; export default function AggFnSelect({ value, defaultValue, onChange, }: { value: string; defaultValue: string; onChange: (value: OnChangeValue) => void; }) { const _onChange = useCallback( (value: string | null) => { if (value == null) { onChange({}); } else if (['p50', 'p90', 'p95', 'p99'].includes(value)) { onChange({ aggFn: 'quantile', level: Number.parseFloat(value.replace('p', '0.')), }); } else { // @ts-ignore onChange({ aggFn: value }); } }, [onChange], ); return ( ); }; export const AlertChannelForm = ({ control, type, namePrefix = '', }: { control: Control; // TODO: properly type this type: AlertChannelType; namePrefix?: string; }) => { if (type === 'webhook') { return ( ); } return null; }; export const getAlertReferenceLines = ({ thresholdType, threshold, // TODO: zScore }: { thresholdType: 'above' | 'below'; threshold: number; }) => { if (threshold != null && thresholdType === 'below') { return ( ); } if (threshold != null && thresholdType === 'above') { return ( ); } if (threshold != null) { return ( } stroke="red" strokeDasharray="3 3" /> ); } return null; }; ================================================ FILE: packages/app/src/components/AppNav/AppNav.components.tsx ================================================ import React from 'react'; import Link from 'next/link'; import cx from 'classnames'; import { Avatar, Badge, Button, Group, Menu, Paper, Text, Tooltip, UnstyledButton, } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { IconBook, IconBrandDiscord, IconBulb, IconChevronDown, IconChevronRight, IconChevronUp, IconHelp, IconLogout, IconSettings, IconUserCog, } from '@tabler/icons-react'; import { IS_LOCAL_MODE } from '@/config'; import styles from './AppNav.module.scss'; export const AppNavContext = React.createContext<{ isCollapsed: boolean; pathname: string; }>({ isCollapsed: false, pathname: '/', }); export const AppNavCloudBanner = () => { return (
Ready to deploy on ClickHouse Cloud?
); }; type AppNavUserMenuProps = { userName?: string; teamName?: string; logoutUrl?: string | null; onClickUserPreferences?: () => void; }; const getUserInitials = (userName: string) => { const nameParts = userName.trim().split(/\s+/).filter(Boolean); if (nameParts.length === 0) { return 'U'; } return nameParts.map(name => name.charAt(0).toUpperCase()).join(''); }; export const AppNavUserMenu = ({ userName = 'User', teamName, logoutUrl, onClickUserPreferences, }: AppNavUserMenuProps) => { const { isCollapsed } = React.useContext(AppNavContext); const resolvedUserName = userName.trim() || 'User'; const initials = getUserInitials(resolvedUserName); const displayName = IS_LOCAL_MODE ? 'Local mode' : resolvedUserName; return ( {initials} {!isCollapsed && ( <> {displayName}
{teamName} } openDelay={250} >
{displayName} {teamName}
)}
{IS_LOCAL_MODE ? ( Local mode ) : ( } > Team Settings )} } onClick={onClickUserPreferences} > User Preferences {logoutUrl && ( <> } component={Link} href={logoutUrl} > Logout )}
); }; export const AppNavHelpMenu = ({ version }: { version?: string }) => { const { isCollapsed } = React.useContext(AppNavContext); return ( <> Help{' '} {version && ( v{version} )} } > Documentation } component="a" href="https://hyperdx.io/discord" target="_blank" rel="noopener noreferrer" > Discord Community } href="https://clickhouse.com/docs/use-cases/observability/clickstack/getting-started" component="a" target="_blank" rel="noopener noreferrer" > Setup Instructions ); }; export const AppNavLink = ({ className, label, icon, href, isExpanded, onToggle, isBeta, }: { className?: string; label: React.ReactNode; icon: React.ReactNode; href: string; isExpanded?: boolean; onToggle?: () => void; isBeta?: boolean; }) => { const { pathname, isCollapsed } = React.useContext(AppNavContext); const testId = `nav-link-${href.replace(/^\//, '').replace(/\//g, '-') || 'home'}`; const handleToggleClick = (e: React.MouseEvent) => { // Clicking chevron only toggles submenu, doesn't navigate // This separates navigation (clicking link) from expand/collapse (clicking chevron) e.preventDefault(); e.stopPropagation(); onToggle?.(); }; // Check if current path matches this nav item // Use exact match or startsWith to avoid partial matches (e.g., /search matching /search-settings) const isActive = pathname === href || pathname?.startsWith(href + '/'); return ( {icon} {!isCollapsed && {label}} {!isCollapsed && isBeta && ( Beta )} {!isCollapsed && onToggle && ( )} ); }; ================================================ FILE: packages/app/src/components/AppNav/AppNav.module.scss ================================================ $spacing-xs: 4px; $spacing-sm: 8px; $spacing-md: 12px; $spacing-lg: 16px; $nav-item-height: 34px; $nav-item-height-collapsed: 28px; $header-height: 58px; $help-button-size: 28px; $search-input-height: 28px; $radius-sm: 4px; $radius-md: 8px; $radius-lg: 10px; $font-size-xs: 10px; $font-size-sm: 11px; $font-size-md: 13px; $font-size-lg: 14px; $transition-fast: 0.1s ease; $transition-normal: 0.15s ease; $transition-slow: 0.2s ease; /* Mixins */ @mixin text-truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } @mixin flex-center { display: flex; align-items: center; justify-content: center; } @mixin interactive-press { &:active { transform: translate(0, 1px); } } /* Layout */ .navGhost { transition: width 0.2s ease; will-change: width; } .nav { height: 100vh; max-height: 100vh; display: flex; flex-flow: column nowrap; justify-content: space-between; border-right: 1px solid var(--color-border); background: var(--color-bg-sidenav); overflow: hidden; transition: width 0.2s ease; flex-shrink: 0; &Fixed { position: fixed; } &Collapsed { .navLinks { padding-inline: 0; align-items: center; } .navItem { padding-inline: $spacing-sm; justify-content: center; height: $nav-item-height-collapsed; margin-block: $spacing-xs; } .navItemIcon { margin-right: 0; } } } .header { padding-inline: $spacing-lg; padding-block: $spacing-md; display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; &Expanded { height: $header-height; } &Collapsed { flex-flow: column nowrap; justify-content: flex-start; align-items: center; padding-inline: 0; padding-block: $spacing-md; min-height: $header-height; gap: $spacing-sm; width: 100%; } } .logoLink { text-decoration: none; display: flex; align-items: center; justify-content: center; color: var(--color-text); } .logoIconWrapper { display: flex; align-items: center; justify-content: center; } .collapseButton { margin-right: -$spacing-xs; margin-left: -$spacing-xs; &Collapsed { transform: rotate(180deg); margin-top: 0; margin-right: 0; margin-left: 0; } } .scrollContainer { max-height: 100%; height: 100%; display: flex; flex-direction: column; justify-content: space-between; } .footer { flex-shrink: 0; position: relative; &::before { content: ''; position: absolute; bottom: 100%; left: 0; right: 0; height: 40px; background: linear-gradient( to top, var(--color-bg-sidenav) 0%, transparent 100% ); pointer-events: none; } } /* Navigation Links */ .navLinks { display: flex; flex-direction: column; gap: 2px; padding-inline: $spacing-lg; margin-top: $spacing-sm; } .navItem { display: flex; justify-content: space-between; align-items: center; text-decoration: none; color: var(--color-text-sidenav-link); font-size: $font-size-lg; @include text-truncate; user-select: none; gap: 10px; padding-inline: $spacing-lg; height: $nav-item-height; border-radius: $radius-sm; &:hover { color: var(--color-text-sidenav-link-active); background: var(--color-bg-sidenav-link-active); } &:focus-visible { outline: none; background: var(--color-bg-sidenav-link-active); } &Active { color: var(--color-text-sidenav-link-active); background: var(--color-bg-sidenav-link-active); &:hover { background: var(--color-bg-sidenav-link-active); } } } .navItemContent { display: flex; align-items: center; } .navItemIcon { margin-right: $spacing-md; display: inline-flex; align-items: center; vertical-align: middle; transition: color $transition-slow; } .navItemBadge { margin-left: auto; } .navItemToggle { @include flex-center; padding: $spacing-xs; margin-right: -$spacing-xs; background: none; border: none; cursor: pointer; border-radius: $radius-sm; color: var(--color-text-muted); transition: background-color $transition-normal, color $transition-normal, transform $transition-fast; &:hover { background: var(--color-bg-sidenav-link-active-hover); color: var(--color-text-sidenav-link-active); transform: scale(1.1); } &:active { transform: scale(0.95); } } /* Sub-menu (Collapsible sections) */ .subMenu { overflow-x: hidden; max-width: 100%; padding: $spacing-xs $spacing-xs; padding-bottom: 0; } .subMenuItem { display: block; color: var(--color-text-sidenav-link); text-decoration: none; font-size: $font-size-md; padding-left: $spacing-lg; padding-block: 2px; transition: color $transition-slow; @include text-truncate; border-radius: $radius-sm; margin-bottom: 2px; &:hover { color: var(--color-text-sidenav-link-active); } &:focus-visible { outline: none; background: var(--color-bg-sidenav-link-active); } i { vertical-align: top; } &Active { color: var(--color-text-sidenav-link-active); background: var(--color-bg-sidenav-link-active); } } /* Groups (Saved Searches, Dashboards) */ .groupLabel { color: var(--color-text-muted); text-transform: uppercase; font-size: $font-size-sm; letter-spacing: 1px; margin-bottom: 2px; margin-top: 6px; padding-left: $spacing-lg; width: 100%; display: flex; align-items: center; gap: 6px; cursor: pointer; &:hover { color: var(--color-text-sidenav-link); } } .groupDragOver { opacity: 0.7; background: #ffffff1a; border-radius: $radius-lg; } /* Search Input */ .searchInput { input { min-height: $search-input-height; height: $search-input-height; line-height: $search-input-height; } } .shortcutHint { white-space: nowrap; letter-spacing: -1px; color: var(--color-text-muted); background: var(--color-bg-surface); border-radius: $radius-sm; padding: 0 $spacing-xs; font-size: $font-size-xs; margin-right: $spacing-lg; &Ctrl { letter-spacing: -2px; } } /* Empty States */ .emptyMessage { color: var(--color-text-muted); font-size: $font-size-md - 1px; margin: $spacing-sm $spacing-lg; @include text-truncate; } /* User Menu */ .userMenu { cursor: pointer; margin: $spacing-sm; padding: $spacing-xs $spacing-sm; border-radius: $radius-md; transition: background-color $transition-slow, transform $transition-fast; max-width: 100%; overflow: hidden; &:hover { background: var(--color-bg-sidenav-link-active); } @include interactive-press; &Collapsed { padding: 2px; margin: $spacing-sm auto 0.875rem; background: transparent; border: none !important; width: fit-content; &:hover { background: var(--color-bg-sidenav-link-active); } @include interactive-press; } } .userMenuInfo { flex: 1; overflow: hidden; } .userMenuName { max-width: 100%; @include text-truncate; } .userMenuTeam { font-size: $font-size-sm; max-width: 100%; max-height: $spacing-lg; @include text-truncate; } /* Help Button */ .helpButton { @include flex-center; cursor: pointer; margin: 0 $spacing-sm $spacing-sm; width: $help-button-size; height: $help-button-size; border-radius: 50%; border: 1px solid var(--color-border); transition: background-color $transition-slow, transform $transition-fast, border-color $transition-slow; &:hover { background: var(--color-bg-sidenav-link-active); border-color: var(--color-border); } @include interactive-press; &Collapsed { margin: 0 auto $spacing-sm; border: none; background: transparent; &:hover { background: var(--color-bg-sidenav-link-active); } @include interactive-press; } } /* Onboarding Section */ .onboardingSection { padding-left: $spacing-sm; padding-right: $spacing-md; margin-bottom: $spacing-sm; margin-top: $spacing-lg; padding-bottom: $spacing-sm; } /* Scrollbar Customization */ .scrollbar { .thumb { background-color: var(--color-border); } } ================================================ FILE: packages/app/src/components/AppNav/AppNav.stories.tsx ================================================ import type { Meta } from '@storybook/nextjs'; import type { StoryObj } from '@storybook/nextjs'; import AppNav from './AppNav'; import { AppNavUserMenu } from './AppNav.components'; const meta: Meta = { component: AppNav, parameters: { layout: 'fullscreen', }, }; export const Default = () => ; export const AppNavUserMenuCmp: StoryObj = { args: { isCollapsed: false, logoutUrl: 'http://localhost/logout', }, render: props => ( ), parameters: { layout: 'centered', }, argTypes: { isCollapsed: { control: { type: 'boolean' }, }, logoutUrl: { control: { type: 'text' }, }, }, }; export default meta; ================================================ FILE: packages/app/src/components/AppNav/AppNav.tsx ================================================ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import Link from 'next/link'; import Router, { useRouter } from 'next/router'; import cx from 'classnames'; import Fuse from 'fuse.js'; import { NumberParam, StringParam, useQueryParam, useQueryParams, withDefault, } from 'use-query-params'; import HyperDX from '@hyperdx/browser'; import { AlertState } from '@hyperdx/common-utils/dist/types'; import { ActionIcon, Badge, Button, CloseButton, Collapse, Group, Input, Loader, ScrollArea, Text, } from '@mantine/core'; import { useDisclosure, useLocalStorage } from '@mantine/hooks'; import { IconBell, IconBellFilled, IconChartDots, IconChevronDown, IconChevronRight, IconCommand, IconDeviceLaptop, IconLayoutGrid, IconLayoutSidebarLeftCollapse, IconSearch, IconSettings, IconSitemap, IconTable, } from '@tabler/icons-react'; import api from '@/api'; import { IS_K8S_DASHBOARD_ENABLED, IS_LOCAL_MODE } from '@/config'; import { useCreateDashboard, useDashboards, useUpdateDashboard, } from '@/dashboard'; import InstallInstructionModal from '@/InstallInstructionsModal'; import OnboardingChecklist from '@/OnboardingChecklist'; import { useSavedSearches, useUpdateSavedSearch } from '@/savedSearch'; import { useLogomark, useWordmark } from '@/theme/ThemeProvider'; import type { SavedSearch, ServerDashboard } from '@/types'; import { UserPreferencesModal } from '@/UserPreferencesModal'; import { useUserPreferences } from '@/useUserPreferences'; import { useWindowSize } from '@/utils'; import packageJson from '../../../package.json'; import { AppNavCloudBanner, AppNavContext, AppNavHelpMenu, AppNavLink, AppNavUserMenu, } from './AppNav.components'; import styles from './AppNav.module.scss'; // Expose the same value Next injected at build time; fall back to package.json for dev tooling const APP_VERSION = process.env.NEXT_PUBLIC_APP_VERSION ?? packageJson.version ?? 'dev'; const UNTAGGED_SEARCHES_GROUP_NAME = 'Saved Searches'; const UNTAGGED_DASHBOARDS_GROUP_NAME = 'Saved Dashboards'; // Navigation link configuration type NavLinkConfig = { id: string; label: string; href: string; icon: React.ReactNode; isBeta?: boolean; cloudOnly?: boolean; // Only show when not in local mode }; const NAV_LINKS: NavLinkConfig[] = [ { id: 'chart', label: 'Chart Explorer', href: '/chart', icon: , }, { id: 'alerts', label: 'Alerts', href: '/alerts', icon: , cloudOnly: true, }, { id: 'sessions', label: 'Client Sessions', href: '/sessions', icon: , }, { id: 'service-map', label: 'Service Map', href: '/service-map', icon: , isBeta: true, }, ]; function NewDashboardButton() { const createDashboard = useCreateDashboard(); return ( ); } function SearchInput({ placeholder, value, onChange, onEnterDown, }: { placeholder: string; value: string; onChange: (arg0: string) => void; onEnterDown?: () => void; }) { const kbdShortcut = useMemo(() => { return (
{window.navigator.platform?.toUpperCase().includes('MAC') ? ( ) : ( Ctrl )}  K
); }, []); const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { if (e.key === 'Enter') { onEnterDown?.(); } }, [onEnterDown], ); return ( ) => onChange(e.currentTarget.value) } leftSection={} onKeyDown={handleKeyDown} rightSection={ value ? ( onChange('')} /> ) : ( kbdShortcut ) } mt={8} mb="sm" size="xs" variant="filled" radius="xl" className={styles.searchInput} /> ); } interface AppNavLinkItem { id: string; name: string; tags?: string[]; } type AppNavLinkGroup = { name: string; items: T[]; }; const AppNavGroupLabel = ({ name, collapsed, onClick, }: { name: string; collapsed: boolean; onClick: () => void; }) => { return (
{collapsed ? ( ) : ( )}
{name}
); }; const AppNavLinkGroups = ({ name, groups, renderLink, onDragEnd, forceExpandGroups = false, }: { name: string; groups: AppNavLinkGroup[]; renderLink: (item: T) => React.ReactNode; onDragEnd?: (target: HTMLElement | null, newGroup: string | null) => void; forceExpandGroups?: boolean; }) => { const [collapsedGroups, setCollapsedGroups] = useLocalStorage< Record >({ key: `collapsedGroups-${name}`, defaultValue: {}, }); const handleToggleGroup = useCallback( (groupName: string) => { setCollapsedGroups({ ...collapsedGroups, [groupName]: !collapsedGroups[groupName], }); }, [collapsedGroups, setCollapsedGroups], ); const [draggingOver, setDraggingOver] = useState(null); return ( <> {groups.map(group => (
{ e.preventDefault(); e.dataTransfer.dropEffect = 'move'; setDraggingOver(group.name); }} onDragEnd={e => { e.preventDefault(); onDragEnd?.(e.target as HTMLElement, draggingOver); setDraggingOver(null); }} > handleToggleGroup(group.name)} name={group.name} collapsed={collapsedGroups[group.name]} /> {group.items.map(item => renderLink(item))}
))} ); }; function useSearchableList({ items, untaggedGroupName = 'Other', }: { items: T[]; untaggedGroupName?: string; }) { const fuse = useMemo( () => new Fuse(items, { keys: ['name'], threshold: 0.2, ignoreLocation: true, }), [items], ); const [q, setQ] = useState(''); const filteredList = useMemo(() => { if (q === '') { return items; } return fuse.search(q).map(result => result.item); }, [fuse, items, q]); const groupedFilteredList = useMemo[]>(() => { // group by tags const groupedItems: Record = {}; const untaggedItems: T[] = []; filteredList.forEach(item => { if (item.tags?.length) { item.tags.forEach(tag => { groupedItems[tag] = groupedItems[tag] ?? []; groupedItems[tag].push(item); }); } else { untaggedItems.push(item); } }); if (untaggedItems.length) { groupedItems[untaggedGroupName] = untaggedItems; } return Object.entries(groupedItems) .map(([name, items]) => ({ name, items, })) .sort((a, b) => { if (a.name === untaggedGroupName) { return 1; } if (b.name === untaggedGroupName) { return -1; } return a.name.localeCompare(b.name); }); }, [filteredList, untaggedGroupName]); return { filteredList, groupedFilteredList, q, setQ, }; } export default function AppNav({ fixed = false }: { fixed?: boolean }) { const wordmark = useWordmark(); const logomark = useLogomark({ size: 22 }); useEffect(() => { let redirectUrl; try { redirectUrl = window.sessionStorage.getItem('hdx-login-redirect-url'); } catch (e: any) { console.error(e); } // conditional redirect if (redirectUrl) { // with router.push the page may be added to history // the browser on history back will go back to this page and then forward again to the redirected page // you can prevent this behaviour using location.replace window.sessionStorage.removeItem('hdx-login-redirect-url'); Router.push(redirectUrl); } }, []); const { data: logViewsData, isLoading: isLogViewsLoading, refetch: refetchLogViews, } = useSavedSearches(); const logViews = useMemo(() => logViewsData ?? [], [logViewsData]); const updateDashboard = useUpdateDashboard(); const updateLogView = useUpdateSavedSearch(); const { data: dashboardsData, isLoading: isDashboardsLoading, refetch: refetchDashboards, } = useDashboards(); const dashboards = useMemo(() => dashboardsData ?? [], [dashboardsData]); const router = useRouter(); const { pathname, query } = router; const [timeRangeQuery] = useQueryParams({ from: withDefault(NumberParam, -1), to: withDefault(NumberParam, -1), }); const [inputTimeQuery] = useQueryParam('tq', withDefault(StringParam, ''), { updateType: 'pushIn', enableBatching: true, }); const { data: meData } = api.useMe(); const [isSearchExpanded, setIsSearchExpanded] = useLocalStorage({ key: 'isSearchExpanded', defaultValue: true, }); const [isDashboardsExpanded, setIsDashboardExpanded] = useLocalStorage({ key: 'isDashboardsExpanded', defaultValue: true, }); const { width } = useWindowSize(); const [isPreferCollapsed, setIsPreferCollapsed] = useLocalStorage({ key: 'isNavCollapsed', defaultValue: false, }); const isSmallScreen = (width ?? 1000) < 900; const isCollapsed = isSmallScreen || isPreferCollapsed; const navWidth = isCollapsed ? 50 : 250; useEffect(() => { HyperDX.addAction('user navigated', { route: pathname, query: JSON.stringify(query), }); }, [pathname, query]); useEffect(() => { if (meData != null) { HyperDX.enableAdvancedNetworkCapture(); HyperDX.setGlobalAttributes({ userEmail: meData.email, userName: meData.name, teamName: meData.team.name, }); } }, [meData]); const { q: searchesListQ, setQ: setSearchesListQ, filteredList: filteredSearchesList, groupedFilteredList: groupedFilteredSearchesList, } = useSearchableList({ items: logViews, untaggedGroupName: UNTAGGED_SEARCHES_GROUP_NAME, }); const { q: dashboardsListQ, setQ: setDashboardsListQ, filteredList: filteredDashboardsList, groupedFilteredList: groupedFilteredDashboardsList, } = useSearchableList({ items: dashboards, untaggedGroupName: UNTAGGED_DASHBOARDS_GROUP_NAME, }); const [isDashboardsPresetsCollapsed, setDashboardsPresetsCollapsed] = useLocalStorage({ key: 'isDashboardsPresetsCollapsed', defaultValue: false, }); const savedSearchesResultsRef = useRef(null); const dashboardsResultsRef = useRef(null); const renderLogViewLink = useCallback( (savedSearch: SavedSearch) => (
{savedSearch.name}
{Array.isArray(savedSearch.alerts) && savedSearch.alerts.length > 0 ? ( savedSearch.alerts.some(a => a.state === AlertState.ALERT) ? ( ) : ( ) ) : null}
), [ inputTimeQuery, query.savedSearchId, timeRangeQuery.from, timeRangeQuery.to, ], ); const handleLogViewDragEnd = useCallback( (target: HTMLElement | null, name: string | null) => { if (!target?.dataset.savedsearchid || name == null) { return; } const logView = logViews.find( lv => lv.id === target.dataset.savedsearchid, ); if (logView?.tags?.includes(name)) { return; } updateLogView.mutate( { id: target.dataset.savedsearchid, tags: name === UNTAGGED_SEARCHES_GROUP_NAME ? [] : [name], }, { onSuccess: () => { refetchLogViews(); }, }, ); }, [logViews, refetchLogViews, updateLogView], ); const renderDashboardLink = useCallback( (dashboard: ServerDashboard) => ( {dashboard.name} ), [query.dashboardId], ); const handleDashboardDragEnd = useCallback( (target: HTMLElement | null, name: string | null) => { if (!target?.dataset.dashboardid || name == null) { return; } const dashboard = dashboards.find( d => d.id === target.dataset.dashboardid, ); if (dashboard?.tags?.includes(name)) { return; } updateDashboard.mutate( { id: target.dataset.dashboardid, tags: name === UNTAGGED_DASHBOARDS_GROUP_NAME ? [] : [name], }, { onSuccess: () => { refetchDashboards(); }, }, ); }, [dashboards, refetchDashboards, updateDashboard], ); const [ UserPreferencesOpen, { close: closeUserPreferences, open: openUserPreferences }, ] = useDisclosure(false); const { userPreferences: { isUTC }, } = useUserPreferences(); const [ showInstallInstructions, { open: openInstallInstructions, close: closeInstallInstructions }, ] = useDisclosure(false); return ( {fixed && (
)}
{isCollapsed ? (
{logomark}
) : ( {wordmark} {isUTC && ( UTC )} )} setIsPreferCollapsed((v: boolean) => !v)} >
{/* Search */} } href="/search" isExpanded={isSearchExpanded} onToggle={() => setIsSearchExpanded(!isSearchExpanded)} /> {!isCollapsed && (
{isLogViewsLoading ? ( ) : ( <> { ( savedSearchesResultsRef?.current ?.firstChild as HTMLAnchorElement )?.focus?.(); }} /> {logViews.length === 0 && (
No saved searches
)}
{searchesListQ && filteredSearchesList.length === 0 ? (
No results matching {searchesListQ}
) : null} )}
)} {/* Simple nav links from config */} {NAV_LINKS.filter(link => !link.cloudOnly || !IS_LOCAL_MODE).map( link => ( ), )} {/* Dashboards */} } isExpanded={isDashboardsExpanded} onToggle={() => setIsDashboardExpanded(!isDashboardsExpanded)} /> {!isCollapsed && (
{isDashboardsLoading && dashboardsData == null ? ( ) : ( <> { ( dashboardsResultsRef?.current ?.firstChild as HTMLAnchorElement )?.focus?.(); }} /> {dashboards.length === 0 && (
No saved dashboards
)} {dashboardsListQ && filteredDashboardsList.length === 0 ? (
No results matching {dashboardsListQ}
) : null} )} setDashboardsPresetsCollapsed( !isDashboardsPresetsCollapsed, ) } /> ClickHouse Services {IS_K8S_DASHBOARD_ENABLED && ( Kubernetes )}
)} {/* Team Settings (Cloud only) */} {!IS_LOCAL_MODE && ( } /> )}
{!isCollapsed && (
)}
{IS_LOCAL_MODE && !isCollapsed && ( Join us & build the future of high scale observability → )} {meData && meData.usageStatsEnabled && ( )}
); } ================================================ FILE: packages/app/src/components/AppNav/index.ts ================================================ export { default } from './AppNav'; export { AppNavCloudBanner, AppNavContext, AppNavHelpMenu, AppNavLink, AppNavUserMenu, } from './AppNav.components'; ================================================ FILE: packages/app/src/components/ChartBox.tsx ================================================ import { Box, BoxComponentProps } from '@mantine/core'; export function ChartBox({ children, style, 'data-testid': dataTestId, }: { children: React.ReactNode; style?: BoxComponentProps['style']; 'data-testid'?: string; }) { return ( {children} ); } ================================================ FILE: packages/app/src/components/ChartDisplaySettingsDrawer.tsx ================================================ import { useCallback } from 'react'; import { useForm, useWatch } from 'react-hook-form'; import { ChartConfigWithDateRange, DisplayType, } from '@hyperdx/common-utils/dist/types'; import { Box, Button, Checkbox, Divider, Drawer, Group, Stack, } from '@mantine/core'; import { shouldFillNullsWithZero } from '@/ChartUtils'; import { FormatTime } from '@/useFormatTime'; import { DEFAULT_NUMBER_FORMAT, NumberFormatForm } from './NumberFormat'; export type ChartConfigDisplaySettings = Pick< ChartConfigWithDateRange, | 'numberFormat' | 'alignDateRangeToGranularity' | 'fillNulls' | 'compareToPreviousPeriod' >; interface ChartDisplaySettingsDrawerProps { opened: boolean; settings: ChartConfigDisplaySettings; displayType: DisplayType; previousDateRange?: [Date, Date]; onChange: (settings: ChartConfigDisplaySettings) => void; onClose: () => void; } function applyDefaultSettings({ numberFormat, alignDateRangeToGranularity, compareToPreviousPeriod, fillNulls, }: ChartConfigDisplaySettings): ChartConfigDisplaySettings { return { numberFormat: numberFormat ?? DEFAULT_NUMBER_FORMAT, alignDateRangeToGranularity: alignDateRangeToGranularity == null ? true : alignDateRangeToGranularity, fillNulls: fillNulls ?? 0, compareToPreviousPeriod: compareToPreviousPeriod ?? false, }; } export default function ChartDisplaySettingsDrawer({ settings, opened, displayType, onChange, onClose, previousDateRange, }: ChartDisplaySettingsDrawerProps) { const { control, handleSubmit, register, reset, setValue } = useForm({ defaultValues: applyDefaultSettings(settings), }); const fillNulls = useWatch({ control, name: 'fillNulls' }); const isFillNullsEnabled = shouldFillNullsWithZero(fillNulls); const handleClose = useCallback(() => { reset(applyDefaultSettings(settings)); // Reset to default values, without saving onClose(); }, [onClose, reset, settings]); const applyChanges = useCallback(() => { handleSubmit(onChange)(); onClose(); }, [onChange, handleSubmit, onClose]); const resetToDefaults = useCallback(() => { reset(applyDefaultSettings({})); }, [reset]); const isTimeChart = displayType === DisplayType.Line || displayType === DisplayType.StackedBar; return ( {isTimeChart && ( <> { setValue('fillNulls', e.currentTarget.checked ? 0 : false); }} /> ( {' - '} ) ) } {...register('compareToPreviousPeriod')} /> )} ); } ================================================ FILE: packages/app/src/components/ChartEditor/RawSqlChartEditor.tsx ================================================ import { useEffect, useMemo } from 'react'; import { Control, UseFormSetValue, useWatch } from 'react-hook-form'; import { TableConnection, tcFromSource, } from '@hyperdx/common-utils/dist/core/metadata'; import { MACRO_SUGGESTIONS } from '@hyperdx/common-utils/dist/macros'; import { QUERY_PARAMS_BY_DISPLAY_TYPE } from '@hyperdx/common-utils/dist/rawSqlParams'; import { DisplayType, isLogSource, isMetricSource, isTraceSource, } from '@hyperdx/common-utils/dist/types'; import { Box, Button, Group, Stack, Text, Tooltip } from '@mantine/core'; import { IconHelpCircle } from '@tabler/icons-react'; import { SQLEditorControlled } from '@/components/SQLEditor/SQLEditor'; import { type SQLCompletion } from '@/components/SQLEditor/utils'; import useResizable from '@/hooks/useResizable'; import { useSources } from '@/source'; import { getAllMetricTables, usePrevious } from '@/utils'; import { ConnectionSelectControlled } from '../ConnectionSelect'; import { SourceSelectControlled } from '../SourceSelect'; import { SQL_PLACEHOLDERS } from './constants'; import { RawSqlChartInstructions } from './RawSqlChartInstructions'; import { ChartEditorFormState } from './types'; import resizeStyles from '@/../styles/ResizablePanel.module.scss'; export default function RawSqlChartEditor({ control, setValue, onOpenDisplaySettings, isDashboardForm, }: { control: Control; setValue: UseFormSetValue; onOpenDisplaySettings: () => void; isDashboardForm: boolean; }) { const { size, startResize } = useResizable(20, 'bottom'); const { data: sources } = useSources(); const displayType = useWatch({ control, name: 'displayType' }); const connection = useWatch({ control, name: 'connection' }); const source = useWatch({ control, name: 'source' }); const prevSource = usePrevious(source); const prevConnection = usePrevious(connection); useEffect(() => { if (!sources) return; // When the source changes, sync the connection to match. if (source !== prevSource) { const sourceConnection = sources.find(s => s.id === source)?.connection; if (sourceConnection && sourceConnection !== connection) { setValue('connection', sourceConnection); } } else if (!connection) { // Set a default connection const defaultConnection = sources[0]?.connection; if (defaultConnection) { setValue('connection', defaultConnection); } } else if (connection !== prevConnection && prevConnection !== undefined) { // When the connection changes, clear the source setValue('source', ''); } }, [connection, prevConnection, prevSource, setValue, source, sources]); const placeholderSQl = SQL_PLACEHOLDERS[displayType ?? DisplayType.Table]; const additionalCompletions: SQLCompletion[] = useMemo(() => { const effectiveDisplayType = displayType ?? DisplayType.Table; const params = QUERY_PARAMS_BY_DISPLAY_TYPE[effectiveDisplayType]; const paramCompletions: SQLCompletion[] = params.map(({ name, type }) => ({ label: `{${name}:${type}}`, apply: `{${name}:${type}`, // Omit the closing } because the editor will have added it when the user types { detail: 'param', type: 'variable', })); const macroCompletions: SQLCompletion[] = MACRO_SUGGESTIONS.map( ({ name, argCount }) => ({ label: `$__${name}`, apply: argCount > 0 ? `$__${name}(` : `$__${name}`, detail: 'macro', type: 'function', }), ); return [...paramCompletions, ...macroCompletions]; }, [displayType]); const tableConnections: TableConnection[] = useMemo(() => { if (!sources) return []; return sources .filter(s => s.connection === connection) .flatMap(source => { const tables: TableConnection[] = getAllMetricTables(source); if (!isMetricSource(source)) { tables.push(tcFromSource(source)); } if ( (isLogSource(source) || isTraceSource(source)) && source.materializedViews ) { tables.push( ...source.materializedViews.map(mv => ({ databaseName: mv.databaseName, tableName: mv.tableName, connectionId: source.connection, })), ); } return tables; }); }, [sources, connection]); return ( Connection Source {isDashboardForm && ( )}
); } ================================================ FILE: packages/app/src/components/ChartEditor/RawSqlChartInstructions.tsx ================================================ import { atom, useAtom } from 'jotai'; import { QUERY_PARAM_EXAMPLES, QUERY_PARAMS_BY_DISPLAY_TYPE, } from '@hyperdx/common-utils/dist/rawSqlParams'; import { DisplayType } from '@hyperdx/common-utils/dist/types'; import { ActionIcon, Anchor, Code, Collapse, Group, List, Paper, Stack, Text, Tooltip, } from '@mantine/core'; import { useClipboard } from '@mantine/hooks'; import { IconCheck, IconChevronDown, IconChevronRight, IconCopy, } from '@tabler/icons-react'; import { DISPLAY_TYPE_INSTRUCTIONS } from './constants'; const helpOpenedAtom = atom(true); function ParamSnippet({ value, description, }: { value: string; description: string; }) { const clipboard = useClipboard({ timeout: 1500 }); return ( {value} clipboard.copy(value)} > {clipboard.copied ? : } — {description} ); } export function RawSqlChartInstructions({ displayType, isDashboardForm, }: { displayType: DisplayType; isDashboardForm: boolean; }) { const [helpOpened, setHelpOpened] = useAtom(helpOpenedAtom); const toggleHelp = () => setHelpOpened(v => !v); const availableParams = QUERY_PARAMS_BY_DISPLAY_TYPE[displayType]; const exampleClipboard = useClipboard({ timeout: 1500 }); return ( {helpOpened ? ( ) : ( )} SQL Chart Instructions {DISPLAY_TYPE_INSTRUCTIONS[displayType]} The following parameters and macros can be used in this chart: {availableParams.map(({ name, type, description }) => ( ))} Macros from the{' '} ClickHouse Datasource Grafana Plugin Example:
exampleClipboard.copy(QUERY_PARAM_EXAMPLES[displayType]) } style={{ position: 'absolute', top: 4, right: 4, zIndex: 1, }} > {exampleClipboard.copied ? ( ) : ( )} {QUERY_PARAM_EXAMPLES[displayType]}
); } ================================================ FILE: packages/app/src/components/ChartEditor/__tests__/utils.test.ts ================================================ import type { BuilderChartConfig, BuilderSavedChartConfig, RawSqlSavedChartConfig, TMetricSource, TSource, } from '@hyperdx/common-utils/dist/types'; import { DisplayType, MetricsDataType, SourceKind, } from '@hyperdx/common-utils/dist/types'; import type { ChartEditorFormState } from '../types'; import { convertFormStateToChartConfig, convertFormStateToSavedChartConfig, convertSavedChartConfigToFormState, validateChartForm, } from '../utils'; jest.mock('../../SearchInput', () => ({ getStoredLanguage: jest.fn().mockReturnValue('lucene'), })); const dateRange: [Date, Date] = [ new Date('2024-01-01'), new Date('2024-01-02'), ]; const logSource: TSource = { id: 'source-log', name: 'Log Source', kind: SourceKind.Log, connection: 'conn-1', from: { databaseName: 'db', tableName: 'logs' }, timestampValueExpression: 'Timestamp', defaultTableSelectExpression: 'Body, SeverityText', implicitColumnExpression: 'Body', }; const metricSource: TMetricSource = { id: 'source-metric', name: 'Metric Source', kind: SourceKind.Metric, connection: 'conn-1', from: { databaseName: 'db', tableName: '' }, timestampValueExpression: 'TimeUnix', metricTables: { gauge: 'gauge_table' } as TMetricSource['metricTables'], resourceAttributesExpression: 'ResourceAttributes', }; const seriesItem = { aggFn: 'count' as const, valueExpression: '*', aggCondition: '', aggConditionLanguage: 'lucene' as const, }; describe('convertFormStateToSavedChartConfig', () => { it('returns undefined when no source and configType is not sql', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, series: [seriesItem], }; expect(convertFormStateToSavedChartConfig(form, undefined)).toBeUndefined(); }); it('returns RawSqlSavedChartConfig for sql+table config', () => { const form: ChartEditorFormState = { configType: 'sql', displayType: DisplayType.Table, sqlTemplate: 'SELECT 1', connection: 'conn-1', name: 'My Chart', series: [], }; const result = convertFormStateToSavedChartConfig(form, undefined); expect(result).toEqual({ configType: 'sql', displayType: DisplayType.Table, sqlTemplate: 'SELECT 1', connection: 'conn-1', name: 'My Chart', }); }); it('returns a raw SQL config for Line displayType', () => { const form: ChartEditorFormState = { configType: 'sql', displayType: DisplayType.Line, sqlTemplate: 'SELECT 1', connection: 'conn-1', series: [], }; const result = convertFormStateToSavedChartConfig(form, undefined); expect(result).toEqual({ configType: 'sql', displayType: DisplayType.Line, sqlTemplate: 'SELECT 1', connection: 'conn-1', }); }); it('returns undefined for sql config with an unsupported displayType', () => { const form: ChartEditorFormState = { configType: 'sql', displayType: DisplayType.Markdown, sqlTemplate: 'SELECT 1', connection: 'conn-1', series: [], }; expect(convertFormStateToSavedChartConfig(form, undefined)).toBeUndefined(); }); it('uses sqlTemplate empty string as default when undefined', () => { const form: ChartEditorFormState = { configType: 'sql', displayType: DisplayType.Table, series: [], }; const result = convertFormStateToSavedChartConfig( form, undefined, ) as RawSqlSavedChartConfig; expect(result.sqlTemplate).toBe(''); expect(result.connection).toBe(''); }); it('maps series to select for builder config', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, where: 'status = 200', series: [seriesItem], }; const result = convertFormStateToSavedChartConfig( form, logSource, ) as BuilderSavedChartConfig; expect(result.select).toEqual([seriesItem]); expect('series' in result).toBe(false); expect(result.source).toBe('source-log'); }); it('uses form.select string for Search displayType', () => { const form: ChartEditorFormState = { displayType: DisplayType.Search, select: 'Body, SeverityText', series: [seriesItem], }; const result = convertFormStateToSavedChartConfig( form, logSource, ) as BuilderSavedChartConfig; expect(result.select).toBe('Body, SeverityText'); expect('series' in result).toBe(false); }); it('uses empty string for Search displayType when select is not a string', () => { const form: ChartEditorFormState = { displayType: DisplayType.Search, select: [seriesItem], series: [], }; const result = convertFormStateToSavedChartConfig( form, logSource, ) as BuilderSavedChartConfig; expect(result.select).toBe(''); expect('series' in result).toBe(false); }); it('strips metricName and metricType from select for non-metric source', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, series: [ { ...seriesItem, metricName: 'cpu.usage', metricType: 'gauge' as any, }, ], }; const result = convertFormStateToSavedChartConfig( form, logSource, ) as BuilderSavedChartConfig; const select = result.select as (typeof seriesItem)[]; expect(select[0]).not.toHaveProperty('metricName'); expect(select[0]).not.toHaveProperty('metricType'); }); it('preserves form metricTables for metric source', () => { const formMetricTables = { gauge: 'gauge_table', } as BuilderSavedChartConfig['metricTables']; const form: ChartEditorFormState = { displayType: DisplayType.Line, series: [seriesItem], metricTables: formMetricTables, }; const result = convertFormStateToSavedChartConfig( form, metricSource, ) as BuilderSavedChartConfig; expect(result.metricTables).toEqual(formMetricTables); }); it('strips metricTables for non-metric source', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, series: [seriesItem], metricTables: { gauge: 'gauge_table' } as any, }; const result = convertFormStateToSavedChartConfig( form, logSource, ) as BuilderSavedChartConfig; expect(result.metricTables).toBeUndefined(); }); it('preserves having and orderBy only for Table displayType', () => { const having = 'count > 5'; const orderBy = [ { aggFn: 'count', valueExpression: '*', aggCondition: '', ordering: 'DESC' as const, }, ]; const form: ChartEditorFormState = { displayType: DisplayType.Table, series: [seriesItem], having, orderBy, }; const tableResult = convertFormStateToSavedChartConfig( form, logSource, ) as BuilderSavedChartConfig; expect(tableResult.having).toBe(having); expect(tableResult.orderBy).toEqual(orderBy); const lineResult = convertFormStateToSavedChartConfig( { ...form, displayType: DisplayType.Line }, logSource, ) as BuilderSavedChartConfig; expect(lineResult.having).toBeUndefined(); expect(lineResult.orderBy).toBeUndefined(); }); it('defaults where to empty string when undefined', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, series: [seriesItem], }; const result = convertFormStateToSavedChartConfig( form, logSource, ) as BuilderSavedChartConfig; expect(result.where).toBe(''); }); }); describe('convertFormStateToChartConfig', () => { it('returns undefined when no source and configType is not sql', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, series: [seriesItem], }; expect( convertFormStateToChartConfig(form, dateRange, undefined), ).toBeUndefined(); }); it('returns RawSqlChartConfig with dateRange for sql config', () => { const form: ChartEditorFormState = { configType: 'sql', displayType: DisplayType.Table, sqlTemplate: 'SELECT now()', connection: 'conn-1', series: [], }; const result = convertFormStateToChartConfig(form, dateRange, undefined); expect(result).toMatchObject({ configType: 'sql', sqlTemplate: 'SELECT now()', connection: 'conn-1', displayType: DisplayType.Table, dateRange, }); }); it('returns builder config with source fields merged', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, where: 'status = 200', series: [seriesItem], }; const result = convertFormStateToChartConfig(form, dateRange, logSource); expect(result).toMatchObject({ from: logSource.from, timestampValueExpression: logSource.timestampValueExpression, connection: logSource.connection, implicitColumnExpression: logSource.implicitColumnExpression, dateRange, where: 'status = 200', }); }); it('falls back to defaultTableSelectExpression when series is empty', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, series: [], }; const result = convertFormStateToChartConfig( form, dateRange, logSource, ) as BuilderChartConfig; expect(result?.select).toBe(logSource.defaultTableSelectExpression); }); it('uses series as select for non-Search displayType', () => { const form: ChartEditorFormState = { displayType: DisplayType.Line, series: [seriesItem], }; const result = convertFormStateToChartConfig( form, dateRange, logSource, ) as BuilderChartConfig; expect(result?.select).toEqual([seriesItem]); }); it('uses form.select for Search displayType', () => { const form: ChartEditorFormState = { displayType: DisplayType.Search, select: 'Body', series: [], }; const result = convertFormStateToChartConfig( form, dateRange, logSource, ) as BuilderChartConfig; expect(result?.select).toBe('Body'); }); }); describe('convertSavedChartConfigToFormState', () => { it('sets configType to sql for RawSqlSavedChartConfig', () => { const config: RawSqlSavedChartConfig = { configType: 'sql', displayType: DisplayType.Table, sqlTemplate: 'SELECT 1', connection: 'conn-1', }; const result = convertSavedChartConfigToFormState(config); expect(result.configType).toBe('sql'); expect(result.series).toEqual([]); }); it('sets configType to builder for BuilderSavedChartConfig', () => { const config: BuilderSavedChartConfig = { source: 'source-1', displayType: DisplayType.Line, select: [seriesItem], where: '', }; const result = convertSavedChartConfigToFormState(config); expect(result.configType).toBe('builder'); }); it('maps array select to series with aggConditionLanguage defaulted', () => { const selectItem = { aggFn: 'count' as const, valueExpression: '*', aggCondition: '', }; const config: BuilderSavedChartConfig = { source: 'source-1', select: [selectItem], where: '', }; const result = convertSavedChartConfigToFormState(config); expect(result.series).toHaveLength(1); expect(result.series[0].aggConditionLanguage).toBe('lucene'); }); it('preserves existing aggConditionLanguage when already set', () => { const config: BuilderSavedChartConfig = { source: 'source-1', select: [{ ...seriesItem, aggConditionLanguage: 'sql' as const }], where: '', }; const result = convertSavedChartConfigToFormState(config); expect(result.series[0].aggConditionLanguage).toBe('sql'); }); it('sets series to empty array when select is a string', () => { const config: BuilderSavedChartConfig = { source: 'source-1', select: 'Body, SeverityText', where: '', }; const result = convertSavedChartConfigToFormState(config); expect(result.series).toEqual([]); }); it('preserves other config fields in the form state', () => { const config: BuilderSavedChartConfig = { source: 'source-1', name: 'My Chart', displayType: DisplayType.Table, select: [seriesItem], where: 'status = 200', }; const result = convertSavedChartConfigToFormState(config); expect(result.name).toBe('My Chart'); expect(result.displayType).toBe(DisplayType.Table); expect(result.where).toBe('status = 200'); }); }); describe('validateChartForm', () => { const metricSeriesItem = { ...seriesItem, metricType: MetricsDataType.Gauge, metricName: 'cpu.usage', }; const makeForm = ( overrides: Partial, ): ChartEditorFormState => ({ displayType: DisplayType.Line, series: [seriesItem], ...overrides, }); // ── Valid forms (no errors) ────────────────────────────────────────── it('returns no errors for a valid builder chart with a source', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ source: 'source-log' }), logSource, setError, ); expect(errors).toHaveLength(0); expect(setError).not.toHaveBeenCalled(); }); it('returns no errors for a valid raw SQL chart', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ configType: 'sql', displayType: DisplayType.Table, sqlTemplate: 'SELECT 1', connection: 'conn-1', }), undefined, setError, ); expect(errors).toHaveLength(0); expect(setError).not.toHaveBeenCalled(); }); it('returns no errors for a Markdown chart without source', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Markdown }), undefined, setError, ); expect(errors).toHaveLength(0); expect(setError).not.toHaveBeenCalled(); }); it('returns no errors for a Number chart with exactly one series', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Number, source: 'source-log', series: [seriesItem], }), logSource, setError, ); expect(errors).toHaveLength(0); expect(setError).not.toHaveBeenCalled(); }); it('returns no errors for a Pie chart with exactly one series', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Pie, source: 'source-log', series: [seriesItem], }), logSource, setError, ); expect(errors).toHaveLength(0); expect(setError).not.toHaveBeenCalled(); }); it('returns no errors for a Search chart (skips series validation)', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Search, source: 'source-log', series: [], }), logSource, setError, ); expect(errors).toHaveLength(0); expect(setError).not.toHaveBeenCalled(); }); it('returns no errors for count aggFn without valueExpression', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ source: 'source-log', series: [{ ...seriesItem, aggFn: 'count', valueExpression: '' }], }), logSource, setError, ); expect(errors).toHaveLength(0); expect(setError).not.toHaveBeenCalled(); }); it('returns no errors for metric series where all items have metricName', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ source: 'source-metric', series: [metricSeriesItem] }), metricSource, setError, ); expect(errors).toHaveLength(0); expect(setError).not.toHaveBeenCalled(); }); // ── Raw SQL validation ─────────────────────────────────────────────── it('errors when raw SQL chart is missing connection', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ configType: 'sql', displayType: DisplayType.Table, sqlTemplate: 'SELECT 1', connection: '', }), undefined, setError, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'connection' }), ); expect(setError).toHaveBeenCalledWith('connection', { type: 'manual', message: 'Connection is required', }); }); it('errors when raw SQL chart is missing sqlTemplate', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ configType: 'sql', displayType: DisplayType.Line, sqlTemplate: '', connection: 'conn-1', }), undefined, setError, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'sqlTemplate' }), ); expect(setError).toHaveBeenCalledWith('sqlTemplate', { type: 'manual', message: 'SQL query is required', }); }); it('does not check connection/sqlTemplate for non-sql configType', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ configType: 'builder', displayType: DisplayType.Line, source: 'source-log', }), logSource, setError, ); expect( errors.filter(e => e.path === 'connection' || e.path === 'sqlTemplate'), ).toHaveLength(0); }); // ── Source validation ──────────────────────────────────────────────── it('errors when builder chart has no source', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ source: undefined }), logSource, setError, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'source', message: 'Source is required', }), ); }); it('does not require source for Markdown charts', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Markdown, source: undefined }), undefined, setError, ); expect(errors.filter(e => e.path === 'source')).toHaveLength(0); }); it('does not require source for raw SQL charts', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ configType: 'sql', displayType: DisplayType.Table, sqlTemplate: 'SELECT 1', connection: 'conn-1', source: undefined, }), undefined, setError, ); expect(errors.filter(e => e.path === 'source')).toHaveLength(0); }); // ── Series valueExpression validation ──────────────────────────────── it('errors when a non-count aggFn series is missing valueExpression', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ source: 'source-log', series: [{ ...seriesItem, aggFn: 'sum', valueExpression: '' }], }), logSource, setError, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series.0.valueExpression', message: 'Expression is required for series 1', }), ); }); it('errors for each series missing valueExpression with non-count aggFn', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ source: 'source-log', series: [ { ...seriesItem, aggFn: 'avg', valueExpression: '' }, { ...seriesItem, aggFn: 'max', valueExpression: '' }, ], }), logSource, setError, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series.0.valueExpression' }), ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series.1.valueExpression' }), ); }); it('does not error for count aggFn even without valueExpression', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ source: 'source-log', series: [{ ...seriesItem, aggFn: 'count', valueExpression: '' }], }), logSource, setError, ); expect( errors.filter(e => e.path === 'series.0.valueExpression'), ).toHaveLength(0); }); it('does not validate valueExpression for Search displayType', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Search, source: 'source-log', series: [{ ...seriesItem, aggFn: 'sum', valueExpression: '' }], }), logSource, setError, ); expect( errors.filter( e => typeof e.path === 'string' && e.path.includes('valueExpression'), ), ).toHaveLength(0); }); it('does not validate valueExpression for Markdown displayType', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Markdown, source: 'source-log', series: [{ ...seriesItem, aggFn: 'sum', valueExpression: '' }], }), logSource, setError, ); expect( errors.filter( e => typeof e.path === 'string' && e.path.includes('valueExpression'), ), ).toHaveLength(0); }); // ── Metric name validation ─────────────────────────────────────────── it('errors for each metric series item missing metricName', () => { const setError = jest.fn(); const seriesWithoutName = { ...seriesItem, metricType: MetricsDataType.Gauge, }; const errors = validateChartForm( makeForm({ source: 'source-metric', series: [seriesWithoutName, seriesWithoutName], }), metricSource, setError, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series.0.metricName' }), ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series.1.metricName' }), ); }); it('only errors on metric series items that are missing metricName', () => { const setError = jest.fn(); const seriesWithoutName = { ...seriesItem, metricType: MetricsDataType.Gauge, }; const errors = validateChartForm( makeForm({ source: 'source-metric', series: [metricSeriesItem, seriesWithoutName], }), metricSource, setError, ); expect(errors.filter(e => e.path === 'series.0.metricName')).toHaveLength( 0, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series.1.metricName' }), ); }); it('skips metric validation for non-metric sources', () => { const setError = jest.fn(); const seriesWithoutName = { ...seriesItem, metricType: MetricsDataType.Gauge, }; const errors = validateChartForm( makeForm({ source: 'source-log', series: [seriesWithoutName] }), logSource, setError, ); expect( errors.filter( e => typeof e.path === 'string' && e.path.includes('metricName'), ), ).toHaveLength(0); }); it('skips metric validation when source is undefined', () => { const setError = jest.fn(); const seriesWithoutName = { ...seriesItem, metricType: MetricsDataType.Gauge, }; const errors = validateChartForm( makeForm({ series: [seriesWithoutName] }), undefined, setError, ); expect( errors.filter( e => typeof e.path === 'string' && e.path.includes('metricName'), ), ).toHaveLength(0); }); // ── Number / Pie single-series validation ──────────────────────────── it('errors when Number chart has more than one series', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Number, source: 'source-log', series: [seriesItem, seriesItem], }), logSource, setError, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series', message: `Only one series is allowed for ${DisplayType.Number} charts`, }), ); }); it('errors when Pie chart has more than one series', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Pie, source: 'source-log', series: [seriesItem, seriesItem], }), logSource, setError, ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series', message: `Only one series is allowed for ${DisplayType.Pie} charts`, }), ); }); it('does not error for Line chart with multiple series', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Line, source: 'source-log', series: [seriesItem, seriesItem], }), logSource, setError, ); expect(errors.filter(e => e.path === 'series')).toHaveLength(0); }); it('does not error for Table chart with multiple series', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Table, source: 'source-log', series: [seriesItem, seriesItem], }), logSource, setError, ); expect(errors.filter(e => e.path === 'series')).toHaveLength(0); }); it('does not apply single-series limit for raw SQL Number charts', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ configType: 'sql', displayType: DisplayType.Number, sqlTemplate: 'SELECT 1', connection: 'conn-1', series: [seriesItem, seriesItem], }), undefined, setError, ); expect(errors.filter(e => e.path === 'series')).toHaveLength(0); }); // ── Multiple validation errors at once ─────────────────────────────── it('accumulates multiple errors across different validation rules', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ displayType: DisplayType.Number, source: undefined, series: [ { ...seriesItem, aggFn: 'sum', valueExpression: '' }, { ...seriesItem, aggFn: 'avg', valueExpression: '' }, ], }), logSource, setError, ); // Should have: source error + 2 valueExpression errors + series count error expect(errors).toContainEqual(expect.objectContaining({ path: 'source' })); expect(errors).toContainEqual( expect.objectContaining({ path: 'series.0.valueExpression' }), ); expect(errors).toContainEqual( expect.objectContaining({ path: 'series.1.valueExpression' }), ); expect(errors).toContainEqual(expect.objectContaining({ path: 'series' })); expect(errors).toHaveLength(4); }); it('calls setError for every accumulated error', () => { const setError = jest.fn(); const errors = validateChartForm( makeForm({ configType: 'sql', displayType: DisplayType.Table, connection: '', sqlTemplate: '', }), undefined, setError, ); // connection (required type) + sqlTemplate (required type) setError calls, // then both are also called again with 'manual' type in the final loop expect(errors).toHaveLength(2); // Each error in the array triggers setError in the final loop expect(setError).toHaveBeenCalledWith( 'connection', expect.objectContaining({ type: 'manual' }), ); expect(setError).toHaveBeenCalledWith( 'sqlTemplate', expect.objectContaining({ type: 'manual' }), ); }); }); ================================================ FILE: packages/app/src/components/ChartEditor/constants.tsx ================================================ import { ReactNode } from 'react'; import { DisplayType } from '@hyperdx/common-utils/dist/types'; import { Code, List, Text } from '@mantine/core'; const TIMESERIES_PLACEHOLDER_SQL = `SELECT toStartOfInterval(TimestampTime, INTERVAL {intervalSeconds:Int64} SECOND) AS ts, SeverityText, count() AS count FROM default.otel_logs WHERE TimestampTime >= fromUnixTimestamp64Milli({startDateMilliseconds:Int64}) AND TimestampTime < fromUnixTimestamp64Milli({endDateMilliseconds:Int64}) GROUP BY ts, SeverityText ORDER BY ts ASC;`; export const SQL_PLACEHOLDERS: Record = { [DisplayType.Line]: TIMESERIES_PLACEHOLDER_SQL, [DisplayType.StackedBar]: TIMESERIES_PLACEHOLDER_SQL, [DisplayType.Table]: `SELECT count() FROM default.otel_logs WHERE TimestampTime >= fromUnixTimestamp64Milli({startDateMilliseconds:Int64}) AND TimestampTime <= fromUnixTimestamp64Milli({endDateMilliseconds:Int64}) LIMIT 200 `, [DisplayType.Pie]: `SELECT ServiceName, count() FROM default.otel_logs WHERE TimestampTime >= fromUnixTimestamp64Milli({startDateMilliseconds:Int64}) AND TimestampTime < fromUnixTimestamp64Milli({endDateMilliseconds:Int64}) GROUP BY ServiceName;`, [DisplayType.Number]: `SELECT count() FROM default.otel_logs WHERE TimestampTime >= fromUnixTimestamp64Milli({startDateMilliseconds:Int64}) AND TimestampTime < fromUnixTimestamp64Milli({endDateMilliseconds:Int64});`, [DisplayType.Search]: '', [DisplayType.Heatmap]: '', [DisplayType.Markdown]: '', }; const TIMESERIES_INSTRUCTIONS = ( <> Result columns are plotted as follows: Timestamp {' '} — The first Date or DateTime{' '} column. Series Value {' '} — Each numeric column will be plotted as a separate series. These columns are generally aggregate function values. Group Names {' '} (optional) — Any string, map, or array type result column will be treated as a group column. Result rows with different group column values will be plotted as separate series. ); export const DISPLAY_TYPE_INSTRUCTIONS: Partial< Record > = { [DisplayType.Line]: TIMESERIES_INSTRUCTIONS, [DisplayType.StackedBar]: TIMESERIES_INSTRUCTIONS, [DisplayType.Pie]: ( <> Result columns are plotted as follows: Slice Value {' '} — The first numeric column determines each slice's size. Slice Label {' '} (optional) — Each unique value of each string, map, and array type columns will be used as a slice label. ), [DisplayType.Number]: ( <> Result columns are displayed as follows: Number {' '} — The value of the first numeric column in the first result row is displayed as the number. ), }; ================================================ FILE: packages/app/src/components/ChartEditor/types.ts ================================================ import { BuilderSavedChartConfig, RawSqlSavedChartConfig, } from '@hyperdx/common-utils/dist/types'; import { AlertWithCreatedBy } from '@/types'; export type SavedChartConfigWithSelectArray = Omit< BuilderSavedChartConfig, 'select' > & { select: NonNullable>; }; /** * A type that flattens the SavedChartConfig union so that the form can include * properties from both BuilderChartConfig and RawSqlSavedChartConfig without * type errors. * * All fields are optional since the form may be in either builder or raw SQL * mode at any given time. `configType?: 'sql'` is the discriminator. * * Additionally, 'series' is added as a separate field that is always an array, * to work around the fact that useFieldArray only works with fields which are *always* * arrays. `series` stores the array `select` data for the form. **/ export type ChartEditorFormState = Partial & Partial> & { alert?: BuilderSavedChartConfig['alert'] & { createdBy?: AlertWithCreatedBy['createdBy']; }; series: SavedChartConfigWithSelectArray['select']; configType?: 'sql' | 'builder'; }; ================================================ FILE: packages/app/src/components/ChartEditor/utils.ts ================================================ import { omit, pick } from 'lodash'; import { Path, UseFormSetError } from 'react-hook-form'; import { isBuilderSavedChartConfig, isRawSqlSavedChartConfig, } from '@hyperdx/common-utils/dist/guards'; import { BuilderSavedChartConfig, ChartConfigWithDateRange, DisplayType, isLogSource, isMetricSource, isTraceSource, RawSqlChartConfig, RawSqlSavedChartConfig, SavedChartConfig, SourceKind, TSource, } from '@hyperdx/common-utils/dist/types'; import { getStoredLanguage } from '../SearchInput'; import { ChartEditorFormState } from './types'; function normalizeChartConfig< C extends Pick< BuilderSavedChartConfig, 'select' | 'having' | 'orderBy' | 'displayType' | 'metricTables' >, >(config: C, source: TSource): C { const isMetricSource = source.kind === SourceKind.Metric; return { ...config, // Strip out metric-specific fields for non-metric sources select: !isMetricSource && Array.isArray(config.select) ? config.select.map(s => omit(s, ['metricName', 'metricType'])) : config.select, metricTables: isMetricSource ? config.metricTables : undefined, // Order By and Having can only be set by the user for table charts having: config.displayType === DisplayType.Table ? config.having : undefined, orderBy: config.displayType === DisplayType.Table ? config.orderBy : undefined, }; } export const isRawSqlDisplayType = ( displayType: DisplayType | undefined, ): displayType is | DisplayType.Table | DisplayType.Line | DisplayType.StackedBar | DisplayType.Pie | DisplayType.Number => displayType === DisplayType.Table || displayType === DisplayType.Line || displayType === DisplayType.StackedBar || displayType === DisplayType.Pie || displayType === DisplayType.Number; export function convertFormStateToSavedChartConfig( form: ChartEditorFormState, source: TSource | undefined, ): SavedChartConfig | undefined { if (form.configType === 'sql' && isRawSqlDisplayType(form.displayType)) { const rawSqlConfig: RawSqlSavedChartConfig = { configType: 'sql', ...pick(form, [ 'name', 'displayType', 'numberFormat', 'granularity', 'compareToPreviousPeriod', 'fillNulls', 'alignDateRangeToGranularity', ]), sqlTemplate: form.sqlTemplate ?? '', connection: form.connection ?? '', source: form.source || undefined, }; return rawSqlConfig; } if (source) { // Merge the series and select fields back together, and prevent the series field from being submitted const config: BuilderSavedChartConfig = { ...omit(form, ['series', 'configType', 'sqlTemplate']), // If the chart type is search, we need to ensure the select is a string select: form.displayType === DisplayType.Search ? typeof form.select === 'string' ? form.select : '' : form.series, where: form.where ?? '', source: source.id, }; return normalizeChartConfig(config, source); } } export function convertFormStateToChartConfig( form: ChartEditorFormState, dateRange: ChartConfigWithDateRange['dateRange'], source: TSource | undefined, ): ChartConfigWithDateRange | undefined { if (form.configType === 'sql' && isRawSqlDisplayType(form.displayType)) { const rawSqlConfig: RawSqlChartConfig = { configType: 'sql', ...pick(form, [ 'name', 'displayType', 'numberFormat', 'granularity', 'compareToPreviousPeriod', 'fillNulls', 'alignDateRangeToGranularity', ]), sqlTemplate: form.sqlTemplate ?? '', connection: form.connection ?? '', source: form.source || undefined, }; return { ...rawSqlConfig, dateRange }; } if (source) { // Merge the series and select fields back together, and prevent the series field from being submitted const mergedSelect = form.displayType === DisplayType.Search ? form.select : form.series; const isSelectEmpty = !mergedSelect || mergedSelect.length === 0; const newConfig: ChartConfigWithDateRange = { ...omit(form, ['series', 'configType', 'sqlTemplate']), from: source.from, timestampValueExpression: source.timestampValueExpression, dateRange, connection: source.connection, implicitColumnExpression: isLogSource(source) || isTraceSource(source) ? source.implicitColumnExpression : undefined, metricTables: isMetricSource(source) ? source.metricTables : undefined, where: form.where ?? '', select: isSelectEmpty ? ((isLogSource(source) || isTraceSource(source)) && source.defaultTableSelectExpression) || '' : mergedSelect, }; return structuredClone(normalizeChartConfig(newConfig, source)); } } export function convertSavedChartConfigToFormState( config: SavedChartConfig, ): ChartEditorFormState { return { ...config, configType: isRawSqlSavedChartConfig(config) ? 'sql' : 'builder', series: isBuilderSavedChartConfig(config) && Array.isArray(config.select) ? config.select.map(s => ({ ...s, aggConditionLanguage: s.aggConditionLanguage ?? getStoredLanguage() ?? 'lucene', })) : [], }; } export const validateChartForm = ( form: ChartEditorFormState, source: TSource | undefined, setError: UseFormSetError, ) => { const errors: { path: Path; message: string }[] = []; const isRawSqlChart = form.configType === 'sql' && isRawSqlDisplayType(form.displayType); // Validate connection is selected for raw SQL charts if (isRawSqlChart && !form.connection) { errors.push({ path: `connection`, message: 'Connection is required' }); } // Validate SQL is provided for raw SQL charts if (isRawSqlChart && !form.sqlTemplate) { errors.push({ path: `sqlTemplate`, message: 'SQL query is required' }); } // Validate source is selected for builder charts if ( !isRawSqlChart && form.displayType !== DisplayType.Markdown && !form.source ) { errors.push({ path: `source`, message: 'Source is required' }); } // Validate that valueExpressions are specified for each series if ( !isRawSqlChart && Array.isArray(form.series) && form.displayType !== DisplayType.Markdown && form.displayType !== DisplayType.Search ) { form.series.forEach((s, index) => { if (s.aggFn && s.aggFn !== 'count' && !s.valueExpression) { errors.push({ path: `series.${index}.valueExpression`, message: `Expression is required for series ${index + 1}`, }); } }); } // Validate metric names for metric sources if ( source?.kind === SourceKind.Metric && Array.isArray(form.series) && form.displayType !== DisplayType.Markdown && form.displayType !== DisplayType.Search && !isRawSqlChart ) { form.series.forEach((s, index) => { if (s.metricType && !s.metricName) { errors.push({ path: `series.${index}.metricName`, message: `Metric is required`, }); } }); } // Validate number and pie charts only have one series if ( !isRawSqlChart && Array.isArray(form.series) && (form.displayType === DisplayType.Number || form.displayType === DisplayType.Pie) && form.series.length > 1 ) { errors.push({ path: `series`, message: `Only one series is allowed for ${form.displayType} charts`, }); } for (const error of errors) { console.warn(`Validation error in field ${error.path}: ${error.message}`); setError(error.path, { type: 'manual', message: error.message, }); } return errors; }; ================================================ FILE: packages/app/src/components/ChartSQLPreview.tsx ================================================ import { useState } from 'react'; import CopyToClipboard from 'react-copy-to-clipboard'; import { sql } from '@codemirror/lang-sql'; import { format } from '@hyperdx/common-utils/dist/sqlFormatter'; import { ChartConfigWithOptDateRange } from '@hyperdx/common-utils/dist/types'; import { Button, Paper, Text } from '@mantine/core'; import { IconCheck, IconCopy } from '@tabler/icons-react'; import CodeMirror, { EditorView } from '@uiw/react-codemirror'; import { useRenderedSqlChartConfig } from '@/hooks/useChartConfig'; function tryFormat(data?: string) { try { if (data != null) { return format(data); } return data; } catch { return data; } } function CopyButton({ text = '', size = 'md', }: { text?: string; size?: 'xs' | 'md'; }) { const [copied, setCopied] = useState(false); const iconSize = size === 'xs' ? 14 : 16; const buttonSize = size === 'xs' ? 'compact-xs' : 'sm'; return ( setCopied(true)}> ); } export function SQLPreview({ data, formatData = true, enableCopy = false, copyButtonSize = 'md', enableLineWrapping = false, }: { data?: string; formatData?: boolean; enableCopy?: boolean; copyButtonSize?: 'xs' | 'md'; enableLineWrapping?: boolean; }) { const displayed = formatData ? tryFormat(data) : data; return (
{enableCopy && }
); } // TODO: Support clicking in to view matched events export default function ChartSQLPreview({ config, enableCopy, }: { config: ChartConfigWithOptDateRange; enableCopy?: boolean; }) { const { data, error, isLoading } = useRenderedSqlChartConfig(config); return ( {isLoading ? ( Loading query preview... ) : error ? ( Unable to format query. {error.message} ) : ( )} ); } ================================================ FILE: packages/app/src/components/ColorSwatchInput.stories.tsx ================================================ import React from 'react'; import type { Meta, StoryObj } from '@storybook/nextjs'; import { ColorSwatchInput } from './ColorSwatchInput'; const meta = { component: ColorSwatchInput, } satisfies Meta; export default meta; type Story = StoryObj; export const Default = () => { const [color, setColor] = React.useState('#6610f2'); return setColor(value)} />; }; ================================================ FILE: packages/app/src/components/ColorSwatchInput.tsx ================================================ import React from 'react'; import { ActionIcon, Button, ColorInput, ColorSwatch, Group, Popover, SimpleGrid, Text, } from '@mantine/core'; // Different from auto colors, TBD const COLOR_PRESETS = [ '#e60049', '#0bb4ff', '#50e991', '#e6d800', '#9b19f5', '#ffa300', '#dc0ab4', '#b3d4ff', '#00bfa0', ]; const Z_INDEX = 9999; export const ColorSwatchInput = ({ value, onChange, }: { value?: string; onChange?: (value?: string) => void; }) => { const [opened, setOpened] = React.useState(false); const handleChange = (color?: string) => { onChange?.(color); setOpened(false); }; return ( onChange?.(color)} placeholder="#000000" radius="md" variant="filled" w="130" onBlur={() => setOpened(false)} popoverProps={{ zIndex: Z_INDEX + 1, closeOnClickOutside: false, }} /> {COLOR_PRESETS.map(color => ( handleChange(color)} > ))} {value && ( )} ); }; ================================================ FILE: packages/app/src/components/ConfirmDeleteMenu.tsx ================================================ import { Button, Menu } from '@mantine/core'; import { IconTrash } from '@tabler/icons-react'; export default function ConfirmDeleteMenu({ onDelete, }: { onDelete: () => void; }) { return ( } onClick={onDelete}> Confirm Delete ); } ================================================ FILE: packages/app/src/components/ConnectionForm.tsx ================================================ import { useCallback, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { testLocalConnection } from '@hyperdx/common-utils/dist/clickhouse/browser'; import { Connection } from '@hyperdx/common-utils/dist/types'; import { Anchor, Box, Button, Flex, Group, Stack, Text, Tooltip, } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { IconHelpCircle, IconSettings } from '@tabler/icons-react'; import api from '@/api'; import { InputControlled, PasswordInputControlled, } from '@/components/InputControlled'; import { IS_CLICKHOUSE_BUILD, IS_LOCAL_MODE } from '@/config'; import { useCreateConnection, useDeleteConnection, useUpdateConnection, } from '@/connection'; import { stripTrailingSlash } from '@/utils'; import ConfirmDeleteMenu from './ConfirmDeleteMenu'; enum TestConnectionState { Loading = 'loading', Valid = 'valid', Invalid = 'invalid', } function useTestConnection({ getValues, }: { getValues: (name: string) => string; }) { const testConnection = api.useTestConnection(); const [testConnectionState, setTestConnectionState] = useState(null); const handleTestConnection = useCallback(async () => { const hostValue = getValues('host'); const username = getValues('username'); const password = getValues('password'); const host = stripTrailingSlash(hostValue); if (testConnectionState) { return; } setTestConnectionState(TestConnectionState.Loading); if (IS_LOCAL_MODE) { try { const result = await testLocalConnection({ host, username, password }); if (result) { setTestConnectionState(TestConnectionState.Valid); } else { setTestConnectionState(TestConnectionState.Invalid); notifications.show({ color: 'red', message: 'Connection test failed', autoClose: 5000, }); } } catch (e) { console.error(e); setTestConnectionState(TestConnectionState.Invalid); notifications.show({ color: 'red', message: e.message, autoClose: 5000, }); } } else { try { const result = await testConnection.mutateAsync({ host, username, password, }); if (result.success) { setTestConnectionState(TestConnectionState.Valid); } else { setTestConnectionState(TestConnectionState.Invalid); notifications.show({ color: 'red', message: result.error || 'Connection test failed', autoClose: 5000, }); } } catch (error: any) { const body = await error.response?.json(); setTestConnectionState(TestConnectionState.Invalid); notifications.show({ color: 'red', message: body?.error ?? 'Failed to test connection', autoClose: 5000, }); } } setTimeout(() => { setTestConnectionState(null); }, 2000); }, [getValues, testConnection, testConnectionState]); return { testConnectionState, handleTestConnection, }; } export function ConnectionForm({ connection, isNew, onSave, onClose, showCancelButton = false, showDeleteButton = false, }: { connection: Connection; isNew: boolean; onSave?: () => void; onClose?: () => void; showCancelButton?: boolean; showDeleteButton?: boolean; }) { const { control, handleSubmit, resetField, getValues, formState } = useForm({ defaultValues: { id: connection.id, name: connection.name, host: connection.host, username: connection.username, password: connection.password, hyperdxSettingPrefix: connection.hyperdxSettingPrefix, }, }); const createConnection = useCreateConnection(); const updateConnection = useUpdateConnection(); const deleteConnection = useDeleteConnection(); const onSubmit = (data: Connection) => { // Make sure we don't save a trailing slash in the host // Convert empty hyperdxSettingPrefix to null to signal clearing the field // (undefined gets stripped from JSON, null is preserved and handled by API) const normalizedData = { ...data, host: stripTrailingSlash(data.host), hyperdxSettingPrefix: data.hyperdxSettingPrefix || null, }; if (isNew) { const { id, ...connection } = normalizedData; createConnection.mutate( { connection }, { onSuccess: () => { notifications.show({ color: 'green', message: 'Connection created successfully', }); onSave?.(); }, onError: () => { notifications.show({ color: 'red', message: 'Error creating connection, please check the host and credentials and try again.', autoClose: 5000, }); }, }, ); } else { updateConnection.mutate( { connection: normalizedData, id: connection.id }, { onSuccess: () => { notifications.show({ color: 'green', message: 'Connection updated successfully', }); onSave?.(); }, onError: () => { notifications.show({ color: 'red', message: 'Error updating connection, please check the host and credentials and try again.', autoClose: 5000, }); }, }, ); } }; const [showUpdatePassword, setShowUpdatePassword] = useState(false); const [showAdvancedSettings, setShowAdvancedSettings] = useState(false); const { testConnectionState, handleTestConnection } = useTestConnection({ getValues, }); return (
{ e.preventDefault(); handleSubmit(d => { onSubmit(d); })(); }} > Connection Name Host Username Password {!showUpdatePassword && !isNew && ( )} {(showUpdatePassword || isNew) && ( {!isNew && ( )} )} {!showAdvancedSettings && ( setShowAdvancedSettings(true)} size="xs" > Advanced Settings )} {showAdvancedSettings && ( )} Query Log Setting Prefix {onClose && showCancelButton && ( )} {!isNew && showDeleteButton !== false && ( deleteConnection.mutate( { id: connection.id }, { onSuccess: () => { onClose?.(); }, }, ) } /> )}
); } ================================================ FILE: packages/app/src/components/ConnectionSelect.tsx ================================================ import { useMemo } from 'react'; import { UseControllerProps } from 'react-hook-form'; import { IconServer } from '@tabler/icons-react'; import SelectControlled from '@/components/SelectControlled'; import { useConnections } from '@/connection'; export function ConnectionSelectControlled({ size, ...props }: { size?: string } & UseControllerProps) { const { data } = useConnections(); const values = useMemo( () => data?.map(d => ({ value: d.id, label: d.name, })), [data], ); return ( } maxDropdownHeight={280} size={size} /> ); } ================================================ FILE: packages/app/src/components/ContactSupportText.tsx ================================================ import { IS_OSS } from '@/config'; const GH_LINK = 'https://github.com/hyperdxio/hyperdx/issues'; export const ContactSupportText = () => { if (IS_OSS) { return ( Please open an issue on{' '} GitHub . ); } return Please contact support.; }; ================================================ FILE: packages/app/src/components/ContextSidePanel.tsx ================================================ import { useCallback, useContext, useMemo, useState } from 'react'; import { sq } from 'date-fns/locale'; import ms from 'ms'; import { useQueryState } from 'nuqs'; import { useForm, useWatch } from 'react-hook-form'; import { tcFromSource } from '@hyperdx/common-utils/dist/core/metadata'; import { BuilderChartConfigWithDateRange, isLogSource, isTraceSource, TSource, } from '@hyperdx/common-utils/dist/types'; import { Badge, Flex, Group, SegmentedControl } from '@mantine/core'; import { useDebouncedValue } from '@mantine/hooks'; import SearchWhereInput, { getStoredLanguage, } from '@/components/SearchInput/SearchWhereInput'; import { RowWhereResult, WithClause } from '@/hooks/useRowWhere'; import { useSource } from '@/source'; import { formatAttributeClause } from '@/utils'; import { parseAsStringEncoded } from '@/utils/queryParsers'; import { ROW_DATA_ALIASES } from './DBRowDataPanel'; import DBRowSidePanel, { RowSidePanelContext } from './DBRowSidePanel'; import { BreadcrumbNavigationCallback, BreadcrumbPath, } from './DBRowSidePanelHeader'; import { DBSqlRowTable } from './DBRowTable'; enum ContextBy { All = 'all', Custom = 'custom', Host = 'host', Node = 'k8s.node.name', Pod = 'k8s.pod.name', Service = 'service', } interface ContextSubpanelProps { source: TSource; dbSqlRowTableConfig: BuilderChartConfigWithDateRange | undefined; rowData: Record; rowId: string | undefined; breadcrumbPath?: BreadcrumbPath; onBreadcrumbClick?: BreadcrumbNavigationCallback; } // Custom hook to manage nested panel state export function useNestedPanelState(isNested?: boolean) { // Query state (URL-based) for root level const queryState = { contextRowId: useQueryState('contextRowId', parseAsStringEncoded), // Source IDs are MongoDB ObjectIDs (hex strings) and contain no special // characters, so no encoding is needed here. contextRowSource: useQueryState('contextRowSource'), }; // Local state for nested levels const localState = { contextRowId: useState(null), contextRowSource: useState(null), }; // Choose which state to use based on nesting level const activeState = isNested ? localState : queryState; return { contextRowId: activeState.contextRowId[0], contextRowSource: activeState.contextRowSource[0], setContextRowId: activeState.contextRowId[1], setContextRowSource: activeState.contextRowSource[1], }; } export default function ContextSubpanel({ source, dbSqlRowTableConfig, rowData, rowId, breadcrumbPath = [], onBreadcrumbClick, }: ContextSubpanelProps) { const QUERY_KEY_PREFIX = 'context'; const origTimestamp = rowData[ROW_DATA_ALIASES.TIMESTAMP]; const { whereLanguage: originalLanguage = 'lucene' } = dbSqlRowTableConfig ?? {}; const [range, setRange] = useState(ms('30s')); const [contextBy, setContextBy] = useState(ContextBy.All); const { control } = useForm({ defaultValues: { where: '', whereLanguage: originalLanguage ?? getStoredLanguage() ?? ('lucene' as 'lucene' | 'sql'), }, }); const formWhere = useWatch({ control, name: 'where' }); const [debouncedWhere] = useDebouncedValue(formWhere, 1000); // State management for nested panels const isNested = breadcrumbPath.length > 0; const { contextRowId, contextRowSource, setContextRowId, setContextRowSource, } = useNestedPanelState(isNested); const { data: contextRowSidePanelSource } = useSource({ id: contextRowSource || '', }); const [contextAliasWith, setContextAliasWith] = useState([]); const handleContextSidePanelClose = useCallback(() => { setContextRowId(null); setContextRowSource(null); }, [setContextRowId, setContextRowSource]); const { setChildModalOpen } = useContext(RowSidePanelContext); const handleRowExpandClick = useCallback( (rowWhere: RowWhereResult) => { setContextRowId(rowWhere.where); setContextAliasWith(rowWhere.aliasWith); setContextRowSource(source.id); }, [source.id, setContextRowId, setContextRowSource], ); const date = useMemo(() => new Date(origTimestamp), [origTimestamp]); const newDateRange = useMemo( (): [Date, Date] => [ new Date(date.getTime() - range / 2), new Date(date.getTime() + range / 2), ], [date, range], ); /* Functions to help generate WHERE clause based on which Context the user chooses (All, Host, Node, etc...). Since we support lucene and sql, we need to format the condition based on the language */ const { 'k8s.node.name': k8sNodeName, 'k8s.pod.name': k8sPodName, 'host.name': host, 'service.name': service, } = rowData[ROW_DATA_ALIASES.RESOURCE_ATTRIBUTES] ?? {}; const CONTEXT_MAPPING = useMemo( () => ({ [ContextBy.All]: { field: '', value: '', }, [ContextBy.Custom]: { field: '', value: debouncedWhere || '', }, [ContextBy.Service]: { field: 'service.name', value: service, }, [ContextBy.Host]: { field: 'host.name', value: host, }, [ContextBy.Pod]: { field: 'k8s.pod.name', value: k8sPodName, }, [ContextBy.Node]: { field: 'k8s.node.name', value: k8sNodeName, }, }) as const, [k8sNodeName, k8sPodName, host, service, debouncedWhere], ); // Main function to generate WHERE clause based on context const getWhereClause = useCallback( (contextBy: ContextBy): string => { const isSql = originalLanguage === 'sql'; const mapping = CONTEXT_MAPPING[contextBy]; if (contextBy === ContextBy.All) { return mapping.value; } if (contextBy === ContextBy.Custom) { return mapping.value.trim(); } const attributeClause = formatAttributeClause( 'ResourceAttributes', mapping.field, mapping.value, isSql, ); return attributeClause; }, [CONTEXT_MAPPING, originalLanguage], ); function generateSegmentedControlData() { return [ { label: 'All', value: ContextBy.All }, ...(service ? [{ label: 'Service', value: ContextBy.Service }] : []), ...(host ? [{ label: 'Host', value: ContextBy.Host }] : []), ...(k8sPodName ? [{ label: 'Pod', value: ContextBy.Pod }] : []), ...(k8sNodeName ? [{ label: 'Node', value: ContextBy.Node }] : []), { label: 'Custom', value: ContextBy.Custom }, ]; } const config = useMemo(() => { const whereClause = getWhereClause(contextBy); // missing query info, build config from source with default value if (!dbSqlRowTableConfig) return { connection: source.connection, from: source.from, timestampValueExpression: source.timestampValueExpression, select: ((isLogSource(source) || isTraceSource(source)) && source.defaultTableSelectExpression) || '', limit: { limit: 200 }, orderBy: `${source.timestampValueExpression} DESC`, where: whereClause, whereLanguage: originalLanguage, dateRange: newDateRange, }; return { ...dbSqlRowTableConfig, where: whereClause, whereLanguage: originalLanguage, dateRange: newDateRange, filters: [], }; }, [ dbSqlRowTableConfig, getWhereClause, originalLanguage, newDateRange, contextBy, source, ]); return ( <> {config && ( setContextBy(v as ContextBy)} /> {contextBy === ContextBy.Custom && ( )} setRange(Number(value))} />
{contextBy !== ContextBy.All && ( {contextBy}:{CONTEXT_MAPPING[contextBy].value} )} Time range: ±{ms(range / 2)}
)} {contextRowId && contextRowSidePanelSource && ( )} ); } ================================================ FILE: packages/app/src/components/CsvExportButton.tsx ================================================ import React, { useCallback } from 'react'; import Papa from 'papaparse'; interface CsvExportButtonProps { data: Record[]; filename: string | (() => string); children: React.ReactNode; className?: string; title?: string; disabled?: boolean; onExportStart?: () => void; onExportComplete?: () => void; onExportError?: (error: Error) => void; } export const CsvExportButton: React.FC = ({ data, filename, children, className, title, disabled = false, onExportStart, onExportComplete, onExportError, }) => { const handleClick = useCallback(() => { try { if (data.length === 0) { onExportError?.(new Error('No data to export')); return; } onExportStart?.(); const csv = Papa.unparse(data, { quotes: true, quoteChar: '"', escapeChar: '"', delimiter: ',', header: true, }); const blob = new Blob([`\ufeff${csv}`], { type: 'text/csv;charset=utf-8;', }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = typeof filename === 'string' ? `${filename}.csv` : `${filename()}.csv`; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url); onExportComplete?.(); } catch (error) { onExportError?.( error instanceof Error ? error : new Error('Export failed'), ); } }, [data, filename, onExportStart, onExportComplete, onExportError]); if (disabled || data.length === 0) { return (
{children}
); } return ( ); }; ================================================ FILE: packages/app/src/components/DBDeltaChart.tsx ================================================ import { useCallback, useEffect, useMemo, useState } from 'react'; import { ClickHouseQueryError } from '@hyperdx/common-utils/dist/clickhouse'; import { BuilderChartConfigWithDateRange, Filter, } from '@hyperdx/common-utils/dist/types'; import { Box, Code, Container, Divider, Flex, Pagination, Text, } from '@mantine/core'; import { useElementSize } from '@mantine/hooks'; import { isAggregateFunction } from '@/ChartUtils'; import { useQueriedChartConfig } from '@/hooks/useChartConfig'; import { getFirstTimestampValueExpression } from '@/source'; import { getChartColorError, getChartColorSuccess } from '@/utils'; import { SQLPreview } from './ChartSQLPreview'; import type { AddFilterFn } from './deltaChartUtils'; import { ALL_SPANS_COLOR, computeComparisonScore, flattenedKeyToFilterKey, getPropertyStatistics, getStableSampleExpression, isDenylisted, isHighCardinality, SAMPLE_SIZE, semanticBoost, } from './deltaChartUtils'; import { CHART_GAP, CHART_HEIGHT, CHART_WIDTH, PAGINATION_HEIGHT, PropertyComparisonChart, } from './PropertyComparisonChart'; // Re-export types so callers importing from DBDeltaChart don't need to change. export type { AddFilterFn } from './deltaChartUtils'; export default function DBDeltaChart({ config, valueExpr, xMin: rawXMin, xMax: rawXMax, yMin: rawYMin, yMax: rawYMax, onAddFilter, spanIdExpression, legendPrefix, }: { config: BuilderChartConfigWithDateRange; valueExpr: string; xMin?: number | null; xMax?: number | null; yMin?: number | null; yMax?: number | null; onAddFilter?: AddFilterFn; spanIdExpression?: string; legendPrefix?: React.ReactNode; }) { // Derive whether a heatmap selection exists from nullable props const hasSelection = rawXMin != null && rawXMax != null && rawYMin != null && rawYMax != null; // Safe numeric defaults so query builders always get valid values // (outlier/inlier queries are gated by enabled:hasSelection) const xMin = rawXMin ?? 0; const xMax = rawXMax ?? 0; const yMin = rawYMin ?? 0; const yMax = rawYMax ?? 0; // Determine if the value expression uses aggregate functions const isAggregate = isAggregateFunction(valueExpr); // Build deterministic ORDER BY expression from source's spanIdExpression const stableSampleExpr = getStableSampleExpression(spanIdExpression); // Get the timestamp expression from config const timestampExpr = getFirstTimestampValueExpression( config.timestampValueExpression, ); // Helper to build the shared AggregatedTimestamps CTE (used by both outlier and inlier queries) const buildAggregatedTimestampsCTE = () => isAggregate ? { name: 'AggregatedTimestamps', chartConfig: { ...config, from: config.from, select: timestampExpr, filters: [ ...(config.filters ?? []), { type: 'sql', condition: `${timestampExpr} >= ${xMin}`, } satisfies Filter, { type: 'sql', condition: `${timestampExpr} <= ${xMax}`, } satisfies Filter, ...(config.where ? [ { type: config.whereLanguage, condition: config.where, } as Filter, ] : []), ], groupBy: timestampExpr, having: `(${valueExpr}) >= ${yMin} AND (${valueExpr}) <= ${yMax}`, }, } : null; // Helper to build WITH clauses for a query (outlier or inlier) const buildWithClauses = ( isOutlier: boolean, ): NonNullable => { const aggregatedTimestampsCTE = buildAggregatedTimestampsCTE(); // Build the SQL condition for filtering const buildSqlCondition = () => { const timestampExpression = `${timestampExpr} >= ${xMin} AND ${timestampExpr} <= ${xMax}`; let query = timestampExpression; if (!isAggregate) { // For non-aggregates, we filter directly on both timestamp and value query += ` AND (${valueExpr}) >= ${yMin} AND (${valueExpr}) <= ${yMax}`; } return isOutlier ? query : `NOT (${query})`; }; const sqlCondition = buildSqlCondition(); const aggregateTimestampCondition = isOutlier ? `${timestampExpr} IN (SELECT ${timestampExpr} FROM AggregatedTimestamps)` : `${timestampExpr} NOT IN (SELECT ${timestampExpr} FROM AggregatedTimestamps)`; return [ ...(aggregatedTimestampsCTE ? [aggregatedTimestampsCTE] : []), { name: 'PartIds', chartConfig: { ...config, select: 'tuple(_part, _part_offset)', filters: [ ...(config.filters ?? []), { type: 'sql', condition: sqlCondition, } satisfies Filter, ...(isAggregate ? [ { type: 'sql', condition: aggregateTimestampCondition, } satisfies Filter, ] : []), ], orderBy: [{ ordering: 'DESC', valueExpression: stableSampleExpr }], limit: { limit: SAMPLE_SIZE }, }, }, ]; }; // Helper to build filters for the main query const buildFilters = (isOutlier: boolean) => { // Build the SQL condition for filtering const buildSqlCondition = () => { if (isAggregate) { // For aggregates, we filter by timestamp range return isOutlier ? `${timestampExpr} >= ${xMin} AND ${timestampExpr} <= ${xMax}` : `NOT (${timestampExpr} >= ${xMin} AND ${timestampExpr} <= ${xMax})`; } else { // For non-aggregates, we filter directly on both timestamp and value return isOutlier ? `(${valueExpr}) >= ${yMin} AND (${valueExpr}) <= ${yMax} AND ${timestampExpr} >= ${xMin} AND ${timestampExpr} <= ${xMax}` : `NOT ((${valueExpr}) >= ${yMin} AND (${valueExpr}) <= ${yMax} AND ${timestampExpr} >= ${xMin} AND ${timestampExpr} <= ${xMax})`; } }; const sqlCondition = buildSqlCondition(); const aggregateTimestampCondition = isOutlier ? `${timestampExpr} IN (SELECT ${timestampExpr} FROM AggregatedTimestamps)` : `${timestampExpr} NOT IN (SELECT ${timestampExpr} FROM AggregatedTimestamps)`; return [ ...(config.filters ?? []), { type: 'sql', condition: sqlCondition, } as { type: 'sql'; condition: string }, ...(isAggregate ? [ { type: 'sql', condition: aggregateTimestampCondition, } as { type: 'sql'; condition: string }, ] : []), { type: 'sql', condition: `indexHint((_part, _part_offset) IN PartIds)`, } as { type: 'sql'; condition: string }, ]; }; const { data: outlierData, error: outlierError, isLoading: isOutlierLoading, } = useQueriedChartConfig( { ...config, with: buildWithClauses(true), select: '*', filters: buildFilters(true), orderBy: [{ ordering: 'DESC', valueExpression: stableSampleExpr }], limit: { limit: SAMPLE_SIZE }, }, { enabled: hasSelection }, ); const { data: inlierData, isLoading: isInlierLoading } = useQueriedChartConfig( { ...config, with: buildWithClauses(false), select: '*', filters: buildFilters(false), orderBy: [{ ordering: 'DESC', valueExpression: stableSampleExpr }], limit: { limit: SAMPLE_SIZE }, }, { enabled: hasSelection }, ); // When no selection exists, fetch all spans without any range filter const { data: allSpansData, error: allSpansError, isLoading: isAllSpansLoading, } = useQueriedChartConfig( { ...config, select: '*', orderBy: [{ ordering: 'DESC', valueExpression: stableSampleExpr }], limit: { limit: SAMPLE_SIZE }, }, { enabled: !hasSelection }, ); const isLoading = hasSelection ? isOutlierLoading || isInlierLoading : isAllSpansLoading; const error = outlierError ?? allSpansError; // Column metadata for field classification (from ClickHouse response) const columnMeta = useMemo<{ name: string; type: string }[]>( () => outlierData?.meta ?? inlierData?.meta ?? allSpansData?.meta ?? [], [outlierData?.meta, inlierData?.meta, allSpansData?.meta], ); // Wrap onAddFilter to convert flattened dot-notation keys into ClickHouse bracket notation const handleAddFilter = useCallback>( (property, value, action) => { if (!onAddFilter) return; onAddFilter(flattenedKeyToFilterKey(property, columnMeta), value, action); }, [onAddFilter, columnMeta], ); const { visibleProperties, hiddenProperties, outlierValueOccurences, inlierValueOccurences, } = useMemo(() => { // When no selection: use allSpans as "outlier" data and empty for inliers. // The sort will rank by frequency (delta = count - 0 = count). const actualOutlierData = hasSelection ? (outlierData?.data ?? []) : (allSpansData?.data ?? []); const actualInlierData = hasSelection ? (inlierData?.data ?? []) : []; const { percentageOccurences: outlierValueOccurences, propertyOccurences: outlierPropertyOccurences, valueOccurences: outlierRawValueOccurences, } = getPropertyStatistics(actualOutlierData); const { percentageOccurences: inlierValueOccurences, propertyOccurences: inlierPropertyOccurences, valueOccurences: inlierRawValueOccurences, } = getPropertyStatistics(actualInlierData); // Get all the unique keys from the outliers let uniqueKeys = new Set([...outlierValueOccurences.keys()]); // If there's no outliers, use inliers as the unique keys if (uniqueKeys.size === 0) { uniqueKeys = new Set([...inlierValueOccurences.keys()]); } // Sort by proportional comparison score (normalizes group sizes). // TODO: When #1824 (always-on distribution) merges, use computeEntropyScore // for distribution mode (no selection) and computeComparisonScore only when // a selection is active (hasSelection flag from #1824). const sortedProperties = Array.from(uniqueKeys) .map(key => { const inlierCount = inlierValueOccurences.get(key) ?? new Map(); const outlierCount = outlierValueOccurences.get(key) ?? new Map(); // Use proportional comparison scoring which normalizes group sizes. // Semantic boost acts as a tiebreaker for well-known OTel attributes // (only applied when the field has actual variance). const baseScore = computeComparisonScore(outlierCount, inlierCount); const boost = baseScore > 0 ? semanticBoost(key) * 0.1 : 0; const sortScore = baseScore + boost; return [key, sortScore] as const; }) .sort((a, b) => b[1] - a[1]) .map(a => a[0]); // Split into visible (primary) and hidden (denylisted + high cardinality) const visibleProperties: string[] = []; const hiddenProperties: string[] = []; sortedProperties.forEach(key => { if (isDenylisted(key, columnMeta)) { hiddenProperties.push(key); } else if ( isHighCardinality( key, outlierRawValueOccurences, inlierRawValueOccurences, outlierPropertyOccurences, inlierPropertyOccurences, ) ) { hiddenProperties.push(key); } else { visibleProperties.push(key); } }); return { visibleProperties, hiddenProperties, outlierValueOccurences, inlierValueOccurences, }; }, [ outlierData?.data, inlierData?.data, allSpansData?.data, hasSelection, columnMeta, ]); const [activePage, setPage] = useState(1); const { ref: containerRef, width: containerWidth, height: containerHeight, } = useElementSize(); const columns = Math.max( 1, Math.floor((containerWidth + CHART_GAP) / (CHART_WIDTH + CHART_GAP)), ); // The "Lower-priority fields" divider (~30px) may appear between visible // and hidden sections on the same page. Reserve space for it so the last // chart row + pagination aren't pushed out of the overflow:hidden container. const hasDivider = visibleProperties.length > 0 && hiddenProperties.length > 0; const dividerHeight = hasDivider ? 30 : 0; const rows = Math.max( 1, Math.floor( (containerHeight - PAGINATION_HEIGHT - dividerHeight + CHART_GAP) / (CHART_HEIGHT + CHART_GAP), ), ); useEffect(() => { setPage(1); }, [columns, rows, xMin, xMax, yMin, yMax]); if (error) { return ( Error Message: {error.message} {error instanceof ClickHouseQueryError && ( Original Query: )} ); } // Row-based pagination: visible and hidden sections are separate grids, // so an incomplete last row of visible fields does not get "filled" with hidden items. const visibleRows = Math.ceil(visibleProperties.length / columns); const hiddenRows = Math.ceil(hiddenProperties.length / columns); const totalRows = visibleRows + hiddenRows; const totalPages = Math.ceil(totalRows / rows); const pageRowStart = (activePage - 1) * rows; const pageRowEnd = activePage * rows; // Rows occupied by the visible section on this page const visRowStart = Math.min(pageRowStart, visibleRows); const visRowEnd = Math.min(pageRowEnd, visibleRows); const visibleOnPage = visibleProperties.slice( visRowStart * columns, Math.min(visRowEnd * columns, visibleProperties.length), ); // Rows occupied by the hidden section on this page const hidRowStart = Math.max(0, pageRowStart - visibleRows); const hidRowEnd = Math.min(hiddenRows, Math.max(0, pageRowEnd - visibleRows)); const hiddenOnPage = hiddenProperties.slice( hidRowStart * columns, Math.min(hidRowEnd * columns, hiddenProperties.length), ); // Show a divider when both sections appear on the same page const showDivider = visibleOnPage.length > 0 && hiddenOnPage.length > 0; // Show a header when ONLY hidden fields appear on this page (no divider above) const showHiddenHeader = hiddenOnPage.length > 0 && visibleOnPage.length === 0; return ( {/* Legend */} {legendPrefix} {legendPrefix && ( )} {hasSelection ? ( <> Selection Background ) : ( <> All spans {isLoading ? 'Loading\u2026' : 'Select an area on the chart above to enable comparisons'} )} {/* Loading state */} {isLoading && visibleOnPage.length === 0 && hiddenOnPage.length === 0 && ( Loading attribute distributions\u2026 )} {/* Primary fields */} {visibleOnPage.length > 0 && (
{visibleOnPage.map(property => ( ))}
)} {/* Divider between primary and lower-priority fields */} {(showDivider || showHiddenHeader) && ( Lower-priority fields ({hiddenProperties.length}) } labelPosition="left" /> )} {/* Lower-priority fields - separate grid so rows align independently */} {hiddenOnPage.length > 0 && (
{hiddenOnPage.map(key => ( ))}
)} 1 ? 'visible' : 'hidden', }} >
); } ================================================ FILE: packages/app/src/components/DBEditTimeChartForm.tsx ================================================ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Control, Controller, FieldErrors, Path, useFieldArray, useForm, UseFormClearErrors, UseFormSetValue, useWatch, } from 'react-hook-form'; import { NativeSelect, NumberInput } from 'react-hook-form-mantine'; import z from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { tcFromSource } from '@hyperdx/common-utils/dist/core/metadata'; import { isBuilderChartConfig, isRawSqlChartConfig, isRawSqlSavedChartConfig, } from '@hyperdx/common-utils/dist/guards'; import { ChartAlertBaseSchema, ChartConfigWithDateRange, ChartConfigWithOptTimestamp, DateRange, DisplayType, Filter, MetricsDataType, SavedChartConfig, SelectList, SourceKind, TSource, validateAlertScheduleOffsetMinutes, } from '@hyperdx/common-utils/dist/types'; import { Accordion, ActionIcon, Box, Button, Center, Divider, Flex, Group, List, Menu, Paper, SegmentedControl, Stack, Switch, Tabs, Text, Textarea, } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { notifications } from '@mantine/notifications'; import { IconArrowDown, IconArrowUp, IconBell, IconChartLine, IconChartPie, IconCirclePlus, IconCode, IconDotsVertical, IconLayoutGrid, IconList, IconMarkdown, IconNumbers, IconPlayerPlay, IconTable, IconTrash, IconX, } from '@tabler/icons-react'; import { SortingState } from '@tanstack/react-table'; import { AGG_FNS, buildTableRowSearchUrl, convertToNumberChartConfig, convertToPieChartConfig, convertToTableChartConfig, convertToTimeChartConfig, getPreviousDateRange, } from '@/ChartUtils'; import { AlertChannelForm, getAlertReferenceLines } from '@/components/Alerts'; import ChartSQLPreview from '@/components/ChartSQLPreview'; import DBTableChart from '@/components/DBTableChart'; import { DBTimeChart } from '@/components/DBTimeChart'; import SearchWhereInput, { getStoredLanguage, } from '@/components/SearchInput/SearchWhereInput'; import { SQLInlineEditorControlled } from '@/components/SQLEditor/SQLInlineEditor'; import { TimePicker } from '@/components/TimePicker'; import { IS_LOCAL_MODE } from '@/config'; import { GranularityPickerControlled } from '@/GranularityPicker'; import { useFetchMetricMetadata } from '@/hooks/useFetchMetricMetadata'; import { parseAttributeKeysFromSuggestions, useFetchMetricResourceAttrs, } from '@/hooks/useFetchMetricResourceAttrs'; import { getFirstTimestampValueExpression, useSource } from '@/source'; import { getMetricTableName, optionsToSelectData, orderByStringToSortingState, sortingStateToOrderByString, } from '@/utils'; import { ALERT_CHANNEL_OPTIONS, DEFAULT_TILE_ALERT, extendDateRangeToInterval, intervalToGranularity, intervalToMinutes, normalizeNoOpAlertScheduleFields, TILE_ALERT_INTERVAL_OPTIONS, TILE_ALERT_THRESHOLD_TYPE_OPTIONS, } from '@/utils/alerts'; import HDXMarkdownChart from '../HDXMarkdownChart'; import RawSqlChartEditor from './ChartEditor/RawSqlChartEditor'; import { ChartEditorFormState, SavedChartConfigWithSelectArray, } from './ChartEditor/types'; import { convertFormStateToChartConfig, convertFormStateToSavedChartConfig, convertSavedChartConfigToFormState, isRawSqlDisplayType, validateChartForm, } from './ChartEditor/utils'; import { ErrorBoundary } from './Error/ErrorBoundary'; import MVOptimizationIndicator from './MaterializedViews/MVOptimizationIndicator'; import { AggFnSelectControlled } from './AggFnSelect'; import { AlertScheduleFields } from './AlertScheduleFields'; import ChartDisplaySettingsDrawer, { ChartConfigDisplaySettings, } from './ChartDisplaySettingsDrawer'; import DBNumberChart from './DBNumberChart'; import { DBPieChart } from './DBPieChart'; import DBSqlRowTableWithSideBar from './DBSqlRowTableWithSidebar'; import { CheckBoxControlled, InputControlled, TextInputControlled, } from './InputControlled'; import { MetricAttributeHelperPanel } from './MetricAttributeHelperPanel'; import { MetricNameSelect } from './MetricNameSelect'; import SaveToDashboardModal from './SaveToDashboardModal'; import SourceSchemaPreview from './SourceSchemaPreview'; import { SourceSelectControlled } from './SourceSelect'; const isQueryReady = (queriedConfig: ChartConfigWithDateRange | undefined) => { if (!queriedConfig) return false; if (isRawSqlChartConfig(queriedConfig)) { return !!(queriedConfig.sqlTemplate && queriedConfig.connection); } return ( ((queriedConfig.select?.length ?? 0) > 0 || typeof queriedConfig.select === 'string') && queriedConfig.from?.databaseName && // tableName is empty for metric sources (queriedConfig.from?.tableName || queriedConfig.metricTables) && queriedConfig.timestampValueExpression ); }; type SeriesItem = NonNullable< SavedChartConfigWithSelectArray['select'] >[number]; function ChartSeriesEditorComponent({ control, databaseName, dateRange, connectionId, index, namePrefix, onRemoveSeries, onSwapSeries, onSubmit, setValue, showGroupBy, showHaving, tableName: _tableName, parentRef, length, tableSource, errors, clearErrors, }: { control: Control; databaseName: string; dateRange?: DateRange['dateRange']; connectionId?: string; index: number; namePrefix: `series.${number}.`; parentRef?: HTMLElement | null; onRemoveSeries: (index: number) => void; onSwapSeries: (from: number, to: number) => void; onSubmit: () => void; setValue: UseFormSetValue; showGroupBy: boolean; showHaving: boolean; tableName: string; length: number; tableSource?: TSource; errors?: FieldErrors; clearErrors: UseFormClearErrors; }) { const aggFn = useWatch({ control, name: `${namePrefix}aggFn` }); const aggConditionLanguage = useWatch({ control, name: `${namePrefix}aggConditionLanguage`, defaultValue: 'lucene', }); const metricType = useWatch({ control, name: `${namePrefix}metricType` }); // Initialize metricType to 'gauge' when switching to a metric source useEffect(() => { if (tableSource?.kind === SourceKind.Metric && !metricType) { setValue(`${namePrefix}metricType`, MetricsDataType.Gauge); } }, [tableSource?.kind, metricType, namePrefix, setValue]); const tableName = tableSource?.kind === SourceKind.Metric ? getMetricTableName(tableSource, metricType) : _tableName; const metricName = useWatch({ control, name: `${namePrefix}metricName` }); const aggCondition = useWatch({ control, name: `${namePrefix}aggCondition`, }); const groupBy = useWatch({ control, name: 'groupBy' }); const metricTableSource = tableSource?.kind === SourceKind.Metric ? tableSource : undefined; const { data: attributeSuggestions, isLoading: isLoadingAttributes } = useFetchMetricResourceAttrs({ databaseName, metricType, metricName, tableSource: metricTableSource, isSql: aggConditionLanguage === 'sql', }); const attributeKeys = useMemo( () => parseAttributeKeysFromSuggestions(attributeSuggestions ?? []), [attributeSuggestions], ); const { data: metricMetadata } = useFetchMetricMetadata({ databaseName, metricType, metricName, tableSource: metricTableSource, }); const handleAddToWhere = useCallback( (clause: string) => { const currentValue = aggCondition || ''; const newValue = currentValue ? `${currentValue} AND ${clause}` : clause; setValue(`${namePrefix}aggCondition`, newValue); onSubmit(); }, [aggCondition, namePrefix, setValue, onSubmit], ); const handleAddToGroupBy = useCallback( (clause: string) => { const currentValue = groupBy || ''; const newValue = currentValue ? `${currentValue}, ${clause}` : clause; setValue('groupBy', newValue); onSubmit(); }, [groupBy, setValue, onSubmit], ); const showWhere = aggFn !== 'none'; const tableConnection = useMemo( () => ({ databaseName, tableName: tableName ?? '', connectionId: connectionId ?? '', metricName: tableSource?.kind === SourceKind.Metric ? metricName : undefined, }), [databaseName, tableName, connectionId, metricName, tableSource], ); return ( <> Alias
onSubmit()} size="xs" data-testid="series-alias-input" />
{(index ?? -1) > 0 && ( )} {(index ?? -1) < length - 1 && ( )} {((index ?? -1) > 0 || length > 1) && ( )} } labelPosition="right" mb={8} mt="sm" />
{tableSource?.kind === SourceKind.Metric && metricType && (
{ setValue(`${namePrefix}metricName`, value); setValue(`${namePrefix}valueExpression`, 'Value'); }} setMetricType={value => setValue(`${namePrefix}metricType`, value) } metricSource={tableSource} data-testid="metric-name-selector" error={errors?.metricName?.message} onFocus={() => clearErrors(`${namePrefix}metricName`)} /> {metricType === 'gauge' && ( )}
)} {tableSource?.kind !== SourceKind.Metric && aggFn !== 'count' && (
)} {(showWhere || showGroupBy || showHaving) && (
{showWhere && ( <> Where
)} {showGroupBy && ( <> Group By
{showHaving && ( <> Having
)} )}
)}
{tableSource?.kind === SourceKind.Metric && metricName && metricType && ( )} ); } const ChartSeriesEditor = ChartSeriesEditorComponent; export const ErrorNotificationMessage = ({ errors, }: { errors: { path: Path; message: string }[]; }) => { return ( } > {errors.map(({ message }, index) => ( {message} ))} ); }; const zSavedChartConfig = z .object({ // TODO: Chart alert: ChartAlertBaseSchema.superRefine( validateAlertScheduleOffsetMinutes, ).optional(), }) .passthrough(); export default function EditTimeChartForm({ dashboardId, chartConfig, displayedTimeInputValue, dateRange, isSaving, onTimeRangeSearch, setChartConfig, setDisplayedTimeInputValue, onSave, onTimeRangeSelect, onClose, onDirtyChange, 'data-testid': dataTestId, submitRef, isDashboardForm = false, }: { dashboardId?: string; chartConfig: SavedChartConfig; displayedTimeInputValue?: string; dateRange: [Date, Date]; isSaving?: boolean; onTimeRangeSearch?: (value: string) => void; setChartConfig?: (chartConfig: SavedChartConfig) => void; setDisplayedTimeInputValue?: (value: string) => void; onSave?: (chart: SavedChartConfig) => void; onClose?: () => void; onDirtyChange?: (isDirty: boolean) => void; onTimeRangeSelect?: (start: Date, end: Date) => void; 'data-testid'?: string; submitRef?: React.MutableRefObject<(() => void) | undefined>; isDashboardForm?: boolean; }) { const formValue: ChartEditorFormState = useMemo( () => convertSavedChartConfigToFormState(chartConfig), [chartConfig], ); const { control, setValue, handleSubmit, register, setError, clearErrors, formState: { errors, isDirty, dirtyFields }, } = useForm({ defaultValues: formValue, values: formValue, resolver: zodResolver(zSavedChartConfig), }); const { fields, append, remove: removeSeries, swap: swapSeries, } = useFieldArray({ control, name: 'series', }); useEffect(() => { onDirtyChange?.(isDirty); }, [isDirty, onDirtyChange]); const [isSampleEventsOpen, setIsSampleEventsOpen] = useState(false); const select = useWatch({ control, name: 'select' }); const sourceId = useWatch({ control, name: 'source' }); const alert = useWatch({ control, name: 'alert' }); const seriesReturnType = useWatch({ control, name: 'seriesReturnType' }); const groupBy = useWatch({ control, name: 'groupBy' }); const displayType = useWatch({ control, name: 'displayType' }) ?? DisplayType.Line; const markdown = useWatch({ control, name: 'markdown' }); const alertChannelType = useWatch({ control, name: 'alert.channel.type' }); const alertScheduleOffsetMinutes = useWatch({ control, name: 'alert.scheduleOffsetMinutes', }); const granularity = useWatch({ control, name: 'granularity' }); const maxAlertScheduleOffsetMinutes = alert?.interval ? Math.max(intervalToMinutes(alert.interval) - 1, 0) : 0; const alertIntervalLabel = alert?.interval ? TILE_ALERT_INTERVAL_OPTIONS[alert.interval] : undefined; const configType = useWatch({ control, name: 'configType' }); const chartConfigAlert = !isRawSqlSavedChartConfig(chartConfig) ? chartConfig.alert : undefined; const isRawSqlInput = configType === 'sql' && isRawSqlDisplayType(displayType); const { data: tableSource } = useSource({ id: sourceId }); const databaseName = tableSource?.from.databaseName; const tableName = tableSource?.from.tableName; const activeTab = useMemo(() => { switch (displayType) { case DisplayType.Search: return 'search'; case DisplayType.Markdown: return 'markdown'; case DisplayType.Table: return 'table'; case DisplayType.Pie: return 'pie'; case DisplayType.Number: return 'number'; default: return 'time'; } }, [displayType]); useEffect(() => { if ( displayType !== DisplayType.Line && displayType !== DisplayType.Number ) { setValue('alert', undefined); } }, [displayType, setValue]); const showGeneratedSql = ['table', 'time', 'number', 'pie'].includes( activeTab, ); const showSampleEvents = tableSource?.kind !== SourceKind.Metric && !isRawSqlInput; const [ alignDateRangeToGranularity, fillNulls, compareToPreviousPeriod, numberFormat, ] = useWatch({ control, name: [ 'alignDateRangeToGranularity', 'fillNulls', 'compareToPreviousPeriod', 'numberFormat', ], }); const displaySettings: ChartConfigDisplaySettings = useMemo( () => ({ alignDateRangeToGranularity, fillNulls, compareToPreviousPeriod, numberFormat, }), [ alignDateRangeToGranularity, fillNulls, compareToPreviousPeriod, numberFormat, ], ); const [ displaySettingsOpened, { open: openDisplaySettings, close: closeDisplaySettings }, ] = useDisclosure(false); // Only update this on submit, otherwise we'll have issues // with using the source value from the last submit // (ex. ignoring local custom source updates) const [queriedConfig, setQueriedConfig] = useState< ChartConfigWithDateRange | undefined >(undefined); const [queriedSource, setQueriedSource] = useState( undefined, ); const setQueriedConfigAndSource = useCallback( (config: ChartConfigWithDateRange, source: TSource | undefined) => { setQueriedConfig(config); setQueriedSource(source); }, [], ); const dbTimeChartConfig = useMemo(() => { if (!queriedConfig) { return undefined; } return { ...queriedConfig, granularity: alert ? intervalToGranularity(alert.interval) : queriedConfig.granularity, dateRange: alert ? extendDateRangeToInterval(queriedConfig.dateRange, alert.interval) : queriedConfig.dateRange, }; }, [queriedConfig, alert]); const [saveToDashboardModalOpen, setSaveToDashboardModalOpen] = useState(false); const onSubmit = useCallback( (suppressErrorNotification: boolean = false) => { handleSubmit(form => { const isRawSqlChart = form.configType === 'sql' && isRawSqlDisplayType(form.displayType); const errors = validateChartForm(form, tableSource, setError); if (errors.length > 0) { if (!suppressErrorNotification) { notifications.show({ id: 'chart-error', title: 'Invalid Chart', message: , color: 'red', }); } return; } const savedConfig = convertFormStateToSavedChartConfig( form, tableSource, ); const queriedConfig = convertFormStateToChartConfig( form, dateRange, tableSource, ); if (savedConfig && queriedConfig) { const normalizedSavedConfig = isRawSqlSavedChartConfig(savedConfig) ? savedConfig : { ...savedConfig, alert: normalizeNoOpAlertScheduleFields( savedConfig.alert, chartConfigAlert, { preserveExplicitScheduleOffsetMinutes: dirtyFields.alert?.scheduleOffsetMinutes === true, preserveExplicitScheduleStartAt: dirtyFields.alert?.scheduleStartAt === true, }, ), }; setChartConfig?.(normalizedSavedConfig); setQueriedConfigAndSource( queriedConfig, isRawSqlChart ? undefined : tableSource, ); } })(); }, [ chartConfigAlert, dirtyFields.alert?.scheduleOffsetMinutes, dirtyFields.alert?.scheduleStartAt, handleSubmit, setChartConfig, setQueriedConfigAndSource, tableSource, dateRange, setError, ], ); const onTableSortingChange = useCallback( (sortState: SortingState | null) => { setValue('orderBy', sortingStateToOrderByString(sortState) ?? ''); onSubmit(); }, [setValue, onSubmit], ); const tableSortState = useMemo( () => queriedConfig != null && isBuilderChartConfig(queriedConfig) && queriedConfig.orderBy && typeof queriedConfig.orderBy === 'string' ? orderByStringToSortingState(queriedConfig.orderBy) : undefined, [queriedConfig], ); useEffect(() => { if (submitRef) { submitRef.current = onSubmit; } }, [onSubmit, submitRef]); const handleSave = useCallback( (form: ChartEditorFormState) => { const errors = validateChartForm(form, tableSource, setError); if (errors.length > 0) { notifications.show({ id: 'chart-error', title: 'Invalid Chart', message: , color: 'red', }); return; } const savedChartConfig = convertFormStateToSavedChartConfig( form, tableSource, ); if (savedChartConfig) { const normalizedSavedConfig = isRawSqlSavedChartConfig(savedChartConfig) ? savedChartConfig : { ...savedChartConfig, alert: normalizeNoOpAlertScheduleFields( savedChartConfig.alert, chartConfigAlert, { preserveExplicitScheduleOffsetMinutes: dirtyFields.alert?.scheduleOffsetMinutes === true, preserveExplicitScheduleStartAt: dirtyFields.alert?.scheduleStartAt === true, }, ), }; onSave?.(normalizedSavedConfig); } }, [ onSave, tableSource, setError, chartConfigAlert, dirtyFields.alert?.scheduleOffsetMinutes, dirtyFields.alert?.scheduleStartAt, ], ); // Track previous values for detecting changes const prevGranularityRef = useRef(granularity); const prevDisplayTypeRef = useRef(displayType); const prevConfigTypeRef = useRef(configType); useEffect(() => { // Emulate the granularity picker auto-searching similar to dashboards if (granularity !== prevGranularityRef.current) { prevGranularityRef.current = granularity; onSubmit(); } }, [granularity, onSubmit]); useEffect(() => { const displayTypeChanged = displayType !== prevDisplayTypeRef.current; const configTypeChanged = configType !== prevConfigTypeRef.current; if (displayTypeChanged || configTypeChanged) { prevDisplayTypeRef.current = displayType; prevConfigTypeRef.current = configType; if (displayType === DisplayType.Search && typeof select !== 'string') { setValue('select', ''); setValue('series', []); } if (displayType !== DisplayType.Search && !Array.isArray(select)) { const defaultSeries: SavedChartConfigWithSelectArray['select'] = [ { aggFn: 'count', aggCondition: '', aggConditionLanguage: getStoredLanguage() ?? 'lucene', valueExpression: '', }, ]; setValue('where', ''); setValue('select', defaultSeries); setValue('series', defaultSeries); } // Don't auto-submit when config type changes, to avoid clearing form state (like source) if (displayTypeChanged) { // true = Suppress error notification (because we're auto-submitting) onSubmit(true); } } }, [displayType, select, setValue, onSubmit, configType]); // Emulate the date range picker auto-searching similar to dashboards useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect setQueriedConfig((config: ChartConfigWithDateRange | undefined) => { if (config == null) { return config; } return { ...config, dateRange, }; }); }, [dateRange]); const queryReady = isQueryReady(queriedConfig); // The chart config to use when showing the user the generated SQL // and explaining whether a MV can be used. const chartConfigForExplanations: ChartConfigWithOptTimestamp | undefined = useMemo(() => { if (queriedConfig && isRawSqlChartConfig(queriedConfig)) return { ...queriedConfig, dateRange }; if (chartConfig && isRawSqlSavedChartConfig(chartConfig)) return { ...chartConfig, dateRange }; const userHasSubmittedQuery = !!queriedConfig; const queriedSourceMatchesSelectedSource = queriedSource?.id === tableSource?.id; const urlParamsSourceMatchesSelectedSource = chartConfig.source === tableSource?.id; const effectiveQueriedConfig = activeTab === 'time' ? dbTimeChartConfig : queriedConfig; const config = userHasSubmittedQuery && queriedSourceMatchesSelectedSource ? effectiveQueriedConfig : chartConfig && urlParamsSourceMatchesSelectedSource && tableSource ? { ...chartConfig, dateRange, timestampValueExpression: tableSource.timestampValueExpression, from: tableSource.from, connection: tableSource.connection, } : undefined; if (!config || isRawSqlChartConfig(config)) { return undefined; } // Apply the transformations that child components will apply, // so that the MV optimization explanation and generated SQL preview // are accurate. if (activeTab === 'time') { return convertToTimeChartConfig(config); } else if (activeTab === 'number') { return convertToNumberChartConfig(config); } else if (activeTab === 'table') { return convertToTableChartConfig(config); } else if (activeTab === 'pie') { return convertToPieChartConfig(config); } return config; }, [ queriedConfig, queriedSource?.id, tableSource, chartConfig, dateRange, activeTab, dbTimeChartConfig, ]); const previousDateRange = getPreviousDateRange(dateRange); const sampleEventsConfig = useMemo( () => tableSource != null && queriedConfig != null && isBuilderChartConfig(queriedConfig) && queryReady ? { ...queriedConfig, orderBy: [ { ordering: 'DESC' as const, valueExpression: getFirstTimestampValueExpression( tableSource.timestampValueExpression, ), }, ], dateRange, timestampValueExpression: tableSource.timestampValueExpression, connection: tableSource.connection, from: tableSource.from, limit: { limit: 200 }, select: ((tableSource?.kind === SourceKind.Log || tableSource?.kind === SourceKind.Trace) && tableSource.defaultTableSelectExpression) || '', filters: seriesToFilters(queriedConfig.select), filtersLogicalOperator: 'OR' as const, groupBy: undefined, granularity: undefined, having: undefined, } : null, [queriedConfig, tableSource, dateRange, queryReady], ); // Need to force a rerender on change as the modal will not be mounted when initially rendered const [parentRef, setParentRef] = useState(null); const handleUpdateDisplaySettings = useCallback( ({ numberFormat, alignDateRangeToGranularity, fillNulls, compareToPreviousPeriod, }: ChartConfigDisplaySettings) => { setValue('numberFormat', numberFormat); setValue('alignDateRangeToGranularity', alignDateRangeToGranularity); setValue('fillNulls', fillNulls); setValue('compareToPreviousPeriod', compareToPreviousPeriod); onSubmit(); }, [setValue, onSubmit], ); const tableConnection = useMemo( () => tcFromSource(tableSource), [tableSource], ); return (
( } > Line/Bar } > Table } > Number } > Pie } > Search } > Markdown )} /> Chart Name {isRawSqlDisplayType(displayType) && ( ( )} /> )} {activeTab === 'markdown' ? (