diff --git a/.github/workflows/cloudfrontfunctioncheck.yml b/.github/workflows/cloudfrontfunctioncheck.yml index 07082c1159..94118894ea 100644 --- a/.github/workflows/cloudfrontfunctioncheck.yml +++ b/.github/workflows/cloudfrontfunctioncheck.yml @@ -3,7 +3,7 @@ name: cloudfront_function_check on: pull_request: paths: - - 'src/cloudfront/fusionauth-website-request-handler.js' + - 'src/cloudfront/functions/fusionauth-website-request-handler.js' - '.github/workflows/cloudfrontfunctioncheck.yml' # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -22,5 +22,5 @@ jobs: cache: 'npm' cache-dependency-path: 'astro/package-lock.json' - name: Check cloudfront function is syntactically correct. - run: node --check src/cloudfront/fusionauth-website-request-handler.js + run: node --check src/cloudfront/functions/fusionauth-website-request-handler.js shell: bash diff --git a/.github/workflows/publish-site-redirect-rules.yaml b/.github/workflows/publish-site-redirect-rules.yaml new file mode 100644 index 0000000000..5889d5637d --- /dev/null +++ b/.github/workflows/publish-site-redirect-rules.yaml @@ -0,0 +1,39 @@ +--- +name: publish-site-redirect-rules-to-s3 + +env: + AWS_ACCOUNT_ID: '172023253951' + AWS_REGION: us-east-1 + +on: + push: + branches: + - development + paths: + - 'src/lambdas/fusionauth-site-origin-handler/data/redirects.json' + +permissions: + id-token: write + contents: read + +jobs: + publish-to-s3: + runs-on: fusionauth-standard + container: 752443094709.dkr.ecr.us-west-2.amazonaws.com/gha-runner-ubuntu-22.04:bootstrap-05 + steps: + + - name: checkout + uses: actions/checkout@v4 + + - name: set aws credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-chaining: true + role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/github-actions + role-session-name: github-actions + aws-region: ${{ env.AWS_REGION }} + + - name: upload file to s3 + working-directory: src/lambdas/fusionauth-site-origin-handler/data + run: | + aws s3 cp ./redirects.json s3://fusionauth-dev-us-east-1-artifacts/lambda/fusionauth-site-origin-handler/redirects.json diff --git a/.gitignore b/.gitignore index 7a8a905ec8..536ea73e7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +.env* .jekyll-metadata .jekyll-cache .sass-cache diff --git a/src/cloudfront/fusionauth-website-request-handler.js b/src/cloudfront/functions/fusionauth-website-request-handler.js similarity index 100% rename from src/cloudfront/fusionauth-website-request-handler.js rename to src/cloudfront/functions/fusionauth-website-request-handler.js diff --git a/src/cloudfront/lambda-request-handler/package-lock.json b/src/cloudfront/lambda-request-handler/package-lock.json deleted file mode 100644 index 139161abc4..0000000000 --- a/src/cloudfront/lambda-request-handler/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "lambda-request-handler", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lambda-request-handler", - "version": "1.0.0", - "license": "Apache-2.0" - } - } -} diff --git a/src/cloudfront/lambda-request-handler/package.json b/src/cloudfront/lambda-request-handler/package.json deleted file mode 100644 index cab1c3e0ec..0000000000 --- a/src/cloudfront/lambda-request-handler/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "lambda-request-handler", - "version": "1.0.0", - "description": "A Lambda@Edge function for handling redirects and translating site requests to S3 URIs.", - "main": "fusionauth-website-request-handler.js", - "scripts": { - "test": "test" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/FusionAuth/fusionauth-site.git" - }, - "type": "commonjs", - "author": "", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/FusionAuth/fusionauth-site/issues" - }, - "homepage": "https://github.com/FusionAuth/fusionauth-site#readme" -} diff --git a/src/cloudfront/lambda-request-handler/src/fusionauth-website-lambda-request-handler.js b/src/cloudfront/lambda-request-handler/src/fusionauth-website-lambda-request-handler.js deleted file mode 100644 index 3edcc739a2..0000000000 --- a/src/cloudfront/lambda-request-handler/src/fusionauth-website-lambda-request-handler.js +++ /dev/null @@ -1,661 +0,0 @@ -const referenceData = { - redirects: { - '/articles/oauth/what-is-oauth': '/articles/oauth/modern-guide-to-oauth', - '/blog/archive/category/announcement': '/blog/category/news', - '/blog/archive/category/article': '/blog/category/education', - '/blog/archive/category/community': '/blog/category/community', - '/blog/archive/category/comparison': '/blog/category/compare', - '/blog/archive/category/features': '/blog/category/product', - '/blog/archive/category/tutorial': '/blog/category/tutorial', - '/cognito': '/docs/lifecycle/migrate-users/bulk/cognito', - '/dev-tools/jwt-debugger': '/dev-tools/jwt-decoder', - '/docs/v1/tech/': '/docs/', - '/docs/v1/tech/5-minute-setup-guide': '/docs/quickstarts/5-minute-setup-guide', - '/docs/v1/tech/account-management/': '/docs/lifecycle/manage-users/account-management/', - '/docs/v1/tech/account-management/add-webauthn': '/docs/lifecycle/manage-users/account-management/add-webauthn', - '/docs/v1/tech/account-management/bootstrapping-login': '/docs/lifecycle/manage-users/account-management/bootstrapping-login', - '/docs/v1/tech/account-management/customizing-account-management': '/docs/lifecycle/manage-users/account-management/customizing-account-management', - '/docs/v1/tech/account-management/troubleshooting': '/docs/lifecycle/manage-users/account-management/troubleshooting', - '/docs/v1/tech/account-management/two-factor-authenticator': '/docs/lifecycle/manage-users/account-management/two-factor-authenticator', - '/docs/v1/tech/account-management/two-factor-email': '/docs/lifecycle/manage-users/account-management/two-factor-email', - '/docs/v1/tech/account-management/two-factor-sms': '/docs/lifecycle/manage-users/account-management/two-factor-sms', - '/docs/v1/tech/account-management/updating-user-data': '/docs/lifecycle/manage-users/account-management/updating-user-data', - '/docs/v1/tech/admin-guide/account-portal': '/docs/get-started/download-and-install/account-portal', - '/docs/v1/tech/admin-guide/cli': '/docs/customize/look-and-feel/cli', - '/docs/v1/tech/admin-guide/configuration-management': '/docs/operate/deploy/configuration-management', - '/docs/v1/tech/admin-guide/licensing': '/docs/get-started/core-concepts/licensing', - '/docs/v1/tech/admin-guide/monitor': '/docs/operate/secure-and-monitor/monitor', - '/docs/v1/tech/admin-guide/proxy-setup': '/docs/operate/deploy/proxy-setup', - '/docs/v1/tech/admin-guide/release-notifications': '/docs/operate/roadmap/releases', - '/docs/v1/tech/admin-guide/releases': '/docs/operate/roadmap/releases', - '/docs/v1/tech/admin-guide/securing': '/docs/operate/secure-and-monitor/securing', - '/docs/v1/tech/admin-guide/technical-support': '/docs/operate/troubleshooting/technical-support', - '/docs/v1/tech/admin-guide/troubleshooting': '/docs/operate/troubleshooting/troubleshooting', - '/docs/v1/tech/admin-guide/upgrade': '/docs/operate/deploy/upgrade', - '/docs/v1/tech/admin-guide/user-support-guide': '/docs/operate/deploy/user-support-guide', - '/docs/v1/tech/admin-guide/vulnerabilities': '/docs/operate/secure-and-monitor/vulnerabilities', - '/docs/v1/tech/admin-guide/webauthn': '/docs/lifecycle/authenticate-users/passwordless/webauthn', - '/docs/v1/tech/advanced-threat-detection/': '/docs/operate/secure-and-monitor/advanced-threat-detection', - '/docs/v1/tech/apis/': '/docs/apis/', - '/docs/v1/tech/apis/actioning-users': '/docs/apis/actioning-users', - '/docs/v1/tech/apis/api-explorer': '/docs/apis/api-explorer', - '/docs/v1/tech/apis/api-keys': '/docs/apis/api-keys', - '/docs/v1/tech/apis/applications': '/docs/apis/applications', - '/docs/v1/tech/apis/audit-logs': '/docs/apis/audit-logs', - '/docs/v1/tech/apis/authentication': '/docs/apis/authentication', - '/docs/v1/tech/apis/connectors/': '/docs/apis/connectors/', - '/docs/v1/tech/apis/connectors/generic': '/docs/apis/connectors/generic', - '/docs/v1/tech/apis/connectors/ldap': '/docs/apis/connectors/ldap', - '/docs/v1/tech/apis/consent': '/docs/apis/consents', - '/docs/v1/tech/apis/consents': '/docs/apis/consents', - '/docs/v1/tech/apis/emails': '/docs/apis/emails', - '/docs/v1/tech/apis/entity-management/': '/docs/apis/entities/', - '/docs/v1/tech/apis/entity-management/entities': '/docs/apis/entities/entities', - '/docs/v1/tech/apis/entity-management/entity-types': '/docs/apis/entities/entity-types', - '/docs/v1/tech/apis/entity-management/grants': '/docs/apis/entities/grants', - '/docs/v1/tech/apis/errors': '/docs/apis/errors', - '/docs/v1/tech/apis/event-logs': '/docs/apis/event-logs', - '/docs/v1/tech/apis/families': '/docs/apis/families', - '/docs/v1/tech/apis/form-fields': '/docs/apis/custom-forms/form-fields', - '/docs/v1/tech/apis/forms': '/docs/apis/custom-forms/forms', - '/docs/v1/tech/apis/groups': '/docs/apis/groups', - '/docs/v1/tech/apis/hosted-backend': '/docs/apis/hosted-backend', - '/docs/v1/tech/apis/identity-providers/': '/docs/apis/identity-providers/', - '/docs/v1/tech/apis/identity-providers/apple': '/docs/apis/identity-providers/apple', - '/docs/v1/tech/apis/identity-providers/epicgames': '/docs/apis/identity-providers/epicgames', - '/docs/v1/tech/apis/identity-providers/external-jwt': '/docs/apis/identity-providers/external-jwt', - '/docs/v1/tech/apis/identity-providers/facebook': '/docs/apis/identity-providers/facebook', - '/docs/v1/tech/apis/identity-providers/google': '/docs/apis/identity-providers/google', - '/docs/v1/tech/apis/identity-providers/hypr': '/docs/apis/identity-providers/hypr', - '/docs/v1/tech/apis/identity-providers/linkedin': '/docs/apis/identity-providers/linkedin', - '/docs/v1/tech/apis/identity-providers/links': '/docs/apis/identity-providers/links', - '/docs/v1/tech/apis/identity-providers/nintendo': '/docs/apis/identity-providers/nintendo', - '/docs/v1/tech/apis/identity-providers/openid-connect': '/docs/apis/identity-providers/openid-connect', - '/docs/v1/tech/apis/identity-providers/samlv2': '/docs/apis/identity-providers/samlv2', - '/docs/v1/tech/apis/identity-providers/samlv2-idp-initiated': '/docs/apis/identity-providers/samlv2-idp-initiated', - '/docs/v1/tech/apis/identity-providers/sonypsn': '/docs/apis/identity-providers/sonypsn', - '/docs/v1/tech/apis/identity-providers/steam': '/docs/apis/identity-providers/steam', - '/docs/v1/tech/apis/identity-providers/twitch': '/docs/apis/identity-providers/twitch', - '/docs/v1/tech/apis/identity-providers/twitter': '/docs/apis/identity-providers/twitter', - '/docs/v1/tech/apis/identity-providers/xbox': '/docs/apis/identity-providers/xbox', - '/docs/v1/tech/apis/integrations': '/docs/apis/integrations', - '/docs/v1/tech/apis/ip-acl': '/docs/apis/ip-acl', - '/docs/v1/tech/apis/jwt': '/docs/apis/jwt', - '/docs/v1/tech/apis/keys': '/docs/apis/keys', - '/docs/v1/tech/apis/lambdas': '/docs/apis/lambdas', - '/docs/v1/tech/apis/login': '/docs/apis/login', - '/docs/v1/tech/apis/message-templates': '/docs/apis/message-templates', - '/docs/v1/tech/apis/messengers/': '/docs/apis/messengers/', - '/docs/v1/tech/apis/messengers/generic': '/docs/apis/messengers/generic', - '/docs/v1/tech/apis/messengers/twilio': '/docs/apis/messengers/twilio', - '/docs/v1/tech/apis/passwordless': '/docs/apis/passwordless', - '/docs/v1/tech/apis/reactor': '/docs/apis/reactor', - '/docs/v1/tech/apis/registrations': '/docs/apis/registrations', - '/docs/v1/tech/apis/reports': '/docs/apis/reports', - '/docs/v1/tech/apis/scim/': '/docs/apis/scim/', - '/docs/v1/tech/apis/scim/SCIMEnterpriseUser': '/docs/apis/scim/SCIMEnterpriseUser', - '/docs/v1/tech/apis/scim/SCIMGroup': '/docs/apis/scim/SCIMGroup', - '/docs/v1/tech/apis/scim/SCIMServiceProvider': '/docs/apis/scim/SCIMServiceProvider', - '/docs/v1/tech/apis/scim/SCIMUser': '/docs/apis/scim/SCIMUser', - '/docs/v1/tech/apis/system': '/docs/apis/system', - '/docs/v1/tech/apis/tenants': '/docs/apis/tenants', - '/docs/v1/tech/apis/themes': '/docs/apis/themes', - '/docs/v1/tech/apis/two-factor': '/docs/apis/messengers/two-factor', - '/docs/v1/tech/apis/two-factor-1-25': '/docs/archive/apis/two-factor-1-25', - '/docs/v1/tech/apis/user-action-reasons': '/docs/apis/user-action-reasons', - '/docs/v1/tech/apis/user-actions': '/docs/apis/user-actions', - '/docs/v1/tech/apis/user-comments': '/docs/apis/user-comments', - '/docs/v1/tech/apis/users': '/docs/apis/users', - '/docs/v1/tech/apis/webauthn': '/docs/apis/webauthn', - '/docs/v1/tech/apis/webhooks': '/docs/apis/webhooks', - '/docs/v1/tech/archive/apis/system': '/docs/archive/apis/system-1-29', - '/docs/v1/tech/archive/release-notes': '/docs/archive/release-notes', - '/docs/v1/tech/client-libraries/': '/docs/sdks/', - '/docs/v1/tech/client-libraries/angular-sdk': '/docs/sdks/angular-sdk', - '/docs/v1/tech/client-libraries/dart': '/docs/sdks/dart', - '/docs/v1/tech/client-libraries/go': '/docs/sdks/go', - '/docs/v1/tech/client-libraries/java': '/docs/sdks/java', - '/docs/v1/tech/client-libraries/javascript': '/docs/sdks/javascript', - '/docs/v1/tech/client-libraries/netcore': '/docs/sdks/netcore', - '/docs/v1/tech/client-libraries/node': '/docs/sdks/node', - '/docs/v1/tech/client-libraries/openapi': '/docs/sdks/openapi', - '/docs/v1/tech/client-libraries/php': '/docs/sdks/php', - '/docs/v1/tech/client-libraries/python': '/docs/sdks/python', - '/docs/v1/tech/client-libraries/react-sdk': '/docs/sdks/react-sdk', - '/docs/v1/tech/client-libraries/ruby': '/docs/sdks/ruby', - '/docs/v1/tech/client-libraries/typescript': '/docs/sdks/typescript', - '/docs/v1/tech/client-libraries/vue-sdk': '/docs/sdks/vue-sdk', - '/docs/v1/tech/common-errors': '/docs/operate/troubleshooting/troubleshooting', - '/docs/v1/tech/connectors/': '/docs/lifecycle/migrate-users/connectors/', - '/docs/v1/tech/connectors/fusionauth-connector': '/docs/lifecycle/migrate-users/connectors/fusionauth-connector', - '/docs/v1/tech/connectors/generic-connector': '/docs/lifecycle/migrate-users/connectors/generic-connector', - '/docs/v1/tech/connectors/ldap-connector': '/docs/lifecycle/migrate-users/connectors/ldap-connector', - '/docs/v1/tech/core-concepts/applications': '/docs/get-started/core-concepts/applications', - '/docs/v1/tech/core-concepts/authentication-authorization': '/docs/get-started/core-concepts/authentication-authorization', - '/docs/v1/tech/core-concepts/editions-features': '/docs/get-started/core-concepts/editions-features', - '/docs/v1/tech/core-concepts/entity-management': '/docs/get-started/core-concepts/entity-management', - '/docs/v1/tech/core-concepts/groups': '/docs/get-started/core-concepts/groups', - '/docs/v1/tech/core-concepts/identity-providers': '/docs/get-started/core-concepts/identity-providers', - '/docs/v1/tech/core-concepts/integration-points': '/docs/get-started/core-concepts/integration-points', - '/docs/v1/tech/core-concepts/key-master': '/docs/operate/secure-and-monitor/key-master', - '/docs/v1/tech/core-concepts/localization-and-internationalization': '/docs/get-started/core-concepts/localization-and-internationalization', - '/docs/v1/tech/core-concepts/modes': '/docs/lifecycle/authenticate-users/oauth/modes', - '/docs/v1/tech/core-concepts/registrations': '/docs/get-started/core-concepts/registrations', - '/docs/v1/tech/core-concepts/roadmap': '/docs/operate/roadmap/roadmap', - '/docs/v1/tech/core-concepts/roles': '/docs/get-started/core-concepts/roles', - '/docs/v1/tech/core-concepts/scim': '/docs/lifecycle/migrate-users/scim/scim', - '/docs/v1/tech/core-concepts/search': '/docs/lifecycle/manage-users/search/search', - '/docs/v1/tech/core-concepts/tenants': '/docs/get-started/core-concepts/tenants', - '/docs/v1/tech/core-concepts/users': '/docs/get-started/core-concepts/users', - '/docs/v1/tech/developer-guide/api-gateways/': '/docs/extend/examples/api-gateways/', - '/docs/v1/tech/developer-guide/api-gateways/aws-api-gateway': '/docs/extend/examples/api-gateways/aws-api-gateway', - '/docs/v1/tech/developer-guide/api-gateways/haproxy-api-gateway': '/docs/extend/examples/api-gateways/haproxy-api-gateway', - '/docs/v1/tech/developer-guide/api-gateways/kong-gateway': '/docs/extend/examples/api-gateways/kong-gateway', - '/docs/v1/tech/developer-guide/api-gateways/ngrok-cloud-edge': '/docs/extend/examples/api-gateways/ngrok-cloud-edge', - '/docs/v1/tech/developer-guide/exposing-instance': '/docs/get-started/download-and-install/development/exposing-instance', - '/docs/v1/tech/email-templates/': '/docs/customize/email-and-messages/', - '/docs/v1/tech/email-templates/configure-email': '/docs/customize/email-and-messages/configure-email', - '/docs/v1/tech/email-templates/email-templates': '/docs/customize/email-and-messages/email-templates', - '/docs/v1/tech/email-templates/message-templates': '/docs/customize/email-and-messages/message-templates', - '/docs/v1/tech/email-templates/templates-replacement-variables': '/docs/customize/email-and-messages/templates-replacement-variables', - '/docs/v1/tech/events-webhooks/': '/docs/extend/events-and-webhooks/', - '/docs/v1/tech/events-webhooks/events/': '/docs/extend/events-and-webhooks/events/', - '/docs/v1/tech/events-webhooks/events/audit-log-create': '/docs/extend/events-and-webhooks/events/audit-log-create', - '/docs/v1/tech/events-webhooks/events/event-log-create': '/docs/extend/events-and-webhooks/events/event-log-create', - '/docs/v1/tech/events-webhooks/events/group-create': '/docs/extend/events-and-webhooks/events/group-create', - '/docs/v1/tech/events-webhooks/events/group-create-complete': '/docs/extend/events-and-webhooks/events/group-create-complete', - '/docs/v1/tech/events-webhooks/events/group-delete': '/docs/extend/events-and-webhooks/events/group-delete', - '/docs/v1/tech/events-webhooks/events/group-delete-complete': '/docs/extend/events-and-webhooks/events/group-delete-complete', - '/docs/v1/tech/events-webhooks/events/group-member-add': '/docs/extend/events-and-webhooks/events/group-member-add', - '/docs/v1/tech/events-webhooks/events/group-member-add-complete': '/docs/extend/events-and-webhooks/events/group-member-add-complete', - '/docs/v1/tech/events-webhooks/events/group-member-remove': '/docs/extend/events-and-webhooks/events/group-member-remove', - '/docs/v1/tech/events-webhooks/events/group-member-remove-complete': '/docs/extend/events-and-webhooks/events/group-member-remove-complete', - '/docs/v1/tech/events-webhooks/events/group-member-update': '/docs/extend/events-and-webhooks/events/group-member-update', - '/docs/v1/tech/events-webhooks/events/group-member-update-complete': '/docs/extend/events-and-webhooks/events/group-member-update-complete', - '/docs/v1/tech/events-webhooks/events/group-update': '/docs/extend/events-and-webhooks/events/group-update', - '/docs/v1/tech/events-webhooks/events/group-update-complete': '/docs/extend/events-and-webhooks/events/group-update-complete', - '/docs/v1/tech/events-webhooks/events/jwt-public-key-update': '/docs/extend/events-and-webhooks/events/jwt-public-key-update', - '/docs/v1/tech/events-webhooks/events/jwt-refresh': '/docs/extend/events-and-webhooks/events/jwt-refresh', - '/docs/v1/tech/events-webhooks/events/jwt-refresh-token-revoke': '/docs/extend/events-and-webhooks/events/jwt-refresh-token-revoke', - '/docs/v1/tech/events-webhooks/events/kickstart-success': '/docs/extend/events-and-webhooks/events/kickstart-success', - '/docs/v1/tech/events-webhooks/events/user-actions': '/docs/extend/events-and-webhooks/events/user-actions', - '/docs/v1/tech/events-webhooks/events/user-bulk-create': '/docs/extend/events-and-webhooks/events/user-bulk-create', - '/docs/v1/tech/events-webhooks/events/user-create': '/docs/extend/events-and-webhooks/events/user-create', - '/docs/v1/tech/events-webhooks/events/user-create-complete': '/docs/extend/events-and-webhooks/events/user-create-complete', - '/docs/v1/tech/events-webhooks/events/user-deactivate': '/docs/extend/events-and-webhooks/events/user-deactivate', - '/docs/v1/tech/events-webhooks/events/user-delete': '/docs/extend/events-and-webhooks/events/user-delete', - '/docs/v1/tech/events-webhooks/events/user-delete-complete': '/docs/extend/events-and-webhooks/events/user-delete-complete', - '/docs/v1/tech/events-webhooks/events/user-email-update': '/docs/extend/events-and-webhooks/events/user-email-update', - '/docs/v1/tech/events-webhooks/events/user-email-verified': '/docs/extend/events-and-webhooks/events/user-email-verified', - '/docs/v1/tech/events-webhooks/events/user-identity-provider-link': '/docs/extend/events-and-webhooks/events/user-identity-provider-link', - '/docs/v1/tech/events-webhooks/events/user-identity-provider-unlink': '/docs/extend/events-and-webhooks/events/user-identity-provider-unlink', - '/docs/v1/tech/events-webhooks/events/user-login-failed': '/docs/extend/events-and-webhooks/events/user-login-failed', - '/docs/v1/tech/events-webhooks/events/user-login-id-duplicate-create': '/docs/extend/events-and-webhooks/events/user-login-id-duplicate-create', - '/docs/v1/tech/events-webhooks/events/user-login-id-duplicate-update': '/docs/extend/events-and-webhooks/events/user-login-id-duplicate-update', - '/docs/v1/tech/events-webhooks/events/user-login-new-device': '/docs/extend/events-and-webhooks/events/user-login-new-device', - '/docs/v1/tech/events-webhooks/events/user-login-success': '/docs/extend/events-and-webhooks/events/user-login-success', - '/docs/v1/tech/events-webhooks/events/user-login-suspicious': '/docs/extend/events-and-webhooks/events/user-login-suspicious', - '/docs/v1/tech/events-webhooks/events/user-password-breach': '/docs/extend/events-and-webhooks/events/user-password-breach', - '/docs/v1/tech/events-webhooks/events/user-password-reset-send': '/docs/extend/events-and-webhooks/events/user-password-reset-send', - '/docs/v1/tech/events-webhooks/events/user-password-reset-start': '/docs/extend/events-and-webhooks/events/user-password-reset-start', - '/docs/v1/tech/events-webhooks/events/user-password-reset-success': '/docs/extend/events-and-webhooks/events/user-password-reset-success', - '/docs/v1/tech/events-webhooks/events/user-password-update': '/docs/extend/events-and-webhooks/events/user-password-update', - '/docs/v1/tech/events-webhooks/events/user-reactivate': '/docs/extend/events-and-webhooks/events/user-reactivate', - '/docs/v1/tech/events-webhooks/events/user-registration-create': '/docs/extend/events-and-webhooks/events/user-registration-create', - '/docs/v1/tech/events-webhooks/events/user-registration-create-complete': '/docs/extend/events-and-webhooks/events/user-registration-create-complete', - '/docs/v1/tech/events-webhooks/events/user-registration-delete': '/docs/extend/events-and-webhooks/events/user-registration-delete', - '/docs/v1/tech/events-webhooks/events/user-registration-delete-complete': '/docs/extend/events-and-webhooks/events/user-registration-delete-complete', - '/docs/v1/tech/events-webhooks/events/user-registration-update': '/docs/extend/events-and-webhooks/events/user-registration-update', - '/docs/v1/tech/events-webhooks/events/user-registration-update-complete': '/docs/extend/events-and-webhooks/events/user-registration-update-complete', - '/docs/v1/tech/events-webhooks/events/user-registration-verified': '/docs/extend/events-and-webhooks/events/user-registration-verified', - '/docs/v1/tech/events-webhooks/events/user-two-factor-method-add': '/docs/extend/events-and-webhooks/events/user-two-factor-method-add', - '/docs/v1/tech/events-webhooks/events/user-two-factor-method-remove': '/docs/extend/events-and-webhooks/events/user-two-factor-method-remove', - '/docs/v1/tech/events-webhooks/events/user-update': '/docs/extend/events-and-webhooks/events/user-update', - '/docs/v1/tech/events-webhooks/events/user-update-complete': '/docs/extend/events-and-webhooks/events/user-update-complete', - '/docs/v1/tech/events-webhooks/securing': '/docs/extend/events-and-webhooks/securing', - '/docs/v1/tech/events-webhooks/writing-a-webhook': '/docs/extend/events-and-webhooks/writing-a-webhook', - '/docs/v1/tech/example-apps/': '/docs/extend/examples/example-apps/', - '/docs/v1/tech/example-apps/dart': '/docs/sdks/examples/dart', - '/docs/v1/tech/example-apps/go': '/docs/sdks/examples/go', - '/docs/v1/tech/example-apps/java': '/docs/sdks/examples/java', - '/docs/v1/tech/example-apps/javascript': '/docs/sdks/examples/javascript', - '/docs/v1/tech/example-apps/netcore': '/docs/sdks/examples/netcore', - '/docs/v1/tech/example-apps/php': '/docs/sdks/examples/php', - '/docs/v1/tech/example-apps/python': '/docs/sdks/examples/python', - '/docs/v1/tech/example-apps/ruby': '/docs/sdks/examples/ruby', - '/docs/v1/tech/getting-started/': '/docs/getting-started/', - '/docs/v1/tech/getting-started/5-minute-docker': '/docs/quickstarts/5-minute-docker', - '/docs/v1/tech/getting-started/5-minute-fastpath': '/docs/quickstarts/5-minute-fastpath', - '/docs/v1/tech/getting-started/5-minute-sandbox': '/docs/quickstarts/5-minute-sandbox', - '/docs/v1/tech/guides/advanced-registration-forms': '/docs/lifecycle/register-users/advanced-registration-forms', - '/docs/v1/tech/guides/anonymous-user': '/docs/lifecycle/register-users/anonymous-user', - '/docs/v1/tech/guides/api-authorization': '/docs/extend/examples/api-gateways/api-authorization', - '/docs/v1/tech/guides/auth0-migration': '/docs/lifecycle/migrate-users/bulk/auth0', - '/docs/v1/tech/guides/basic-registration-forms': '/docs/lifecycle/register-users/basic-registration-forms', - '/docs/v1/tech/guides/breached-password-detection': '/docs/operate/secure-and-monitor/breached-password-detection', - '/docs/v1/tech/guides/configuring-application-specific-email-templates': '/docs/customize/email-and-messages/configuring-application-specific-email-templates', - '/docs/v1/tech/guides/migration': '/docs/lifecycle/migrate-users/bulk/general', - '/docs/v1/tech/guides/migration/general': '/docs/lifecycle/migrate-users/bulk/general', - '/docs/v1/tech/guides/multi-factor-authentication': '/docs/lifecycle/authenticate-users/multi-factor-authentication', - '/docs/v1/tech/guides/multi-tenant': '/docs/extend/examples/multi-tenant', - '/docs/v1/tech/guides/passwordless': '/docs/lifecycle/authenticate-users/passwordless/magic-links', - '/docs/v1/tech/guides/registration-email-verification': '/docs/lifecycle/manage-users/verification/registration-email-verification', - '/docs/v1/tech/guides/silent-mode': '/docs/get-started/download-and-install/silent-mode', - '/docs/v1/tech/guides/single-sign-on': '/docs/lifecycle/authenticate-users/single-sign-on', - '/docs/v1/tech/guides/user-actions': '/docs/lifecycle/manage-users/user-actions', - '/docs/v1/tech/guides/user-search-with-elasticsearch': '/docs/lifecycle/manage-users/search/user-search-with-elasticsearch', - '/docs/v1/tech/guides/webauthn': '/docs/lifecycle/authenticate-users/passwordless/webauthn-passkeys', - '/docs/v1/tech/identity-providers/': '/docs/lifecycle/authenticate-users/identity-providers/', - '/docs/v1/tech/identity-providers/apple': '/docs/lifecycle/authenticate-users/identity-providers/social/apple', - '/docs/v1/tech/identity-providers/epic-games': '/docs/lifecycle/authenticate-users/identity-providers/gaming/epic-games', - '/docs/v1/tech/identity-providers/external-jwt/': '/docs/lifecycle/authenticate-users/identity-providers/external-jwt/', - '/docs/v1/tech/identity-providers/external-jwt/example': '/docs/lifecycle/authenticate-users/identity-providers/external-jwt/example', - '/docs/v1/tech/identity-providers/facebook': '/docs/lifecycle/authenticate-users/identity-providers/social/facebook', - '/docs/v1/tech/identity-providers/google': '/docs/lifecycle/authenticate-users/identity-providers/social/google', - '/docs/v1/tech/identity-providers/hypr': '/docs/lifecycle/authenticate-users/identity-providers/enterprise/hypr', - '/docs/v1/tech/identity-providers/linkedin': '/docs/lifecycle/authenticate-users/identity-providers/social/linkedin', - '/docs/v1/tech/identity-providers/nintendo': '/docs/lifecycle/authenticate-users/identity-providers/gaming/nintendo', - '/docs/v1/tech/identity-providers/openid-connect/': '/docs/lifecycle/authenticate-users/identity-providers/', - '/docs/v1/tech/identity-providers/openid-connect/azure-ad': '/docs/lifecycle/authenticate-users/identity-providers/enterprise/azure-ad', - '/docs/v1/tech/identity-providers/openid-connect/cognito': '/docs/lifecycle/authenticate-users/identity-providers/social/cognito', - '/docs/v1/tech/identity-providers/openid-connect/discord': '/docs/lifecycle/authenticate-users/identity-providers/gaming/discord', - '/docs/v1/tech/identity-providers/openid-connect/github': '/docs/lifecycle/authenticate-users/identity-providers/social/github', - '/docs/v1/tech/identity-providers/openid-connect/okta': '/docs/lifecycle/authenticate-users/identity-providers/enterprise/okta', - '/docs/v1/tech/identity-providers/samlv2-idp-initiated/': '/docs/lifecycle/authenticate-users/identity-providers/enterprise/samlv2-idp-initiated', - '/docs/v1/tech/identity-providers/samlv2-idp-initiated/okta': '/docs/lifecycle/authenticate-users/identity-providers/enterprise/okta', - '/docs/v1/tech/identity-providers/samlv2/': '/docs/lifecycle/authenticate-users/identity-providers/', - '/docs/v1/tech/identity-providers/samlv2/adfs': '/docs/lifecycle/authenticate-users/identity-providers/enterprise/adfs', - '/docs/v1/tech/identity-providers/samlv2/azure-ad': '/docs/lifecycle/authenticate-users/identity-providers/enterprise/azure-ad', - '/docs/v1/tech/identity-providers/sony': '/docs/lifecycle/authenticate-users/identity-providers/gaming/sony', - '/docs/v1/tech/identity-providers/steam': '/docs/lifecycle/authenticate-users/identity-providers/gaming/steam', - '/docs/v1/tech/identity-providers/twitch': '/docs/lifecycle/authenticate-users/identity-providers/gaming/twitch', - '/docs/v1/tech/identity-providers/twitter': '/docs/lifecycle/authenticate-users/identity-providers/social/twitter', - '/docs/v1/tech/identity-providers/xbox': '/docs/lifecycle/authenticate-users/identity-providers/gaming/xbox', - '/docs/v1/tech/installation-guide/cloud': '/docs/get-started/run-in-the-cloud/cloud', - '/docs/v1/tech/installation-guide/cluster': '/docs/operate/deploy/cluster', - '/docs/v1/tech/installation-guide/common-configuration': '/docs/get-started/download-and-install/common-configuration', - '/docs/v1/tech/installation-guide/configuration-management': '/docs/operate/deploy/configuration-management', - '/docs/v1/tech/installation-guide/database': '/docs/get-started/download-and-install/database', - '/docs/v1/tech/installation-guide/docker': '/docs/get-started/download-and-install/docker', - '/docs/v1/tech/installation-guide/fast-path': '/docs/get-started/download-and-install/fast-path', - '/docs/v1/tech/installation-guide/fusionauth-app': '/docs/get-started/download-and-install/fusionauth-app', - '/docs/v1/tech/installation-guide/fusionauth-search': '/docs/get-started/download-and-install/fusionauth-search', - '/docs/v1/tech/installation-guide/homebrew': '/docs/get-started/download-and-install/homebrew', - '/docs/v1/tech/installation-guide/kickstart': '/docs/get-started/download-and-install/development/kickstart', - '/docs/v1/tech/installation-guide/kubernetes/': '/docs/get-started/download-and-install/kubernetes/', - '/docs/v1/tech/installation-guide/kubernetes/fusionauth-deployment': '/docs/get-started/download-and-install/kubernetes/fusionauth-deployment', - '/docs/v1/tech/installation-guide/kubernetes/setup/aks': '/docs/get-started/download-and-install/kubernetes/aks', - '/docs/v1/tech/installation-guide/kubernetes/setup/eks': '/docs/get-started/download-and-install/kubernetes/eks', - '/docs/v1/tech/installation-guide/kubernetes/setup/gke': '/docs/get-started/download-and-install/kubernetes/gke', - '/docs/v1/tech/installation-guide/kubernetes/setup/minikube': '/docs/get-started/download-and-install/kubernetes/minikube', - '/docs/v1/tech/installation-guide/marketplaces': '/docs/get-started/run-in-the-cloud/marketplaces', - '/docs/v1/tech/installation-guide/migration': '/archive/passport-to-fusionauth', - '/docs/v1/tech/installation-guide/monitor': '/docs/operate/secure-and-monitor/monitor', - '/docs/v1/tech/installation-guide/packages': '/docs/get-started/download-and-install/packages', - '/docs/v1/tech/installation-guide/securing': '/docs/operate/secure-and-monitor/securing', - '/docs/v1/tech/installation-guide/server-layout': '/docs/get-started/download-and-install/server-layout', - '/docs/v1/tech/installation-guide/system-requirements': '/docs/get-started/download-and-install/system-requirements', - '/docs/v1/tech/installation-guide/upgrade': '/docs/operate/deploy/upgrade', - '/docs/v1/tech/integrations/cleanspeak': '/docs/lifecycle/manage-users/cleanspeak', - '/docs/v1/tech/integrations/kafka': '/docs/extend/events-and-webhooks/kafka', - '/docs/v1/tech/integrations/twilio': '/docs/customize/email-and-messages/deprecated/twilio', - '/docs/v1/tech/lambdas/': '/docs/extend/code/lambdas/', - '/docs/v1/tech/messengers/': '/docs/customize/email-and-messages/', - '/docs/v1/tech/messengers/generic-messenger': '/docs/customize/email-and-messages/generic-messenger', - '/docs/v1/tech/messengers/twilio-messenger': '/docs/customize/email-and-messages/twilio-messenger', - '/docs/v1/tech/migration-guide/': '/docs/lifecycle/migrate-users/', - '/docs/v1/tech/migration-guide/auth0': '/docs/lifecycle/migrate-users/bulk/auth0', - '/docs/v1/tech/migration-guide/azureadb2c': '/docs/lifecycle/migrate-users/bulk/azureadb2c', - '/docs/v1/tech/migration-guide/cognito': '/docs/lifecycle/migrate-users/bulk/cognito', - '/docs/v1/tech/migration-guide/duende': '/docs/lifecycle/migrate-users/bulk/duende', - '/docs/v1/tech/migration-guide/firebase': '/docs/lifecycle/migrate-users/bulk/firebase', - '/docs/v1/tech/migration-guide/general': '/docs/lifecycle/migrate-users/bulk/general', - '/docs/v1/tech/migration-guide/keycloak': '/docs/lifecycle/migrate-users/bulk/keycloak', - '/docs/v1/tech/migration-guide/supabase': '/docs/lifecycle/migrate-users/bulk/supabase', - '/docs/v1/tech/migration-guide/tutorial': '/docs/lifecycle/migrate-users/bulk/tutorial', - '/docs/v1/tech/oauth/': '/docs/lifecycle/authenticate-users/oauth/', - '/docs/v1/tech/oauth/endpoints': '/docs/lifecycle/authenticate-users/oauth/endpoints', - '/docs/v1/tech/oauth/integrations/cockroachdb': '/docs/lifecycle/authenticate-users/integrations/oidc/cockroachdb', - '/docs/v1/tech/oauth/integrations/salesforce': '/docs/lifecycle/authenticate-users/integrations/oidc/salesforce', - '/docs/v1/tech/oauth/tokens': '/docs/lifecycle/authenticate-users/oauth/tokens', - '/docs/v1/tech/oauth/url-validation': '/docs/lifecycle/authenticate-users/oauth/url-validation', - '/docs/v1/tech/passwordless/': '/docs/lifecycle/authenticate-users/passwordless/', - '/docs/v1/tech/passwordless/magic-links': '/docs/lifecycle/authenticate-users/passwordless/magic-links', - '/docs/v1/tech/passwordless/webauthn': '/docs/lifecycle/authenticate-users/passwordless/webauthn-passkeys', - '/docs/v1/tech/passwordless/webauthn-passkeys': '/docs/lifecycle/authenticate-users/passwordless/webauthn-passkeys', - '/docs/v1/tech/plugins/': '/docs/extend/code/password-hashes/', - '/docs/v1/tech/plugins/custom-password-hashing': '/docs/extend/code/password-hashes/custom-password-hashing', - '/docs/v1/tech/plugins/password-encryptors': '/docs/extend/code/password-hashes/custom-password-hashing', - '/docs/v1/tech/plugins/writing-a-plugin': '/docs/extend/code/password-hashes/writing-a-plugin', - '/docs/v1/tech/premium-features/': '/docs/get-started/core-concepts/premium-features', - '/docs/v1/tech/premium-features/scim/azure-ad-client': '/docs/lifecycle/migrate-users/scim/azure-ad-client', - '/docs/v1/tech/premium-features/scim/okta-client': '/docs/lifecycle/migrate-users/scim/okta-client', - '/docs/v1/tech/premium-features/scim/scim-sdk': '/docs/lifecycle/migrate-users/scim/scim-sdk', - '/docs/v1/tech/reactor': '/docs/get-started/core-concepts/licensing', - '/docs/v1/tech/reactor/': '/docs/get-started/core-concepts/licensing', - '/docs/v1/tech/reference/': '/docs/reference/', - '/docs/v1/tech/reference/configuration': '/docs/reference/configuration', - '/docs/v1/tech/reference/cookies': '/docs/reference/cookies', - '/docs/v1/tech/reference/cors': '/docs/operate/secure-and-monitor/cors', - '/docs/v1/tech/reference/data-types': '/docs/reference/data-types', - '/docs/v1/tech/reference/limitations': '/docs/get-started/core-concepts/limitations', - '/docs/v1/tech/reference/password-encryptors': '/docs/reference/password-hashes', - '/docs/v1/tech/reference/password-hashes': '/docs/reference/password-hashes', - '/docs/v1/tech/release-notes': '/docs/release-notes/', - '/docs/v1/tech/samlv2/': '/docs/lifecycle/authenticate-users/saml/', - '/docs/v1/tech/samlv2/aiven': '/docs/lifecycle/authenticate-users/integrations/saml/aiven', - '/docs/v1/tech/samlv2/google': '/docs/lifecycle/authenticate-users/integrations/saml/google', - '/docs/v1/tech/samlv2/pagerduty': '/docs/lifecycle/authenticate-users/integrations/saml/pagerduty', - '/docs/v1/tech/samlv2/sendgrid': '/docs/lifecycle/authenticate-users/integrations/saml/sendgrid', - '/docs/v1/tech/samlv2/tableau-cloud': '/docs/lifecycle/authenticate-users/integrations/saml/tableau-cloud', - '/docs/v1/tech/samlv2/zendesk': '/docs/lifecycle/authenticate-users/integrations/saml/zendesk', - '/docs/v1/tech/themes/': '/docs/customize/look-and-feel/', - '/docs/v1/tech/themes/application-specific-themes': '/docs/customize/look-and-feel/application-specific-themes', - '/docs/v1/tech/themes/client-side-password-rule-validation': '/docs/customize/look-and-feel/client-side-password-rule-validation', - '/docs/v1/tech/themes/examples': '/docs/customize/look-and-feel/examples', - '/docs/v1/tech/themes/helpers': '/docs/customize/look-and-feel/helpers', - '/docs/v1/tech/themes/kickstart-custom-theme': '/docs/customize/look-and-feel/kickstart-custom-theme', - '/docs/v1/tech/themes/localization': '/docs/customize/look-and-feel/localization', - '/docs/v1/tech/themes/tailwind': '/docs/customize/look-and-feel/tailwind', - '/docs/v1/tech/themes/template-variables': '/docs/customize/look-and-feel/template-variables', - '/docs/v1/tech/troubleshooting': '/docs/operate/troubleshooting/troubleshooting', - '/docs/v1/tech/tutorials/application-authentication-tokens': '/docs/lifecycle/authenticate-users/application-authentication-tokens', - '/docs/v1/tech/tutorials/gate-accounts-until-verified': '/docs/lifecycle/manage-users/verification/gate-accounts-until-user-email-verified', - '/docs/v1/tech/tutorials/gating/gate-accounts-until-user-email-verified': '/docs/lifecycle/manage-users/verification/gate-accounts-until-user-email-verified', - '/docs/v1/tech/tutorials/gating/registration-gate-accounts-until-verified': '/docs/lifecycle/manage-users/verification/registration-gate-accounts-until-verified', - '/docs/v1/tech/tutorials/gating/setting-up-user-account-lockout': '/docs/lifecycle/authenticate-users/setting-up-user-account-lockout', - '/docs/v1/tech/tutorials/integrate-angular': '/docs/quickstarts/quickstart-javascript-angular-web', - '/docs/v1/tech/tutorials/integrate-dotnet': '/docs/quickstarts/quickstart-dotnet-web', - '/docs/v1/tech/tutorials/integrate-java-spring': '/docs/quickstarts/quickstart-springboot-web', - '/docs/v1/tech/tutorials/integrate-python-django': '/docs/quickstarts/quickstart-python-django-web', - '/docs/v1/tech/tutorials/integrate-python-flask': '/docs/quickstarts/quickstart-python-flask-web', - '/docs/v1/tech/tutorials/integrate-react': '/docs/quickstarts/quickstart-javascript-react-web', - '/docs/v1/tech/tutorials/integrate-ruby-rails': '/docs/quickstarts/quickstart-ruby-rails-web', - '/docs/v1/tech/tutorials/json-web-tokens': '/docs/lifecycle/authenticate-users/login-api/json-web-tokens', - '/docs/v1/tech/tutorials/key-rotation': '/docs/operate/secure-and-monitor/key-rotation', - '/docs/v1/tech/tutorials/migrate-users': '/docs/lifecycle/migrate-users/bulk/tutorial', - '/docs/v1/tech/tutorials/prometheus': '/docs/operate/secure-and-monitor/prometheus', - '/docs/v1/tech/tutorials/register-user-login-api': '/docs/lifecycle/register-users/register-user-login-api', - '/docs/v1/tech/tutorials/setting-up-user-account-lockout': '/docs/lifecycle/authenticate-users/setting-up-user-account-lockout', - '/docs/v1/tech/tutorials/setup-wizard': '/docs/get-started/download-and-install/setup-wizard', - '/docs/v1/tech/tutorials/start-and-stop': '/docs/get-started/download-and-install/start-and-stop', - '/docs/v1/tech/tutorials/switch-search-engines': '/docs/lifecycle/manage-users/search/switch-search-engines', - '/docs/v1/tech/tutorials/two-factor/': '/docs/customize/email-and-messages/deprecated/', - '/docs/v1/tech/tutorials/two-factor/authenticator-app': '/docs/customize/email-and-messages/deprecated/authenticator-app-pre-1-26', - '/docs/v1/tech/tutorials/two-factor/authenticator-app-pre-1-26': '/docs/customize/email-and-messages/deprecated/authenticator-app-pre-1-26', - '/docs/v1/tech/tutorials/two-factor/twilio-push': '/docs/customize/email-and-messages/deprecated/twilio-push-pre-1-26', - '/docs/v1/tech/tutorials/two-factor/twilio-push-pre-1-26': '/docs/customize/email-and-messages/deprecated/twilio-push-pre-1-26', - '/features/advanced-registration-forms': '/platform/registration-forms', - '/features/architecture': '/platform/built-for-developers', - '/features/breached-password-detection': '/features/authentication', - '/features/built-for-developers': '/platform/built-for-developers', - '/features/connectors': '/features/authentication', - '/features/scalability': '/platform/scalable', - '/features/security-data-compliance': '/security-data-compliance', - '/features/user-experience': '/platform/customizable', - '/features/user-management-reporting': '/features/user-management', - '/gaming': '/industries/gaming-entertainment', - '/gaming/': '/industries/gaming-entertainment', - '/kubernetes': '/docs/get-started/download-and-install/kubernetes/', - '/kubernetes/': '/docs/get-started/download-and-install/kubernetes/', - '/learn/expert-advice/': '/articles/', - '/learn/expert-advice/authentication/gaming-identity-provider-needs': '/articles/gaming-entertainment/gaming-identity-provider-needs', - '/learn/expert-advice/authentication/login-authentication-workflows': '/articles/login-authentication-workflows/authentication-workflows-overview', - '/learn/expert-advice/authentication/login-authentication-workflows/': '/articles/login-authentication-workflows/authentication-workflows-overview', - '/learn/expert-advice/ciam/ciam-vs-iam': '/articles/ciam/ciam-vs-iam', - '/learn/expert-advice/identity-basics/avoid-lockin': '/articles/authentication/avoid-lockin', - '/learn/expert-advice/identity-basics/common-authentication-implementation-risks': '/articles/authentication/common-authentication-implementation-risks', - '/learn/expert-advice/identity-basics/making-sure-your-auth-system-scales': '/articles/ciam/making-sure-your-auth-system-scales', - '/learn/expert-advice/identity-basics/value-standards-compliant-authentication': '/articles/oauth/value-standards-compliant-authentication', - '/learn/expert-advice/security/guide-to-user-data-security': '/articles/security/guide-to-user-data-security', - '/learn/expert-advice/tokens/anatomy-of-jwt': '/articles/tokens/jwt-components-explained', - '/learn/expert-advice/tokens/jwt-authentication-token-components-explained': '/articles/tokens/jwt-components-explained', - '/podcast': '/', - '/podcast/': '/', - '/pricing/cloud': '/pricing', - '/pricing/cloud/': '/pricing', - '/pricing/edition': '/pricing', - '/pricing/edition/': '/pricing', - '/pricing/editions': '/pricing', - '/pricing/editions/': '/pricing', - '/products/identity-user-management/ciam-vs-iam': '/articles/ciam/ciam-vs-iam', - '/resources/auth0-migration': '/auth0-migration', - '/resources/guide-to-user-data-security': '/articles/security/guide-to-user-data-security', - '/upgrade/from-homegrown': '/compare', - '/upgrade/from-open-source': '/compare', - '/upgrade/from-saas': '/compare' - }, - - indexPaths: { - '/articles/': true, - '/articles/authentication/': true, - '/articles/ciam/': true, - '/articles/gaming-entertainment/': true, - '/articles/identity-basics/': true, - '/articles/login-authentication-workflows/': true, - '/articles/login-authentication-workflows/mobile/': true, - '/articles/login-authentication-workflows/spa/': true, - '/articles/login-authentication-workflows/webapp/': true, - '/articles/oauth/': true, - '/articles/security/': true, - '/articles/tokens/': true, - '/blog/': true, - '/community/forum/': true, - '/dev-tools/': true, - '/docs/': true, - '/docs/apis/': true, - '/docs/apis/connectors/': true, - '/docs/apis/custom-forms/': true, - '/docs/apis/entities/': true, - '/docs/apis/identity-providers/': true, - '/docs/apis/messengers/': true, - '/docs/apis/scim/': true, - '/docs/archive/': true, - '/docs/archive/apis/': true, - '/docs/customize/': true, - '/docs/customize/email-and-messages/': true, - '/docs/customize/email-and-messages/deprecated/': true, - '/docs/customize/look-and-feel/': true, - '/docs/extend/': true, - '/docs/extend/code/': true, - '/docs/extend/code/lambdas/': true, - '/docs/extend/code/password-hashes/': true, - '/docs/extend/events-and-webhooks/': true, - '/docs/extend/events-and-webhooks/events/': true, - '/docs/extend/events-and-webhooks/kafka/': true, - '/docs/extend/examples/': true, - '/docs/extend/examples/api-gateways/': true, - '/docs/get-started/': true, - '/docs/get-started/core-concepts/': true, - '/docs/get-started/download-and-install/': true, - '/docs/get-started/download-and-install/development/': true, - '/docs/get-started/download-and-install/kubernetes/': true, - '/docs/get-started/run-in-the-cloud/': true, - '/docs/lifecycle/': true, - '/docs/lifecycle/authenticate-users/': true, - '/docs/lifecycle/authenticate-users/identity-providers/': true, - '/docs/lifecycle/authenticate-users/identity-providers/enterprise/': true, - '/docs/lifecycle/authenticate-users/identity-providers/external-jwt/': true, - '/docs/lifecycle/authenticate-users/identity-providers/gaming/': true, - '/docs/lifecycle/authenticate-users/identity-providers/social/': true, - '/docs/lifecycle/authenticate-users/integrations/': true, - '/docs/lifecycle/authenticate-users/integrations/oidc/': true, - '/docs/lifecycle/authenticate-users/integrations/saml/': true, - '/docs/lifecycle/authenticate-users/login-api/': true, - '/docs/lifecycle/authenticate-users/oauth/': true, - '/docs/lifecycle/authenticate-users/passwordless/': true, - '/docs/lifecycle/authenticate-users/saml/': true, - '/docs/lifecycle/manage-users/': true, - '/docs/lifecycle/manage-users/account-management/': true, - '/docs/lifecycle/manage-users/search/': true, - '/docs/lifecycle/manage-users/verification/': true, - '/docs/lifecycle/migrate-users/': true, - '/docs/lifecycle/migrate-users/bulk/': true, - '/docs/lifecycle/migrate-users/connectors/': true, - '/docs/lifecycle/migrate-users/scim/': true, - '/docs/lifecycle/register-users/': true, - '/docs/operate/': true, - '/docs/operate/deploy/': true, - '/docs/operate/roadmap/': true, - '/docs/operate/secure-and-monitor/': true, - '/docs/operate/troubleshooting/': true, - '/docs/quickstarts/': true, - '/docs/reference/': true, - '/docs/release-notes/': true, - '/docs/sdks/': true, - '/docs/sdks/examples/': true, - '/docs/v1/tech/': true, - '/docs/v1/tech/account-management/': true, - '/docs/v1/tech/admin-guide/': true, - '/docs/v1/tech/advanced-threat-detection/': true, - '/docs/v1/tech/apis/': true, - '/docs/v1/tech/apis/connectors/': true, - '/docs/v1/tech/apis/entity-management/': true, - '/docs/v1/tech/apis/identity-providers/': true, - '/docs/v1/tech/apis/messengers/': true, - '/docs/v1/tech/apis/scim/': true, - '/docs/v1/tech/client-libraries/': true, - '/docs/v1/tech/connectors/': true, - '/docs/v1/tech/core-concepts/': true, - '/docs/v1/tech/developer-guide/': true, - '/docs/v1/tech/developer-guide/api-gateways/': true, - '/docs/v1/tech/email-templates/': true, - '/docs/v1/tech/events-webhooks/': true, - '/docs/v1/tech/events-webhooks/events/': true, - '/docs/v1/tech/example-apps/': true, - '/docs/v1/tech/getting-started/': true, - '/docs/v1/tech/guides/': true, - '/docs/v1/tech/identity-providers/': true, - '/docs/v1/tech/identity-providers/external-jwt/': true, - '/docs/v1/tech/identity-providers/openid-connect/': true, - '/docs/v1/tech/identity-providers/samlv2-idp-initiated/': true, - '/docs/v1/tech/identity-providers/samlv2/': true, - '/docs/v1/tech/installation-guide/': true, - '/docs/v1/tech/installation-guide/kubernetes/': true, - '/docs/v1/tech/integrations/': true, - '/docs/v1/tech/lambdas/': true, - '/docs/v1/tech/messengers/': true, - '/docs/v1/tech/migration-guide/': true, - '/docs/v1/tech/oauth/': true, - '/docs/v1/tech/passwordless/': true, - '/docs/v1/tech/plugins/': true, - '/docs/v1/tech/premium-features/': true, - '/docs/v1/tech/premium-features/webauthn/': true, - '/docs/v1/tech/reference/': true, - '/docs/v1/tech/samlv2/': true, - '/docs/v1/tech/themes/': true, - '/docs/v1/tech/tutorials/': true, - '/docs/v1/tech/tutorials/gating/': true, - '/docs/v1/tech/tutorials/two-factor/': true, - '/how-to/': true, - '/quickstarts/': true - }, - redirectsByPrefix: [ - ['/learn/expert-advice/dev-tools', '/dev-tools'], - ['/learn/expert-advice/authentication/spa', '/articles/login-authentication-workflows/spa'], - ['/learn/expert-advice/authentication/mobile', '/articles/login-authentication-workflows/mobile'], - ['/learn/expert-advice/authentication/webapp', '/articles/login-authentication-workflows/webapp'], - ['/learn/expert-advice', '/articles'] - ], - redirectsByRegex: [ - ['^/blog/(category|tag|author)/([^/]*)$', '$&/'], - ['/blog/archive/tag/', '/blog/tag/'], - ['/blog/\\d\\d\\d\\d/\\d\\d/\\d\\d/', '/blog/'] - ], - s3Paths: ['/direct-download', '/license'], - s3Prefixes: ['/blog/', '/docs/', '/legal/', '/articles/', '/dev-tools/'] -} - -exports.handler = (event, context, callback) => { - var req = event.Records[0].cf.request; - var uri = req.uri; - var result = req; - - if (uri.endsWith('.html')) { - - // there shouldn't be links to .html files out there - result = redir(uri.substring(0, uri.length - 5)); - - } else if (uri.endsWith('/') && removeSlash(uri)) { - - // if this seems to be a reference to a file but with a trailing slash, remove it - result = redir(uri.substring(0, uri.length - 1)); - - } else if (!uri.endsWith('/') && referenceData.indexPaths[uri + '/'] === true) { - - // if this is a reference to an index page that is missing its slash, add it - result = redir(uri + '/'); - } else { - - var redirect = calculateRedirect(uri); - - if (redirect !== null) { - result = redir(redirect); - } else { - req.uri = calculateURI(uri); - } - } - - callback(null, result); -} - -// returns true if this seems to be a link to a page with a trailing slash that should just be removed -function removeSlash(uri) { - return referenceData.indexPaths[uri] !== true && - (!uri.startsWith('/blog') || (uri.match('^/blog/[\\w\\d-]*/$') && !uri.match('^/blog/latest/$'))) && - referenceData.redirectsByPrefix.find(e => uri.startsWith(e[0])) === undefined; -} - -function calculateRedirect(uri) { - var result = referenceData.redirects.hasOwnProperty(uri) ? referenceData.redirects[uri] : null; - - if (result === null) { - var prefix_replacement = referenceData.redirectsByPrefix.find(e => uri.startsWith(e[0])); - - if (prefix_replacement !== undefined) { - result = uri.replace(prefix_replacement[0], prefix_replacement[1]); - } - } - - if (result === null) { - referenceData.redirectsByRegex.forEach(function (regexValueArray) { - var regex = new RegExp(regexValueArray[0], "g"); - var value = regexValueArray[1]; - if (regex.test(uri)) { - result = uri.replace(regex, value); - } - }); - } - - return result; -} - -function appendHTML(uri) { - var slashIndex = uri.lastIndexOf('/'); - var dotIndex = uri.indexOf('.', slashIndex); - if (slashIndex < uri.length - 1 && dotIndex < 0) { - uri = uri + '.html'; - } - return uri; -} - -function calculateURI(uri) { - var i; - for (i = 0; i < referenceData.s3Prefixes.length; i++) { - if (uri.startsWith(referenceData.s3Prefixes[i])) { - return uri.endsWith('/') ? uri + 'index.html' : appendHTML(uri); - } - } - - for (i = 0; i < referenceData.s3Paths.length; i++) { - if (uri === referenceData.s3Paths[i]) { - return appendHTML(uri); - } - } - - return uri; -} - -function redir(loc) { - return {status:301,statusDescription:'Moved',headers:{'location':[{key: 'Location', value: loc}]}} -} diff --git a/src/lambdas/fusionauth-site-origin-handler/README.md b/src/lambdas/fusionauth-site-origin-handler/README.md new file mode 100644 index 0000000000..2ee26bb016 --- /dev/null +++ b/src/lambdas/fusionauth-site-origin-handler/README.md @@ -0,0 +1,17 @@ +# fusionauth-site-origin-handler + +This is a Lambda@Edge function that handles redirects for fusionauth.dev. + +## Localdev + +You'll need Node 18 or later installed. + +From this directory, install the dependencies. +``` +npm install +``` + +Run the tests with AWS credentials that have permissions to read from the `fusionauth-dev-us-east-1-artifacts` bucket. +``` +AWS_PROFILE=fusionauth-dev npm test +``` diff --git a/src/lambdas/fusionauth-site-origin-handler/data/redirects.json b/src/lambdas/fusionauth-site-origin-handler/data/redirects.json new file mode 100644 index 0000000000..9e176ae357 --- /dev/null +++ b/src/lambdas/fusionauth-site-origin-handler/data/redirects.json @@ -0,0 +1,566 @@ +{ + "redirects": { + "/articles/oauth/what-is-oauth": "/articles/oauth/modern-guide-to-oauth", + "/blog/archive/category/announcement": "/blog/category/news", + "/blog/archive/category/article": "/blog/category/education", + "/blog/archive/category/community": "/blog/category/community", + "/blog/archive/category/comparison": "/blog/category/compare", + "/blog/archive/category/features": "/blog/category/product", + "/blog/archive/category/tutorial": "/blog/category/tutorial", + "/cognito": "/docs/lifecycle/migrate-users/bulk/cognito", + "/dev-tools/jwt-debugger": "/dev-tools/jwt-decoder", + "/docs/v1/tech/": "/docs/", + "/docs/v1/tech/5-minute-setup-guide": "/docs/quickstarts/5-minute-setup-guide", + "/docs/v1/tech/account-management/": "/docs/lifecycle/manage-users/account-management/", + "/docs/v1/tech/account-management/add-webauthn": "/docs/lifecycle/manage-users/account-management/add-webauthn", + "/docs/v1/tech/account-management/bootstrapping-login": "/docs/lifecycle/manage-users/account-management/bootstrapping-login", + "/docs/v1/tech/account-management/customizing-account-management": "/docs/lifecycle/manage-users/account-management/customizing-account-management", + "/docs/v1/tech/account-management/troubleshooting": "/docs/lifecycle/manage-users/account-management/troubleshooting", + "/docs/v1/tech/account-management/two-factor-authenticator": "/docs/lifecycle/manage-users/account-management/two-factor-authenticator", + "/docs/v1/tech/account-management/two-factor-email": "/docs/lifecycle/manage-users/account-management/two-factor-email", + "/docs/v1/tech/account-management/two-factor-sms": "/docs/lifecycle/manage-users/account-management/two-factor-sms", + "/docs/v1/tech/account-management/updating-user-data": "/docs/lifecycle/manage-users/account-management/updating-user-data", + "/docs/v1/tech/admin-guide/account-portal": "/docs/get-started/download-and-install/account-portal", + "/docs/v1/tech/admin-guide/cli": "/docs/customize/look-and-feel/cli", + "/docs/v1/tech/admin-guide/configuration-management": "/docs/operate/deploy/configuration-management", + "/docs/v1/tech/admin-guide/licensing": "/docs/get-started/core-concepts/licensing", + "/docs/v1/tech/admin-guide/monitor": "/docs/operate/secure-and-monitor/monitor", + "/docs/v1/tech/admin-guide/proxy-setup": "/docs/operate/deploy/proxy-setup", + "/docs/v1/tech/admin-guide/release-notifications": "/docs/operate/roadmap/releases", + "/docs/v1/tech/admin-guide/releases": "/docs/operate/roadmap/releases", + "/docs/v1/tech/admin-guide/securing": "/docs/operate/secure-and-monitor/securing", + "/docs/v1/tech/admin-guide/technical-support": "/docs/operate/troubleshooting/technical-support", + "/docs/v1/tech/admin-guide/troubleshooting": "/docs/operate/troubleshooting/troubleshooting", + "/docs/v1/tech/admin-guide/upgrade": "/docs/operate/deploy/upgrade", + "/docs/v1/tech/admin-guide/user-support-guide": "/docs/operate/deploy/user-support-guide", + "/docs/v1/tech/admin-guide/vulnerabilities": "/docs/operate/secure-and-monitor/vulnerabilities", + "/docs/v1/tech/admin-guide/webauthn": "/docs/lifecycle/authenticate-users/passwordless/webauthn", + "/docs/v1/tech/advanced-threat-detection/": "/docs/operate/secure-and-monitor/advanced-threat-detection", + "/docs/v1/tech/apis/": "/docs/apis/", + "/docs/v1/tech/apis/actioning-users": "/docs/apis/actioning-users", + "/docs/v1/tech/apis/api-explorer": "/docs/apis/api-explorer", + "/docs/v1/tech/apis/api-keys": "/docs/apis/api-keys", + "/docs/v1/tech/apis/applications": "/docs/apis/applications", + "/docs/v1/tech/apis/audit-logs": "/docs/apis/audit-logs", + "/docs/v1/tech/apis/authentication": "/docs/apis/authentication", + "/docs/v1/tech/apis/connectors/": "/docs/apis/connectors/", + "/docs/v1/tech/apis/connectors/generic": "/docs/apis/connectors/generic", + "/docs/v1/tech/apis/connectors/ldap": "/docs/apis/connectors/ldap", + "/docs/v1/tech/apis/consent": "/docs/apis/consents", + "/docs/v1/tech/apis/consents": "/docs/apis/consents", + "/docs/v1/tech/apis/emails": "/docs/apis/emails", + "/docs/v1/tech/apis/entity-management/": "/docs/apis/entities/", + "/docs/v1/tech/apis/entity-management/entities": "/docs/apis/entities/entities", + "/docs/v1/tech/apis/entity-management/entity-types": "/docs/apis/entities/entity-types", + "/docs/v1/tech/apis/entity-management/grants": "/docs/apis/entities/grants", + "/docs/v1/tech/apis/errors": "/docs/apis/errors", + "/docs/v1/tech/apis/event-logs": "/docs/apis/event-logs", + "/docs/v1/tech/apis/families": "/docs/apis/families", + "/docs/v1/tech/apis/form-fields": "/docs/apis/custom-forms/form-fields", + "/docs/v1/tech/apis/forms": "/docs/apis/custom-forms/forms", + "/docs/v1/tech/apis/groups": "/docs/apis/groups", + "/docs/v1/tech/apis/hosted-backend": "/docs/apis/hosted-backend", + "/docs/v1/tech/apis/identity-providers/": "/docs/apis/identity-providers/", + "/docs/v1/tech/apis/identity-providers/apple": "/docs/apis/identity-providers/apple", + "/docs/v1/tech/apis/identity-providers/epicgames": "/docs/apis/identity-providers/epicgames", + "/docs/v1/tech/apis/identity-providers/external-jwt": "/docs/apis/identity-providers/external-jwt", + "/docs/v1/tech/apis/identity-providers/facebook": "/docs/apis/identity-providers/facebook", + "/docs/v1/tech/apis/identity-providers/google": "/docs/apis/identity-providers/google", + "/docs/v1/tech/apis/identity-providers/hypr": "/docs/apis/identity-providers/hypr", + "/docs/v1/tech/apis/identity-providers/linkedin": "/docs/apis/identity-providers/linkedin", + "/docs/v1/tech/apis/identity-providers/links": "/docs/apis/identity-providers/links", + "/docs/v1/tech/apis/identity-providers/nintendo": "/docs/apis/identity-providers/nintendo", + "/docs/v1/tech/apis/identity-providers/openid-connect": "/docs/apis/identity-providers/openid-connect", + "/docs/v1/tech/apis/identity-providers/samlv2": "/docs/apis/identity-providers/samlv2", + "/docs/v1/tech/apis/identity-providers/samlv2-idp-initiated": "/docs/apis/identity-providers/samlv2-idp-initiated", + "/docs/v1/tech/apis/identity-providers/sonypsn": "/docs/apis/identity-providers/sonypsn", + "/docs/v1/tech/apis/identity-providers/steam": "/docs/apis/identity-providers/steam", + "/docs/v1/tech/apis/identity-providers/twitch": "/docs/apis/identity-providers/twitch", + "/docs/v1/tech/apis/identity-providers/twitter": "/docs/apis/identity-providers/twitter", + "/docs/v1/tech/apis/identity-providers/xbox": "/docs/apis/identity-providers/xbox", + "/docs/v1/tech/apis/integrations": "/docs/apis/integrations", + "/docs/v1/tech/apis/ip-acl": "/docs/apis/ip-acl", + "/docs/v1/tech/apis/jwt": "/docs/apis/jwt", + "/docs/v1/tech/apis/keys": "/docs/apis/keys", + "/docs/v1/tech/apis/lambdas": "/docs/apis/lambdas", + "/docs/v1/tech/apis/login": "/docs/apis/login", + "/docs/v1/tech/apis/message-templates": "/docs/apis/message-templates", + "/docs/v1/tech/apis/messengers/": "/docs/apis/messengers/", + "/docs/v1/tech/apis/messengers/generic": "/docs/apis/messengers/generic", + "/docs/v1/tech/apis/messengers/twilio": "/docs/apis/messengers/twilio", + "/docs/v1/tech/apis/passwordless": "/docs/apis/passwordless", + "/docs/v1/tech/apis/reactor": "/docs/apis/reactor", + "/docs/v1/tech/apis/registrations": "/docs/apis/registrations", + "/docs/v1/tech/apis/reports": "/docs/apis/reports", + "/docs/v1/tech/apis/scim/": "/docs/apis/scim/", + "/docs/v1/tech/apis/scim/SCIMEnterpriseUser": "/docs/apis/scim/SCIMEnterpriseUser", + "/docs/v1/tech/apis/scim/SCIMGroup": "/docs/apis/scim/SCIMGroup", + "/docs/v1/tech/apis/scim/SCIMServiceProvider": "/docs/apis/scim/SCIMServiceProvider", + "/docs/v1/tech/apis/scim/SCIMUser": "/docs/apis/scim/SCIMUser", + "/docs/v1/tech/apis/system": "/docs/apis/system", + "/docs/v1/tech/apis/tenants": "/docs/apis/tenants", + "/docs/v1/tech/apis/themes": "/docs/apis/themes", + "/docs/v1/tech/apis/two-factor": "/docs/apis/messengers/two-factor", + "/docs/v1/tech/apis/two-factor-1-25": "/docs/archive/apis/two-factor-1-25", + "/docs/v1/tech/apis/user-action-reasons": "/docs/apis/user-action-reasons", + "/docs/v1/tech/apis/user-actions": "/docs/apis/user-actions", + "/docs/v1/tech/apis/user-comments": "/docs/apis/user-comments", + "/docs/v1/tech/apis/users": "/docs/apis/users", + "/docs/v1/tech/apis/webauthn": "/docs/apis/webauthn", + "/docs/v1/tech/apis/webhooks": "/docs/apis/webhooks", + "/docs/v1/tech/archive/apis/system": "/docs/archive/apis/system-1-29", + "/docs/v1/tech/archive/release-notes": "/docs/archive/release-notes", + "/docs/v1/tech/client-libraries/": "/docs/sdks/", + "/docs/v1/tech/client-libraries/angular-sdk": "/docs/sdks/angular-sdk", + "/docs/v1/tech/client-libraries/dart": "/docs/sdks/dart", + "/docs/v1/tech/client-libraries/go": "/docs/sdks/go", + "/docs/v1/tech/client-libraries/java": "/docs/sdks/java", + "/docs/v1/tech/client-libraries/javascript": "/docs/sdks/javascript", + "/docs/v1/tech/client-libraries/netcore": "/docs/sdks/netcore", + "/docs/v1/tech/client-libraries/node": "/docs/sdks/node", + "/docs/v1/tech/client-libraries/openapi": "/docs/sdks/openapi", + "/docs/v1/tech/client-libraries/php": "/docs/sdks/php", + "/docs/v1/tech/client-libraries/python": "/docs/sdks/python", + "/docs/v1/tech/client-libraries/react-sdk": "/docs/sdks/react-sdk", + "/docs/v1/tech/client-libraries/ruby": "/docs/sdks/ruby", + "/docs/v1/tech/client-libraries/typescript": "/docs/sdks/typescript", + "/docs/v1/tech/client-libraries/vue-sdk": "/docs/sdks/vue-sdk", + "/docs/v1/tech/common-errors": "/docs/operate/troubleshooting/troubleshooting", + "/docs/v1/tech/connectors/": "/docs/lifecycle/migrate-users/connectors/", + "/docs/v1/tech/connectors/fusionauth-connector": "/docs/lifecycle/migrate-users/connectors/fusionauth-connector", + "/docs/v1/tech/connectors/generic-connector": "/docs/lifecycle/migrate-users/connectors/generic-connector", + "/docs/v1/tech/connectors/ldap-connector": "/docs/lifecycle/migrate-users/connectors/ldap-connector", + "/docs/v1/tech/core-concepts/applications": "/docs/get-started/core-concepts/applications", + "/docs/v1/tech/core-concepts/authentication-authorization": "/docs/get-started/core-concepts/authentication-authorization", + "/docs/v1/tech/core-concepts/editions-features": "/docs/get-started/core-concepts/editions-features", + "/docs/v1/tech/core-concepts/entity-management": "/docs/get-started/core-concepts/entity-management", + "/docs/v1/tech/core-concepts/groups": "/docs/get-started/core-concepts/groups", + "/docs/v1/tech/core-concepts/identity-providers": "/docs/get-started/core-concepts/identity-providers", + "/docs/v1/tech/core-concepts/integration-points": "/docs/get-started/core-concepts/integration-points", + "/docs/v1/tech/core-concepts/key-master": "/docs/operate/secure-and-monitor/key-master", + "/docs/v1/tech/core-concepts/localization-and-internationalization": "/docs/get-started/core-concepts/localization-and-internationalization", + "/docs/v1/tech/core-concepts/modes": "/docs/lifecycle/authenticate-users/oauth/modes", + "/docs/v1/tech/core-concepts/registrations": "/docs/get-started/core-concepts/registrations", + "/docs/v1/tech/core-concepts/roadmap": "/docs/operate/roadmap/roadmap", + "/docs/v1/tech/core-concepts/roles": "/docs/get-started/core-concepts/roles", + "/docs/v1/tech/core-concepts/scim": "/docs/lifecycle/migrate-users/scim/scim", + "/docs/v1/tech/core-concepts/search": "/docs/lifecycle/manage-users/search/search", + "/docs/v1/tech/core-concepts/tenants": "/docs/get-started/core-concepts/tenants", + "/docs/v1/tech/core-concepts/users": "/docs/get-started/core-concepts/users", + "/docs/v1/tech/developer-guide/api-gateways/": "/docs/extend/examples/api-gateways/", + "/docs/v1/tech/developer-guide/api-gateways/aws-api-gateway": "/docs/extend/examples/api-gateways/aws-api-gateway", + "/docs/v1/tech/developer-guide/api-gateways/haproxy-api-gateway": "/docs/extend/examples/api-gateways/haproxy-api-gateway", + "/docs/v1/tech/developer-guide/api-gateways/kong-gateway": "/docs/extend/examples/api-gateways/kong-gateway", + "/docs/v1/tech/developer-guide/api-gateways/ngrok-cloud-edge": "/docs/extend/examples/api-gateways/ngrok-cloud-edge", + "/docs/v1/tech/developer-guide/exposing-instance": "/docs/get-started/download-and-install/development/exposing-instance", + "/docs/v1/tech/email-templates/": "/docs/customize/email-and-messages/", + "/docs/v1/tech/email-templates/configure-email": "/docs/customize/email-and-messages/configure-email", + "/docs/v1/tech/email-templates/email-templates": "/docs/customize/email-and-messages/email-templates", + "/docs/v1/tech/email-templates/message-templates": "/docs/customize/email-and-messages/message-templates", + "/docs/v1/tech/email-templates/templates-replacement-variables": "/docs/customize/email-and-messages/templates-replacement-variables", + "/docs/v1/tech/events-webhooks/": "/docs/extend/events-and-webhooks/", + "/docs/v1/tech/events-webhooks/events/": "/docs/extend/events-and-webhooks/events/", + "/docs/v1/tech/events-webhooks/events/audit-log-create": "/docs/extend/events-and-webhooks/events/audit-log-create", + "/docs/v1/tech/events-webhooks/events/event-log-create": "/docs/extend/events-and-webhooks/events/event-log-create", + "/docs/v1/tech/events-webhooks/events/group-create": "/docs/extend/events-and-webhooks/events/group-create", + "/docs/v1/tech/events-webhooks/events/group-create-complete": "/docs/extend/events-and-webhooks/events/group-create-complete", + "/docs/v1/tech/events-webhooks/events/group-delete": "/docs/extend/events-and-webhooks/events/group-delete", + "/docs/v1/tech/events-webhooks/events/group-delete-complete": "/docs/extend/events-and-webhooks/events/group-delete-complete", + "/docs/v1/tech/events-webhooks/events/group-member-add": "/docs/extend/events-and-webhooks/events/group-member-add", + "/docs/v1/tech/events-webhooks/events/group-member-add-complete": "/docs/extend/events-and-webhooks/events/group-member-add-complete", + "/docs/v1/tech/events-webhooks/events/group-member-remove": "/docs/extend/events-and-webhooks/events/group-member-remove", + "/docs/v1/tech/events-webhooks/events/group-member-remove-complete": "/docs/extend/events-and-webhooks/events/group-member-remove-complete", + "/docs/v1/tech/events-webhooks/events/group-member-update": "/docs/extend/events-and-webhooks/events/group-member-update", + "/docs/v1/tech/events-webhooks/events/group-member-update-complete": "/docs/extend/events-and-webhooks/events/group-member-update-complete", + "/docs/v1/tech/events-webhooks/events/group-update": "/docs/extend/events-and-webhooks/events/group-update", + "/docs/v1/tech/events-webhooks/events/group-update-complete": "/docs/extend/events-and-webhooks/events/group-update-complete", + "/docs/v1/tech/events-webhooks/events/jwt-public-key-update": "/docs/extend/events-and-webhooks/events/jwt-public-key-update", + "/docs/v1/tech/events-webhooks/events/jwt-refresh": "/docs/extend/events-and-webhooks/events/jwt-refresh", + "/docs/v1/tech/events-webhooks/events/jwt-refresh-token-revoke": "/docs/extend/events-and-webhooks/events/jwt-refresh-token-revoke", + "/docs/v1/tech/events-webhooks/events/kickstart-success": "/docs/extend/events-and-webhooks/events/kickstart-success", + "/docs/v1/tech/events-webhooks/events/user-actions": "/docs/extend/events-and-webhooks/events/user-actions", + "/docs/v1/tech/events-webhooks/events/user-bulk-create": "/docs/extend/events-and-webhooks/events/user-bulk-create", + "/docs/v1/tech/events-webhooks/events/user-create": "/docs/extend/events-and-webhooks/events/user-create", + "/docs/v1/tech/events-webhooks/events/user-create-complete": "/docs/extend/events-and-webhooks/events/user-create-complete", + "/docs/v1/tech/events-webhooks/events/user-deactivate": "/docs/extend/events-and-webhooks/events/user-deactivate", + "/docs/v1/tech/events-webhooks/events/user-delete": "/docs/extend/events-and-webhooks/events/user-delete", + "/docs/v1/tech/events-webhooks/events/user-delete-complete": "/docs/extend/events-and-webhooks/events/user-delete-complete", + "/docs/v1/tech/events-webhooks/events/user-email-update": "/docs/extend/events-and-webhooks/events/user-email-update", + "/docs/v1/tech/events-webhooks/events/user-email-verified": "/docs/extend/events-and-webhooks/events/user-email-verified", + "/docs/v1/tech/events-webhooks/events/user-identity-provider-link": "/docs/extend/events-and-webhooks/events/user-identity-provider-link", + "/docs/v1/tech/events-webhooks/events/user-identity-provider-unlink": "/docs/extend/events-and-webhooks/events/user-identity-provider-unlink", + "/docs/v1/tech/events-webhooks/events/user-login-failed": "/docs/extend/events-and-webhooks/events/user-login-failed", + "/docs/v1/tech/events-webhooks/events/user-login-id-duplicate-create": "/docs/extend/events-and-webhooks/events/user-login-id-duplicate-create", + "/docs/v1/tech/events-webhooks/events/user-login-id-duplicate-update": "/docs/extend/events-and-webhooks/events/user-login-id-duplicate-update", + "/docs/v1/tech/events-webhooks/events/user-login-new-device": "/docs/extend/events-and-webhooks/events/user-login-new-device", + "/docs/v1/tech/events-webhooks/events/user-login-success": "/docs/extend/events-and-webhooks/events/user-login-success", + "/docs/v1/tech/events-webhooks/events/user-login-suspicious": "/docs/extend/events-and-webhooks/events/user-login-suspicious", + "/docs/v1/tech/events-webhooks/events/user-password-breach": "/docs/extend/events-and-webhooks/events/user-password-breach", + "/docs/v1/tech/events-webhooks/events/user-password-reset-send": "/docs/extend/events-and-webhooks/events/user-password-reset-send", + "/docs/v1/tech/events-webhooks/events/user-password-reset-start": "/docs/extend/events-and-webhooks/events/user-password-reset-start", + "/docs/v1/tech/events-webhooks/events/user-password-reset-success": "/docs/extend/events-and-webhooks/events/user-password-reset-success", + "/docs/v1/tech/events-webhooks/events/user-password-update": "/docs/extend/events-and-webhooks/events/user-password-update", + "/docs/v1/tech/events-webhooks/events/user-reactivate": "/docs/extend/events-and-webhooks/events/user-reactivate", + "/docs/v1/tech/events-webhooks/events/user-registration-create": "/docs/extend/events-and-webhooks/events/user-registration-create", + "/docs/v1/tech/events-webhooks/events/user-registration-create-complete": "/docs/extend/events-and-webhooks/events/user-registration-create-complete", + "/docs/v1/tech/events-webhooks/events/user-registration-delete": "/docs/extend/events-and-webhooks/events/user-registration-delete", + "/docs/v1/tech/events-webhooks/events/user-registration-delete-complete": "/docs/extend/events-and-webhooks/events/user-registration-delete-complete", + "/docs/v1/tech/events-webhooks/events/user-registration-update": "/docs/extend/events-and-webhooks/events/user-registration-update", + "/docs/v1/tech/events-webhooks/events/user-registration-update-complete": "/docs/extend/events-and-webhooks/events/user-registration-update-complete", + "/docs/v1/tech/events-webhooks/events/user-registration-verified": "/docs/extend/events-and-webhooks/events/user-registration-verified", + "/docs/v1/tech/events-webhooks/events/user-two-factor-method-add": "/docs/extend/events-and-webhooks/events/user-two-factor-method-add", + "/docs/v1/tech/events-webhooks/events/user-two-factor-method-remove": "/docs/extend/events-and-webhooks/events/user-two-factor-method-remove", + "/docs/v1/tech/events-webhooks/events/user-update": "/docs/extend/events-and-webhooks/events/user-update", + "/docs/v1/tech/events-webhooks/events/user-update-complete": "/docs/extend/events-and-webhooks/events/user-update-complete", + "/docs/v1/tech/events-webhooks/securing": "/docs/extend/events-and-webhooks/securing", + "/docs/v1/tech/events-webhooks/writing-a-webhook": "/docs/extend/events-and-webhooks/writing-a-webhook", + "/docs/v1/tech/example-apps/": "/docs/extend/examples/example-apps/", + "/docs/v1/tech/example-apps/dart": "/docs/sdks/examples/dart", + "/docs/v1/tech/example-apps/go": "/docs/sdks/examples/go", + "/docs/v1/tech/example-apps/java": "/docs/sdks/examples/java", + "/docs/v1/tech/example-apps/javascript": "/docs/sdks/examples/javascript", + "/docs/v1/tech/example-apps/netcore": "/docs/sdks/examples/netcore", + "/docs/v1/tech/example-apps/php": "/docs/sdks/examples/php", + "/docs/v1/tech/example-apps/python": "/docs/sdks/examples/python", + "/docs/v1/tech/example-apps/ruby": "/docs/sdks/examples/ruby", + "/docs/v1/tech/getting-started/": "/docs/getting-started/", + "/docs/v1/tech/getting-started/5-minute-docker": "/docs/quickstarts/5-minute-docker", + "/docs/v1/tech/getting-started/5-minute-fastpath": "/docs/quickstarts/5-minute-fastpath", + "/docs/v1/tech/getting-started/5-minute-sandbox": "/docs/quickstarts/5-minute-sandbox", + "/docs/v1/tech/guides/advanced-registration-forms": "/docs/lifecycle/register-users/advanced-registration-forms", + "/docs/v1/tech/guides/anonymous-user": "/docs/lifecycle/register-users/anonymous-user", + "/docs/v1/tech/guides/api-authorization": "/docs/extend/examples/api-gateways/api-authorization", + "/docs/v1/tech/guides/auth0-migration": "/docs/lifecycle/migrate-users/bulk/auth0", + "/docs/v1/tech/guides/basic-registration-forms": "/docs/lifecycle/register-users/basic-registration-forms", + "/docs/v1/tech/guides/breached-password-detection": "/docs/operate/secure-and-monitor/breached-password-detection", + "/docs/v1/tech/guides/configuring-application-specific-email-templates": "/docs/customize/email-and-messages/configuring-application-specific-email-templates", + "/docs/v1/tech/guides/migration": "/docs/lifecycle/migrate-users/bulk/general", + "/docs/v1/tech/guides/migration/general": "/docs/lifecycle/migrate-users/bulk/general", + "/docs/v1/tech/guides/multi-factor-authentication": "/docs/lifecycle/authenticate-users/multi-factor-authentication", + "/docs/v1/tech/guides/multi-tenant": "/docs/extend/examples/multi-tenant", + "/docs/v1/tech/guides/passwordless": "/docs/lifecycle/authenticate-users/passwordless/magic-links", + "/docs/v1/tech/guides/registration-email-verification": "/docs/lifecycle/manage-users/verification/registration-email-verification", + "/docs/v1/tech/guides/silent-mode": "/docs/get-started/download-and-install/silent-mode", + "/docs/v1/tech/guides/single-sign-on": "/docs/lifecycle/authenticate-users/single-sign-on", + "/docs/v1/tech/guides/user-actions": "/docs/lifecycle/manage-users/user-actions", + "/docs/v1/tech/guides/user-search-with-elasticsearch": "/docs/lifecycle/manage-users/search/user-search-with-elasticsearch", + "/docs/v1/tech/guides/webauthn": "/docs/lifecycle/authenticate-users/passwordless/webauthn-passkeys", + "/docs/v1/tech/identity-providers/": "/docs/lifecycle/authenticate-users/identity-providers/", + "/docs/v1/tech/identity-providers/apple": "/docs/lifecycle/authenticate-users/identity-providers/social/apple", + "/docs/v1/tech/identity-providers/epic-games": "/docs/lifecycle/authenticate-users/identity-providers/gaming/epic-games", + "/docs/v1/tech/identity-providers/external-jwt/": "/docs/lifecycle/authenticate-users/identity-providers/external-jwt/", + "/docs/v1/tech/identity-providers/external-jwt/example": "/docs/lifecycle/authenticate-users/identity-providers/external-jwt/example", + "/docs/v1/tech/identity-providers/facebook": "/docs/lifecycle/authenticate-users/identity-providers/social/facebook", + "/docs/v1/tech/identity-providers/google": "/docs/lifecycle/authenticate-users/identity-providers/social/google", + "/docs/v1/tech/identity-providers/hypr": "/docs/lifecycle/authenticate-users/identity-providers/enterprise/hypr", + "/docs/v1/tech/identity-providers/linkedin": "/docs/lifecycle/authenticate-users/identity-providers/social/linkedin", + "/docs/v1/tech/identity-providers/nintendo": "/docs/lifecycle/authenticate-users/identity-providers/gaming/nintendo", + "/docs/v1/tech/identity-providers/openid-connect/": "/docs/lifecycle/authenticate-users/identity-providers/", + "/docs/v1/tech/identity-providers/openid-connect/azure-ad": "/docs/lifecycle/authenticate-users/identity-providers/enterprise/azure-ad", + "/docs/v1/tech/identity-providers/openid-connect/cognito": "/docs/lifecycle/authenticate-users/identity-providers/social/cognito", + "/docs/v1/tech/identity-providers/openid-connect/discord": "/docs/lifecycle/authenticate-users/identity-providers/gaming/discord", + "/docs/v1/tech/identity-providers/openid-connect/github": "/docs/lifecycle/authenticate-users/identity-providers/social/github", + "/docs/v1/tech/identity-providers/openid-connect/okta": "/docs/lifecycle/authenticate-users/identity-providers/enterprise/okta", + "/docs/v1/tech/identity-providers/samlv2-idp-initiated/": "/docs/lifecycle/authenticate-users/identity-providers/enterprise/samlv2-idp-initiated", + "/docs/v1/tech/identity-providers/samlv2-idp-initiated/okta": "/docs/lifecycle/authenticate-users/identity-providers/enterprise/okta", + "/docs/v1/tech/identity-providers/samlv2/": "/docs/lifecycle/authenticate-users/identity-providers/", + "/docs/v1/tech/identity-providers/samlv2/adfs": "/docs/lifecycle/authenticate-users/identity-providers/enterprise/adfs", + "/docs/v1/tech/identity-providers/samlv2/azure-ad": "/docs/lifecycle/authenticate-users/identity-providers/enterprise/azure-ad", + "/docs/v1/tech/identity-providers/sony": "/docs/lifecycle/authenticate-users/identity-providers/gaming/sony", + "/docs/v1/tech/identity-providers/steam": "/docs/lifecycle/authenticate-users/identity-providers/gaming/steam", + "/docs/v1/tech/identity-providers/twitch": "/docs/lifecycle/authenticate-users/identity-providers/gaming/twitch", + "/docs/v1/tech/identity-providers/twitter": "/docs/lifecycle/authenticate-users/identity-providers/social/twitter", + "/docs/v1/tech/identity-providers/xbox": "/docs/lifecycle/authenticate-users/identity-providers/gaming/xbox", + "/docs/v1/tech/installation-guide/cloud": "/docs/get-started/run-in-the-cloud/cloud", + "/docs/v1/tech/installation-guide/cluster": "/docs/operate/deploy/cluster", + "/docs/v1/tech/installation-guide/common-configuration": "/docs/get-started/download-and-install/common-configuration", + "/docs/v1/tech/installation-guide/configuration-management": "/docs/operate/deploy/configuration-management", + "/docs/v1/tech/installation-guide/database": "/docs/get-started/download-and-install/database", + "/docs/v1/tech/installation-guide/docker": "/docs/get-started/download-and-install/docker", + "/docs/v1/tech/installation-guide/fast-path": "/docs/get-started/download-and-install/fast-path", + "/docs/v1/tech/installation-guide/fusionauth-app": "/docs/get-started/download-and-install/fusionauth-app", + "/docs/v1/tech/installation-guide/fusionauth-search": "/docs/get-started/download-and-install/fusionauth-search", + "/docs/v1/tech/installation-guide/homebrew": "/docs/get-started/download-and-install/homebrew", + "/docs/v1/tech/installation-guide/kickstart": "/docs/get-started/download-and-install/development/kickstart", + "/docs/v1/tech/installation-guide/kubernetes/": "/docs/get-started/download-and-install/kubernetes/", + "/docs/v1/tech/installation-guide/kubernetes/fusionauth-deployment": "/docs/get-started/download-and-install/kubernetes/fusionauth-deployment", + "/docs/v1/tech/installation-guide/kubernetes/setup/aks": "/docs/get-started/download-and-install/kubernetes/aks", + "/docs/v1/tech/installation-guide/kubernetes/setup/eks": "/docs/get-started/download-and-install/kubernetes/eks", + "/docs/v1/tech/installation-guide/kubernetes/setup/gke": "/docs/get-started/download-and-install/kubernetes/gke", + "/docs/v1/tech/installation-guide/kubernetes/setup/minikube": "/docs/get-started/download-and-install/kubernetes/minikube", + "/docs/v1/tech/installation-guide/marketplaces": "/docs/get-started/run-in-the-cloud/marketplaces", + "/docs/v1/tech/installation-guide/migration": "/archive/passport-to-fusionauth", + "/docs/v1/tech/installation-guide/monitor": "/docs/operate/secure-and-monitor/monitor", + "/docs/v1/tech/installation-guide/packages": "/docs/get-started/download-and-install/packages", + "/docs/v1/tech/installation-guide/securing": "/docs/operate/secure-and-monitor/securing", + "/docs/v1/tech/installation-guide/server-layout": "/docs/get-started/download-and-install/server-layout", + "/docs/v1/tech/installation-guide/system-requirements": "/docs/get-started/download-and-install/system-requirements", + "/docs/v1/tech/installation-guide/upgrade": "/docs/operate/deploy/upgrade", + "/docs/v1/tech/integrations/cleanspeak": "/docs/lifecycle/manage-users/cleanspeak", + "/docs/v1/tech/integrations/kafka": "/docs/extend/events-and-webhooks/kafka", + "/docs/v1/tech/integrations/twilio": "/docs/customize/email-and-messages/deprecated/twilio", + "/docs/v1/tech/lambdas/": "/docs/extend/code/lambdas/", + "/docs/v1/tech/messengers/": "/docs/customize/email-and-messages/", + "/docs/v1/tech/messengers/generic-messenger": "/docs/customize/email-and-messages/generic-messenger", + "/docs/v1/tech/messengers/twilio-messenger": "/docs/customize/email-and-messages/twilio-messenger", + "/docs/v1/tech/migration-guide/": "/docs/lifecycle/migrate-users/", + "/docs/v1/tech/migration-guide/auth0": "/docs/lifecycle/migrate-users/bulk/auth0", + "/docs/v1/tech/migration-guide/azureadb2c": "/docs/lifecycle/migrate-users/bulk/azureadb2c", + "/docs/v1/tech/migration-guide/cognito": "/docs/lifecycle/migrate-users/bulk/cognito", + "/docs/v1/tech/migration-guide/duende": "/docs/lifecycle/migrate-users/bulk/duende", + "/docs/v1/tech/migration-guide/firebase": "/docs/lifecycle/migrate-users/bulk/firebase", + "/docs/v1/tech/migration-guide/general": "/docs/lifecycle/migrate-users/bulk/general", + "/docs/v1/tech/migration-guide/keycloak": "/docs/lifecycle/migrate-users/bulk/keycloak", + "/docs/v1/tech/migration-guide/supabase": "/docs/lifecycle/migrate-users/bulk/supabase", + "/docs/v1/tech/migration-guide/tutorial": "/docs/lifecycle/migrate-users/bulk/tutorial", + "/docs/v1/tech/oauth/": "/docs/lifecycle/authenticate-users/oauth/", + "/docs/v1/tech/oauth/endpoints": "/docs/lifecycle/authenticate-users/oauth/endpoints", + "/docs/v1/tech/oauth/integrations/cockroachdb": "/docs/lifecycle/authenticate-users/integrations/oidc/cockroachdb", + "/docs/v1/tech/oauth/integrations/salesforce": "/docs/lifecycle/authenticate-users/integrations/oidc/salesforce", + "/docs/v1/tech/oauth/tokens": "/docs/lifecycle/authenticate-users/oauth/tokens", + "/docs/v1/tech/oauth/url-validation": "/docs/lifecycle/authenticate-users/oauth/url-validation", + "/docs/v1/tech/passwordless/": "/docs/lifecycle/authenticate-users/passwordless/", + "/docs/v1/tech/passwordless/magic-links": "/docs/lifecycle/authenticate-users/passwordless/magic-links", + "/docs/v1/tech/passwordless/webauthn": "/docs/lifecycle/authenticate-users/passwordless/webauthn-passkeys", + "/docs/v1/tech/passwordless/webauthn-passkeys": "/docs/lifecycle/authenticate-users/passwordless/webauthn-passkeys", + "/docs/v1/tech/plugins/": "/docs/extend/code/password-hashes/", + "/docs/v1/tech/plugins/custom-password-hashing": "/docs/extend/code/password-hashes/custom-password-hashing", + "/docs/v1/tech/plugins/password-encryptors": "/docs/extend/code/password-hashes/custom-password-hashing", + "/docs/v1/tech/plugins/writing-a-plugin": "/docs/extend/code/password-hashes/writing-a-plugin", + "/docs/v1/tech/premium-features/": "/docs/get-started/core-concepts/premium-features", + "/docs/v1/tech/premium-features/scim/azure-ad-client": "/docs/lifecycle/migrate-users/scim/azure-ad-client", + "/docs/v1/tech/premium-features/scim/okta-client": "/docs/lifecycle/migrate-users/scim/okta-client", + "/docs/v1/tech/premium-features/scim/scim-sdk": "/docs/lifecycle/migrate-users/scim/scim-sdk", + "/docs/v1/tech/reactor": "/docs/get-started/core-concepts/licensing", + "/docs/v1/tech/reactor/": "/docs/get-started/core-concepts/licensing", + "/docs/v1/tech/reference/": "/docs/reference/", + "/docs/v1/tech/reference/configuration": "/docs/reference/configuration", + "/docs/v1/tech/reference/cookies": "/docs/reference/cookies", + "/docs/v1/tech/reference/cors": "/docs/operate/secure-and-monitor/cors", + "/docs/v1/tech/reference/data-types": "/docs/reference/data-types", + "/docs/v1/tech/reference/limitations": "/docs/get-started/core-concepts/limitations", + "/docs/v1/tech/reference/password-encryptors": "/docs/reference/password-hashes", + "/docs/v1/tech/reference/password-hashes": "/docs/reference/password-hashes", + "/docs/v1/tech/release-notes": "/docs/release-notes/", + "/docs/v1/tech/samlv2/": "/docs/lifecycle/authenticate-users/saml/", + "/docs/v1/tech/samlv2/aiven": "/docs/lifecycle/authenticate-users/integrations/saml/aiven", + "/docs/v1/tech/samlv2/google": "/docs/lifecycle/authenticate-users/integrations/saml/google", + "/docs/v1/tech/samlv2/pagerduty": "/docs/lifecycle/authenticate-users/integrations/saml/pagerduty", + "/docs/v1/tech/samlv2/sendgrid": "/docs/lifecycle/authenticate-users/integrations/saml/sendgrid", + "/docs/v1/tech/samlv2/tableau-cloud": "/docs/lifecycle/authenticate-users/integrations/saml/tableau-cloud", + "/docs/v1/tech/samlv2/zendesk": "/docs/lifecycle/authenticate-users/integrations/saml/zendesk", + "/docs/v1/tech/themes/": "/docs/customize/look-and-feel/", + "/docs/v1/tech/themes/application-specific-themes": "/docs/customize/look-and-feel/application-specific-themes", + "/docs/v1/tech/themes/client-side-password-rule-validation": "/docs/customize/look-and-feel/client-side-password-rule-validation", + "/docs/v1/tech/themes/examples": "/docs/customize/look-and-feel/examples", + "/docs/v1/tech/themes/helpers": "/docs/customize/look-and-feel/helpers", + "/docs/v1/tech/themes/kickstart-custom-theme": "/docs/customize/look-and-feel/kickstart-custom-theme", + "/docs/v1/tech/themes/localization": "/docs/customize/look-and-feel/localization", + "/docs/v1/tech/themes/tailwind": "/docs/customize/look-and-feel/tailwind", + "/docs/v1/tech/themes/template-variables": "/docs/customize/look-and-feel/template-variables", + "/docs/v1/tech/troubleshooting": "/docs/operate/troubleshooting/troubleshooting", + "/docs/v1/tech/tutorials/application-authentication-tokens": "/docs/lifecycle/authenticate-users/application-authentication-tokens", + "/docs/v1/tech/tutorials/gate-accounts-until-verified": "/docs/lifecycle/manage-users/verification/gate-accounts-until-user-email-verified", + "/docs/v1/tech/tutorials/gating/gate-accounts-until-user-email-verified": "/docs/lifecycle/manage-users/verification/gate-accounts-until-user-email-verified", + "/docs/v1/tech/tutorials/gating/registration-gate-accounts-until-verified": "/docs/lifecycle/manage-users/verification/registration-gate-accounts-until-verified", + "/docs/v1/tech/tutorials/gating/setting-up-user-account-lockout": "/docs/lifecycle/authenticate-users/setting-up-user-account-lockout", + "/docs/v1/tech/tutorials/integrate-angular": "/docs/quickstarts/quickstart-javascript-angular-web", + "/docs/v1/tech/tutorials/integrate-dotnet": "/docs/quickstarts/quickstart-dotnet-web", + "/docs/v1/tech/tutorials/integrate-java-spring": "/docs/quickstarts/quickstart-springboot-web", + "/docs/v1/tech/tutorials/integrate-python-django": "/docs/quickstarts/quickstart-python-django-web", + "/docs/v1/tech/tutorials/integrate-python-flask": "/docs/quickstarts/quickstart-python-flask-web", + "/docs/v1/tech/tutorials/integrate-react": "/docs/quickstarts/quickstart-javascript-react-web", + "/docs/v1/tech/tutorials/integrate-ruby-rails": "/docs/quickstarts/quickstart-ruby-rails-web", + "/docs/v1/tech/tutorials/json-web-tokens": "/docs/lifecycle/authenticate-users/login-api/json-web-tokens", + "/docs/v1/tech/tutorials/key-rotation": "/docs/operate/secure-and-monitor/key-rotation", + "/docs/v1/tech/tutorials/migrate-users": "/docs/lifecycle/migrate-users/bulk/tutorial", + "/docs/v1/tech/tutorials/prometheus": "/docs/operate/secure-and-monitor/prometheus", + "/docs/v1/tech/tutorials/register-user-login-api": "/docs/lifecycle/register-users/register-user-login-api", + "/docs/v1/tech/tutorials/setting-up-user-account-lockout": "/docs/lifecycle/authenticate-users/setting-up-user-account-lockout", + "/docs/v1/tech/tutorials/setup-wizard": "/docs/get-started/download-and-install/setup-wizard", + "/docs/v1/tech/tutorials/start-and-stop": "/docs/get-started/download-and-install/start-and-stop", + "/docs/v1/tech/tutorials/switch-search-engines": "/docs/lifecycle/manage-users/search/switch-search-engines", + "/docs/v1/tech/tutorials/two-factor/": "/docs/customize/email-and-messages/deprecated/", + "/docs/v1/tech/tutorials/two-factor/authenticator-app": "/docs/customize/email-and-messages/deprecated/authenticator-app-pre-1-26", + "/docs/v1/tech/tutorials/two-factor/authenticator-app-pre-1-26": "/docs/customize/email-and-messages/deprecated/authenticator-app-pre-1-26", + "/docs/v1/tech/tutorials/two-factor/twilio-push": "/docs/customize/email-and-messages/deprecated/twilio-push-pre-1-26", + "/docs/v1/tech/tutorials/two-factor/twilio-push-pre-1-26": "/docs/customize/email-and-messages/deprecated/twilio-push-pre-1-26", + "/features/advanced-registration-forms": "/platform/registration-forms", + "/features/architecture": "/platform/built-for-developers", + "/features/breached-password-detection": "/features/authentication", + "/features/built-for-developers": "/platform/built-for-developers", + "/features/connectors": "/features/authentication", + "/features/scalability": "/platform/scalable", + "/features/security-data-compliance": "/security-data-compliance", + "/features/user-experience": "/platform/customizable", + "/features/user-management-reporting": "/features/user-management", + "/gaming": "/industries/gaming-entertainment", + "/gaming/": "/industries/gaming-entertainment", + "/kubernetes": "/docs/get-started/download-and-install/kubernetes/", + "/kubernetes/": "/docs/get-started/download-and-install/kubernetes/", + "/learn/expert-advice/": "/articles/", + "/learn/expert-advice/authentication/gaming-identity-provider-needs": "/articles/gaming-entertainment/gaming-identity-provider-needs", + "/learn/expert-advice/authentication/login-authentication-workflows": "/articles/login-authentication-workflows/authentication-workflows-overview", + "/learn/expert-advice/authentication/login-authentication-workflows/": "/articles/login-authentication-workflows/authentication-workflows-overview", + "/learn/expert-advice/ciam/ciam-vs-iam": "/articles/ciam/ciam-vs-iam", + "/learn/expert-advice/identity-basics/avoid-lockin": "/articles/authentication/avoid-lockin", + "/learn/expert-advice/identity-basics/common-authentication-implementation-risks": "/articles/authentication/common-authentication-implementation-risks", + "/learn/expert-advice/identity-basics/making-sure-your-auth-system-scales": "/articles/ciam/making-sure-your-auth-system-scales", + "/learn/expert-advice/identity-basics/value-standards-compliant-authentication": "/articles/oauth/value-standards-compliant-authentication", + "/learn/expert-advice/security/guide-to-user-data-security": "/articles/security/guide-to-user-data-security", + "/learn/expert-advice/tokens/anatomy-of-jwt": "/articles/tokens/jwt-components-explained", + "/learn/expert-advice/tokens/jwt-authentication-token-components-explained": "/articles/tokens/jwt-components-explained", + "/podcast": "/", + "/podcast/": "/", + "/pricing/cloud": "/pricing", + "/pricing/cloud/": "/pricing", + "/pricing/edition": "/pricing", + "/pricing/edition/": "/pricing", + "/pricing/editions": "/pricing", + "/pricing/editions/": "/pricing", + "/products/identity-user-management/ciam-vs-iam": "/articles/ciam/ciam-vs-iam", + "/resources/auth0-migration": "/auth0-migration", + "/resources/guide-to-user-data-security": "/articles/security/guide-to-user-data-security", + "/upgrade/from-homegrown": "/compare", + "/upgrade/from-open-source": "/compare", + "/upgrade/from-saas": "/compare" + }, + "indexPaths": { + "/articles/": true, + "/articles/authentication/": true, + "/articles/ciam/": true, + "/articles/gaming-entertainment/": true, + "/articles/identity-basics/": true, + "/articles/login-authentication-workflows/": true, + "/articles/login-authentication-workflows/mobile/": true, + "/articles/login-authentication-workflows/spa/": true, + "/articles/login-authentication-workflows/webapp/": true, + "/articles/oauth/": true, + "/articles/security/": true, + "/articles/tokens/": true, + "/blog/": true, + "/community/forum/": true, + "/dev-tools/": true, + "/docs/": true, + "/docs/apis/": true, + "/docs/apis/connectors/": true, + "/docs/apis/custom-forms/": true, + "/docs/apis/entities/": true, + "/docs/apis/identity-providers/": true, + "/docs/apis/messengers/": true, + "/docs/apis/scim/": true, + "/docs/archive/": true, + "/docs/archive/apis/": true, + "/docs/customize/": true, + "/docs/customize/email-and-messages/": true, + "/docs/customize/email-and-messages/deprecated/": true, + "/docs/customize/look-and-feel/": true, + "/docs/extend/": true, + "/docs/extend/code/": true, + "/docs/extend/code/lambdas/": true, + "/docs/extend/code/password-hashes/": true, + "/docs/extend/events-and-webhooks/": true, + "/docs/extend/events-and-webhooks/events/": true, + "/docs/extend/events-and-webhooks/kafka/": true, + "/docs/extend/examples/": true, + "/docs/extend/examples/api-gateways/": true, + "/docs/get-started/": true, + "/docs/get-started/core-concepts/": true, + "/docs/get-started/download-and-install/": true, + "/docs/get-started/download-and-install/development/": true, + "/docs/get-started/download-and-install/kubernetes/": true, + "/docs/get-started/run-in-the-cloud/": true, + "/docs/lifecycle/": true, + "/docs/lifecycle/authenticate-users/": true, + "/docs/lifecycle/authenticate-users/identity-providers/": true, + "/docs/lifecycle/authenticate-users/identity-providers/enterprise/": true, + "/docs/lifecycle/authenticate-users/identity-providers/external-jwt/": true, + "/docs/lifecycle/authenticate-users/identity-providers/gaming/": true, + "/docs/lifecycle/authenticate-users/identity-providers/social/": true, + "/docs/lifecycle/authenticate-users/integrations/": true, + "/docs/lifecycle/authenticate-users/integrations/oidc/": true, + "/docs/lifecycle/authenticate-users/integrations/saml/": true, + "/docs/lifecycle/authenticate-users/login-api/": true, + "/docs/lifecycle/authenticate-users/oauth/": true, + "/docs/lifecycle/authenticate-users/passwordless/": true, + "/docs/lifecycle/authenticate-users/saml/": true, + "/docs/lifecycle/manage-users/": true, + "/docs/lifecycle/manage-users/account-management/": true, + "/docs/lifecycle/manage-users/search/": true, + "/docs/lifecycle/manage-users/verification/": true, + "/docs/lifecycle/migrate-users/": true, + "/docs/lifecycle/migrate-users/bulk/": true, + "/docs/lifecycle/migrate-users/connectors/": true, + "/docs/lifecycle/migrate-users/scim/": true, + "/docs/lifecycle/register-users/": true, + "/docs/operate/": true, + "/docs/operate/deploy/": true, + "/docs/operate/roadmap/": true, + "/docs/operate/secure-and-monitor/": true, + "/docs/operate/troubleshooting/": true, + "/docs/quickstarts/": true, + "/docs/reference/": true, + "/docs/release-notes/": true, + "/docs/sdks/": true, + "/docs/sdks/examples/": true, + "/docs/v1/tech/": true, + "/docs/v1/tech/account-management/": true, + "/docs/v1/tech/admin-guide/": true, + "/docs/v1/tech/advanced-threat-detection/": true, + "/docs/v1/tech/apis/": true, + "/docs/v1/tech/apis/connectors/": true, + "/docs/v1/tech/apis/entity-management/": true, + "/docs/v1/tech/apis/identity-providers/": true, + "/docs/v1/tech/apis/messengers/": true, + "/docs/v1/tech/apis/scim/": true, + "/docs/v1/tech/client-libraries/": true, + "/docs/v1/tech/connectors/": true, + "/docs/v1/tech/core-concepts/": true, + "/docs/v1/tech/developer-guide/": true, + "/docs/v1/tech/developer-guide/api-gateways/": true, + "/docs/v1/tech/email-templates/": true, + "/docs/v1/tech/events-webhooks/": true, + "/docs/v1/tech/events-webhooks/events/": true, + "/docs/v1/tech/example-apps/": true, + "/docs/v1/tech/getting-started/": true, + "/docs/v1/tech/guides/": true, + "/docs/v1/tech/identity-providers/": true, + "/docs/v1/tech/identity-providers/external-jwt/": true, + "/docs/v1/tech/identity-providers/openid-connect/": true, + "/docs/v1/tech/identity-providers/samlv2-idp-initiated/": true, + "/docs/v1/tech/identity-providers/samlv2/": true, + "/docs/v1/tech/installation-guide/": true, + "/docs/v1/tech/installation-guide/kubernetes/": true, + "/docs/v1/tech/integrations/": true, + "/docs/v1/tech/lambdas/": true, + "/docs/v1/tech/messengers/": true, + "/docs/v1/tech/migration-guide/": true, + "/docs/v1/tech/oauth/": true, + "/docs/v1/tech/passwordless/": true, + "/docs/v1/tech/plugins/": true, + "/docs/v1/tech/premium-features/": true, + "/docs/v1/tech/premium-features/webauthn/": true, + "/docs/v1/tech/reference/": true, + "/docs/v1/tech/samlv2/": true, + "/docs/v1/tech/themes/": true, + "/docs/v1/tech/tutorials/": true, + "/docs/v1/tech/tutorials/gating/": true, + "/docs/v1/tech/tutorials/two-factor/": true, + "/how-to/": true, + "/quickstarts/": true + }, + "redirectsByPrefix": [ + ["/learn/expert-advice/dev-tools", "/dev-tools"], + ["/learn/expert-advice/authentication/spa", "/articles/login-authentication-workflows/spa"], + ["/learn/expert-advice/authentication/mobile", "/articles/login-authentication-workflows/mobile"], + ["/learn/expert-advice/authentication/webapp", "/articles/login-authentication-workflows/webapp"], + ["/learn/expert-advice", "/articles"] + ], + "redirectsByRegex": [ + ["^/blog/(category|tag|author)/([^/]*)$", "$&/"], + ["/blog/archive/tag/", "/blog/tag/"], + ["/blog/\\d\\d\\d\\d/\\d\\d/\\d\\d/", "/blog/"] + ], + "s3Paths": ["/direct-download", "/license"], + "s3Prefixes": ["/blog/", "/docs/", "/legal/", "/articles/", "/dev-tools/"] +} diff --git a/src/lambdas/fusionauth-site-origin-handler/package-lock.json b/src/lambdas/fusionauth-site-origin-handler/package-lock.json new file mode 100644 index 0000000000..29f7a1201c --- /dev/null +++ b/src/lambdas/fusionauth-site-origin-handler/package-lock.json @@ -0,0 +1,2322 @@ +{ + "name": "fusionauth-site-origin-handler", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fusionauth-site-origin-handler", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-s3": "^3.435.0" + }, + "devDependencies": { + "mocha": "*", + "mocha-suppress-logs": "*" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.436.0.tgz", + "integrity": "sha512-4F/eg9caxUxRU9za+nppiq4VnjTy+QKc4V2A7bI+7N4GBXl/Ye8Q9zBjbEDpGBmZBHbuO/RtBtyf/ZyrYntEvA==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.436.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.436.0", + "@aws-sdk/middleware-bucket-endpoint": "3.433.0", + "@aws-sdk/middleware-expect-continue": "3.433.0", + "@aws-sdk/middleware-flexible-checksums": "3.433.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-location-constraint": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-s3": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-ssec": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/signature-v4-multi-region": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.433.0", + "@aws-sdk/xml-builder": "3.310.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/eventstream-serde-browser": "^2.0.12", + "@smithy/eventstream-serde-config-resolver": "^2.0.12", + "@smithy/eventstream-serde-node": "^2.0.12", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-blob-browser": "^2.0.12", + "@smithy/hash-node": "^2.0.12", + "@smithy/hash-stream-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/md5-js": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-stream": "^2.0.17", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.12", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.436.0.tgz", + "integrity": "sha512-MM59VTikuehbN/iLz0rH0MhvUb9ngG9rB129darJkNBWNBQDNnQHox/31dm/Hyfq++YUf6GREsfW8r9HMMfLdg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.433.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.436.0.tgz", + "integrity": "sha512-DJKvvtcjIziD8FMGIURwesrKdZcfTx0dZ3juBg8I0q2Y+kQYx1xFqy4dl9V/lQLBRWk1hku0iM+J/TI1YjlOrQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.436.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-sts": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.433.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.436.0.tgz", + "integrity": "sha512-vX5/LjXvCejC2XUY6TSg1oozjqK6BvkE75t0ys9dgqyr5PlZyZksMoeAFHUlj0sCjhT3ziWCujP1oiSpPWY9hg==", + "dependencies": { + "@smithy/smithy-client": "^2.1.12" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.436.0.tgz", + "integrity": "sha512-VWemmELcB+WSvP+hPk5CTlIYZMZdjcPFeoWrv11tpVqQ4be33AM1LEC1sTSU8fXKSgIL/tz7ilqp11fWm0MQwA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.436.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.436.0.tgz", + "integrity": "sha512-ZQIqR11TPU03RGI/eynOCMmH8FK4J+IxdDEsv2FBcxkuFl990CangoeEziRhVsw+a68TWVZA65kVv+oUX2u8Sw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-ini": "3.436.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.436.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.436.0.tgz", + "integrity": "sha512-40exwlz6Xfc/28e1dfpHP7vwK04gATWEQ1dBb30d0zXASpn0Z0PWyNgAO2owcGsw4TdceSREV1mj8HwYkl8+BA==", + "dependencies": { + "@aws-sdk/client-sso": "3.436.0", + "@aws-sdk/token-providers": "3.435.0", + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.433.0.tgz", + "integrity": "sha512-Lk1xIu2tWTRa1zDw5hCF1RrpWQYSodUhrS/q3oKz8IAoFqEy+lNaD5jx+fycuZb5EkE4IzWysT+8wVkd0mAnOg==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.433.0.tgz", + "integrity": "sha512-Uq2rPIsjz0CR2sulM/HyYr5WiqiefrSRLdwUZuA7opxFSfE808w5DBWSprHxbH3rbDSQR4nFiOiVYIH8Eth7nA==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.433.0.tgz", + "integrity": "sha512-Ptssx373+I7EzFUWjp/i/YiNFt6I6sDuRHz6DOUR9nmmRTlHHqmdcBXlJL2d9wwFxoBRCN8/PXGsTc/DJ4c95Q==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.433.0", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.433.0.tgz", + "integrity": "sha512-2YD860TGntwZifIUbxm+lFnNJJhByR/RB/+fV1I8oGKg+XX2rZU+94pRfHXRywoZKlCA0L+LGDA1I56jxrB9sw==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.433.0.tgz", + "integrity": "sha512-mkn3DiSuMVh4NTLsduC42Av+ApcOor52LMoQY0Wc6M5Mx7Xd05U+G1j8sjI9n/1bs5cZ/PoeRYJ/9bL1Xxznnw==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.433.0.tgz", + "integrity": "sha512-2AMaPx0kYfCiekxoL7aqFqSSoA9du+yI4zefpQNLr+1cZOerYiDxdsZ4mbqStR1CVFaX6U6hrYokXzjInsvETw==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.433.0.tgz", + "integrity": "sha512-jMgA1jHfisBK4oSjMKrtKEZf0sl2vzADivkFmyZFzORpSZxBnF6hC21RjaI+70LJLcc9rSCzLgcoz5lHb9LLDg==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.433.0.tgz", + "integrity": "sha512-wl2j1dos4VOKFawbapPm/0CNa3cIgpJXbEx+sp+DI3G8tSuP3c5UGtm0pXjM85egxZulhHVK1RVde0iD8j63pQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.435.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.435.0.tgz", + "integrity": "sha512-JZKqsuoK321ozp2ufGmjfpbAqtK1tYnLn0PaePWjvDL48B5A5jGNqFyP3/tg7LFP7vTp9O3pJ7ln0QLh8FpsjQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.433.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.433.0.tgz", + "integrity": "sha512-LFNUh9FH7RMtYjSjPGz9lAJQMzmJ3RcXISzc5X5k2R/9mNwMK7y1k2VAfvx+RbuDbll6xwsXlgv6QHcxVdF2zw==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.433.0.tgz", + "integrity": "sha512-yT1tO4MbbsUBLl5+S+jVv8wxiAtP5TKjKib9B2KQ2x0OtWWTrIf2o+IZK8va+zQqdV4MVMjezdxdE20hOdB4yQ==", + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", + "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", + "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.0.tgz", + "integrity": "sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==", + "dependencies": { + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", + "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", + "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.12.tgz", + "integrity": "sha512-0pi8QlU/pwutNshoeJcbKR1p7Ie5STd8UFAMX5xhSoSJjNlxIv/OsHbF023jscMRN2Prrqd6ToGgdCnsZVQjvg==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.12.tgz", + "integrity": "sha512-I0XfwQkIX3gAnbrU5rLMkBSjTM9DHttdbLwf12CXmj7SSI5dT87PxtKLRrZGanaCMbdf2yCep+MW5/4M7IbvQA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.12.tgz", + "integrity": "sha512-vf1vMHGOkG3uqN9x1zKOhnvW/XgvhJXWqjV6zZiT2FMjlEayugQ1mzpSqr7uf89+BzjTzuZKERmOsEAmewLbxw==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.12.tgz", + "integrity": "sha512-xZ3ZNpCxIND+q+UCy7y1n1/5VQEYicgSTNCcPqsKawX+Vd+6OcFX7gUHMyPzL8cZr+GdmJuxNleqHlH4giK2tw==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", + "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", + "dependencies": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.12.tgz", + "integrity": "sha512-riLnV16f27yyePX8UF0deRHAeccUK8SrOxyTykSTrnVkgS3DsjNapZtTbd8OGNKEbI60Ncdb5GwN3rHZudXvog==", + "dependencies": { + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", + "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.12.tgz", + "integrity": "sha512-x/DrSynPKrW0k00q7aZ/vy531a3mRw79mOajHp+cIF0TrA1SqEMFoy/B8X0XtoAtlJWt/vvgeDNqt/KAeaAqMw==", + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.12.tgz", + "integrity": "sha512-OgDt+Xnrw+W5z3MSl5KZZzebqmXrYl9UdbCiBYnnjErmNywwSjV6QB/Oic3/7hnsPniSU81n7Rvlhz2kH4EREQ==", + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", + "dependencies": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", + "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", + "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", + "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", + "dependencies": { + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", + "dependencies": { + "@smithy/types": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", + "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", + "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", + "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", + "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", + "dependencies": { + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", + "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", + "dependencies": { + "@smithy/config-resolver": "^2.0.16", + "@smithy/credential-provider-imds": "^2.0.18", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", + "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", + "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha-suppress-logs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mocha-suppress-logs/-/mocha-suppress-logs-0.4.1.tgz", + "integrity": "sha512-llHPy1sEEOSoQ04TzixavZjBy2g65Tu64GYaEl3m7JxL5T1XmUhkpifcJSfRxKlCWWFVZ+cLIq4WHmVRBwQpyQ==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src/lambdas/fusionauth-site-origin-handler/package.json b/src/lambdas/fusionauth-site-origin-handler/package.json new file mode 100644 index 0000000000..41eaf39829 --- /dev/null +++ b/src/lambdas/fusionauth-site-origin-handler/package.json @@ -0,0 +1,27 @@ +{ + "name": "fusionauth-site-origin-handler", + "version": "1.0.0", + "description": "Cloudfront origin handler for fusionauth-site", + "main": "index.js", + "scripts": { + "test": "mocha --require mocha-suppress-logs" + }, + "type": "module", + "repository": { + "type": "git", + "url": "git+https://github.com/FusionAuth/fusionauth-site.git" + }, + "author": "", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/FusionAuth/fusionauth-site/issues" + }, + "homepage": "https://github.com/FusionAuth/fusionauth-site#readme", + "dependencies": { + "@aws-sdk/client-s3": "^3.435.0" + }, + "devDependencies": { + "mocha": "*", + "mocha-suppress-logs": "*" + } +} diff --git a/src/lambdas/fusionauth-site-origin-handler/src/index.js b/src/lambdas/fusionauth-site-origin-handler/src/index.js new file mode 100644 index 0000000000..8633d84f04 --- /dev/null +++ b/src/lambdas/fusionauth-site-origin-handler/src/index.js @@ -0,0 +1,162 @@ +import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3"; +const s3 = new S3Client({ region: 'us-east-1' }); + +// Location of the file containing the redirect rules. +const fileBucket = 'fusionauth-dev-us-east-1-artifacts'; +const fileKey = 'lambda/fusionauth-site-origin-handler/redirects.json'; + +let redirectRules = null; + +// When is the last time the rules were updated? This is stored +// in globals so it can be shared between lambda invocations. +let lastUpdatedTime = 0; +// How frequently (in seconds) should we refresh the redirect rules? +let intervalBetweenUpdates = 300; + +export const handler = async (event, context) => { + var req = event.Records[0].cf.request; + var uri = req.uri; + var result = req; + + await syncRedirectRules() + + try { + // Try to load the redirect rules from s3. + if (!redirectRules) { + console.error("[ERROR] missing redirect rules"); + return; + } + // If we successfully retrieved the rules, parse them as JSON. + else { + redirectRules = JSON.parse(redirectRules); + } + + // If any requests come in with .html extensions, trim the extension. + if (uri.endsWith('.html')) { + result = redir(uri.substring(0, uri.length - 5)); + } + // If this looks like a reference to a file but with a trailing slash, remove it. + else if (uri.endsWith('/') && removeSlash(uri)) { + result = redir(uri.substring(0, uri.length - 1)); + } + // If this is a reference to an index page that's missing its slash, add it. + else if (!uri.endsWith('/') && redirectRules.indexPaths[uri + '/'] === true) { + result = redir(uri + '/'); + } + else { + var redirect = calculateRedirect(uri); + if (redirect !== null) { + result = redir(redirect); + } else { + req.uri = calculateURI(uri); + } + } + + return result; + } + catch (err) { + console.error('[ERROR] %s', err); + } +}; + +async function syncRedirectRules() { + // If we're within the sync interval period, do nothing. + let currentTime = new Date().getTime(); + if (lastUpdatedTime && (currentTime - lastUpdatedTime) < (intervalBetweenUpdates * 1000)) { + return; + } + + console.log('Synchronizing redirect rules from s3') + + try { + const command = new GetObjectCommand({ + Bucket: fileBucket, + Key: fileKey, + }); + const response = await s3.send(command) + redirectRules = await response.Body.transformToString() + intervalBetweenUpdates = redirectRules.refreshTime; + lastUpdatedTime = currentTime; + } catch (err) { + console.error('[ERROR] failed to retrieve redirect rules file from s3: %s', err) + redirectRules = null; + lastUpdatedTime = currentTime; + } +} + +// returns true if this seems to be a link to a page with a trailing slash that should just be removed +function removeSlash(uri) { + return redirectRules.indexPaths[uri] !== true && + (!uri.startsWith('/blog') || (uri.match('^/blog/[\\w\\d-]*/$') && !uri.match('^/blog/latest/$'))) && + redirectRules.redirectsByPrefix.find(e => uri.startsWith(e[0])) === undefined; +} + +function calculateRedirect(uri) { + var result = redirectRules.redirects.hasOwnProperty(uri) ? redirectRules.redirects[uri] : null; + + if (result === null) { + var prefix_replacement = redirectRules.redirectsByPrefix.find(e => uri.startsWith(e[0])); + + if (prefix_replacement !== undefined) { + result = uri.replace(prefix_replacement[0], prefix_replacement[1]); + } + } + + if (result === null) { + redirectRules.redirectsByRegex.forEach(function (regexValueArray) { + var regex = new RegExp(regexValueArray[0], "g"); + var value = regexValueArray[1]; + if (regex.test(uri)) { + result = uri.replace(regex, value); + } + }); + } + + return result; +} + + +function appendHTML(uri) { + var slashIndex = uri.lastIndexOf('/'); + var dotIndex = uri.indexOf('.', slashIndex); + + if (slashIndex < uri.length - 1 && dotIndex < 0) { + uri = uri + '.html'; + } + + return uri; +} + + +function calculateURI(uri) { + var i; + for (i = 0; i < redirectRules.s3Prefixes.length; i++) { + if (uri.startsWith(redirectRules.s3Prefixes[i])) { + return uri.endsWith('/') ? uri + 'index.html' : appendHTML(uri); + } + } + + for (i = 0; i < redirectRules.s3Paths.length; i++) { + if (uri === redirectRules.s3Paths[i]) { + return appendHTML(uri); + } + } + + return uri; +} + + +function redir(loc) { + return { + 'status': 301, + 'statusDescription': 'Moved', + 'headers': { + 'location': [ + { + 'key': 'Location', + 'value': loc + } + ] + } + } +} diff --git a/src/cloudfront/lambda-request-handler/test/test.js b/src/lambdas/fusionauth-site-origin-handler/test/index.test.js similarity index 69% rename from src/cloudfront/lambda-request-handler/test/test.js rename to src/lambdas/fusionauth-site-origin-handler/test/index.test.js index b98a1533a5..6fb42a37d8 100644 --- a/src/cloudfront/lambda-request-handler/test/test.js +++ b/src/lambdas/fusionauth-site-origin-handler/test/index.test.js @@ -1,59 +1,55 @@ -//import {test} from "node:test"; -//import assert from "node:assert/strict"; -//import handler from '../src/fusionauth-website-lambda-request-handler.js'; -const { test} = require("node:test"); -const assert = require("node:assert/strict"); -const { handler } = require('../src/fusionauth-website-lambda-request-handler.js'); +import assert from 'node:assert/strict'; +import { handler } from '../src/index.js'; -// fix this hack -let callbackResult; +let event, result; -const mockCallback = (unknown, result) => { callbackResult = result; } - -const runTest = (pathToTest, expectedResult) => { - handler(makeRequest(pathToTest), null, mockCallback); - - assert.deepStrictEqual(callbackResult, expectedResult); -} - -const testPath = (path) => { - return handler(makeRequest(path)); -} - -const makeRequest = (path) => { - return { Records: [ { cf: { request: {headers: [], uri: path}}}]}; +// Mock a lambda event that we can pass to the handler. +const mockEvent = (path) => { + return { 'Records': [{ 'cf': { 'request': { 'headers': {}, 'uri': path }}}]} } +// Build the expected response for a 301 redirect. const makeRedirect = (path) => { - return {status: 301, statusDescription: 'Moved', headers: {'location': [{key: "Location", value: path}]}}; -}; + return { 'status': 301, 'statusDescription': 'Moved', 'headers': {'location': [{ 'key': "Location", 'value': path }]}}; +} +// Build the expected response for a passthrough. const makePassThroughRequest = (path) => { - return {headers: [], uri: path}; + return { headers: {}, uri: path }; }; -test('html suffix', (t) => { + +// All the tests follow a similar format. We pass the mock event to the +// handler which contains the path we're testing. The handler's real +// response is asserted to be equal to the expected response. +const runTest = (path, expected) => { + it(path, async function() { + result = await handler(mockEvent(path), null); + assert.deepEqual(result, expected); + }); +} + +describe('html extension', function() { runTest('/something.html', makeRedirect('/something')); }); -test('docs home', (t) => { +describe('docs root', function() { runTest('/docs', makeRedirect('/docs/')); runTest('/docs/', makePassThroughRequest('/docs/index.html')); }); -test('docs redirects', (t) => { +describe('docs redirects', function() { runTest('/cognito/', makeRedirect('/cognito')); runTest('/cognito', makeRedirect('/docs/lifecycle/migrate-users/bulk/cognito')); runTest('/docs/v1/tech/installation-guide/configuration-management', makeRedirect('/docs/operate/deploy/configuration-management')); runTest('/features/advanced-registration-forms', makeRedirect('/platform/registration-forms')); - runTest('/docs/v1/tech/common-errors', makeRedirect('/docs/operate/troubleshooting/troubleshooting')); runTest('/docs/v1/tech/admin-guide/troubleshooting', makeRedirect('/docs/operate/troubleshooting/troubleshooting')); runTest('/docs/v1/tech/reactor/', makeRedirect('/docs/v1/tech/reactor')); runTest('/docs/v1/tech/identity-providers/', makeRedirect('/docs/lifecycle/authenticate-users/identity-providers/')); }); -test('blog', (t) => { +describe('blog', function() { runTest('/blog', makeRedirect('/blog/')); runTest('/blog/category/tutorial', makeRedirect('/blog/category/tutorial/')); runTest('/blog/category/tutorial/', makePassThroughRequest('/blog/category/tutorial/index.html')); @@ -66,14 +62,13 @@ test('blog', (t) => { runTest('/blog/digitalocean-oneclick-installation', makePassThroughRequest('/blog/digitalocean-oneclick-installation.html')); }); -test('articles', (t) => { +describe('articles', function() { runTest('/learn/expert-advice/', makeRedirect('/articles/')); runTest('/learn/expert-advice/tokens/jwt-authentication-token-components-explained', makeRedirect('/articles/tokens/jwt-components-explained')); runTest('/products/identity-user-management/ciam-vs-iam', makeRedirect('/articles/ciam/ciam-vs-iam')); }); -test('dev-tools', (t) => { - +describe('dev-tools', function() { runTest('/dev-tools/jwt-debugger', makeRedirect('/dev-tools/jwt-decoder')); runTest('/learn/expert-advice/dev-tools/this/should-be-a-prefix-replacement', makeRedirect('/dev-tools/this/should-be-a-prefix-replacement')); });